test(gateway): extract shared parse warning helper

This commit is contained in:
Peter Steinberger
2026-02-21 23:32:20 +00:00
parent d3991d6aa9
commit e84d89ab06

View File

@@ -8,6 +8,14 @@ import {
const PNG_1x1 =
"iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/woAAn8B9FD5fHAAAAAASUVORK5CYII=";
async function parseWithWarnings(message: string, attachments: ChatAttachment[]) {
const logs: string[] = [];
const parsed = await parseMessageWithAttachments(message, attachments, {
log: { warn: (warning) => logs.push(warning) },
});
return { parsed, logs };
}
describe("buildMessageWithAttachments", () => {
it("embeds a single image as data URL", () => {
const msg = buildMessageWithAttachments("see this", [
@@ -54,18 +62,13 @@ describe("parseMessageWithAttachments", () => {
});
it("sniffs mime when missing", async () => {
const logs: string[] = [];
const parsed = await parseMessageWithAttachments(
"see this",
[
{
type: "image",
fileName: "dot.png",
content: PNG_1x1,
},
],
{ log: { warn: (message) => logs.push(message) } },
);
const { parsed, logs } = await parseWithWarnings("see this", [
{
type: "image",
fileName: "dot.png",
content: PNG_1x1,
},
]);
expect(parsed.message).toBe("see this");
expect(parsed.images).toHaveLength(1);
expect(parsed.images[0]?.mimeType).toBe("image/png");
@@ -74,39 +77,29 @@ describe("parseMessageWithAttachments", () => {
});
it("drops non-image payloads and logs", async () => {
const logs: string[] = [];
const pdf = Buffer.from("%PDF-1.4\n").toString("base64");
const parsed = await parseMessageWithAttachments(
"x",
[
{
type: "file",
mimeType: "image/png",
fileName: "not-image.pdf",
content: pdf,
},
],
{ log: { warn: (message) => logs.push(message) } },
);
const { parsed, logs } = await parseWithWarnings("x", [
{
type: "file",
mimeType: "image/png",
fileName: "not-image.pdf",
content: pdf,
},
]);
expect(parsed.images).toHaveLength(0);
expect(logs).toHaveLength(1);
expect(logs[0]).toMatch(/non-image/i);
});
it("prefers sniffed mime type and logs mismatch", async () => {
const logs: string[] = [];
const parsed = await parseMessageWithAttachments(
"x",
[
{
type: "image",
mimeType: "image/jpeg",
fileName: "dot.png",
content: PNG_1x1,
},
],
{ log: { warn: (message) => logs.push(message) } },
);
const { parsed, logs } = await parseWithWarnings("x", [
{
type: "image",
mimeType: "image/jpeg",
fileName: "dot.png",
content: PNG_1x1,
},
]);
expect(parsed.images).toHaveLength(1);
expect(parsed.images[0]?.mimeType).toBe("image/png");
expect(logs).toHaveLength(1);
@@ -114,39 +107,31 @@ describe("parseMessageWithAttachments", () => {
});
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) } },
);
const { parsed, logs } = await parseWithWarnings("x", [
{ type: "file", fileName: "unknown.bin", content: unknown },
]);
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) } },
);
const { parsed, logs } = await parseWithWarnings("x", [
{
type: "image",
mimeType: "image/png",
fileName: "dot.png",
content: PNG_1x1,
},
{
type: "file",
mimeType: "image/png",
fileName: "not-image.pdf",
content: pdf,
},
]);
expect(parsed.images).toHaveLength(1);
expect(parsed.images[0]?.mimeType).toBe("image/png");
expect(parsed.images[0]?.data).toBe(PNG_1x1);