import test from "node:test"; import assert from "node:assert/strict"; import fs from "node:fs/promises"; import os from "node:os"; import path from "node:path"; import { execFile as callback } from "node:child_process"; import { promisify } from "node:util"; import { authoringWorklist } from "../src/capability-language/authoring-worklist.js"; import { checkRecordName } from "../src/capability-language/authoring-check.js"; import { checkerIdentity, snapshotCommit } from "../src/capability-language/checked-build.js"; const execFile = promisify(callback); test("worklist grows and clears from current source, dependency and checker observations", async (context) => { const workbench = await fs.mkdtemp(path.join(os.tmpdir(), "qx-worklist-test-")); context.after(() => fs.rm(workbench, { recursive: true, force: true })); const root = path.join(workbench, "root"), provider = path.join(workbench, "resources/Base"); await fs.mkdir(root); await fs.mkdir(provider, { recursive: true }); await fs.mkdir(path.join(workbench, ".quixos/checks"), { recursive: true }); const header = `quixos-lock version 1 { quixos source { repository "https://example.test/quixos"; commit "${"a".repeat(40)}"; }`; for (const directory of [root, provider]) await execFile("jj", ["git", "init", "--colocate", directory]); await fs.writeFile( path.join(provider, "interface.qx"), 'interface Base id "interface:base" revision "interface:base@1" {}', ); await fs.writeFile(path.join(provider, "quixos.lock"), `${header} }`); const baseCommit = await snapshotCommit(provider); await fs.writeFile( path.join(root, "workspace.qx"), `workspace Test id "workspace:test" revision "workspace:test@1" commit "${"b".repeat(40)}" { import interface Base; }`, ); await fs.writeFile( path.join(root, "quixos.lock"), `${header} interface Base source { repository "https://example.test/base"; commit "${baseCommit}"; } }`, ); const rootCommit = await snapshotCommit(root); await fs.writeFile( path.join(workbench, ".quixos/resource-graph.json"), JSON.stringify({ resources: [ { kind: "interface", directory: provider, source: { resolver: "git", repository: "https://example.test/base", commit: baseCommit }, }, ], }), ); assert.equal((await authoringWorklist(workbench)).worklist.filter((entry) => entry.phase === "unchecked").length, 2); const remember = (directory: string, commit: string, checker = checkerIdentity()) => fs.writeFile( path.join(workbench, ".quixos/checks", checkRecordName(directory)), JSON.stringify({ commit, checker, phase: "checked", blockers: [] }), ); await remember("root", rootCommit); await remember("resources/Base", baseCommit); assert.deepEqual((await authoringWorklist(workbench)).worklist, []); await fs.writeFile(path.join(provider, "interface.qx"), "interface broken {{{"); const broken = await authoringWorklist(workbench); assert.ok( broken.worklist.some( (entry) => entry.directory === "resources/Base" && entry.phase === "syntax" && /historical/.test(entry.message), ), ); assert.ok(broken.worklist.some((entry) => entry.directory === "root" && entry.phase === "dependency")); await fs.writeFile( path.join(provider, "interface.qx"), 'interface Base id "interface:base" revision "interface:base@1" {}', ); assert.deepEqual((await authoringWorklist(workbench)).worklist, []); await remember("resources/Base", baseCommit, "old-checker"); assert.ok((await authoringWorklist(workbench)).worklist.some((entry) => /checker changed/.test(entry.message))); await fs.writeFile( path.join(workbench, ".quixos/checks", checkRecordName("resources/Base")), JSON.stringify({ phase: "publication", blockers: ["source retention unavailable"] }), ); assert.ok( (await authoringWorklist(workbench)).worklist.some( (entry) => entry.phase === "publication" && /source retention/.test(entry.message), ), ); });