import { describe, expect, mock, test } from "bun:test";
const handled: string[] = [];
mock.module("./abuse-email", () => ({
handleAbuseEmail: async (message: { to: string }) => handled.push(`abuse:${message.to}`),
}));
mock.module("./email-reply", () => ({
isReplyAddress: (address: string) => address.toLowerCase().startsWith("reply+"),
handleReplyEmail: async (message: { to: string }) => handled.push(`reply:${message.to}`),
}));
const { routeInboundEmail } = await import("./inbound-email");
function message(to: string) {
const rejected: string[] = [];
return { to, rejected, setReject: (reason: string) => rejected.push(reason) };
}
describe("routeInboundEmail", () => {
test("routes abuse@, its subaddresses and thread replies, and rejects anything else", async () => {
for (const to of ["abuse@gitfor.dev", "Abuse+dmca@gitfor.dev", "reply+abc@mail.gitfor.dev"]) {
await routeInboundEmail(message(to) as unknown as ForwardableEmailMessage);
}
expect(handled).toEqual([
"abuse:abuse@gitfor.dev",
"abuse:Abuse+dmca@gitfor.dev",
"reply:reply+abc@mail.gitfor.dev",
]);
for (const to of ["abusers@gitfor.dev", "support@gitfor.dev"]) {
const stray = message(to);
await routeInboundEmail(stray as unknown as ForwardableEmailMessage);
expect(stray.rejected).toEqual(["Unknown address"]);
}
});
});