48 lines
1.5 KiB
TypeScript
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);
|
|
});
|