diff --git a/CHANGELOG.md b/CHANGELOG.md index 10f6ea8d10..a1522443af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ Docs: https://docs.openclaw.ai ### Fixes +- WhatsApp: preserve original filenames for inbound documents. (#12691) Thanks @akramcodez. - Telegram: harden quote parsing; preserve quote context; avoid QUOTE_TEXT_INVALID; avoid nested reply quote misclassification. (#12156) Thanks @rybnikov. - Telegram: recover proactive sends when stale topic thread IDs are used by retrying without `message_thread_id`. (#11620) - Telegram: render markdown spoilers with `` HTML tags. (#11543) Thanks @ezhikkk. diff --git a/src/web/inbound.media.test.ts b/src/web/inbound.media.test.ts index 91e37a5b4f..d7f7530d5c 100644 --- a/src/web/inbound.media.test.ts +++ b/src/web/inbound.media.test.ts @@ -235,4 +235,45 @@ describe("web inbound media saves with extension", () => { await listener.close(); }); + + it("passes document filenames to saveMediaBuffer", async () => { + const onMessage = vi.fn(); + const listener = await monitorWebInbox({ verbose: false, onMessage }); + const { createWaSocket } = await import("./session.js"); + const realSock = await ( + createWaSocket as unknown as () => Promise<{ + ev: import("node:events").EventEmitter; + }> + )(); + + const fileName = "invoice.pdf"; + const upsert = { + type: "notify", + messages: [ + { + key: { id: "doc1", fromMe: false, remoteJid: "333@s.whatsapp.net" }, + message: { documentMessage: { mimetype: "application/pdf", fileName } }, + messageTimestamp: 1_700_000_004, + }, + ], + }; + + realSock.ev.emit("messages.upsert", upsert); + + for (let i = 0; i < 50; i++) { + if (onMessage.mock.calls.length > 0) { + break; + } + await new Promise((resolve) => setTimeout(resolve, 10)); + } + + expect(onMessage).toHaveBeenCalledTimes(1); + const msg = onMessage.mock.calls[0][0]; + expect(msg.mediaFileName).toBe(fileName); + expect(saveMediaBufferSpy).toHaveBeenCalled(); + const lastCall = saveMediaBufferSpy.mock.calls.at(-1); + expect(lastCall?.[4]).toBe(fileName); + + await listener.close(); + }); });