import assert from "node:assert/strict"; import { after, before, test } from "node:test"; import { createServer } from "vite"; let server; let environment; before(async () => { server = await createServer({ appType: "custom", logLevel: "silent", server: { middlewareMode: true }, }); environment = await server.ssrLoadModule( "/src/core/environment/environmentSettings.ts", ); }); after(async () => { await server?.close(); }); function serverDocument(overrides = {}) { const defaults = environment.defaultEnvironmentSettings(); return { schema_version: "missioncore.operator-environment/v2", revision: defaults.revision, pages: Object.fromEntries( Object.entries(defaults.pages).map(([surfaceId, page]) => [ surfaceId, { header_label: page.headerLabel, eyebrow: page.eyebrow, title: page.title, description: page.description, primary_workspace_id: page.primaryWorkspaceId, secondary_workspace_id: page.secondaryWorkspaceId, background: { enabled: page.background.enabled, source: page.background.source, url: page.background.url, media_kind: page.background.mediaKind, file_name: page.background.fileName, }, }, ]), ), ...overrides, }; } test("default environment exposes every current product page", () => { const defaults = environment.defaultEnvironmentSettings(); assert.deepEqual(Object.keys(defaults.pages), [ "home", "fleet", "observation", "missions", "data", "system", "polygon", ]); assert.equal(defaults.pages.fleet.primaryWorkspaceId, "contour-health"); assert.equal(defaults.pages.observation.primaryWorkspaceId, "spatial-scene"); }); test("server document decodes and re-encodes the complete page contract", () => { const base = serverDocument(); const payload = serverDocument({ revision: 4, pages: { ...base.pages, observation: { ...base.pages.observation, header_label: "Контроль", title: "Контроль пространства", }, fleet: { ...base.pages.fleet, primary_workspace_id: "contour-health", background: { enabled: true, source: "file", url: `/api/v1/environment/media/fleet?generation=${"a".repeat(64)}`, media_kind: "video", file_name: "stage.mp4", }, }, }, }); const decoded = environment.decodeEnvironmentSettings(payload); const encoded = environment.encodeEnvironmentSettings(decoded); assert.equal(decoded.revision, 4); assert.equal(decoded.pages.observation.headerLabel, "Контроль"); assert.equal(decoded.pages.observation.title, "Контроль пространства"); assert.equal(decoded.pages.fleet.background.mediaKind, "video"); assert.equal(encoded.pages.fleet.background.media_kind, "video"); assert.equal(encoded.pages.fleet.primary_workspace_id, "contour-health"); assert.equal("schema_version" in encoded, false); }); test("decoder fails closed on an unknown environment schema", () => { assert.throws( () => environment.decodeEnvironmentSettings( serverDocument({ schema_version: "future/v9" }), ), /не поддерживается/, ); }); test("editing a cloned page cannot mutate accepted settings", () => { const accepted = environment.decodeEnvironmentSettings(serverDocument()); const draft = environment.cloneEnvironmentSettings(accepted); draft.pages.observation.headerLabel = "Изменено"; draft.pages.fleet.background.enabled = true; assert.equal(accepted.pages.observation.headerLabel, "Наблюдение"); assert.equal(accepted.pages.fleet.background.enabled, false); });