96 lines
3.3 KiB
JavaScript
96 lines
3.3 KiB
JavaScript
import assert from "node:assert/strict";
|
|
|
|
import {
|
|
ZONE_SOURCE_GENERATION_SCHEMA_VERSION,
|
|
normalizeZoneSourceGeneration,
|
|
validateDataProductPublish,
|
|
} from "../src/index.mjs";
|
|
|
|
const generatedAt = "2026-07-20T18:00:00.000Z";
|
|
const live = normalizeZoneSourceGeneration({
|
|
schemaVersion: ZONE_SOURCE_GENERATION_SCHEMA_VERSION,
|
|
adapterId: "gelios-rest-v1",
|
|
sourceRevision: "gelios-rest-v1",
|
|
generatedAt,
|
|
complete: true,
|
|
zones: [{
|
|
id: 42,
|
|
name: "Polygon zone",
|
|
type: "polygon",
|
|
points: [
|
|
{ latitude: 55.74, longitude: 37.60 },
|
|
{ latitude: 55.74, longitude: 37.62 },
|
|
{ latitude: 55.76, longitude: 37.62 },
|
|
],
|
|
color: "#ff00ff",
|
|
}, {
|
|
id: 43,
|
|
name: "Circle zone",
|
|
type: "circle",
|
|
points: [{ latitude: 55.75, longitude: 37.61 }],
|
|
radius: 150,
|
|
}],
|
|
});
|
|
assert.equal(live.complete, true);
|
|
assert.equal(live.sourceKind, "live_api");
|
|
assert.equal(live.facts.length, 2);
|
|
assert.deepEqual(live.facts.map((fact) => fact.sourceId), ["gelios-zone-42", "gelios-zone-43"]);
|
|
assert.equal(live.facts.every((fact) => fact.observedAt === generatedAt), true);
|
|
assert.equal(live.facts.every((fact) => fact.geometry.type === "Polygon"), true);
|
|
assert.equal(validateDataProductPublish({
|
|
schemaVersion: "nodedc.data-product.publish/v1",
|
|
batch: { runId: "zones-live-1", sequence: 0, idempotencyKey: "zones-live-1.batch-0", mode: "replace", generationAt: generatedAt },
|
|
facts: live.facts,
|
|
}).ok, true);
|
|
|
|
const snapshotDigest = "a".repeat(64);
|
|
const snapshot = normalizeZoneSourceGeneration({
|
|
schemaVersion: ZONE_SOURCE_GENERATION_SCHEMA_VERSION,
|
|
adapterId: "mmap-snapshot-v1",
|
|
snapshotDigest,
|
|
generatedAt,
|
|
complete: true,
|
|
zones: [{
|
|
snapshotKey: "legacy-zone-a",
|
|
name: "Snapshot zone",
|
|
type: "polygon",
|
|
points: "55.74,37.60;55.74,37.62;55.76,37.62",
|
|
}],
|
|
}, { identityCrosswalk: { "legacy-zone-a": 42 } });
|
|
assert.equal(snapshot.sourceKind, "versioned_snapshot");
|
|
assert.equal(snapshot.facts[0].sourceId, live.facts[0].sourceId);
|
|
assert.match(snapshot.sourceRevision, new RegExp(`@sha256:${snapshotDigest}$`));
|
|
|
|
assert.throws(() => normalizeZoneSourceGeneration({
|
|
schemaVersion: ZONE_SOURCE_GENERATION_SCHEMA_VERSION,
|
|
adapterId: "mmap-snapshot-v1",
|
|
snapshotDigest,
|
|
generatedAt,
|
|
complete: true,
|
|
zones: [{ snapshotKey: "unknown", name: "Unknown", type: "polygon", points: "55.74,37.60;55.74,37.62;55.76,37.62" }],
|
|
}), /zone_source_identity_crosswalk_required/);
|
|
assert.throws(() => normalizeZoneSourceGeneration({
|
|
schemaVersion: ZONE_SOURCE_GENERATION_SCHEMA_VERSION,
|
|
adapterId: "mmap-snapshot-v1",
|
|
snapshotDigest,
|
|
generatedAt,
|
|
complete: true,
|
|
zones: [{ id: 42, name: "Uncrossed", type: "polygon", points: "55.74,37.60;55.74,37.62;55.76,37.62" }],
|
|
}), /zone_source_identity_crosswalk_required/);
|
|
assert.throws(() => normalizeZoneSourceGeneration({
|
|
schemaVersion: ZONE_SOURCE_GENERATION_SCHEMA_VERSION,
|
|
adapterId: "gelios-rest-v1",
|
|
generatedAt,
|
|
complete: true,
|
|
zones: [{ name: "No native id", type: "polygon", points: "55.74,37.60;55.74,37.62;55.76,37.62" }],
|
|
}), /zone_source_native_identity_required/);
|
|
assert.throws(() => normalizeZoneSourceGeneration({
|
|
schemaVersion: ZONE_SOURCE_GENERATION_SCHEMA_VERSION,
|
|
adapterId: "gelios-rest-v1",
|
|
generatedAt,
|
|
complete: false,
|
|
zones: [],
|
|
}), /zone_source_generation_incomplete/);
|
|
|
|
console.log("external-provider zone source: ok");
|