Repository Public
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