feat(control-station): configure page-specific shell
This commit is contained in:
@@ -24,18 +24,25 @@ after(async () => {
|
||||
function serverDocument(overrides = {}) {
|
||||
const defaults = environment.defaultEnvironmentSettings();
|
||||
return {
|
||||
schema_version: "missioncore.operator-environment/v1",
|
||||
schema_version: "missioncore.operator-environment/v2",
|
||||
revision: defaults.revision,
|
||||
header_labels: defaults.headerLabels,
|
||||
backgrounds: Object.fromEntries(
|
||||
Object.entries(defaults.backgrounds).map(([surfaceId, background]) => [
|
||||
pages: Object.fromEntries(
|
||||
Object.entries(defaults.pages).map(([surfaceId, page]) => [
|
||||
surfaceId,
|
||||
{
|
||||
enabled: background.enabled,
|
||||
source: background.source,
|
||||
url: background.url,
|
||||
media_kind: background.mediaKind,
|
||||
file_name: background.fileName,
|
||||
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,
|
||||
},
|
||||
},
|
||||
]),
|
||||
),
|
||||
@@ -43,20 +50,10 @@ function serverDocument(overrides = {}) {
|
||||
};
|
||||
}
|
||||
|
||||
test("default environment exposes every header and landing surface", () => {
|
||||
test("default environment exposes every current product page", () => {
|
||||
const defaults = environment.defaultEnvironmentSettings();
|
||||
assert.deepEqual(Object.keys(defaults.headerLabels), [
|
||||
"center",
|
||||
"fleet",
|
||||
"observation",
|
||||
"missions",
|
||||
"data",
|
||||
"system",
|
||||
"polygon",
|
||||
]);
|
||||
assert.deepEqual(Object.keys(defaults.backgrounds), [
|
||||
assert.deepEqual(Object.keys(defaults.pages), [
|
||||
"home",
|
||||
"center",
|
||||
"fleet",
|
||||
"observation",
|
||||
"missions",
|
||||
@@ -64,23 +61,31 @@ test("default environment exposes every header and landing surface", () => {
|
||||
"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 without leaking schema internals", () => {
|
||||
test("server document decodes and re-encodes the complete page contract", () => {
|
||||
const base = serverDocument();
|
||||
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",
|
||||
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",
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -88,9 +93,11 @@ test("server document decodes and re-encodes without leaking schema internals",
|
||||
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(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);
|
||||
});
|
||||
|
||||
@@ -103,12 +110,12 @@ test("decoder fails closed on an unknown environment schema", () => {
|
||||
);
|
||||
});
|
||||
|
||||
test("editing a cloned environment cannot mutate the accepted settings", () => {
|
||||
test("editing a cloned page cannot mutate accepted settings", () => {
|
||||
const accepted = environment.decodeEnvironmentSettings(serverDocument());
|
||||
const draft = environment.cloneEnvironmentSettings(accepted);
|
||||
draft.headerLabels.center = "Изменено";
|
||||
draft.backgrounds.home.enabled = true;
|
||||
draft.pages.observation.headerLabel = "Изменено";
|
||||
draft.pages.fleet.background.enabled = true;
|
||||
|
||||
assert.equal(accepted.headerLabels.center, "Центр");
|
||||
assert.equal(accepted.backgrounds.home.enabled, false);
|
||||
assert.equal(accepted.pages.observation.headerLabel, "Наблюдение");
|
||||
assert.equal(accepted.pages.fleet.background.enabled, false);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user