Files
NODEDC_MISSION_CORE/apps/control-station/test/perceptionPreparation.test.mjs

78 lines
2.1 KiB
JavaScript

import assert from "node:assert/strict";
import { after, before, test } from "node:test";
import { createServer } from "vite";
let server;
let fetchPerceptionPreparationStatus;
let perceptionPreparationMessage;
before(async () => {
server = await createServer({
appType: "custom",
logLevel: "silent",
server: { middlewareMode: true },
});
({
fetchPerceptionPreparationStatus,
perceptionPreparationMessage,
} = await server.ssrLoadModule(
"/src/core/observation/perceptionPreparation.ts",
));
});
after(async () => {
await server?.close();
});
test("perception preparation status is same-origin, typed and phase-specific", async () => {
let requested;
const status = await fetchPerceptionPreparationStatus(
"/api/v1/observation-sessions/session-1/perception.rrd",
"recording-001",
{
origin: "http://127.0.0.1:8000",
fetcher: async (input, init) => {
requested = { url: String(input), method: init.method };
return Response.json({
state: "preparing",
phase: "artifact-validation",
elapsed_seconds: 2.5,
byte_length: null,
});
},
},
);
assert.deepEqual(requested, {
url: "http://127.0.0.1:8000/api/v1/observation-sessions/session-1/perception/status?recording_id=recording-001",
method: "GET",
});
assert.deepEqual(status, {
state: "preparing",
phase: "artifact-validation",
elapsedSeconds: 2.5,
byteLength: null,
});
assert.equal(
perceptionPreparationMessage(status.phase),
"Проверяем опубликованный AI-результат.",
);
});
test("perception preparation status rejects cross-origin endpoints", async () => {
await assert.rejects(
fetchPerceptionPreparationStatus(
"https://example.com/api/v1/observation-sessions/session-1/perception.rrd",
"recording-001",
{
origin: "http://127.0.0.1:8000",
fetcher: async () => {
throw new Error("must not fetch");
},
},
),
/Unsafe perception preparation status request/,
);
});