7df9ebf22c
Sync labels / sync (push) Failing after 1m9s
Publish Container Image / Build and publish container image (push) Has been cancelled
Deploy Website / Deploy to GitHub Pages (push) Has been cancelled
Deploy Website / Build website and demo (push) Has been cancelled
Deploy viewer / Deploy viewer proxy to Cloudflare Workers (push) Has been cancelled
Deploy tiles / Deploy planetary tile proxy to Cloudflare Workers (push) Has been cancelled
Deploy collab / Deploy collaboration relay to Cloudflare Workers (push) Has been cancelled
CI / Dependency audit (push) Has been cancelled
CI / E2E smoke (Playwright) (push) Has been cancelled
CI / Validate CITATION.cff (push) Has been cancelled
CI / Build and test (push) Has been cancelled
172 lines
5.2 KiB
TypeScript
172 lines
5.2 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import { describe, it } from "node:test";
|
|
import { DEFAULT_LAYER_STYLE, type GeoLibreLayer } from "@geolibre/core";
|
|
import type { GeoLibreExternalNativeLayerRegistration } from "@geolibre/plugins";
|
|
import { createExternalNativeStoreLayer } from "../apps/geolibre-desktop/src/lib/external-native-layer";
|
|
|
|
const baseRegistration = (
|
|
overrides: Partial<GeoLibreExternalNativeLayerRegistration> = {},
|
|
): GeoLibreExternalNativeLayerRegistration => ({
|
|
id: "plugin-layer",
|
|
name: "Plugin Layer",
|
|
nativeLayerIds: ["plugin-layer-fill", "plugin-layer-outline"],
|
|
...overrides,
|
|
});
|
|
|
|
describe("createExternalNativeStoreLayer", () => {
|
|
it("keeps the registration style over an existing default-seeded style", () => {
|
|
// addGeoJsonLayer seeds the layer with the full DEFAULT_LAYER_STYLE before
|
|
// the plugin registers its own colors, so the registration must win.
|
|
const existing: GeoLibreLayer = {
|
|
id: "plugin-layer",
|
|
name: "Plugin Layer",
|
|
type: "geojson",
|
|
source: { type: "geojson" },
|
|
visible: true,
|
|
opacity: 1,
|
|
style: { ...DEFAULT_LAYER_STYLE },
|
|
metadata: {},
|
|
};
|
|
|
|
const layer = createExternalNativeStoreLayer(
|
|
baseRegistration({ style: { fillColor: "#ff0000", strokeColor: "#990000" } }),
|
|
existing,
|
|
);
|
|
|
|
assert.equal(layer.style.fillColor, "#ff0000");
|
|
assert.equal(layer.style.strokeColor, "#990000");
|
|
assert.notEqual(layer.style.fillColor, DEFAULT_LAYER_STYLE.fillColor);
|
|
});
|
|
|
|
it("preserves user-edited existing style for keys the registration omits", () => {
|
|
const existing: GeoLibreLayer = {
|
|
id: "plugin-layer",
|
|
name: "Plugin Layer",
|
|
type: "geojson",
|
|
source: { type: "geojson" },
|
|
visible: true,
|
|
opacity: 1,
|
|
style: { ...DEFAULT_LAYER_STYLE, strokeWidth: 5 },
|
|
metadata: {},
|
|
};
|
|
|
|
const layer = createExternalNativeStoreLayer(
|
|
baseRegistration({ style: { fillColor: "#00ff00" } }),
|
|
existing,
|
|
);
|
|
|
|
assert.equal(layer.style.fillColor, "#00ff00");
|
|
assert.equal(layer.style.strokeWidth, 5);
|
|
});
|
|
|
|
it("lets the registration own overlapping style keys over a user edit", () => {
|
|
// External native layers are plugin-owned: a re-registration's style wins
|
|
// even over a non-default user value on the same key, not just over defaults.
|
|
const existing: GeoLibreLayer = {
|
|
id: "plugin-layer",
|
|
name: "Plugin Layer",
|
|
type: "geojson",
|
|
source: { type: "geojson" },
|
|
visible: true,
|
|
opacity: 1,
|
|
style: { ...DEFAULT_LAYER_STYLE, fillColor: "#abcdef" },
|
|
metadata: {},
|
|
};
|
|
|
|
const layer = createExternalNativeStoreLayer(
|
|
baseRegistration({ style: { fillColor: "#ff0000" } }),
|
|
existing,
|
|
);
|
|
|
|
assert.equal(layer.style.fillColor, "#ff0000");
|
|
});
|
|
|
|
it("keeps the registration opacity over an existing default-seeded opacity", () => {
|
|
const existing: GeoLibreLayer = {
|
|
id: "plugin-layer",
|
|
name: "Plugin Layer",
|
|
type: "geojson",
|
|
source: { type: "geojson" },
|
|
visible: true,
|
|
opacity: 1, // seeded by addGeoJsonLayer
|
|
style: { ...DEFAULT_LAYER_STYLE },
|
|
metadata: {},
|
|
};
|
|
|
|
const layer = createExternalNativeStoreLayer(
|
|
baseRegistration({ opacity: 0.5 }),
|
|
existing,
|
|
);
|
|
|
|
assert.equal(layer.opacity, 0.5);
|
|
});
|
|
|
|
it("falls back to existing opacity when the registration omits opacity", () => {
|
|
const existing: GeoLibreLayer = {
|
|
id: "plugin-layer",
|
|
name: "Plugin Layer",
|
|
type: "geojson",
|
|
source: { type: "geojson" },
|
|
visible: true,
|
|
opacity: 0.7,
|
|
style: { ...DEFAULT_LAYER_STYLE },
|
|
metadata: {},
|
|
};
|
|
|
|
const layer = createExternalNativeStoreLayer(baseRegistration(), existing);
|
|
|
|
assert.equal(layer.opacity, 0.7);
|
|
});
|
|
|
|
it("lets the registration own opacity over a non-default user-edited value", () => {
|
|
const existing: GeoLibreLayer = {
|
|
id: "plugin-layer",
|
|
name: "Plugin Layer",
|
|
type: "geojson",
|
|
source: { type: "geojson" },
|
|
visible: true,
|
|
opacity: 0.3, // user-edited
|
|
style: { ...DEFAULT_LAYER_STYLE },
|
|
metadata: {},
|
|
};
|
|
|
|
const layer = createExternalNativeStoreLayer(
|
|
baseRegistration({ opacity: 0.8 }),
|
|
existing,
|
|
);
|
|
|
|
assert.equal(layer.opacity, 0.8);
|
|
});
|
|
|
|
it("applies the registration style over defaults for a brand-new layer", () => {
|
|
const layer = createExternalNativeStoreLayer(
|
|
baseRegistration({ style: { fillColor: "#123456" } }),
|
|
);
|
|
|
|
assert.equal(layer.style.fillColor, "#123456");
|
|
assert.equal(layer.style.strokeColor, DEFAULT_LAYER_STYLE.strokeColor);
|
|
assert.equal(layer.metadata?.externalNativeLayer, true);
|
|
assert.deepEqual(layer.metadata?.nativeLayerIds, [
|
|
"plugin-layer-fill",
|
|
"plugin-layer-outline",
|
|
]);
|
|
});
|
|
|
|
it("preserves existing visibility when false", () => {
|
|
const existing: GeoLibreLayer = {
|
|
id: "plugin-layer",
|
|
name: "Plugin Layer",
|
|
type: "geojson",
|
|
source: { type: "geojson" },
|
|
visible: false,
|
|
opacity: 1,
|
|
style: { ...DEFAULT_LAYER_STYLE },
|
|
metadata: {},
|
|
};
|
|
|
|
const layer = createExternalNativeStoreLayer(baseRegistration(), existing);
|
|
|
|
assert.equal(layer.visible, false);
|
|
});
|
|
});
|