36 lines
1.9 KiB
TypeScript
36 lines
1.9 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import { mkdtemp, readFile, rm, writeFile } from "node:fs/promises";
|
|
import { tmpdir } from "node:os";
|
|
import { join } from "node:path";
|
|
import { DEFAULT_CONFIG, stage } from "../src/domain";
|
|
import { bootstrapProject } from "../src/persistence";
|
|
import { createState, recordEvidence, startStage } from "../src/state";
|
|
import { validatePom } from "../src/validators";
|
|
|
|
test("stage gate rejects starter shell then accepts substantive evidence-backed artifact", async () => {
|
|
const parent = await mkdtemp(join(tmpdir(), "pom-validation-"));
|
|
try {
|
|
const config = { ...DEFAULT_CONFIG, projectRootMode: "child" as const };
|
|
let state = createState("Validation Test", parent, config, true);
|
|
await bootstrapProject(state);
|
|
state = startStage(state, 0);
|
|
const initial = await validatePom(state, "stage", { writeReport: false });
|
|
assert.equal(initial.passed, false);
|
|
assert.ok(initial.checks.some((item) => item.id.includes("bytes") && item.status === "fail"));
|
|
|
|
const sections = ["Vision", "Audience", "Constraints", "Success Criteria", "Open Questions"];
|
|
const body = sections.map((heading) => `## ${heading}\n\n${("Specific, measurable, original production detail. ").repeat(18)}`).join("\n\n");
|
|
const briefPath = join(state.projectRoot, "01_planning", "00_project_brief.md");
|
|
const original = await readFile(briefPath, "utf8");
|
|
await writeFile(briefPath, `${original.split("## Vision")[0]}${body}\n`);
|
|
for (const criterion of stage(0).acceptance) {
|
|
state = recordEvidence(state, criterion.id, `Verified ${criterion.description}`, ["01_planning/00_project_brief.md"], "Test");
|
|
}
|
|
const final = await validatePom(state, "stage", { writeReport: false });
|
|
assert.equal(final.passed, true, final.checks.filter((item) => item.status === "fail").map((item) => item.message).join("\n"));
|
|
} finally {
|
|
await rm(parent, { recursive: true, force: true });
|
|
}
|
|
});
|