/*
RFC-1324 regression tests for resolveSystemIdForMission — the resolver shared by evidence.sync and evidence.fetch.
- Does not exercise R2 upload/download — covered by evidence-sync-fetch.test.ts.
- RFC-1324: initial — locks in the manifest-first order and the `-mNNNNNN`-only suffix strip after `e2e-valid-minimal-m000001` resolved to `e2e-valid`.
- RFC-1324: cold-run defect: evidence.sync/fetch resolveSystemId split on bare '-m' — e2e-valid-minimal-m000001 resolved to e2e-valid, SYSTEM_MISMATCH blocked post-close deploy; shared resolveSystemIdForMission reads mission.yaml first
*/
import { describe, it, expect, beforeEach, afterEach } from "vitest";
import { mkdtemp, rm, mkdir, writeFile } from "node:fs/promises";
import { tmpdir } from "node:os";
import { join } from "node:path";
import { stringify as stringifyYaml } from "yaml";
import { createDefaultIO } from "@warpgogol/werkstatt-shared/kernel/workspace-io";
import { resolveSystemIdForMission } from "./resolve-system-id.ts";
const MANIFEST = {
schemaVersion: "1.0.0",
missionId: "e2e-valid-minimal-m000001",
systemId: "e2e-valid-minimal",
state: "closed",
brief: "e2e",
openedAt: "2026-10-18T20:00:00.000Z",
openedBy: "e2e",
closedAt: "2026-10-18T20:30:00.000Z",
closedBy: null,
pinAtOpen: "x",
materializedAt: null,
reconciledAt: null,
migratedAt: null,
releaseId: null,
rfcId: null,
operationId: "op-x",
};
describe("resolveSystemIdForMission (RFC-1324)", () => {
let root: string;
let workspaceRoot: string;
const io = createDefaultIO().io;
beforeEach(async () => {
root = await mkdtemp(join(tmpdir(), "resolve-system-id-"));
workspaceRoot = join(root, "werkstatt");
await mkdir(join(workspaceRoot, "missions"), { recursive: true });
});
afterEach(async () => {
await rm(root, { recursive: true, force: true });
});
it("reads systemId from mission.yaml — the mid-slug '-m' case that split('-m') broke", async () => {
const dir = join(workspaceRoot, "missions", MANIFEST.missionId);
await mkdir(dir, { recursive: true });
await writeFile(join(dir, "mission.yaml"), stringifyYaml(MANIFEST));
expect(await resolveSystemIdForMission(workspaceRoot, MANIFEST.missionId, io)).toBe(
"e2e-valid-minimal",
);
});
it("falls back to the currentMission scan when no manifest exists", async () => {
const cache = join(root, "systems-cache", "my-site");
await mkdir(cache, { recursive: true });
await writeFile(
join(cache, "system-config.yaml"),
stringifyYaml({
schemaVersion: "1.0.0",
id: "my-site",
cosmicStar: "Polaris",
mirrors: [{ path: cache, storageType: "non-bare" }],
}),
);
await writeFile(
join(cache, "system-state.yaml"),
stringifyYaml({
schemaVersion: "1.0.0",
systemId: "my-site",
currentMission: "my-site-m000007",
}),
);
expect(await resolveSystemIdForMission(workspaceRoot, "my-site-m000007", io)).toBe("my-site");
});
it("strips only the canonical -mNNNNNN suffix as a last resort", async () => {
expect(await resolveSystemIdForMission(workspaceRoot, "site-minimal-m000042", io)).toBe(
"site-minimal",
);
expect(await resolveSystemIdForMission(workspaceRoot, "plainid-m000001", io)).toBe("plainid");
});
it("returns the whole id when nothing matches and no suffix exists", async () => {
expect(await resolveSystemIdForMission(workspaceRoot, "custom-mission", io)).toBe(
"custom-mission",
);
});
});