diff options
Diffstat (limited to 'services/docker/mail-server/relay/mail.test.ts')
-rw-r--r-- | services/docker/mail-server/relay/mail.test.ts | 83 |
1 files changed, 59 insertions, 24 deletions
diff --git a/services/docker/mail-server/relay/mail.test.ts b/services/docker/mail-server/relay/mail.test.ts index b734c70..1741efc 100644 --- a/services/docker/mail-server/relay/mail.test.ts +++ b/services/docker/mail-server/relay/mail.test.ts @@ -3,28 +3,50 @@ import { expect, fn } from "@std/expect"; import { Mail, MailDeliverer } from "./mail.ts"; -describe("Mail", () => { - const mockDate = "Fri, 02 May 2025 08:33:02 +0000"; - const mockBodyStr = `This is body content. +const mockDate = "Fri, 02 May 2025 08:33:02 +0000"; +const mockBodyStr = `This is body content. Line 2 Line 4`; - const mockHeaders = [ - ["Content-Disposition", "inline"], - ["Content-Transfer-Encoding", "quoted-printable"], - ["MIME-Version", "1.0"], - ["X-Mailer", "MIME-tools 5.509 (Entity 5.509)"], - ["Content-Type", "text/plain; charset=utf-8"], - ["From", '"Mock From" <mock@from.mock>'], - ["To", "Mock To <mock@to.mock>"], - ["CC", "Mock CC <mock@cc.mock"], - ["Subject", "A very long mock\n subject"], - ["Message-ID", "<abcdef@from.mock>"], - ["Date", mockDate], - ]; - const mockHeaderStr = mockHeaders.map((h) => h[0] + ": " + h[1]).join("\n"); - const mockMailStr = mockHeaderStr + "\n\n" + mockBodyStr; +const mockHeaders = [ + ["Content-Disposition", "inline"], + ["Content-Transfer-Encoding", "quoted-printable"], + ["MIME-Version", "1.0"], + ["X-Mailer", "MIME-tools 5.509 (Entity 5.509)"], + ["Content-Type", "text/plain; charset=utf-8"], + ["From", '"Mock From" <mock@from.mock>'], + [ + "To", + `"John \\"Big\\" Doe" <john@example.com>, "Alice (Work)" <alice+work@example.com>, + undisclosed-recipients:;, "Group: Team" <team@company.com>, + "Escaped, Name" <escape@test.com>, just@email.com, + "Comment (This is valid)" <comment@domain.net>, + "Odd @Chars" <weird!#$%'*+-/=?^_\`{|}~@char-test.com>, + "Non-ASCII 用户" <user@例子.中国>, + admin@[192.168.1.1]`, + ], + ["CC", "Mock CC <mock@cc.mock>"], + ["Subject", "A very long mock\n subject"], + ["Message-ID", "<abcdef@from.mock>"], + ["Date", mockDate], +]; +const mockHeaderStr = mockHeaders.map((h) => h[0] + ": " + h[1]).join("\n"); +const mockMailStr = mockHeaderStr + "\n\n" + mockBodyStr; +const mockCrlfMailStr = mockMailStr.replaceAll("\n", "\r\n"); +const mockToAddresses = [ + "john@example.com", + "alice+work@example.com", + "team@company.com", + "escape@test.com", + "just@email.com", + "comment@domain.net", + "weird!#$%'*+-/=?^_`{|}~@char-test.com", + "user@例子.中国", + "admin@[192.168.1.1]", +]; +const mockCcAddresses = ["mock@cc.mock"]; +describe("Mail", () => { it("simple parse", () => { const parsed = new Mail(mockMailStr).simpleParse(); expect(parsed.sections.header).toEqual(mockHeaderStr); @@ -33,6 +55,12 @@ Line 4`; expect(parsed.eol).toBe("\n"); }); + it("simple parse crlf", () => { + const parsed = new Mail(mockCrlfMailStr).simpleParse(); + expect(parsed.sep).toBe("\r\n"); + expect(parsed.eol).toBe("\r\n"); + }); + it("simple parse date", () => { expect(new Mail(mockMailStr).simpleParseDate()).toEqual(new Date(mockDate)); }); @@ -59,6 +87,18 @@ Line 4`; "\n\n" + mockBodyStr, ); }); + + it("parse receipts", () => { + const mail = new Mail(mockMailStr); + expect(mail.simpleParseReceipts()).toEqual([ + ...mockToAddresses, + ...mockCcAddresses, + ]); + expect(mail.simpleParseReceipts({domain: "example.com"})).toEqual([ + ...mockToAddresses, + ...mockCcAddresses, + ].filter(a => a.endsWith("example.com"))); + }); }); describe("MailDeliverer", () => { @@ -69,12 +109,7 @@ describe("MailDeliverer", () => { const mockDeliverer = new MockMailDeliverer(); it("deliver success", async () => { - const mail = await mockDeliverer.deliverRaw("mock mail"); + await mockDeliverer.deliverRaw(mockMailStr); expect(mockDeliverer.doDeliver).toHaveBeenCalledTimes(1); - expect(mail.deliverState).toEqual({ - kind: "delivered", - error: undefined, - deliverer: mockDeliverer, - }); }); }); |