| import { describe, expect, it } from "vitest"; |
| import { extractTextFromChatContent } from "./chat-content.js"; |
|
|
| describe("shared/chat-content", () => { |
| it("normalizes plain string content", () => { |
| expect(extractTextFromChatContent(" hello\nworld ")).toBe("hello world"); |
| }); |
|
|
| it("extracts only text blocks from array content", () => { |
| expect( |
| extractTextFromChatContent([ |
| { type: "text", text: " hello " }, |
| { type: "image_url", image_url: "https://example.com" }, |
| { type: "text", text: "world" }, |
| { text: "ignored without type" }, |
| null, |
| ]), |
| ).toBe("hello world"); |
| }); |
|
|
| it("applies sanitizers and custom join/normalization hooks", () => { |
| expect( |
| extractTextFromChatContent("Here [Tool Call: foo (ID: 1)] ok", { |
| sanitizeText: (text) => text.replace(/\[Tool Call:[^\]]+\]\s*/g, ""), |
| }), |
| ).toBe("Here ok"); |
|
|
| expect( |
| extractTextFromChatContent( |
| [ |
| { type: "text", text: " hello " }, |
| { type: "text", text: "world " }, |
| ], |
| { |
| sanitizeText: (text) => text.trim(), |
| joinWith: "\n", |
| normalizeText: (text) => text.trim(), |
| }, |
| ), |
| ).toBe("hello\nworld"); |
|
|
| expect( |
| extractTextFromChatContent( |
| [ |
| { type: "text", text: "keep" }, |
| { type: "text", text: "drop" }, |
| ], |
| { |
| sanitizeText: (text) => (text === "drop" ? " " : text), |
| }, |
| ), |
| ).toBe("keep"); |
| }); |
|
|
| it("returns null for unsupported or empty content", () => { |
| expect(extractTextFromChatContent(123)).toBeNull(); |
| expect(extractTextFromChatContent([{ type: "text", text: " " }])).toBeNull(); |
| expect( |
| extractTextFromChatContent(" ", { |
| sanitizeText: () => "", |
| }), |
| ).toBeNull(); |
| }); |
| }); |
|
|