Files
NODEDC_MISSION_CORE/apps/control-station/test/environmentSettings.test.mjs
T

115 lines
3.2 KiB
JavaScript

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/v1",
revision: defaults.revision,
header_labels: defaults.headerLabels,
backgrounds: Object.fromEntries(
Object.entries(defaults.backgrounds).map(([surfaceId, background]) => [
surfaceId,
{
enabled: background.enabled,
source: background.source,
url: background.url,
media_kind: background.mediaKind,
file_name: background.fileName,
},
]),
),
...overrides,
};
}
test("default environment exposes every header and landing surface", () => {
const defaults = environment.defaultEnvironmentSettings();
assert.deepEqual(Object.keys(defaults.headerLabels), [
"center",
"fleet",
"observation",
"missions",
"data",
"system",
"polygon",
]);
assert.deepEqual(Object.keys(defaults.backgrounds), [
"home",
"center",
"fleet",
"observation",
"missions",
"data",
"system",
"polygon",
]);
});
test("server document decodes and re-encodes without leaking schema internals", () => {
const payload = serverDocument({
revision: 4,
header_labels: {
...serverDocument().header_labels,
center: "Командный центр",
},
backgrounds: {
...serverDocument().backgrounds,
home: {
enabled: true,
source: "file",
url: `/api/v1/environment/media/home?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.headerLabels.center, "Командный центр");
assert.equal(decoded.backgrounds.home.mediaKind, "video");
assert.equal(encoded.backgrounds.home.media_kind, "video");
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 environment cannot mutate the accepted settings", () => {
const accepted = environment.decodeEnvironmentSettings(serverDocument());
const draft = environment.cloneEnvironmentSettings(accepted);
draft.headerLabels.center = "Изменено";
draft.backgrounds.home.enabled = true;
assert.equal(accepted.headerLabels.center, "Центр");
assert.equal(accepted.backgrounds.home.enabled, false);
});