/** * Abort tests against the real streamCommandCode core. */ import assert from "node:assert/strict" import { after, before, beforeEach, describe, it } from "node:test" import { collectEvents, createTestDeps, makeContext, makeModel, startMockCommandCodeServer, type MockCommandCodeServer, } from "./helpers.ts" let server: MockCommandCodeServer before(async () => { server = await startMockCommandCodeServer() }) after(async () => { await server.close() }) beforeEach(() => { server.reset() }) describe("streamCommandCode — abort behavior", () => { it("emits aborted error when signal is already aborted", async () => { const controller = new AbortController() controller.abort() const { streamCommandCode } = createTestDeps({ apiBase: server.baseUrl() }) const events = await collectEvents( streamCommandCode(makeModel(), makeContext(), { apiKey: "mock-key", signal: controller.signal, }), ) assert.deepEqual( events.map((event) => event.type), ["start", "error"], ) const error = events.at(-1) assert.equal(error?.type, "error") if (error?.type !== "error") throw new Error("expected error") assert.equal(error.reason, "aborted") assert.equal(error.error.stopReason, "aborted") assert.equal(server.requestCount(), 0) }) it("emits aborted error and cancels the response reader mid-stream", async () => { server.mockResponse({ type: "success", events: [JSON.stringify({ type: "text-delta", text: "first" })], hangAfterLast: true, }) const controller = new AbortController() const { streamCommandCode } = createTestDeps({ apiBase: server.baseUrl() }) const stream = streamCommandCode(makeModel(), makeContext(), { apiKey: "mock-key", signal: controller.signal, }) setTimeout(() => controller.abort(), 50) const events = await collectEvents(stream, 2_000) assert.ok( events.some((event) => event.type === "text_delta"), "stream should process data before abort", ) const error = events.at(-1) assert.equal(error?.type, "error") if (error?.type !== "error") throw new Error("expected error") assert.equal(error.reason, "aborted") assert.equal(error.error.errorMessage, "Request aborted") await new Promise((resolve) => setTimeout(resolve, 50)) assert.ok(server.responseClosedBeforeEnd(), "abort should close the hanging upstream response") }) })