11ty-plugin-giallo/test/giallo-js.test.js
2026-01-23 19:48:31 +00:00

66 lines
4.4 KiB
JavaScript

import markdownHighlighter from "../src/giallo-markdown.js";
const DEFAULT_OPTIONS = {
themeLight: "github-light",
themeDark: "github-dark",
};
const SNIPPET_JS = `
import { readFile } from "node:fs";
/**
* Print contents of a file.
*/
export default async function printFile(path) {
const text = await readFile(path, "utf-8");
console.log(text);
}
`;
const RENDERED_JS =
`<pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);"><code data-lang="javascript"><span class="giallo-l"></span>
<span class="giallo-l"><span style="color: light-dark(#D73A49, #F97583);">import</span><span> {</span><span> readFile</span><span> }</span><span style="color: light-dark(#D73A49, #F97583);"> from</span><span style="color: light-dark(#032F62, #9ECBFF);"> &quot;</span><span style="color: light-dark(#032F62, #9ECBFF);">node:fs</span><span style="color: light-dark(#032F62, #9ECBFF);">&quot;</span><span>;</span></span>
<span class="giallo-l"></span>
<span class="giallo-l"><span style="color: light-dark(#6A737D, #6A737D);">/**</span></span>
<span class="giallo-l"><span style="color: light-dark(#6A737D, #6A737D);"> * Print contents of a file.</span></span>
<span class="giallo-l"><span style="color: light-dark(#6A737D, #6A737D);"> */</span></span>
<span class="giallo-l"><span style="color: light-dark(#D73A49, #F97583);">export</span><span style="color: light-dark(#D73A49, #F97583);"> default</span><span style="color: light-dark(#D73A49, #F97583);"> async</span><span style="color: light-dark(#D73A49, #F97583);"> function</span><span style="color: light-dark(#6F42C1, #B392F0);"> printFile</span><span>(</span><span style="color: light-dark(#E36209, #FFAB70);">path</span><span>)</span><span> {</span></span>
<span class="giallo-l"><span style="color: light-dark(#D73A49, #F97583);"> const</span><span style="color: light-dark(#005CC5, #79B8FF);"> text</span><span style="color: light-dark(#D73A49, #F97583);"> =</span><span style="color: light-dark(#D73A49, #F97583);"> await</span><span style="color: light-dark(#6F42C1, #B392F0);"> readFile</span><span>(</span><span>path</span><span>,</span><span style="color: light-dark(#032F62, #9ECBFF);"> &quot;</span><span style="color: light-dark(#032F62, #9ECBFF);">utf-8</span><span style="color: light-dark(#032F62, #9ECBFF);">&quot;</span><span>)</span><span>;</span></span>
<span class="giallo-l"><span> console</span><span>.</span><span style="color: light-dark(#6F42C1, #B392F0);">log</span><span>(</span><span>text</span><span>)</span><span>;</span></span>
<span class="giallo-l"><span>}</span></span></code></pre>`;
const RENDERED_JS_PLAIN =
`<pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);"><code data-lang="plain"><span class="giallo-l"></span>
<span class="giallo-l"><span>import { readFile } from &quot;node:fs&quot;;</span></span>
<span class="giallo-l"></span>
<span class="giallo-l"><span>/**</span></span>
<span class="giallo-l"><span> * Print contents of a file.</span></span>
<span class="giallo-l"><span> */</span></span>
<span class="giallo-l"><span>export default async function printFile(path) {</span></span>
<span class="giallo-l"><span> const text = await readFile(path, &quot;utf-8&quot;);</span></span>
<span class="giallo-l"><span> console.log(text);</span></span>
<span class="giallo-l"><span>}</span></span></code></pre>`;
const SNIPPET_PY = `print(f"<a>{my_fn('')}</a>")`;
test("renders Javascript code as arbitrary HTML", () => {
const configuredHighlighter = markdownHighlighter(DEFAULT_OPTIONS);
const rendered = configuredHighlighter(SNIPPET_JS, "javascript");
expect(rendered).toContain("<");
});
test("renders Javascript code as expected HTML", () => {
const configuredHighlighter = markdownHighlighter(DEFAULT_OPTIONS);
const rendered = configuredHighlighter(SNIPPET_JS, "javascript");
expect(rendered).toEqual(RENDERED_JS);
});
test("treats unknown language as plain", () => {
const configuredHighlighter = markdownHighlighter(DEFAULT_OPTIONS);
const rendered = configuredHighlighter(SNIPPET_JS, "piedpiperscript");
expect(rendered).toEqual(RENDERED_JS_PLAIN);
});
test("escapes embedded HTML", () => {
const configuredHighlighter = markdownHighlighter(DEFAULT_OPTIONS);
const rendered = configuredHighlighter(SNIPPET_PY, "python");
expect(rendered).toContain("&lt;a&gt;");
});