Files
diegosouzapw--omniroute/tests/unit/chatcore-stream-finalize.test.ts
2026-07-13 13:39:12 +08:00

48 lines
1.5 KiB
TypeScript

// tests/unit/chatcore-stream-finalize.test.ts
// Characterization of wrapReadableStreamWithFinalize — the stream finalize wrapper extracted from
// handleChatCore (chatCore god-file decomposition, #3501). Locks: finalize runs exactly once on
// full drain, on cancel, and is not double-invoked.
import { test } from "node:test";
import assert from "node:assert/strict";
import { wrapReadableStreamWithFinalize } from "../../open-sse/handlers/chatCore/streamFinalize.ts";
function streamOf(chunks: unknown[]): ReadableStream {
let i = 0;
return new ReadableStream({
pull(controller) {
if (i < chunks.length) {
controller.enqueue(chunks[i++]);
} else {
controller.close();
}
},
});
}
test("finalize runs exactly once after the stream is fully drained", async () => {
let calls = 0;
const wrapped = wrapReadableStreamWithFinalize(streamOf(["a", "b"]), () => {
calls++;
});
const reader = wrapped.getReader();
const seen: unknown[] = [];
while (true) {
const { done, value } = await reader.read();
if (done) break;
seen.push(value);
}
assert.deepEqual(seen, ["a", "b"]);
assert.equal(calls, 1);
});
test("finalize runs exactly once on cancel", async () => {
let calls = 0;
const wrapped = wrapReadableStreamWithFinalize(streamOf(["a", "b", "c"]), () => {
calls++;
});
const reader = wrapped.getReader();
await reader.read();
await reader.cancel("done early");
assert.equal(calls, 1);
});