import "../setup.ts";
import {
assert,
assertEquals,
assertFalse,
assertStringIncludes,
} from "@std/assert";
import { EmailKit, esc } from "../../mail/layout.ts";
import { EMAIL_STYLES } from "../../mail/styles.ts";
import { STYLE_NAMES } from "../../../shared/theme.ts";
const doc = (kit: EmailKit) =>
kit.document({
subject: "S <1>",
preheader: "P & Q",
title: "T",
body: kit.para("body"),
footer: kit.footer("why", [["Settings", "https://x.test/?a=1&b=2"]]),
});
Deno.test("esc: user text never becomes markup", () => {
assertEquals(
esc(`'&'`),
"<b a="1">'&'</b>",
);
});
Deno.test("EmailKit: auto inlines light and recolors in a dark media block", () => {
const html = doc(new EmailKit({ style: "smooth", scheme: "auto" }, "en"));
const { light, dark } = EMAIL_STYLES.smooth;
assertStringIncludes(html, `background-color:${light.card}`);
assertStringIncludes(html, "@media (prefers-color-scheme:dark)");
assertStringIncludes(
html,
`.b-card{background-color:${dark.card}!important}`,
);
assertStringIncludes(html, `content="light dark"`);
// The subject, preheader and link are escaped where they land.
assertStringIncludes(html, "
S <1>");
assertStringIncludes(html, "P & Q");
assertStringIncludes(html, `href="https://x.test/?a=1&b=2"`);
});
Deno.test("EmailKit: a chosen scheme is the only one sent", () => {
const { light, dark } = EMAIL_STYLES.kanagawa;
const darkHtml = doc(
new EmailKit({ style: "kanagawa", scheme: "dark" }, "en"),
);
assertStringIncludes(darkHtml, `background-color:${dark.card}`);
assertFalse(darkHtml.includes(light.card));
assertFalse(darkHtml.includes("prefers-color-scheme"));
assertStringIncludes(darkHtml, `content="dark"`);
const lightHtml = doc(
new EmailKit({ style: "kanagawa", scheme: "light" }, "fr"),
);
assertStringIncludes(lightHtml, `background-color:${light.card}`);
assertStringIncludes(lightHtml, ``);
assertFalse(lightHtml.includes("prefers-color-scheme"));
});
Deno.test("EmailKit: every style draws its own card and font", () => {
for (const name of STYLE_NAMES) {
const style = EMAIL_STYLES[name];
const html = doc(new EmailKit({ style: name, scheme: "light" }, "en"));
assertStringIncludes(html, `background-color:${style.light.card}`);
assertStringIncludes(html, `font-family:${style.font}`);
assertEquals(html.includes("fonts.googleapis.com"), !!style.webFont, name);
}
// The rainbow and the hard shadow are what GeoCities and Brutalist look like.
const geo = new EmailKit({ style: "geocities", scheme: "light" }, "en");
assertStringIncludes(
geo.section("A", "", false),
"linear-gradient(90deg,#ff004d",
);
const brutal = doc(
new EmailKit({ style: "brutalist", scheme: "light" }, "en"),
);
assert(brutal.includes("box-shadow:5px 5px 0"));
});