115 lines
3.2 KiB
JavaScript
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);
|
|
});
|