diff --git a/src/index.core.test.ts b/src/index.core.test.ts index f68b86155..357b90e7a 100644 --- a/src/index.core.test.ts +++ b/src/index.core.test.ts @@ -198,6 +198,31 @@ describe("config and templating", () => { expect(result?.text).toBe("caption before caption after"); }); + it("captures MEDIA wrapped in backticks", async () => { + const runSpy = vi.spyOn(index, "runCommandWithTimeout").mockResolvedValue({ + stdout: "MEDIA:`/tmp/pic.png` cool", + stderr: "", + code: 0, + signal: null, + killed: false, + }); + const cfg = { + inbound: { + reply: { + mode: "command" as const, + command: ["echo", "{{Body}}"], + }, + }, + }; + const result = await index.getReplyFromConfig( + { Body: "hi", From: "+1", To: "+2" }, + undefined, + cfg, + runSpy, + ); + expect(result?.mediaUrl).toBe("/tmp/pic.png"); + }); + it("ignores invalid MEDIA lines with whitespace", async () => { const runSpy = vi.spyOn(index, "runCommandWithTimeout").mockResolvedValue({ stdout: "hello\nMEDIA: not a url with spaces\nrest\n", diff --git a/src/provider-web.test.ts b/src/provider-web.test.ts index ea023ad63..effa544dc 100644 --- a/src/provider-web.test.ts +++ b/src/provider-web.test.ts @@ -46,6 +46,7 @@ import { sendMessageWeb, waitForWaConnection, } from "./provider-web.js"; +import { monitorWebProvider } from "./index.js"; const baileys = (await import( "@whiskeysockets/baileys" @@ -209,6 +210,49 @@ describe("provider-web", () => { await listener.close(); }); + it("monitorWebProvider falls back to text when media send fails", async () => { + const sendMedia = vi.fn().mockRejectedValue(new Error("boom")); + const reply = vi.fn().mockResolvedValue(undefined); + const sendComposing = vi.fn(); + const resolver = vi.fn().mockResolvedValue({ + text: "hi", + mediaUrl: "https://example.com/img.png", + }); + + let capturedOnMessage: ((msg: any) => Promise) | undefined; + const listenerFactory = async (opts: { onMessage: (msg: any) => Promise }) => { + capturedOnMessage = opts.onMessage; + return { close: vi.fn() }; + }; + + const fetchMock = vi + .spyOn(global as any, "fetch") + .mockResolvedValue({ + ok: true, + body: true, + arrayBuffer: async () => new ArrayBuffer(1024), + headers: { get: () => "image/png" }, + status: 200, + } as any); + + await monitorWebProvider(false, listenerFactory as any, false, resolver); + + expect(capturedOnMessage).toBeDefined(); + await capturedOnMessage?.({ + body: "hello", + from: "+1", + to: "+2", + id: "msg1", + sendComposing, + reply, + sendMedia, + }); + + expect(sendMedia).toHaveBeenCalled(); + expect(reply).toHaveBeenCalledWith("hi"); + fetchMock.mockRestore(); + }); + it("logWebSelfId prints cached E.164 when creds exist", () => { const existsSpy = vi .spyOn(fsSync, "existsSync")