Files

44 lines
4.2 KiB
TypeScript

import {it,expect} from "vitest";
import {mkdtemp,rm,writeFile} from "node:fs/promises";
import {tmpdir,homedir} from "node:os";
import {join} from "node:path";
import {SkillRunner} from "../src/media/skill-runner.js";
import {mediaRuntime,runMedia} from "../src/media/media-worker.js";
import {analysisFixture} from "./fixtures/editor-analysis.js";
it.each(["analysis","recipe","hook"] as const)("runs the original %s validator and returns its real failures, never a caller PASS flag",async(kind)=>{
const root=await mkdtemp(join(tmpdir(),"original-validator-"));
try{
const runner=new SkillRunner({skillRoot:join(homedir(),".codex/skills/swads-short-drama-editor"),pythonExecutable:join(homedir(),".cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3")});
const input=join(root,"analysis.json");await writeFile(input,JSON.stringify({pass:true}));
const result=await runner.validate(kind,input,root,new AbortController().signal);
expect(result.pass).toBe(false);expect(result.issues.length).toBeGreaterThan(0);
expect(JSON.stringify(result)).not.toContain(root);
}finally{await rm(root,{recursive:true,force:true});}
});
it("keeps references blocked when only unverified evidence is supplied",async()=>{
const root=await mkdtemp(join(tmpdir(),"original-reference-"));
try{
const analysis=join(root,"target-drama-analysis.json");await writeFile(analysis,JSON.stringify(analysisFixture()));
const input=join(root,"candidates.json");await writeFile(input,JSON.stringify({target_analysis_path:analysis,analysis_id:"analysis_fixture",drama_id:"drama_fixture",candidates:[{id:"r1",full_video_access:true,reference_type:"short_drama_ad",origin_name:"Fixture",origin_evidence_url:"https://example.com/title",playable_url:"https://example.com/video",evidence_url:"https://example.com/metrics",platform:"fixture",captured_at:"2026-09-14T00:00:00Z",genre_match:1,hook_match:1,replicability:1,market_recency:1}]}));
const runner=new SkillRunner({skillRoot:join(homedir(),".codex/skills/swads-short-drama-editor"),pythonExecutable:join(homedir(),".cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3")});
const result=await runner.scoreReferences(input,root,new AbortController().signal);
expect(result.status).toBe("blocked_unverified_reference");expect(result.selected_reference).toBeNull();
}finally{await rm(root,{recursive:true,force:true});}
});
it("renders an actual 10-second H264/AAC file using the original renderer and reports actual QA",async()=>{
const root=await mkdtemp(join(tmpdir(),"original-render-"));const signal=new AbortController().signal;
try{
const runtime=await mediaRuntime();const source=join(root,"source.mp4");
await runMedia(runtime.ffmpeg,["-v","error","-f","lavfi","-i","testsrc2=size=180x320:rate=24","-f","lavfi","-i","sine=frequency=440:sample_rate=48000","-t","11","-c:v","libx264","-c:a","aac",source],root,signal);
const analysis=join(root,"target-drama-analysis.json");await writeFile(analysis,JSON.stringify(analysisFixture()));
const recipe=join(root,"recipe.json");await writeFile(recipe,JSON.stringify({schema_version:"2.0",analysis_id:"analysis_fixture",drama_id:"drama_fixture",target_analysis_path:analysis,withheld_information:["The author"],duration_strategy:"content_led",ending:{cutoff_reason:"Test",before_withheld_reveal:true},segments:[{id:"one",hook_id:"fixture",source,episode:1,source_start:0,source_end:10,target_start:0,target_end:10,semantic_role:"Test",continuity_group:"scene",source_gap_before:0,confidence:"high",reveal_risk:"low",cut_reason:"Synthetic test"}]}));
const runner=new SkillRunner({skillRoot:join(homedir(),".codex/skills/swads-short-drama-editor"),pythonExecutable:join(homedir(),".cache/codex-runtimes/codex-primary-runtime/dependencies/python/bin/python3")});
const result=await runner.render(recipe,root,signal);
expect(result.duration).toBeCloseTo(10,1);expect(result.sha256).toMatch(/^[a-f0-9]{64}$/);
expect(result.checks.complete_decode).toBe(true);expect(result.checks.h264_aac).toBe(true);expect(result.checks.portrait_1080x1920).toBe(true);expect(result.reviewStatus).toBe("REVIEW");
}finally{await rm(root,{recursive:true,force:true});}
},60_000);