import { test } from "node:test";
import assert from "node:assert/strict";
import { computeDistStaleness, formatDistStalenessWarning } from "../lib/dist-freshness.mjs";
/*
FNXC:DevWorkflow 2026-06-18-16:50:
FN-6638 stale-dist guard tests. Verifies the startup freshness check flags a
src-ahead-of-dist build, stays quiet when fresh, and never false-positives for
pure-source (no dist) or packaged (no src) layouts.
*/
// In-memory fs seam: paths are exact strings; dirs list children; files carry mtimeMs.
function makeFs({ dirs, files }) {
const dirSet = new Set(dirs);
// files: { "
": [{ name, mtimeMs, isDir? }] } keyed by parent dir
return {
existsSync: (p) => dirSet.has(p),
readdirSync: (dir) =>
(files[dir] ?? []).map((e) => ({
name: e.name,
isDirectory: () => Boolean(e.isDir),
})),
statSync: (p) => {
// p is "/"; look it up by scanning entries
for (const [dir, entries] of Object.entries(files)) {
for (const e of entries) {
if (`${dir}/${e.name}` === p) return { mtimeMs: e.mtimeMs };
}
}
return { mtimeMs: 0 };
},
};
}
const ROOT = "/repo";
function layout({ srcMs, distMs, withSrc = true, withDist = true }) {
const dirs = [];
const files = {};
const srcDir = `${ROOT}/packages/engine/src`;
const distDir = `${ROOT}/packages/engine/dist`;
if (withSrc) {
dirs.push(srcDir);
files[srcDir] = [{ name: "executor.ts", mtimeMs: srcMs }];
}
if (withDist) {
dirs.push(distDir);
files[distDir] = [{ name: "executor.js", mtimeMs: distMs }];
}
return makeFs({ dirs, files });
}
test("flags stale when src is newer than dist beyond slack", () => {
const fs = layout({ srcMs: 10_000, distMs: 1_000 });
const result = computeDistStaleness({ rootDir: ROOT, packages: ["engine"], fs });
assert.equal(result.stale, true);
assert.equal(result.packages[0].stale, true);
const warning = formatDistStalenessWarning(result);
assert.match(warning, /STALE BUILD/);
assert.match(warning, /@fusion\/engine/);
assert.match(warning, /pnpm build/);
});
test("not stale when dist is newer than src", () => {
const fs = layout({ srcMs: 1_000, distMs: 10_000 });
const result = computeDistStaleness({ rootDir: ROOT, packages: ["engine"], fs });
assert.equal(result.stale, false);
assert.equal(formatDistStalenessWarning(result), null);
});
test("not stale within slack window", () => {
const fs = layout({ srcMs: 1_500, distMs: 1_000 }); // 500ms < 2000ms slack
const result = computeDistStaleness({ rootDir: ROOT, packages: ["engine"], fs });
assert.equal(result.stale, false);
});
test("skips packages with no dist (pure source run)", () => {
const fs = layout({ srcMs: 10_000, distMs: 0, withDist: false });
const result = computeDistStaleness({ rootDir: ROOT, packages: ["engine"], fs });
assert.equal(result.stale, false);
assert.equal(result.packages.length, 0);
});
test("skips packages with no src (packaged install)", () => {
const fs = layout({ srcMs: 0, distMs: 10_000, withSrc: false });
const result = computeDistStaleness({ rootDir: ROOT, packages: ["engine"], fs });
assert.equal(result.stale, false);
assert.equal(result.packages.length, 0);
});