/*
Unit tests for sternsystem status covering its documented public contract and regression-sensitive edge cases.
- Not a contract source of truth — the module under test owns the authoritative behavior; fixtures are minimal scaffolding only.
- RFC-1063: behavioral tests for currentMission null and non-null cases.
*/
import { test, expect, beforeEach, afterEach } from "vitest";
import fs from "node:fs/promises";
import { existsSync, mkdirSync } from "node:fs";
import path from "node:path";
import os from "node:os";
import { runSternsystemStatus } from "../sternsystem-status.ts";
import type { KernelCommandInput, KernelRuntimeContext } from "@warpgogol/werkstatt-engine/kernel";
import { createDefaultIO } from "@warpgogol/werkstatt-shared/kernel/workspace-io";
let testRoot: string;
let workspaceRoot: string;
let cacheRoot: string;
const systemId = "test-system";
beforeEach(async () => {
testRoot = await fs.mkdtemp(path.join(os.tmpdir(), "sternsystem-status-test-"));
workspaceRoot = path.join(testRoot, "workspace");
cacheRoot = path.join(testRoot, "systems-cache");
await fs.mkdir(workspaceRoot, { recursive: true });
await fs.mkdir(path.join(cacheRoot, systemId), { recursive: true });
});
afterEach(async () => {
await fs.rm(testRoot, { recursive: true, force: true });
});
function makeInput(flags: Record = {}): KernelCommandInput {
return { flags, argv: [] };
}
function makeContext(): KernelRuntimeContext {
return {
io: createDefaultIO().io,
workspaceRoot,
logger: console,
} as unknown as KernelRuntimeContext;
}
async function writeSystemState(state: Record): Promise {
const filePath = path.join(cacheRoot, systemId, "system-state.yaml");
const yaml =
[
`schemaVersion: "1.0.0"`,
`systemId: "${systemId}"`,
`currentMission: ${state.currentMission === null ? "null" : `"${state.currentMission}"`}`,
`lastRelease: null`,
`lastPropagated: {}`,
`accessPin: null`,
`passportRequired: false`,
`ownershipRequired: false`,
].join("\n") + "\n";
await fs.writeFile(filePath, yaml, "utf8");
}
async function writeBordbuchEmpty(): Promise {
const dir = path.join(cacheRoot, systemId, "bordbuch");
if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
await fs.writeFile(path.join(dir, "events.ndjson"), "", "utf8");
}
async function writeMissionManifest(
missionId: string,
brief: string,
state: string,
): Promise {
const missionDir = path.join(workspaceRoot, "missions", missionId);
await fs.mkdir(missionDir, { recursive: true });
const manifest =
[
`schemaVersion: "1.0.0"`,
`missionId: "${missionId}"`,
`systemId: "${systemId}"`,
`state: "${state}"`,
`brief: "${brief}"`,
`openedAt: "2026-09-10T10:00:00.000Z"`,
`openedBy: "agent"`,
`closedAt: null`,
`closedBy: null`,
`pinAtOpen: "pin-123"`,
`materializedAt: null`,
`reconciledAt: null`,
`migratedAt: null`,
`releaseId: null`,
`operationId: "op-001"`,
].join("\n") + "\n";
await fs.writeFile(path.join(missionDir, "mission.yaml"), manifest, "utf8");
}
test("AC-2: currentMission is null when system-state.yaml has currentMission: null", async () => {
await writeSystemState({ currentMission: null });
await writeBordbuchEmpty();
const result = await runSternsystemStatus(makeInput({ id: systemId }), makeContext());
expect(result.data).toBeDefined();
const data = result.data as { currentMission: unknown };
expect(data.currentMission).toBeNull();
});
test("AC-1: currentMission includes missionId, brief, state, openedAt, openedBy when mission is open", async () => {
const missionId = "test-system-m000001";
await writeSystemState({ currentMission: missionId });
await writeBordbuchEmpty();
await writeMissionManifest(missionId, "Test mission brief", "open");
const result = await runSternsystemStatus(makeInput({ id: systemId }), makeContext());
expect(result.data).toBeDefined();
const data = result.data as {
currentMission: {
missionId: string;
brief: string;
state: string;
openedAt: string;
openedBy: string;
} | null;
};
expect(data.currentMission).not.toBeNull();
expect(data.currentMission!.missionId).toBe(missionId);
expect(data.currentMission!.brief).toBe("Test mission brief");
expect(data.currentMission!.state).toBe("open");
expect(data.currentMission!.openedAt).toBe("2026-09-10T10:00:00.000Z");
expect(data.currentMission!.openedBy).toBe("agent");
});
test("AC-3: summary line includes 'no active mission' when currentMission is null", async () => {
await writeSystemState({ currentMission: null });
await writeBordbuchEmpty();
const result = await runSternsystemStatus(makeInput({ id: systemId }), makeContext());
expect(result.summary).toContain("no active mission");
});
test("AC-3: summary line includes mission ID and state when currentMission is non-null", async () => {
const missionId = "test-system-m000002";
await writeSystemState({ currentMission: missionId });
await writeBordbuchEmpty();
await writeMissionManifest(missionId, "Another mission", "open");
const result = await runSternsystemStatus(makeInput({ id: systemId }), makeContext());
expect(result.summary).toContain(`mission=${missionId}`);
expect(result.summary).toContain("(open)");
});
test("currentMission has 'unknown' fallback fields when manifest is missing", async () => {
const missionId = "test-system-m000003";
await writeSystemState({ currentMission: missionId });
await writeBordbuchEmpty();
// No mission manifest written
const result = await runSternsystemStatus(makeInput({ id: systemId }), makeContext());
expect(result.data).toBeDefined();
const data = result.data as {
currentMission: {
missionId: string;
brief: string;
state: string;
openedAt: string;
openedBy: string;
} | null;
};
expect(data.currentMission).not.toBeNull();
expect(data.currentMission!.missionId).toBe(missionId);
expect(data.currentMission!.brief).toBe("unknown");
expect(data.currentMission!.state).toBe("unknown");
});
test("AC-4: --all includes currentMission for each system entry", async () => {
await writeSystemState({ currentMission: null });
await writeBordbuchEmpty();
// Create a minimal system-config.yaml so discoverSystems finds it
const configPath = path.join(cacheRoot, systemId, "system-config.yaml");
const config =
[
`schemaVersion: "1.0.0"`,
`id: "${systemId}"`,
`cosmicStar: Vega`,
`mirrors:`,
` - path: "../systems-cache/${systemId}"`,
` storageType: non-bare`,
`pinnedPlatform: "1.0.0"`,
`status: active`,
`registeredAt: "2026-01-01T00:00:00.000Z"`,
].join("\n") + "\n";
await fs.writeFile(configPath, config, "utf8");
const result = await runSternsystemStatus(makeInput({ all: true }), makeContext());
expect(Array.isArray(result.data)).toBe(true);
const entries = result.data as Array<{ currentMission: unknown }>;
expect(entries.length).toBeGreaterThanOrEqual(1);
for (const entry of entries) {
expect(entry).toHaveProperty("currentMission");
}
});