/*
Unit tests for mission io covering resolveMissionManifestPath; missionExists; writeMissionManifest & readMissionManifest.
- Not a contract source of truth — the module under test owns the authoritative behavior; fixtures are minimal scaffolding only.
- RFC-1311: Compass header sweep — declares the mission suite's contract for test-file scaffold coverage.
*/
import { test, expect, describe, beforeEach, afterEach } from "vitest";
import { mkdtempSync, rmSync, mkdirSync, writeFileSync, existsSync } from "node:fs";
import { join } from "node:path";
import {
resolveMissionManifestPath,
readMissionManifest,
writeMissionManifest,
missionExists,
createMissionDirectories,
resolveMissionEvidenceDir,
listMissionDirs,
} from "../mission-io.ts";
import type { MissionManifest } from "@warpgogol/werkstatt-engine/schemas";
let tmpDir: string;
beforeEach(() => {
tmpDir = mkdtempSync(join(process.cwd(), "tmp-mission-io-"));
});
afterEach(() => {
rmSync(tmpDir, { recursive: true, force: true });
});
describe("resolveMissionManifestPath", () => {
test("joins workspaceRoot with missions//mission.yaml", async () => {
const p = await resolveMissionManifestPath("/tmp/ws", "m000001");
expect(p).toBe(join("/tmp/ws", "missions", "m000001", "mission.yaml"));
});
});
describe("missionExists", () => {
test("returns false when manifest does not exist", async () => {
expect(await missionExists(tmpDir, "test-system-m000001")).toBe(false);
});
test("returns true when manifest exists", async () => {
const dir = join(tmpDir, "missions", "test-system-m000001");
mkdirSync(dir, { recursive: true });
writeFileSync(join(dir, "mission.yaml"), "missionId: test-system-m000001\n");
expect(await missionExists(tmpDir, "test-system-m000001")).toBe(true);
});
});
describe("writeMissionManifest & readMissionManifest", () => {
test("round-trip write and read", async () => {
const manifest: MissionManifest = {
schemaVersion: "1.0.0",
missionId: "test-system-m000001",
systemId: "test-system",
state: "open",
brief: "Test mission",
openedAt: "2026-01-01T00:00:00Z",
openedBy: "agent",
closedAt: null,
closedBy: null,
pinAtOpen: "abc123",
materializedAt: null,
reconciledAt: null,
migratedAt: null,
releaseId: null,
rfcId: null,
operationId: "op-001",
};
await writeMissionManifest(tmpDir, manifest);
const read = await readMissionManifest(tmpDir, "test-system-m000001");
expect(read.missionId).toBe("test-system-m000001");
expect(read.systemId).toBe("test-system");
expect(read.state).toBe("open");
expect(read.brief).toBe("Test mission");
});
});
describe("createMissionDirectories", () => {
test("creates workpiece and evidence directories", async () => {
await createMissionDirectories(tmpDir, "test-system-m000001");
expect(existsSync(join(tmpDir, "missions", "test-system-m000001", "workpiece"))).toBe(true);
expect(existsSync(join(tmpDir, "missions", "test-system-m000001", "evidence"))).toBe(true);
});
});
describe("resolveMissionEvidenceDir", () => {
test("resolves to evidence/axiom subdirectory", async () => {
const dir = await resolveMissionEvidenceDir(tmpDir, "test-system-m000001");
expect(dir).toBe(join(tmpDir, "missions", "test-system-m000001", "evidence", "axiom"));
});
});
describe("listMissionDirs", () => {
test("returns empty array when missions dir does not exist", async () => {
expect(await listMissionDirs(tmpDir)).toEqual([]);
});
test("lists mission directories", async () => {
mkdirSync(join(tmpDir, "missions", "sys-a-m000001"), { recursive: true });
mkdirSync(join(tmpDir, "missions", "sys-b-m000002"), { recursive: true });
const dirs = await listMissionDirs(tmpDir);
expect(dirs).toContain("sys-a-m000001");
expect(dirs).toContain("sys-b-m000002");
});
test("excludes archive directory", async () => {
mkdirSync(join(tmpDir, "missions", "archive"), { recursive: true });
mkdirSync(join(tmpDir, "missions", "sys-a-m000001"), { recursive: true });
const dirs = await listMissionDirs(tmpDir);
expect(dirs).not.toContain("archive");
});
test("filters by systemId", async () => {
mkdirSync(join(tmpDir, "missions", "sys-a-m000001"), { recursive: true });
mkdirSync(join(tmpDir, "missions", "sys-b-m000002"), { recursive: true });
const dirs = await listMissionDirs(tmpDir, "sys-a");
expect(dirs).toContain("sys-a-m000001");
expect(dirs).not.toContain("sys-b-m000002");
});
});