perf(test): poll ClickClack gateway faster (#109803)

This commit is contained in:
Peter Steinberger
2026-07-17 10:22:09 +01:00
committed by GitHub
parent 45f36640dc
commit d023e8b412

View File

@@ -15,6 +15,10 @@ class FakeSocket extends EventEmitter {
});
}
function waitForGatewayState<T>(assertion: () => T | Promise<T>): Promise<T> {
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}',
);