/*
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();
});