test: add image attachment regression coverage

This commit is contained in:
Peter Steinberger
2026-01-10 20:25:38 +01:00
parent 212b13b099
commit 4533dd6e5d
3 changed files with 175 additions and 2 deletions

View File

@@ -59,6 +59,59 @@ describe("buildMessageWithAttachments", () => {
});
describe("parseMessageWithAttachments", () => {
it("strips data URL prefix", async () => {
const parsed = await parseMessageWithAttachments(
"see this",
[
{
type: "image",
mimeType: "image/png",
fileName: "dot.png",
content: `data:image/png;base64,${PNG_1x1}`,
},
],
{ log: { warn: () => {} } },
);
expect(parsed.images).toHaveLength(1);
expect(parsed.images[0]?.mimeType).toBe("image/png");
expect(parsed.images[0]?.data).toBe(PNG_1x1);
});
it("rejects invalid base64 content", async () => {
await expect(
parseMessageWithAttachments(
"x",
[
{
type: "image",
mimeType: "image/png",
fileName: "dot.png",
content: "%not-base64%",
},
],
{ log: { warn: () => {} } },
),
).rejects.toThrow(/base64/i);
});
it("rejects images over limit", async () => {
const big = Buffer.alloc(6_000_000, 0).toString("base64");
await expect(
parseMessageWithAttachments(
"x",
[
{
type: "image",
mimeType: "image/png",
fileName: "big.png",
content: big,
},
],
{ maxBytes: 5_000_000, log: { warn: () => {} } },
),
).rejects.toThrow(/exceeds size limit/i);
});
it("sniffs mime when missing", async () => {
const logs: string[] = [];
const parsed = await parseMessageWithAttachments(
@@ -118,4 +171,44 @@ describe("parseMessageWithAttachments", () => {
expect(logs).toHaveLength(1);
expect(logs[0]).toMatch(/mime mismatch/i);
});
it("drops unknown mime when sniff fails and logs", async () => {
const logs: string[] = [];
const unknown = Buffer.from("not an image").toString("base64");
const parsed = await parseMessageWithAttachments(
"x",
[{ type: "file", fileName: "unknown.bin", content: unknown }],
{ log: { warn: (message) => logs.push(message) } },
);
expect(parsed.images).toHaveLength(0);
expect(logs).toHaveLength(1);
expect(logs[0]).toMatch(/unable to detect image mime type/i);
});
it("keeps valid images and drops invalid ones", async () => {
const logs: string[] = [];
const pdf = Buffer.from("%PDF-1.4\n").toString("base64");
const parsed = await parseMessageWithAttachments(
"x",
[
{
type: "image",
mimeType: "image/png",
fileName: "dot.png",
content: PNG_1x1,
},
{
type: "file",
mimeType: "image/png",
fileName: "not-image.pdf",
content: pdf,
},
],
{ log: { warn: (message) => logs.push(message) } },
);
expect(parsed.images).toHaveLength(1);
expect(parsed.images[0]?.mimeType).toBe("image/png");
expect(parsed.images[0]?.data).toBe(PNG_1x1);
expect(logs.some((l) => /non-image/i.test(l))).toBe(true);
});
});