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/, ); });