98 lines
3.1 KiB
JavaScript
98 lines
3.1 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { after, before, test } from "node:test";
|
|
import { createServer } from "vite";
|
|
|
|
let server, fetchLabViewProfile, saveLabViewProfile, normalizeLabSceneSettings;
|
|
|
|
before(async () => {
|
|
server = await createServer({ appType: "custom", logLevel: "silent",
|
|
server: { middlewareMode: true } });
|
|
({ fetchLabViewProfile, saveLabViewProfile } = await server.ssrLoadModule(
|
|
"/src/core/observatory/labViewProfile.ts"));
|
|
({ normalizeLabSceneSettings } = await server.ssrLoadModule(
|
|
"/src/components/laboratory/CanonicalResultRerunReplay.tsx"));
|
|
});
|
|
|
|
after(async () => { await server?.close(); });
|
|
|
|
const serverProfile = {
|
|
schema_version: "missioncore.observatory-lab-view-profile/v1",
|
|
result_id: "result-1",
|
|
scene_settings: {
|
|
point_size: 4.7,
|
|
accumulation_seconds: 8,
|
|
color_mode: "height",
|
|
palette: "viridis",
|
|
show_grid: false,
|
|
show_labels: true,
|
|
show_camera_frustums: false,
|
|
},
|
|
updated_at_utc: "2026-09-04T09:30:00.000Z",
|
|
};
|
|
|
|
test("LAB view profile round-trips through the result-scoped server endpoint", async () => {
|
|
const originalFetch = globalThis.fetch;
|
|
const requests = [];
|
|
globalThis.fetch = async (url, init = {}) => {
|
|
requests.push({ url, init });
|
|
return new Response(JSON.stringify(serverProfile), {
|
|
status: 200, headers: { "Content-Type": "application/json" },
|
|
});
|
|
};
|
|
try {
|
|
const settings = await fetchLabViewProfile("result-1");
|
|
assert.equal(settings.pointSize, 4.7);
|
|
assert.equal(settings.palette, "viridis");
|
|
const saved = await saveLabViewProfile("result-1", settings);
|
|
assert.equal(saved.accumulationSeconds, 8);
|
|
assert.equal(requests[0].url, "/api/v1/observatory/lab-view-profiles/result-1");
|
|
assert.equal(requests[1].init.method, "PUT");
|
|
assert.deepEqual(JSON.parse(requests[1].init.body).scene_settings, serverProfile.scene_settings);
|
|
} finally {
|
|
globalThis.fetch = originalFetch;
|
|
}
|
|
});
|
|
|
|
test("LAB view profile fails closed on a foreign result identity", async () => {
|
|
const originalFetch = globalThis.fetch;
|
|
globalThis.fetch = async () => new Response(JSON.stringify({
|
|
...serverProfile, result_id: "foreign-result",
|
|
}), { status: 200, headers: { "Content-Type": "application/json" } });
|
|
try {
|
|
await assert.rejects(fetchLabViewProfile("result-1"), /другой LAB/);
|
|
} finally {
|
|
globalThis.fetch = originalFetch;
|
|
}
|
|
});
|
|
|
|
test("LAB scene settings normalize typed values before persistence", () => {
|
|
assert.deepEqual(
|
|
normalizeLabSceneSettings({
|
|
pointSize: 28,
|
|
accumulationSeconds: 305,
|
|
colorMode: "height",
|
|
palette: "viridis",
|
|
customColor: "#ffffff",
|
|
showGrid: false,
|
|
showPoints: true,
|
|
showTrajectory: true,
|
|
showLabels: true,
|
|
showCameraFrustums: false,
|
|
projection: "3d",
|
|
}),
|
|
{
|
|
pointSize: 28,
|
|
accumulationSeconds: 305,
|
|
colorMode: "height",
|
|
palette: "viridis",
|
|
customColor: "#ffffff",
|
|
showGrid: false,
|
|
showPoints: true,
|
|
showTrajectory: true,
|
|
showLabels: true,
|
|
showCameraFrustums: false,
|
|
projection: "3d",
|
|
},
|
|
);
|
|
});
|