| import { describe, expect, it } from "vitest"; |
|
|
| import { TuiStreamAssembler } from "./tui-stream-assembler.js"; |
|
|
| describe("TuiStreamAssembler", () => { |
| it("keeps thinking before content even when thinking arrives later", () => { |
| const assembler = new TuiStreamAssembler(); |
| const first = assembler.ingestDelta( |
| "run-1", |
| { |
| role: "assistant", |
| content: [{ type: "text", text: "Hello" }], |
| }, |
| true, |
| ); |
| expect(first).toBe("Hello"); |
|
|
| const second = assembler.ingestDelta( |
| "run-1", |
| { |
| role: "assistant", |
| content: [{ type: "thinking", thinking: "Brain" }], |
| }, |
| true, |
| ); |
| expect(second).toBe("[thinking]\nBrain\n\nHello"); |
| }); |
|
|
| it("omits thinking when showThinking is false", () => { |
| const assembler = new TuiStreamAssembler(); |
| const text = assembler.ingestDelta( |
| "run-2", |
| { |
| role: "assistant", |
| content: [ |
| { type: "thinking", thinking: "Hidden" }, |
| { type: "text", text: "Visible" }, |
| ], |
| }, |
| false, |
| ); |
|
|
| expect(text).toBe("Visible"); |
| }); |
|
|
| it("falls back to streamed text on empty final payload", () => { |
| const assembler = new TuiStreamAssembler(); |
| assembler.ingestDelta( |
| "run-3", |
| { |
| role: "assistant", |
| content: [{ type: "text", text: "Streamed" }], |
| }, |
| false, |
| ); |
|
|
| const finalText = assembler.finalize( |
| "run-3", |
| { |
| role: "assistant", |
| content: [], |
| }, |
| false, |
| ); |
|
|
| expect(finalText).toBe("Streamed"); |
| }); |
|
|
| it("returns null when delta text is unchanged", () => { |
| const assembler = new TuiStreamAssembler(); |
| const first = assembler.ingestDelta( |
| "run-4", |
| { |
| role: "assistant", |
| content: [{ type: "text", text: "Repeat" }], |
| }, |
| false, |
| ); |
|
|
| expect(first).toBe("Repeat"); |
|
|
| const second = assembler.ingestDelta( |
| "run-4", |
| { |
| role: "assistant", |
| content: [{ type: "text", text: "Repeat" }], |
| }, |
| false, |
| ); |
|
|
| expect(second).toBeNull(); |
| }); |
| }); |
|
|