-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Expand file tree
/
Copy pathemail-templates.test.ts
More file actions
111 lines (88 loc) · 4.11 KB
/
Copy pathemail-templates.test.ts
File metadata and controls
111 lines (88 loc) · 4.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
/**
* System email builder tests: the builders default to English
* and render injected localized copy verbatim (text) / escaped (HTML).
*/
import { describe, expect, it } from "vitest";
import { buildInviteEmail, localeDir, type InviteEmailStrings } from "./invite.js";
import { buildMagicLinkEmail, type MagicLinkEmailStrings } from "./magic-link/index.js";
const URL = "https://example.com/_emdash/admin/invite/accept?token=abc";
describe("localeDir", () => {
it("flags RTL primary subtags as rtl", () => {
expect(localeDir("ar")).toBe("rtl");
expect(localeDir("fa-IR")).toBe("rtl");
expect(localeDir("he")).toBe("rtl");
});
it("treats LTR and empty locales as ltr", () => {
expect(localeDir("en")).toBe("ltr");
expect(localeDir("de-CH")).toBe("ltr");
expect(localeDir("")).toBe("ltr");
});
});
describe("buildInviteEmail", () => {
it("defaults to English copy with the site name interpolated", () => {
const message = buildInviteEmail(URL, "new@example.com", "Acme");
expect(message.to).toBe("new@example.com");
expect(message.subject).toBe("You've been invited to Acme");
expect(message.text).toContain("You've been invited to join Acme.");
expect(message.text).toContain(URL);
expect(message.html).toContain("Accept Invite");
});
it("renders injected localized copy", () => {
const strings: InviteEmailStrings = {
subject: "Du wurdest zu Acme eingeladen",
textIntro: "Du wurdest eingeladen, Acme beizutreten.",
textLinkInstruction: "Klicke auf diesen Link, um dein Konto zu erstellen:",
htmlInstruction: "Klicke auf den Button unten, um dein Konto zu erstellen:",
buttonLabel: "Einladung annehmen",
expiryNote: "Dieser Link läuft in 7 Tagen ab.",
};
const message = buildInviteEmail(URL, "new@example.com", "Acme", strings);
expect(message.subject).toBe("Du wurdest zu Acme eingeladen");
expect(message.text).toContain("Du wurdest eingeladen, Acme beizutreten.");
expect(message.text).toContain(URL);
expect(message.html).toContain("Einladung annehmen");
expect(message.html).not.toContain("Accept Invite");
});
it("HTML-escapes localized strings (site names and translations are untrusted)", () => {
const message = buildInviteEmail(URL, "new@example.com", `<b>"Acme"</b>`);
expect(message.html).toContain("<b>"Acme"</b>");
expect(message.html).not.toContain(`<b>"Acme"</b>`);
});
it("sets lang/dir on the root element when a locale is provided (RTL)", () => {
const message = buildInviteEmail(URL, "new@example.com", "Acme", undefined, "ar");
expect(message.html).toContain('<html lang="ar" dir="rtl">');
});
it("omits lang/dir when no locale is provided (defaults to ltr)", () => {
const message = buildInviteEmail(URL, "new@example.com", "Acme");
expect(message.html).toContain("<html>");
expect(message.html).not.toContain("dir=");
});
});
describe("buildMagicLinkEmail", () => {
it("defaults to English copy with the site name interpolated", () => {
const message = buildMagicLinkEmail(URL, "user@example.com", "Acme");
expect(message.subject).toBe("Sign in to Acme");
expect(message.text).toContain("Click this link to sign in to Acme:");
expect(message.text).toContain(URL);
expect(message.html).toContain("Sign in");
});
it("renders injected localized copy", () => {
const strings: MagicLinkEmailStrings = {
subject: "Bei Acme anmelden",
textLinkInstruction: "Klicke auf diesen Link, um dich bei Acme anzumelden:",
htmlInstruction: "Klicke auf den Button unten, um dich anzumelden:",
buttonLabel: "Anmelden",
expiryNote: "Dieser Link läuft in 15 Minuten ab.",
ignoreNote: "Wenn du das nicht angefordert hast, kannst du diese E-Mail ignorieren.",
};
const message = buildMagicLinkEmail(URL, "user@example.com", "Acme", strings);
expect(message.subject).toBe("Bei Acme anmelden");
expect(message.text).toContain(URL);
expect(message.html).toContain("Anmelden");
expect(message.html).not.toContain("Sign in to Acme");
});
it("HTML-escapes localized strings", () => {
const message = buildMagicLinkEmail(URL, "user@example.com", `<script>Acme</script>`);
expect(message.html).not.toContain("<script>");
});
});