/*
Unit tests for dns records schema validate 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-0753: initial schema validate tests.
*/
import { test, expect, beforeEach, afterEach } from "vitest";
import { mkdtempSync, writeFileSync, mkdirSync, rmSync } from "node:fs";
import { join } from "node:path";
import { runDnsRecordsSchemaValidate } from "./dns-records-schema-validate.ts";
import type { KernelCommandInput, KernelRuntimeContext } from "@warpgogol/werkstatt-shared/kernel";
import { tmpdir } from "node:os";
import { createDefaultIO } from "@warpgogol/werkstatt-shared/kernel/workspace-io";
let testRoot: string;
let tmpDir: string;
function resolveCacheDir(systemId: string): string {
return join(testRoot, "systems-cache", systemId);
}
function resolveDnsPath(systemId: string): string {
return join(resolveCacheDir(systemId), "dns-records.yaml");
}
beforeEach(() => {
testRoot = mkdtempSync(join(tmpdir(), "tmp-dns-schema-validate-"));
tmpDir = join(testRoot, "workspace");
mkdirSync(tmpDir, { recursive: true });
});
afterEach(() => {
rmSync(testRoot, { recursive: true, force: true });
});
function makeInput(flags: Record): {
argv: string[];
flags: Record;
} {
return { argv: [], flags };
}
test("schema.validate: valid declaration file passes", async () => {
mkdirSync(resolveCacheDir("test-system"), { recursive: true });
writeFileSync(
resolveDnsPath("test-system"),
`kind: dns-records
schemaVersion: 1
zone: example.com
updatedAt: "2026-01-01T00:00:00.000Z"
records:
- name: example.com
type: A
content: 192.0.2.1
proxied: true
`,
);
const result = await runDnsRecordsSchemaValidate(
makeInput({ system: "test-system" }) as unknown as KernelCommandInput,
{ io: createDefaultIO().io, workspaceRoot: tmpDir } as unknown as KernelRuntimeContext,
);
expect(result.data!.state).toBe("valid");
expect(result.data!.files).toHaveLength(1);
expect(result.data!.files[0].valid).toBe(true);
expect(result.exitCode).toBeUndefined();
});
test("schema.validate: invalid record type fails", async () => {
mkdirSync(resolveCacheDir("test-system"), { recursive: true });
writeFileSync(
resolveDnsPath("test-system"),
`kind: dns-records
schemaVersion: 1
zone: example.com
updatedAt: "2026-01-01T00:00:00.000Z"
records:
- name: example.com
type: INVALID
content: 192.0.2.1
`,
);
const result = await runDnsRecordsSchemaValidate(
makeInput({ system: "test-system" }) as unknown as KernelCommandInput,
{ io: createDefaultIO().io, workspaceRoot: tmpDir } as unknown as KernelRuntimeContext,
);
expect(result.data!.state).toBe("invalid");
expect(result.data!.files[0].valid).toBe(false);
expect(result.data!.files[0].errors).not.toBeNull();
expect(result.exitCode).toBe(1);
});
test("schema.validate: missing file is skipped (not an error)", async () => {
const result = await runDnsRecordsSchemaValidate(
makeInput({ system: "nonexistent" }) as unknown as KernelCommandInput,
{ io: createDefaultIO().io, workspaceRoot: tmpDir } as unknown as KernelRuntimeContext,
);
expect(result.data!.state).toBe("valid");
expect(result.data!.files).toHaveLength(0);
});
test("schema.validate: no --system scans all systems", async () => {
for (const id of ["sys-a", "sys-b"]) {
const cacheDir = resolveCacheDir(id);
mkdirSync(cacheDir, { recursive: true });
writeFileSync(
join(cacheDir, "system-config.yaml"),
`schemaVersion: system-config/v1
id: ${id}
cosmicStar: Vega
mirrors:
- path: ../systems-cache/${id}
storageType: non-bare
pinnedPlatform: "1.0.0"
status: active
registeredAt: "2026-01-01T00:00:00Z"
notes: ""
`,
);
}
writeFileSync(
resolveDnsPath("sys-a"),
`kind: dns-records
schemaVersion: 1
zone: a.example.com
updatedAt: "2026-01-01T00:00:00.000Z"
records: []
`,
);
writeFileSync(
resolveDnsPath("sys-b"),
`kind: dns-records
schemaVersion: 1
zone: b.example.com
updatedAt: "2026-01-01T00:00:00.000Z"
records: []
`,
);
const result = await runDnsRecordsSchemaValidate(
makeInput({}) as unknown as KernelCommandInput,
{ io: createDefaultIO().io, workspaceRoot: tmpDir } as unknown as KernelRuntimeContext,
);
expect(result.data!.state).toBe("valid");
expect(result.data!.files).toHaveLength(2);
});
test("schema.validate: invalid schemaVersion fails", async () => {
mkdirSync(resolveCacheDir("test-system"), { recursive: true });
writeFileSync(
resolveDnsPath("test-system"),
`kind: dns-records
schemaVersion: 2
zone: example.com
updatedAt: "2026-01-01T00:00:00.000Z"
records: []
`,
);
const result = await runDnsRecordsSchemaValidate(
makeInput({ system: "test-system" }) as unknown as KernelCommandInput,
{ io: createDefaultIO().io, workspaceRoot: tmpDir } as unknown as KernelRuntimeContext,
);
expect(result.data!.state).toBe("invalid");
expect(result.exitCode).toBe(1);
});