Files
KrisHD_AI/test/streamRenderer.test.js
T
Fretux c48e1b17c4
CI / check (22) (push) Successful in 10m3s
CI / check (24) (push) Successful in 9m34s
Fix admin authorization and harden chat requests
2026-10-05 22:49:29 +02:00

39 lines
1.8 KiB
JavaScript

import test from "node:test";
import assert from "node:assert/strict";
import {createStreamRenderer} from "../public/js/streamRenderer.js";
import {createTextStreamEvents} from "../src/services/streamEvents.js";
test("streaming sends linear-sized deltas, applies replacements and batches rendering", () => {
const events = [], frames = new Map(), rendered = [];
let nextId = 0;
const renderer = createStreamRenderer({
onReply: text => rendered.push(["reply", text]), onThinking: text => rendered.push(["thinking", text]),
schedule: callback => { frames.set(++nextId, callback); return nextId; }, cancel: id => frames.delete(id)
});
const emit = createTextStreamEvents((type, data) => {
events.push({type, data});
renderer[{chunk: "onChunk", thinking: "onThinking", replace: "onReplace"}[type]](data);
});
for (let i = 0; i < 1000; i++) emit.onChunk("a", "a".repeat(i + 1));
assert.equal(JSON.stringify(events).length < 45000, true);
assert.equal(frames.size, 1);
assert.equal(rendered.length, 0);
renderer.flush();
assert.deepEqual(rendered, [["reply", "a".repeat(1000)]]);
emit.onThinking("provisional", "provisional");
emit.onThinking("", ""); emit.onChunk("", "");
emit.onChunk("Corrected", "Corrected");
renderer.flush();
assert.deepEqual(rendered.slice(1), [["thinking", ""], ["reply", "Corrected"]]);
assert.ok(events.some(event => event.type === "replace" && event.data.target === "reply"));
renderer.onChunk({chunk: " stale"});
renderer.dispose();
assert.equal(frames.size, 0);
renderer.flush();
assert.equal(rendered.at(-1)[1], "Corrected");
renderer.onChunk({chunk: "", fullReply: ""});
renderer.onChunk({chunk: "Legacy", fullReply: "Legacy"});
renderer.flush();
assert.equal(rendered.at(-1)[1], "Legacy");
});