Spaces:
Paused
Paused
| import { beforeEach, describe, expect, it, vi } from "vitest"; | |
| import { checkInboundAccessControl } from "./access-control.js"; | |
| const sendMessageMock = vi.fn(); | |
| const readAllowFromStoreMock = vi.fn(); | |
| const upsertPairingRequestMock = vi.fn(); | |
| let config: Record<string, unknown> = {}; | |
| vi.mock("../../config/config.js", async (importOriginal) => { | |
| const actual = await importOriginal<typeof import("../../config/config.js")>(); | |
| return { | |
| ...actual, | |
| loadConfig: () => config, | |
| }; | |
| }); | |
| vi.mock("../../pairing/pairing-store.js", () => ({ | |
| readChannelAllowFromStore: (...args: unknown[]) => readAllowFromStoreMock(...args), | |
| upsertChannelPairingRequest: (...args: unknown[]) => upsertPairingRequestMock(...args), | |
| })); | |
| beforeEach(() => { | |
| config = { | |
| channels: { | |
| whatsapp: { | |
| dmPolicy: "pairing", | |
| allowFrom: [], | |
| }, | |
| }, | |
| }; | |
| sendMessageMock.mockReset().mockResolvedValue(undefined); | |
| readAllowFromStoreMock.mockReset().mockResolvedValue([]); | |
| upsertPairingRequestMock.mockReset().mockResolvedValue({ code: "PAIRCODE", created: true }); | |
| }); | |
| describe("checkInboundAccessControl", () => { | |
| it("suppresses pairing replies for historical DMs on connect", async () => { | |
| const connectedAtMs = 1_000_000; | |
| const messageTimestampMs = connectedAtMs - 31_000; | |
| const result = await checkInboundAccessControl({ | |
| accountId: "default", | |
| from: "+15550001111", | |
| selfE164: "+15550009999", | |
| senderE164: "+15550001111", | |
| group: false, | |
| pushName: "Sam", | |
| isFromMe: false, | |
| messageTimestampMs, | |
| connectedAtMs, | |
| pairingGraceMs: 30_000, | |
| sock: { sendMessage: sendMessageMock }, | |
| remoteJid: "15550001111@s.whatsapp.net", | |
| }); | |
| expect(result.allowed).toBe(false); | |
| expect(upsertPairingRequestMock).not.toHaveBeenCalled(); | |
| expect(sendMessageMock).not.toHaveBeenCalled(); | |
| }); | |
| it("sends pairing replies for live DMs", async () => { | |
| const connectedAtMs = 1_000_000; | |
| const messageTimestampMs = connectedAtMs - 10_000; | |
| const result = await checkInboundAccessControl({ | |
| accountId: "default", | |
| from: "+15550001111", | |
| selfE164: "+15550009999", | |
| senderE164: "+15550001111", | |
| group: false, | |
| pushName: "Sam", | |
| isFromMe: false, | |
| messageTimestampMs, | |
| connectedAtMs, | |
| pairingGraceMs: 30_000, | |
| sock: { sendMessage: sendMessageMock }, | |
| remoteJid: "15550001111@s.whatsapp.net", | |
| }); | |
| expect(result.allowed).toBe(false); | |
| expect(upsertPairingRequestMock).toHaveBeenCalled(); | |
| expect(sendMessageMock).toHaveBeenCalled(); | |
| }); | |
| }); | |