import { test } from "node:test";
import assert from "node:assert/strict";
import { mkdir, mkdtemp, readFile, writeFile } from "node:fs/promises";
import os from "node:os";
import path from "node:path";
import type { Paths } from "./paths";
import { getHomepageConfig, parseHomepageConfig, writeHomepageConfig } from "./homepage";
// homepage.json's `transcriptDownloads` follows site.json's: opt-out, read as
// off only on an explicit false, written only when false.
test("transcriptDownloads is off only when explicitly false", () => {
for (const v of [undefined, true, 0, "false", null]) {
assert.equal(
parseHomepageConfig({ transcriptDownloads: v }).transcriptDownloads,
undefined,
String(v),
);
}
assert.equal(parseHomepageConfig({ transcriptDownloads: false }).transcriptDownloads, false);
assert.equal(parseHomepageConfig({}).transcriptDownloads, undefined);
});
function scratchPaths(dir: string): Paths {
return { homepageConfigFile: path.join(dir, "_homepage", "homepage.json") } as Paths;
}
test("writeHomepageConfig persists transcriptDownloads only when false, and it round-trips", async () => {
const paths = scratchPaths(await mkdtemp(path.join(os.tmpdir(), "homepage-")));
const base = parseHomepageConfig({ siteTitle: "Hub" });
await writeHomepageConfig({ ...base, transcriptDownloads: false }, paths);
let disk = JSON.parse(await readFile(paths.homepageConfigFile, "utf8"));
assert.equal(disk.transcriptDownloads, false);
assert.equal(getHomepageConfig(paths).transcriptDownloads, false);
await writeHomepageConfig({ ...base, transcriptDownloads: undefined }, paths);
disk = JSON.parse(await readFile(paths.homepageConfigFile, "utf8"));
assert.equal("transcriptDownloads" in disk, false);
assert.equal(getHomepageConfig(paths).transcriptDownloads, undefined);
// A true is the default, so it is not written either.
await writeHomepageConfig({ ...base, transcriptDownloads: true }, paths);
disk = JSON.parse(await readFile(paths.homepageConfigFile, "utf8"));
assert.equal("transcriptDownloads" in disk, false);
});
test("writeHomepageConfig keeps an unchanged stored icon the checker now refuses, and checks an edited one", async () => {
const paths = scratchPaths(await mkdtemp(path.join(os.tmpdir(), "homepage-")));
const old = { label: "Old", url: "https://old.example", svg: `` };
await mkdir(path.dirname(paths.homepageConfigFile), { recursive: true });
await writeFile(paths.homepageConfigFile, JSON.stringify({ socialLinks: [old] }));
const base = getHomepageConfig(paths);
await writeHomepageConfig({ ...base, siteTitle: "Renamed" }, paths);
assert.deepEqual(JSON.parse(await readFile(paths.homepageConfigFile, "utf8")).socialLinks, [old]);
await assert.rejects(
writeHomepageConfig({ ...base, socialLinks: [{ ...old, svg: `` }] }, paths),
/Social link "Old" has an invalid SVG: it has a script/,
);
});