import { describe, expect, it, beforeEach, afterEach } from "vitest";
import {
escapeHtml,
emailParagraph,
emailButton,
wrapInEmailTemplate,
} from "~/lib/email.server";
describe("escapeHtml", () => {
it("escapes all five special characters", () => {
expect(escapeHtml('&<>"\'')).toBe("&<>"'");
});
it("leaves safe strings unchanged", () => {
expect(escapeHtml("Hello World")).toBe("Hello World");
});
});
describe("emailParagraph", () => {
it("wraps content in a
tag", () => {
const result = emailParagraph("Hello");
expect(result).toContain("
");
});
it("passes HTML through unescaped (caller is responsible for escaping)", () => {
const result = emailParagraph('link');
expect(result).toContain('');
});
});
describe("emailButton", () => {
it("contains the href and button text", () => {
const result = emailButton("https://example.com/verify", "Verify My Email");
expect(result).toContain("https://example.com/verify");
expect(result).toContain("Verify My Email");
});
it("renders a table-wrapped anchor for Outlook compatibility", () => {
const result = emailButton("https://example.com", "Click me");
expect(result).toContain("
{
const originalAppUrl = process.env.APP_URL;
beforeEach(() => {
process.env.APP_URL = "https://test.brackt.com";
});
afterEach(() => {
if (originalAppUrl === undefined) {
delete process.env.APP_URL;
} else {
process.env.APP_URL = originalAppUrl;
}
});
it("returns a complete HTML document", () => {
const result = wrapInEmailTemplate("Body
");
expect(result).toContain("");
expect(result).toContain("");
});
it("injects the content into the template", () => {
const result = wrapInEmailTemplate("My content
");
expect(result).toContain("My content
");
});
it("includes the preheader text when provided", () => {
const result = wrapInEmailTemplate("Body
", "Preview text here");
expect(result).toContain("Preview text here");
});
it("omits the preheader span when not provided", () => {
const result = wrapInEmailTemplate("Body
");
expect(result).not.toContain("mso-hide:all");
});
it("uses APP_URL for the logo src", () => {
const result = wrapInEmailTemplate("Body
");
expect(result).toContain("https://test.brackt.com/email-logo.png");
});
it("falls back to brackt.com when APP_URL is not set", () => {
delete process.env.APP_URL;
const result = wrapInEmailTemplate("Body
");
expect(result).toContain("https://brackt.com/email-logo.png");
});
it("escapes preheader text to prevent injection", () => {
const result = wrapInEmailTemplate("Body
", "");
expect(result).not.toContain("