78 lines
2.4 KiB
TypeScript
78 lines
2.4 KiB
TypeScript
/**
|
|
* 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");
|
|
});
|
|
});
|