import { describe, expect, it, vi } from "vitest"; import { issuePairingChallenge } from "./pairing-challenge.js"; describe("issuePairingChallenge", () => { it("creates and sends a pairing reply when request is newly created", async () => { const sent: string[] = []; const result = await issuePairingChallenge({ channel: "telegram", senderId: "123", senderIdLine: "Your Telegram user id: 123", upsertPairingRequest: async () => ({ code: "ABCD", created: true }), sendPairingReply: async (text) => { sent.push(text); }, }); expect(result).toEqual({ created: true, code: "ABCD" }); expect(sent).toHaveLength(1); expect(sent[0]).toContain("ABCD"); }); it("does not send a reply when request already exists", async () => { const sendPairingReply = vi.fn(async () => {}); const result = await issuePairingChallenge({ channel: "telegram", senderId: "123", senderIdLine: "Your Telegram user id: 123", upsertPairingRequest: async () => ({ code: "ABCD", created: false }), sendPairingReply, }); expect(result).toEqual({ created: false }); expect(sendPairingReply).not.toHaveBeenCalled(); }); it("supports custom reply text builder", async () => { const sent: string[] = []; await issuePairingChallenge({ channel: "line", senderId: "u1", senderIdLine: "Your line id: u1", upsertPairingRequest: async () => ({ code: "ZXCV", created: true }), buildReplyText: ({ code }) => `custom ${code}`, sendPairingReply: async (text) => { sent.push(text); }, }); expect(sent).toEqual(["custom ZXCV"]); }); it("calls onCreated and forwards meta to upsert", async () => { const onCreated = vi.fn(); const upsert = vi.fn(async () => ({ code: "1111", created: true })); await issuePairingChallenge({ channel: "discord", senderId: "42", senderIdLine: "Your Discord user id: 42", meta: { name: "alice" }, upsertPairingRequest: upsert, onCreated, sendPairingReply: async () => {}, }); expect(upsert).toHaveBeenCalledWith({ id: "42", meta: { name: "alice" } }); expect(onCreated).toHaveBeenCalledWith({ code: "1111" }); }); it("captures reply errors through onReplyError", async () => { const onReplyError = vi.fn(); const result = await issuePairingChallenge({ channel: "signal", senderId: "+1555", senderIdLine: "Your Signal sender id: +1555", upsertPairingRequest: async () => ({ code: "9999", created: true }), sendPairingReply: async () => { throw new Error("send failed"); }, onReplyError, }); expect(result).toEqual({ created: true, code: "9999" }); expect(onReplyError).toHaveBeenCalledTimes(1); }); });