import { describe, expect, it } from "vitest"; import { HarnessError } from "@agent-studio/harness"; import { createTestApp } from "./test-app.js"; import {mkdtemp,writeFile,rm} from "node:fs/promises"; import {tmpdir} from "node:os"; import {join} from "node:path"; describe("private editor frames", () => { it("only serves a registered Session frame and forbids caching", async () => { const { app } = createTestApp({ readEditorFrame: (sessionId, jobId, frameId) => { if (sessionId !== "ses_1" || jobId !== "job_known" || frameId !== "frame_known") throw new HarnessError("FRAME_NOT_FOUND", "Missing frame"); return Promise.resolve(Buffer.from([255, 216, 255, 217])); } }); try { const response = await app.inject({ method: "GET", url: "/api/sessions/ses_1/editor/job_known/frames/frame_known" }); expect(response.statusCode).toBe(200); expect(response.headers["content-type"]).toBe("image/jpeg"); expect(response.headers["cache-control"]).toBe("no-store"); expect(response.rawPayload).toEqual(Buffer.from([255, 216, 255, 217])); expect((await app.inject({ method: "GET", url: "/api/sessions/ses_missing/editor/job_known/frames/frame_known" })).statusCode).toBe(404); expect((await app.inject({ method: "GET", url: "/api/sessions/ses_1/editor/job_known/frames/secret.env" })).statusCode).toBe(400); } finally { await app.close(); } }); }); it("streams only registered media ranges and keeps review mutations same-origin",async()=>{ const root=await mkdtemp(join(tmpdir(),"editor-api-"));const path=join(root,"preview.mp4");await writeFile(path,Buffer.from("0123456789")); const {app}=createTestApp({editorForSession:()=>({workflowView:()=>({jobId:"job_test"}),review:()=>Promise.resolve({saved:true}),video:()=>Promise.resolve({path,size:10})})}); try{ const range=await app.inject({method:"GET",url:"/api/sessions/ses_1/editor/job_test/plans/plan_test/preview",headers:{range:"bytes=2-5"}}); expect(range.statusCode).toBe(206);expect(range.body).toBe("2345");expect(range.headers["content-range"]).toBe("bytes 2-5/10");expect(range.headers["content-type"]).toBe("video/mp4"); expect((await app.inject({method:"GET",url:"/api/sessions/ses_1/editor/job_test/plans/plan_test/preview",headers:{range:"bytes=20-30"}})).statusCode).toBe(416); expect((await app.inject({method:"GET",url:"/api/sessions/ses_missing/editor/job_test/plans/plan_test/preview"})).statusCode).toBe(404); expect((await app.inject({method:"POST",url:"/api/sessions/ses_1/editor/job_test/review/selection",headers:{origin:"https://evil.example","content-type":"application/json"},payload:{}})).statusCode).toBeGreaterThanOrEqual(400); expect((await app.inject({method:"POST",url:"/api/sessions/ses_1/editor/job_test/review/selection",payload:{}})).json()).toEqual({saved:true}); }finally{await app.close();await rm(root,{recursive:true,force:true});} });