Files
fusion/packages/dashboard/app/__tests__/text-token-canonicalization.test.ts
Fusion 8b93d89071 test(FN-4286): use css fixture in text token regression guard
Fusion-Task-Id: FN-4286
Fusion-Task-Lineage: 1dd74ee2-7fb2-4b41-b923-a9f339521b50
2026-05-13 10:00:00 -07:00

52 lines
2.0 KiB
TypeScript

// Regression guard for FN-4286 follow-up to FN-4195: prevent reintroducing undefined --text-secondary.
import { readFileSync, readdirSync, statSync } from "node:fs";
import path from "node:path";
import { describe, expect, it } from "vitest";
import { loadStylesCss } from "../test/cssFixture";
const APP_ROOT = path.resolve(__dirname, "..");
const ALLOWLIST = new Set([
"__tests__/text-token-canonicalization.test.ts",
"__tests__/agent-css-classes.test.ts",
]);
function collectSourceFiles(dir: string): string[] {
const out: string[] = [];
for (const entry of readdirSync(dir)) {
if (entry === "node_modules" || entry === "dist") continue;
const fullPath = path.join(dir, entry);
const relPath = path.relative(APP_ROOT, fullPath).split(path.sep).join("/");
const stats = statSync(fullPath);
if (stats.isDirectory()) {
out.push(...collectSourceFiles(fullPath));
continue;
}
if (/\.(css|tsx?|ts)$/.test(entry)) out.push(relPath);
}
return out;
}
describe("text token canonicalization", () => {
it("keeps --text-secondary out of dashboard source files", () => {
const offenders: string[] = [];
for (const relPath of collectSourceFiles(APP_ROOT)) {
if (ALLOWLIST.has(relPath)) continue;
const content = readFileSync(path.join(APP_ROOT, relPath), "utf8");
if (content.includes("--text-secondary")) offenders.push(relPath);
}
expect(offenders, `Unexpected --text-secondary references in: ${offenders.join(", ")}`).toEqual([]);
});
it("defines canonical text tokens and does not define --text-secondary at :root", () => {
const stylesCss = loadStylesCss();
const rootBlocks = [...stylesCss.matchAll(/:root\s*\{([\s\S]*?)\}/g)].map((match) => match[1]);
expect(rootBlocks.length).toBeGreaterThan(0);
const allRootContent = rootBlocks.join("\n");
expect(allRootContent).not.toMatch(/^\s*--text-secondary\s*:/m);
expect(allRootContent).toMatch(/^\s*--text-muted\s*:/m);
expect(allRootContent).toMatch(/^\s*--text-dim\s*:/m);
});
});