/* Unit tests for onboarding yaml covering its documented public contract and regression-sensitive edge cases. Do not test specific content-discipline schemas — they own their own validation. RFC-1311: Compass header sweep — declares the onboarding suite's contract for test-file scaffold coverage. */ import { test, expect } from "vitest"; import { z } from "zod"; import { parseOnboardingArtifactHeader, parseOnboardingArtifactPayload, RFC_METADATA_KEYS, } from "../yaml.ts"; const HEADER_FIXTURE = `phase: 04-author derivedFromInputHash: sha256:deadbeef generatedAt: 2026-05-23T12:00:00.000Z generator: agent`; test("parseOnboardingArtifactHeader returns the metadata in a two-doc file", () => { const source = `---\n${HEADER_FIXTURE}\n---\nclient: warpgogol-com\npayload: 42\n`; const header = parseOnboardingArtifactHeader(source); expect(header).toEqual({ phase: "04-author", derivedFromInputHash: "sha256:deadbeef", generatedAt: "2026-05-23T12:00:00.000Z", generator: "agent", }); }); test("parseOnboardingArtifactHeader reads the merged metadata in a single-doc file", () => { const source = `${HEADER_FIXTURE}\nclient: warpgogol-com\npayload: 42\n`; const header = parseOnboardingArtifactHeader(source); expect(header?.phase).toBe("04-author"); expect(header?.derivedFromInputHash).toBe("sha256:deadbeef"); }); test("parseOnboardingArtifactHeader returns null when the header is missing", () => { const source = "client: warpgogol-com\nfoo: bar\n"; expect(parseOnboardingArtifactHeader(source)).toBe(null); }); test("parseOnboardingArtifactHeader returns null for an empty source", () => { expect(parseOnboardingArtifactHeader("")).toBe(null); }); test("parseOnboardingArtifactPayload returns the second doc unchanged in a two-doc file", () => { const source = `---\n${HEADER_FIXTURE}\n---\nclient: warpgogol-com\npayload: 42\n`; const schema = z.object({ client: z.string(), payload: z.number() }).strict(); const data = parseOnboardingArtifactPayload(source, schema); expect(data).toEqual({ client: "warpgogol-com", payload: 42 }); }); test("parseOnboardingArtifactPayload strips RFC-0076 keys from a single-doc payload", () => { const source = `${HEADER_FIXTURE}\nclient: warpgogol-com\npayload: 42\n`; const schema = z.object({ client: z.string(), payload: z.number() }).strict(); const data = parseOnboardingArtifactPayload(source, schema); expect(data).toEqual({ client: "warpgogol-com", payload: 42 }); }); test("parseOnboardingArtifactPayload preserves a metadata-named key when the schema declares it", () => { // RFC-0082 carve-out: contentAtomsFileSchema (and others) declare // `generatedAt` as a strict payload field. The helper must NOT strip it // from a single-doc payload when the schema's .shape introspects it. const source = `${HEADER_FIXTURE}\nclient: warpgogol-com\n`; const schema = z.object({ client: z.string(), generatedAt: z.string() }).strict(); const data = parseOnboardingArtifactPayload(source, schema); expect(data).toEqual({ client: "warpgogol-com", generatedAt: "2026-05-23T12:00:00.000Z", }); }); test("parseOnboardingArtifactPayload throws on an empty source", () => { expect(() => parseOnboardingArtifactPayload("", z.any())).toThrow(/no YAML documents/); }); test("parseOnboardingArtifactPayload rejects doc-count > 2", () => { const source = `---\n${HEADER_FIXTURE}\n---\nclient: warpgogol-com\n---\nstray: doc\n`; expect(() => parseOnboardingArtifactPayload(source, z.any())).toThrow( /expected exactly 1 or 2 YAML documents/, ); }); test("RFC_METADATA_KEYS pins the four header field names", () => { expect([...RFC_METADATA_KEYS].sort()).toEqual([ "derivedFromInputHash", "generatedAt", "generator", "phase", ]); }); test("parseOnboardingArtifactPayload propagates Zod schema errors", () => { const source = `---\n${HEADER_FIXTURE}\n---\nclient: 42\n`; const schema = z.object({ client: z.string() }).strict(); expect(() => parseOnboardingArtifactPayload(source, schema)).toThrow(); });