Ctrl K
ComunidadGuías…

test/fonts-manifest.test.js

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
import { test } from "node:test";
import assert from "node:assert/strict";
import { readFile } from "node:fs/promises";
import path from "node:path";
import { fileURLToPath } from "node:url";
import { listThemes, loadTheme } from "../src/theme.js";

/**
 * The font manifest against the themes it claims to serve.
 *
 * `tools/fonts.manifest.json` drives `install-fonts.mjs`, and its `used_by`
 * field is documentation the install step never reads — so nothing noticed when
 * it stopped being true. It had drifted on eighteen of twenty-seven families
 * and listed six that no theme used at all, which is six typefaces downloaded
 * and installed on every machine and in every container for nothing.
 *
 * Wrong documentation is worse than none: the field's whole purpose is to say
 * which themes break if a family is dropped, and answering that wrongly is how
 * a family gets dropped.
 */

const ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");

async function familiesInUse() {
  const byFamily = new Map();
  for (const name of await listThemes()) {
    const theme = await loadTheme(name);
    for (const token of Object.values(theme.type ?? {})) {
      if (!token?.family) continue;
      if (!byFamily.has(token.family)) byFamily.set(token.family, new Set());
      byFamily.get(token.family).add(name);
    }
  }
  return byFamily;
}

const manifest = JSON.parse(await readFile(path.join(ROOT, "tools", "fonts.manifest.json"), "utf8"));

test("every family the themes ask for is in the manifest", async () => {
  // This is the direction that breaks a render: a theme naming a face nothing
  // installs falls back to DejaVu and the slide is quietly the wrong typeface.
  const inUse = await familiesInUse();
  const missing = [...inUse.keys()].filter((f) => !manifest.families[f]).sort();
  assert.deepEqual(missing, [], "a theme names a family the install step never fetches");
});

test("the manifest carries no family no theme uses", async () => {
  const inUse = await familiesInUse();
  const spare = Object.keys(manifest.families).filter((f) => !inUse.has(f)).sort();
  assert.deepEqual(spare, [], "these are downloaded and installed everywhere for nothing");
});

test("used_by names exactly the themes that use the family", async () => {
  // Derived, never hand-written. It drifted on eighteen of twenty-seven
  // families precisely because it was maintained by hand and read by nobody.
  const inUse = await familiesInUse();
  const wrong = [];
  for (const [family, spec] of Object.entries(manifest.families)) {
    const actual = [...(inUse.get(family) ?? [])].sort();
    const declared = [...(spec.used_by ?? [])].sort();
    if (actual.join(",") !== declared.join(",")) {
      wrong.push(`${family}: declared [${declared.join(", ")}] but used by [${actual.join(", ")}]`);
    }
  }
  assert.deepEqual(wrong, [], "used_by has drifted from the themes");
});