diff --git a/packages/workshop-backend/__tests__/code-mode-tail.test.ts b/packages/workshop-backend/__tests__/code-mode-tail.test.ts new file mode 100644 index 000000000..270c96810 --- /dev/null +++ b/packages/workshop-backend/__tests__/code-mode-tail.test.ts @@ -0,0 +1,23 @@ +import { expect, it, vi } from "vitest"; +import { CodeModeTailLoopback } from "../src/overseer.js"; +const trace = (rpcMethod: string) => ({ + event: { rpcMethod }, logs: [], exceptions: [], diagnosticsChannelEvents: [], +}) as unknown as TraceItem; +it("delivers only a run paired with one verify", async () => { + const deliverCodeModeTrace = vi.fn(async () => undefined); + const loopback = { ctx: { + props: { executionId: "execution", overseerId: "overseer" }, + exports: { OverseerDurableObject: { + idFromString: (id: string) => id, + get: () => ({ deliverCodeModeTrace }), + } }, + } }; + const tail = (...methods: string[]) => CodeModeTailLoopback.prototype.tail.call( + loopback as unknown as CodeModeTailLoopback, methods.map(trace)); + await tail("verify", "run"); + expect(deliverCodeModeTrace).toHaveBeenCalledOnce(); + expect(deliverCodeModeTrace.mock.calls[0]?.[1]).toMatchObject({ event: { rpcMethod: "run" } }); + for (const methods of [["verify", "other"], ["verify", "verify", "run"], ["run", "run"]]) { + deliverCodeModeTrace.mockClear(); await tail(...methods); expect(deliverCodeModeTrace).not.toHaveBeenCalled(); + } +}); diff --git a/packages/workshop-backend/src/overseer.ts b/packages/workshop-backend/src/overseer.ts index e5fed5bb2..cdf5fd7f9 100644 --- a/packages/workshop-backend/src/overseer.ts +++ b/packages/workshop-backend/src/overseer.ts @@ -7235,6 +7235,13 @@ export class CodeModeTailLoopback extends WorkerEntrypoint