SPB Git

Repository Public

contracts.test.ts 1.6 KB 27 lines typescript

1import { describe, expect, it } from "vitest";2import { CreativeBrief, Script, critiqueScore, pitchTotal, strictJsonSchema } from "../src/lib/contracts";34describe("contracts", () => {5  it("applies brief defaults and rejects an empty theme", () => {6    const b = CreativeBrief.parse({ theme: "A coin that hovers" });7    expect(b).toMatchObject({ language: "en", shots: 5, mode: "assisted", quality: "master" });8    expect(CreativeBrief.safeParse({ theme: " " }).success).toBe(false);9    expect(CreativeBrief.safeParse({ theme: "ok theme", shots: 9 }).success).toBe(false);10  });11  it("weights pitch scores and penalises artifact risk", () => {12    const base = { index: 0, originality: 8, feasibility: 8, visualPotential: 8, narrativeClarity: 8, note: "" };13    expect(pitchTotal({ ...base, artifactRisk: 0 })).toBeGreaterThan(pitchTotal({ ...base, artifactRisk: 10 }));14    expect(pitchTotal({ ...base, artifactRisk: 2 })).toBe(8);15  });16  it("averages the seven critic dimensions", () => {17    expect(critiqueScore({ narrativeCoherence: 7, visualFidelity: 7, continuity: 7, audioIntelligibility: 7, factualIntegrity: 7, accessibility: 7, safety: 7, issues: [], summary: "" })).toBe(7);18  });19  it("emits a strict JSON schema: every property required, no extra keys, no length keywords", () => {20    const s = JSON.stringify(strictJsonSchema(Script));21    expect(s).toContain('"additionalProperties":false');22    expect(s).not.toMatch(/minLength|maxLength|minimum|maximum|\$schema/);23    const root = strictJsonSchema(Script) as { required: string[]; properties: Record<string, unknown> };24    expect(root.required.sort()).toEqual(Object.keys(root.properties).sort());25  });26});27
Files main
Menu

Theme