import { describe, expect, it } from "vitest"; import { buildMessageWithAttachments, type ChatAttachment, } from "./chat-attachments.js"; const PNG_1x1 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/woAAn8B9FD5fHAAAAAASUVORK5CYII="; describe("buildMessageWithAttachments", () => { it("embeds a single image as data URL", () => { const msg = buildMessageWithAttachments("see this", [ { type: "image", mimeType: "image/png", fileName: "dot.png", content: PNG_1x1, }, ]); expect(msg).toContain("see this"); expect(msg).toContain(`data:image/png;base64,${PNG_1x1}`); expect(msg).toContain("![dot.png]"); }); it("rejects non-image mime types", () => { const bad: ChatAttachment = { type: "file", mimeType: "application/pdf", fileName: "a.pdf", content: "AAA", }; expect(() => buildMessageWithAttachments("x", [bad])).toThrow(/image/); }); it("rejects invalid base64 content", () => { const bad: ChatAttachment = { type: "image", mimeType: "image/png", fileName: "dot.png", content: "%not-base64%", }; expect(() => buildMessageWithAttachments("x", [bad])).toThrow(/base64/); }); it("rejects images over limit", () => { const big = Buffer.alloc(6_000_000, 0).toString("base64"); const att: ChatAttachment = { type: "image", mimeType: "image/png", fileName: "big.png", content: big, }; expect(() => buildMessageWithAttachments("x", [att], { maxBytes: 5_000_000 }), ).toThrow(/exceeds size limit/i); }); });