From d023e8b412c19c8268673ea62b21933a1f20e67f Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 17 Jul 2026 10:22:09 +0100 Subject: [PATCH] perf(test): poll ClickClack gateway faster (#109803) --- extensions/clickclack/src/gateway.test.ts | 56 +++++++++++++---------- 1 file changed, 31 insertions(+), 25 deletions(-) diff --git a/extensions/clickclack/src/gateway.test.ts b/extensions/clickclack/src/gateway.test.ts index de2b8e1cb4f6..a71684ea0ca5 100644 --- a/extensions/clickclack/src/gateway.test.ts +++ b/extensions/clickclack/src/gateway.test.ts @@ -15,6 +15,10 @@ class FakeSocket extends EventEmitter { }); } +function waitForGatewayState(assertion: () => T | Promise): Promise { + return vi.waitFor(assertion, { interval: 1 }); +} + const mocks = vi.hoisted(() => ({ createClickClackClient: vi.fn(), client: { @@ -166,7 +170,7 @@ describe("ClickClack gateway", () => { const ctx = createGatewayContext(abort.signal, { commandMenu }); const run = startClickClackGatewayAccount(ctx); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); expect(mocks.client.setBotCommands).toHaveBeenCalledTimes(1); expect(mocks.client.me.mock.invocationCallOrder[0]).toBeLessThan( @@ -190,7 +194,7 @@ describe("ClickClack gateway", () => { const ctx = createGatewayContext(abort.signal, { commandMenu: false }); const run = startClickClackGatewayAccount(ctx); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); expect(mocks.client.setBotCommands).not.toHaveBeenCalled(); @@ -226,7 +230,7 @@ describe("ClickClack gateway", () => { const ctx = createGatewayContext(abort.signal); const run = startClickClackGatewayAccount(ctx); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); expect(ctx.log?.[level]).toHaveBeenCalledWith(message); expect(ctx.setStatus).toHaveBeenCalledWith({ @@ -252,7 +256,7 @@ describe("ClickClack gateway", () => { const ctx = createGatewayContext(abort.signal); const run = startClickClackGatewayAccount(ctx); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); expect(mocks.client.eventPage).toHaveBeenCalledWith("workspace-1", { includeTail: true }); expect(mocks.client.websocket).toHaveBeenCalledWith("workspace-1", "cursor-501"); @@ -277,9 +281,9 @@ describe("ClickClack gateway", () => { const ctx = createGatewayContext(abort.signal); const run = startClickClackGatewayAccount(ctx); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); firstSocket.emit("close"); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(2)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(2)); expect(mocks.client.eventPage).toHaveBeenNthCalledWith(2, "workspace-1", { afterCursor: "", @@ -310,7 +314,7 @@ describe("ClickClack gateway", () => { runError = error; }); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); socket.emit("message", Buffer.from("{not json")); await new Promise((resolve) => { @@ -323,7 +327,7 @@ describe("ClickClack gateway", () => { emitMessageEvent(socket, 1); - await vi.waitFor(() => expect(mocks.handleClickClackInbound).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.handleClickClackInbound).toHaveBeenCalledTimes(1)); expect(mocks.handleClickClackInbound.mock.calls[0]?.[0].access).toEqual({ shouldDispatch: true, commandAuthorized: true, @@ -350,19 +354,19 @@ describe("ClickClack gateway", () => { const ctx = createGatewayContext(abort.signal); const run = startClickClackGatewayAccount(ctx); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); for (const index of [1, 2]) { emitMessageEvent(firstSocket, index); } firstSocket.emit("close"); - await vi.waitFor(() => expect(finishFirstEvent).toBeTypeOf("function")); + await waitForGatewayState(() => expect(finishFirstEvent).toBeTypeOf("function")); expect(mocks.handleClickClackInbound).toHaveBeenCalledTimes(1); expect(mocks.client.websocket).toHaveBeenCalledTimes(1); finishFirstEvent?.(); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(2)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(2)); expect(mocks.handleClickClackInbound).toHaveBeenCalledTimes(2); expect(mocks.client.eventPage).toHaveBeenLastCalledWith("workspace-1", { @@ -391,13 +395,13 @@ describe("ClickClack gateway", () => { const ctx = createGatewayContext(abort.signal); const run = startClickClackGatewayAccount(ctx); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); for (const index of [1, 2]) { emitMessageEvent(firstSocket, index); } - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(2)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(2)); expect(mocks.handleClickClackInbound).toHaveBeenCalledTimes(3); expect(firstSocket.close).toHaveBeenCalledOnce(); @@ -430,13 +434,13 @@ describe("ClickClack gateway", () => { const slowRun = startClickClackGatewayAccount(createGatewayContext(slowAbort.signal)); const fastRun = startClickClackGatewayAccount(createGatewayContext(fastAbort.signal)); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(2)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(2)); emitMessageEvent(slowSocket, 1); - await vi.waitFor(() => expect(finishSlowEvent).toBeTypeOf("function")); + await waitForGatewayState(() => expect(finishSlowEvent).toBeTypeOf("function")); emitMessageEvent(fastSocket, 2); - await vi.waitFor(() => expect(mocks.handleClickClackInbound).toHaveBeenCalledTimes(2)); + await waitForGatewayState(() => expect(mocks.handleClickClackInbound).toHaveBeenCalledTimes(2)); expect(finishSlowEvent).toBeTypeOf("function"); finishSlowEvent?.(); @@ -456,11 +460,13 @@ describe("ClickClack gateway", () => { const ctx = createGatewayContext(abort.signal); const run = startClickClackGatewayAccount(ctx); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); emitMessageEvent(socket, 1); - await vi.waitFor(() => expect(mocks.resolveClickClackInboundAccess).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => + expect(mocks.resolveClickClackInboundAccess).toHaveBeenCalledTimes(1), + ); expect(mocks.handleClickClackInbound).not.toHaveBeenCalled(); abort.abort(); await run; @@ -499,11 +505,11 @@ describe("ClickClack gateway", () => { const ctx = createGatewayContext(abort.signal); const run = startClickClackGatewayAccount(ctx); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); emitMessageEvent(socket, 1, { correlation_id: "bad correlation" }); - await vi.waitFor(() => expect(mocks.handleClickClackInbound).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.handleClickClackInbound).toHaveBeenCalledTimes(1)); expect(mocks.createClickClackClient).toHaveBeenCalledTimes(1); expect(mocks.handleClickClackInbound.mock.calls[0]?.[0]).not.toHaveProperty("correlationId"); @@ -520,11 +526,11 @@ describe("ClickClack gateway", () => { const ctx = createGatewayContext(abort.signal); const run = startClickClackGatewayAccount(ctx); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); firstSocket.emit("error", new Error("gateway dropped")); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(2)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(2)); expect(ctx.log?.warn).toHaveBeenCalledWith( "[default] ClickClack websocket error; reconnecting: gateway dropped", ); @@ -571,7 +577,7 @@ describe("ClickClack gateway", () => { const ctx = createGatewayContext(abort.signal); const run = startClickClackGatewayAccount(ctx); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); abort.abort(); await run; @@ -617,11 +623,11 @@ describe("ClickClack gateway", () => { const ctx = createGatewayContext(abort.signal); const run = startClickClackGatewayAccount(ctx); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(1)); emitMessageEvent(firstSocket, 1); - await vi.waitFor(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(2)); + await waitForGatewayState(() => expect(mocks.client.websocket).toHaveBeenCalledTimes(2)); expect(ctx.log?.warn).toHaveBeenCalledWith( '[default] ClickClack event processing failed; reconnecting: {"code":"ECONNRESET","retryable":true}', );