import { describe, expect, test } from "bun:test"; import { createUserMessage, createAssistantMessage, normalizeMessages, extractTag, } from "../../src/utils/messages"; // ─── Message Structure ──────────────────────────────────────────────── describe("Message pipeline: message structure", () => { test("createUserMessage returns a Message with type 'user'", () => { const msg = createUserMessage("hello"); expect(msg.type).toBe("user"); expect(msg.message.role).toBe("user"); expect(msg.uuid).toBeTruthy(); expect(msg.timestamp).toBeTruthy(); }); test("createAssistantMessage returns a Message with type 'assistant'", () => { const msg = createAssistantMessage("response"); expect(msg.type).toBe("assistant"); expect(msg.message.role).toBe("assistant"); expect(msg.uuid).toBeTruthy(); }); test("user and assistant messages have different UUIDs", () => { const user = createUserMessage("hello"); const assistant = createAssistantMessage("response"); expect(user.uuid).not.toBe(assistant.uuid); }); }); // ─── Tag Extraction ─────────────────────────────────────────────────── describe("Message pipeline: tag extraction", () => { test("extractTag returns null for non-matching tag", () => { expect(extractTag("no tags here", "think")).toBeNull(); }); test("extractTag returns null for empty string", () => { expect(extractTag("", "think")).toBeNull(); }); test("extractTag requires tagName parameter", () => { // Calling without tagName throws expect(() => (extractTag as any)("hello")).toThrow(); }); }); // ─── Normalization ──────────────────────────────────────────────────── describe("Message pipeline: normalization", () => { test("normalizeMessages returns an array", () => { const msg = createUserMessage("hello"); const result = normalizeMessages([msg]); expect(Array.isArray(result)).toBe(true); }); test("normalizeMessages preserves at least one message for simple input", () => { const msg = createUserMessage("hello"); const result = normalizeMessages([msg]); expect(result.length).toBeGreaterThanOrEqual(1); }); });