58 lines
3.1 KiB
TypeScript
58 lines
3.1 KiB
TypeScript
import test from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import fs from "node:fs/promises";
|
|
import path from "node:path";
|
|
import os from "node:os";
|
|
import { execFile as callback } from "node:child_process";
|
|
import { promisify } from "node:util";
|
|
import { snapshotRepository, checkWorkspaceCandidate } from "../src/capability-language/candidate-check.js";
|
|
const execFile = promisify(callback);
|
|
|
|
test("candidate snapshots include dirty and new files without changing Git history or index", async (context) => {
|
|
const directory = await fs.mkdtemp(path.join(os.tmpdir(), "qx-candidate-test-"));
|
|
context.after(() => fs.rm(directory, { recursive: true, force: true }));
|
|
const root = path.join(directory, "source");
|
|
await fs.mkdir(root);
|
|
const git = (...args: string[]) => execFile("git", ["-C", root, ...args]);
|
|
await git("init");
|
|
await fs.writeFile(path.join(root, "tracked"), "original");
|
|
await fs.writeFile(path.join(root, ".gitignore"), "ignored\n");
|
|
await git("add", ".");
|
|
const index = await fs.readFile(path.join(root, ".git/index"));
|
|
await fs.writeFile(path.join(root, "tracked"), "edited");
|
|
await fs.writeFile(path.join(root, "new"), "new content");
|
|
await fs.writeFile(path.join(root, "ignored"), "not source");
|
|
const snapshot = await snapshotRepository(root, path.join(directory, "snapshot"));
|
|
assert.equal(await fs.readFile(path.join(snapshot.directory, "tracked"), "utf8"), "edited");
|
|
assert.equal(await fs.readFile(path.join(snapshot.directory, "new"), "utf8"), "new content");
|
|
await assert.rejects(fs.access(path.join(snapshot.directory, "ignored")));
|
|
assert.deepEqual(await fs.readFile(path.join(root, ".git/index")), index);
|
|
await assert.rejects(git("rev-parse", "--verify", "HEAD"), "no commit was created");
|
|
await fs.symlink("tracked", path.join(root, "link"));
|
|
await assert.rejects(snapshotRepository(root, path.join(directory, "rejected")), /regular file/);
|
|
});
|
|
|
|
test("candidate check produces explicitly non-activation evidence and never overwrites a report", async (context) => {
|
|
const directory = await fs.mkdtemp(path.join(os.tmpdir(), "qx-check-test-"));
|
|
context.after(() => fs.rm(directory, { recursive: true, force: true }));
|
|
const root = path.join(directory, "source"),
|
|
output = path.join(directory, "check");
|
|
await fs.mkdir(root);
|
|
await execFile("jj", ["git", "init", "--colocate", root]);
|
|
await fs.writeFile(
|
|
path.join(root, "quixos.lock"),
|
|
`quixos-lock version 1 { quixos source { repository "https://example.test/quixos.git"; commit "${"a".repeat(40)}"; } }`,
|
|
);
|
|
await fs.writeFile(
|
|
path.join(root, "workspace.qx"),
|
|
`workspace Test id "workspace:test" revision "workspace:test@1" commit "${"b".repeat(40)}" { atom Subject id "atom:subject"; }`,
|
|
);
|
|
const result = await checkWorkspaceCandidate({ root, output });
|
|
assert.equal(result.candidateOnly, true);
|
|
assert.equal(result.activationEvidence, false);
|
|
assert.deepEqual(result.blockers, []);
|
|
const report = await fs.readFile(path.join(output, "report.json"));
|
|
await assert.rejects(checkWorkspaceCandidate({ root, output }), /EEXIST/);
|
|
assert.deepEqual(await fs.readFile(path.join(output, "report.json")), report);
|
|
});
|