feat(control-station): add configurable environment shell
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
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);
|
||||
});
|
||||
Reference in New Issue
Block a user