/* Unit tests for actor identity 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-0560: initial unit tests for resolveActorFromEnv and resolveActor. */ import { test, expect, beforeEach, afterEach } from "vitest"; import { resolveActorFromEnv, resolveActor } from "./actor-identity.ts"; import type { KernelCommandInput } from "@warpgogol/werkstatt-engine/kernel"; function makeInput(flags: Record): KernelCommandInput { return { argv: [], flags: flags as Record, }; } const ENV_VARS = ["WERKSTATT_ACTOR_ID", "WERKSTATT_ACTOR_SITE", "WERKSTATT_ACTOR_SCOPES"]; beforeEach(() => { for (const key of ENV_VARS) delete process.env[key]; }); afterEach(() => { for (const key of ENV_VARS) delete process.env[key]; }); test("resolveActorFromEnv returns null when env vars are not set", () => { expect(resolveActorFromEnv()).toBeNull(); }); test("resolveActorFromEnv returns ActorIdentity when WERKSTATT_ACTOR_ID and WERKSTATT_ACTOR_SITE are set", () => { process.env["WERKSTATT_ACTOR_ID"] = "did:key:z6Mktest"; process.env["WERKSTATT_ACTOR_SITE"] = "warpgogol-com"; const identity = resolveActorFromEnv(); expect(identity).toEqual({ actorId: "did:key:z6Mktest", siteId: "warpgogol-com", scopes: [], }); }); test("resolveActorFromEnv returns null when only WERKSTATT_ACTOR_ID is set", () => { process.env["WERKSTATT_ACTOR_ID"] = "did:key:z6Mktest"; expect(resolveActorFromEnv()).toBeNull(); }); test("resolveActorFromEnv parses scopes from comma-separated WERKSTATT_ACTOR_SCOPES", () => { process.env["WERKSTATT_ACTOR_ID"] = "did:key:z6Mktest"; process.env["WERKSTATT_ACTOR_SITE"] = "warpgogol-com"; process.env["WERKSTATT_ACTOR_SCOPES"] = "mission:open,mission:close, mission:abort"; const identity = resolveActorFromEnv(); expect(identity?.scopes).toEqual(["mission:open", "mission:close", "mission:abort"]); }); test("resolveActor returns 'unknown' when neither flag is set", () => { expect(resolveActor(makeInput({}))).toBe("unknown"); }); test("resolveActor returns --actor flag value when set", () => { expect(resolveActor(makeInput({ actor: "human:alice" }))).toBe("human:alice"); }); test("resolveActor returns env actorId when --actor-from-auth is set and env vars are present", () => { process.env["WERKSTATT_ACTOR_ID"] = "did:key:z6Mktest"; process.env["WERKSTATT_ACTOR_SITE"] = "warpgogol-com"; expect(resolveActor(makeInput({ "actor-from-auth": true }))).toBe("did:key:z6Mktest"); }); test("resolveActor throws actor-required error when --actor-from-auth is set but env vars are missing", () => { expect(() => resolveActor(makeInput({ "actor-from-auth": true }))).toThrow(/actor-required/); }); test("resolveActor: --actor-from-auth takes precedence over --actor", () => { process.env["WERKSTATT_ACTOR_ID"] = "did:key:z6Mktest"; process.env["WERKSTATT_ACTOR_SITE"] = "warpgogol-com"; expect(resolveActor(makeInput({ "actor-from-auth": true, actor: "human:alice" }))).toBe( "did:key:z6Mktest", ); });