Spaces:
Sleeping
Sleeping
| import { beforeEach, describe, expect, it, vi } from "vitest"; | |
| const loadSendMessageIMessage = async () => await import("./send.js"); | |
| const requestMock = vi.fn(); | |
| const stopMock = vi.fn(); | |
| vi.mock("../config/config.js", async (importOriginal) => { | |
| const actual = await importOriginal<typeof import("../config/config.js")>(); | |
| return { | |
| ...actual, | |
| loadConfig: () => ({}), | |
| }; | |
| }); | |
| vi.mock("./client.js", () => ({ | |
| createIMessageRpcClient: vi.fn().mockResolvedValue({ | |
| request: (...args: unknown[]) => requestMock(...args), | |
| stop: (...args: unknown[]) => stopMock(...args), | |
| }), | |
| })); | |
| vi.mock("../web/media.js", () => ({ | |
| loadWebMedia: vi.fn().mockResolvedValue({ | |
| buffer: Buffer.from("data"), | |
| contentType: "image/jpeg", | |
| }), | |
| })); | |
| vi.mock("../media/store.js", () => ({ | |
| saveMediaBuffer: vi.fn().mockResolvedValue({ | |
| path: "/tmp/imessage-media.jpg", | |
| contentType: "image/jpeg", | |
| }), | |
| })); | |
| describe("sendMessageIMessage", () => { | |
| beforeEach(() => { | |
| requestMock.mockReset().mockResolvedValue({ ok: true }); | |
| stopMock.mockReset().mockResolvedValue(undefined); | |
| vi.resetModules(); | |
| }); | |
| it("sends to chat_id targets", async () => { | |
| const { sendMessageIMessage } = await loadSendMessageIMessage(); | |
| await sendMessageIMessage("chat_id:123", "hi"); | |
| const params = requestMock.mock.calls[0]?.[1] as Record<string, unknown>; | |
| expect(requestMock).toHaveBeenCalledWith("send", expect.any(Object), expect.any(Object)); | |
| expect(params.chat_id).toBe(123); | |
| expect(params.text).toBe("hi"); | |
| }); | |
| it("applies sms service prefix", async () => { | |
| const { sendMessageIMessage } = await loadSendMessageIMessage(); | |
| await sendMessageIMessage("sms:+1555", "hello"); | |
| const params = requestMock.mock.calls[0]?.[1] as Record<string, unknown>; | |
| expect(params.service).toBe("sms"); | |
| expect(params.to).toBe("+1555"); | |
| }); | |
| it("adds file attachment with placeholder text", async () => { | |
| const { sendMessageIMessage } = await loadSendMessageIMessage(); | |
| await sendMessageIMessage("chat_id:7", "", { mediaUrl: "http://x/y.jpg" }); | |
| const params = requestMock.mock.calls[0]?.[1] as Record<string, unknown>; | |
| expect(params.file).toBe("/tmp/imessage-media.jpg"); | |
| expect(params.text).toBe("<media:image>"); | |
| }); | |
| it("returns message id when rpc provides one", async () => { | |
| requestMock.mockResolvedValue({ ok: true, id: 123 }); | |
| const { sendMessageIMessage } = await loadSendMessageIMessage(); | |
| const result = await sendMessageIMessage("chat_id:7", "hello"); | |
| expect(result.messageId).toBe("123"); | |
| }); | |
| }); | |