From 52cda537a40ae4883de24d21f4b5806b9ea111a1 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Wed, 12 Aug 2026 16:54:20 -0700 Subject: [PATCH] test(discord): move ready abort proof to lifecycle (#122869) --- .../src/monitor/provider.lifecycle.test.ts | 76 ++++++++----------- .../discord/src/monitor/provider.lifecycle.ts | 4 - extensions/discord/test-api.ts | 2 - 3 files changed, 30 insertions(+), 52 deletions(-) delete mode 100644 extensions/discord/test-api.ts diff --git a/extensions/discord/src/monitor/provider.lifecycle.test.ts b/extensions/discord/src/monitor/provider.lifecycle.test.ts index 864772d03d45..eda4f350acc4 100644 --- a/extensions/discord/src/monitor/provider.lifecycle.test.ts +++ b/extensions/discord/src/monitor/provider.lifecycle.test.ts @@ -380,6 +380,36 @@ describe("runDiscordGatewayLifecycle", () => { } }); + it("returns promptly when abortSignal fires during the READY retry backoff", async () => { + vi.useFakeTimers(); + try { + const abortController = new AbortController(); + const { gateway } = createGatewayHarness(); + const { lifecycleParams, threadStop, gatewaySupervisor } = createLifecycleHarness({ + gateway, + }); + lifecycleParams.abortSignal = abortController.signal; + + const lifecyclePromise = runDiscordGatewayLifecycle(lifecycleParams); + await vi.advanceTimersByTimeAsync(15_250); + expect(gateway.disconnect).toHaveBeenCalledTimes(1); + expect(gateway.connect).toHaveBeenCalledTimes(1); + expect(waitForDiscordGatewayStopMock).not.toHaveBeenCalled(); + + abortController.abort(new Error("shutdown")); + await vi.advanceTimersByTimeAsync(0); + expect(waitForDiscordGatewayStopMock).toHaveBeenCalledTimes(1); + await expect(lifecyclePromise).resolves.toBeUndefined(); + + expectLifecycleCleanup({ threadStop, waitCalls: 1, gatewaySupervisor }); + expect(vi.getTimerCount()).toBe(0); + await vi.advanceTimersByTimeAsync(2_000); + expect(gateway.connect).toHaveBeenCalledTimes(1); + } finally { + vi.useRealTimers(); + } + }); + it("waits for the stale startup socket to close before reconnecting", async () => { vi.useFakeTimers(); try { @@ -711,49 +741,3 @@ describe("runDiscordGatewayLifecycle", () => { } }); }); - -describe("waitForGatewayReady", () => { - let waitForGatewayReady: (typeof import("../../test-api.js"))["discordGatewayLifecycleTesting"]["waitForGatewayReady"]; - - beforeAll(async () => { - waitForGatewayReady = (await import("../../test-api.js")).discordGatewayLifecycleTesting - .waitForGatewayReady; - }); - - it("returns promptly when abortSignal fires during the READY retry backoff", async () => { - vi.useFakeTimers(); - try { - const controller = new AbortController(); - const gateway = { - isConnected: false, - connect: vi.fn(), - disconnect: vi.fn(), - ws: null, - }; - const runtime: RuntimeEnv = { - log: () => {}, - error: () => {}, - exit: () => {}, - }; - - const readyPromise = waitForGatewayReady({ - gateway, - abortSignal: controller.signal, - readyTimeoutMs: 200, - runtime, - }); - - await vi.advanceTimersByTimeAsync(250); - expect(gateway.connect).toHaveBeenCalledTimes(1); - controller.abort(); - - await expect(readyPromise).resolves.toBeUndefined(); - expect(vi.getTimerCount()).toBe(0); - await vi.advanceTimersByTimeAsync(2_000); - expect(gateway.connect).toHaveBeenCalledTimes(1); - expect(gateway.disconnect).toHaveBeenCalledTimes(1); - } finally { - vi.useRealTimers(); - } - }); -}); diff --git a/extensions/discord/src/monitor/provider.lifecycle.ts b/extensions/discord/src/monitor/provider.lifecycle.ts index be37dd528ec5..fc6f24f68d62 100644 --- a/extensions/discord/src/monitor/provider.lifecycle.ts +++ b/extensions/discord/src/monitor/provider.lifecycle.ts @@ -573,7 +573,3 @@ export async function runDiscordGatewayLifecycle(params: { params.threadBindings.stop(); } } - -// Test-only surface. Re-exported from the plugin root `test-api.ts` entry so Knip's -// production scan sees the consumer; tests import `testing` from `test-api.js`. -export const testing = { waitForGatewayReady }; diff --git a/extensions/discord/test-api.ts b/extensions/discord/test-api.ts deleted file mode 100644 index d00434289dd7..000000000000 --- a/extensions/discord/test-api.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Discord test API exposes the gateway lifecycle fixture. -export { testing as discordGatewayLifecycleTesting } from "./src/monitor/provider.lifecycle.js";