38 lines
2.9 KiB
TypeScript
38 lines
2.9 KiB
TypeScript
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});}
|
|
});
|