import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; import { resetLogger, setLoggerOverride } from "../logging.js"; import { setActiveWebListener } from "./active-listener.js"; const loadWebMediaMock = vi.fn(); vi.mock("./media.js", () => ({ loadWebMedia: (...args: unknown[]) => loadWebMediaMock(...args), })); import { sendMessageWhatsApp } from "./outbound.js"; describe("web outbound", () => { const sendComposingTo = vi.fn(async () => {}); const sendMessage = vi.fn(async () => ({ messageId: "msg123" })); beforeEach(() => { vi.clearAllMocks(); setActiveWebListener({ sendComposingTo, sendMessage }); }); afterEach(() => { resetLogger(); setLoggerOverride(null); setActiveWebListener(null); }); it("sends message via active listener", async () => { const result = await sendMessageWhatsApp("+1555", "hi", { verbose: false }); expect(result).toEqual({ messageId: "msg123", toJid: "1555@s.whatsapp.net", }); expect(sendComposingTo).toHaveBeenCalledWith("+1555"); expect(sendMessage).toHaveBeenCalledWith( "+1555", "hi", undefined, undefined, ); }); it("maps audio to PTT with opus mime when ogg", async () => { const buf = Buffer.from("audio"); loadWebMediaMock.mockResolvedValueOnce({ buffer: buf, contentType: "audio/ogg", kind: "audio", }); await sendMessageWhatsApp("+1555", "voice note", { verbose: false, mediaUrl: "/tmp/voice.ogg", }); expect(sendMessage).toHaveBeenLastCalledWith( "+1555", "voice note", buf, "audio/ogg; codecs=opus", ); }); it("maps video with caption", async () => { const buf = Buffer.from("video"); loadWebMediaMock.mockResolvedValueOnce({ buffer: buf, contentType: "video/mp4", kind: "video", }); await sendMessageWhatsApp("+1555", "clip", { verbose: false, mediaUrl: "/tmp/video.mp4", }); expect(sendMessage).toHaveBeenLastCalledWith( "+1555", "clip", buf, "video/mp4", ); }); it("maps image with caption", async () => { const buf = Buffer.from("img"); loadWebMediaMock.mockResolvedValueOnce({ buffer: buf, contentType: "image/jpeg", kind: "image", }); await sendMessageWhatsApp("+1555", "pic", { verbose: false, mediaUrl: "/tmp/pic.jpg", }); expect(sendMessage).toHaveBeenLastCalledWith( "+1555", "pic", buf, "image/jpeg", ); }); it("maps other kinds to document with filename", async () => { const buf = Buffer.from("pdf"); loadWebMediaMock.mockResolvedValueOnce({ buffer: buf, contentType: "application/pdf", kind: "document", fileName: "file.pdf", }); await sendMessageWhatsApp("+1555", "doc", { verbose: false, mediaUrl: "/tmp/file.pdf", }); expect(sendMessage).toHaveBeenLastCalledWith( "+1555", "doc", buf, "application/pdf", ); }); });