86 lines
2.6 KiB
TypeScript
86 lines
2.6 KiB
TypeScript
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();
|
|
});
|
|
});
|