From 79840c9fdf1cd3f735d5d1bfe3b60e5180181f51 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 21 Apr 2026 13:59:21 +0530 Subject: [PATCH] fix(media): preserve outbound attachment filenames (cherry picked from commit fcc86f043b510dfc871a8d76a625f6d7b773bb52) --- src/media/outbound-attachment.test.ts | 39 +++++++++++++++++++++++++++ src/media/outbound-attachment.ts | 1 + 2 files changed, 40 insertions(+) create mode 100644 src/media/outbound-attachment.test.ts diff --git a/src/media/outbound-attachment.test.ts b/src/media/outbound-attachment.test.ts new file mode 100644 index 00000000000..e5618469b82 --- /dev/null +++ b/src/media/outbound-attachment.test.ts @@ -0,0 +1,39 @@ +import { describe, expect, it, vi } from "vitest"; + +const loadWebMedia = vi.hoisted(() => vi.fn()); +const saveMediaBuffer = vi.hoisted(() => vi.fn()); + +vi.mock("./web-media.js", () => ({ + loadWebMedia, +})); + +vi.mock("./store.js", () => ({ + saveMediaBuffer, +})); + +const { resolveOutboundAttachmentFromUrl } = await import("./outbound-attachment.js"); + +describe("resolveOutboundAttachmentFromUrl", () => { + it("preserves the loaded file name when staging outbound media", async () => { + const buffer = Buffer.from("pdf"); + loadWebMedia.mockResolvedValueOnce({ + buffer, + contentType: "application/pdf", + fileName: "report.pdf", + }); + saveMediaBuffer.mockResolvedValueOnce({ + path: "/tmp/media/outbound/report---uuid.pdf", + contentType: "application/pdf", + }); + + await resolveOutboundAttachmentFromUrl("./report.pdf", 1024); + + expect(saveMediaBuffer).toHaveBeenCalledWith( + buffer, + "application/pdf", + "outbound", + 1024, + "report.pdf", + ); + }); +}); diff --git a/src/media/outbound-attachment.ts b/src/media/outbound-attachment.ts index ac303b07d74..fa9a93a1b66 100644 --- a/src/media/outbound-attachment.ts +++ b/src/media/outbound-attachment.ts @@ -25,6 +25,7 @@ export async function resolveOutboundAttachmentFromUrl( media.contentType ?? undefined, "outbound", maxBytes, + media.fileName, ); return { path: saved.path, contentType: saved.contentType }; }