aboutsummaryrefslogtreecommitdiff
path: root/services/docker/mail-server/relay/mail.test.ts
diff options
context:
space:
mode:
Diffstat (limited to 'services/docker/mail-server/relay/mail.test.ts')
-rw-r--r--services/docker/mail-server/relay/mail.test.ts83
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,
- });
});
});