158 lines
5.7 KiB
JavaScript
158 lines
5.7 KiB
JavaScript
import assert from "node:assert/strict";
|
|
import { fileURLToPath } from "node:url";
|
|
|
|
import {
|
|
ZONE_SOURCE_GENERATION_SCHEMA_VERSION,
|
|
normalizeZoneSourceGeneration,
|
|
validateDataProductPublish,
|
|
} from "../src/index.mjs";
|
|
import { loadZoneSourceProfile } from "../../../services/map-gateway/src/zone-source-snapshot.mjs";
|
|
|
|
const generatedAt = "2025-06-03T11:05:00.000Z";
|
|
const snapshotDigest = "a".repeat(64);
|
|
const snapshot = normalizeZoneSourceGeneration({
|
|
schemaVersion: ZONE_SOURCE_GENERATION_SCHEMA_VERSION,
|
|
profileId: "moscow-pmd-slow-zones",
|
|
authorityId: "moscow-department-of-transport",
|
|
datasetId: "pmd-slow-zones",
|
|
adapterId: "depttrans-mmap-snapshot-v1",
|
|
sourceRevision: "pmd-slow-zones-202506031405",
|
|
contentDigest: snapshotDigest,
|
|
generatedAt,
|
|
timezone: "Europe/Moscow",
|
|
complete: true,
|
|
zones: [{
|
|
nativeId: "1478",
|
|
displayName: "Петровский парк_6 (15 км/ч)",
|
|
geometry: {
|
|
type: "Polygon",
|
|
coordinates: [[
|
|
[37.60, 55.74],
|
|
[37.62, 55.74],
|
|
[37.62, 55.76],
|
|
[37.60, 55.74],
|
|
]],
|
|
},
|
|
areaSquareMeters: 75689,
|
|
appliesToKicksharing: false,
|
|
appliesToCouriers: true,
|
|
maxSpeedKph: 15,
|
|
weeklySpeedSchedule: [{
|
|
dayOfWeek: 1,
|
|
startTime: "00:00:00",
|
|
endTime: "23:59:00",
|
|
speedLimitKph: 15,
|
|
}],
|
|
}],
|
|
});
|
|
|
|
assert.equal(snapshot.complete, true);
|
|
assert.equal(snapshot.sourceKind, "versioned_snapshot");
|
|
assert.equal(snapshot.facts.length, 1);
|
|
assert.equal(snapshot.facts[0].sourceId, "depttrans-pmd-slow-zone-1478");
|
|
assert.equal(snapshot.facts[0].observedAt, generatedAt);
|
|
assert.equal(snapshot.facts[0].geometry.type, "Polygon");
|
|
assert.equal(snapshot.facts[0].attributes.dataset_authority, "moscow-department-of-transport");
|
|
assert.equal(snapshot.facts[0].attributes.dataset_id, "pmd-slow-zones");
|
|
assert.equal(snapshot.facts[0].attributes.source_adapter, "depttrans-mmap-snapshot-v1");
|
|
assert.deepEqual(snapshot.facts[0].attributes.weekly_speed_schedule, ["1@00:00:00-23:59:00=15"]);
|
|
assert.match(snapshot.sourceRevision, new RegExp(`@sha256:${snapshotDigest}$`));
|
|
assert.equal(validateDataProductPublish({
|
|
schemaVersion: "nodedc.data-product.publish/v1",
|
|
batch: {
|
|
runId: "zones-snapshot-1",
|
|
sequence: 0,
|
|
idempotencyKey: "zones-snapshot-1.batch-0",
|
|
mode: "replace",
|
|
generationAt: generatedAt,
|
|
},
|
|
facts: snapshot.facts,
|
|
}).ok, true);
|
|
|
|
const apiSnapshot = normalizeZoneSourceGeneration({
|
|
schemaVersion: ZONE_SOURCE_GENERATION_SCHEMA_VERSION,
|
|
authorityId: "moscow-department-of-transport",
|
|
datasetId: "pmd-slow-zones",
|
|
adapterId: "depttrans-api-snapshot-v1",
|
|
sourceRevision: "pmd-slow-zones-20260721",
|
|
contentDigest: "b".repeat(64),
|
|
generatedAt: "2026-07-21T09:00:00.000Z",
|
|
timezone: "Europe/Moscow",
|
|
complete: true,
|
|
zones: [{
|
|
nativeId: "1478",
|
|
displayName: "Петровский парк_6 (15 км/ч)",
|
|
geometry: snapshot.facts[0].geometry,
|
|
}],
|
|
});
|
|
assert.equal(apiSnapshot.facts[0].sourceId, snapshot.facts[0].sourceId);
|
|
assert.equal(apiSnapshot.facts[0].attributes.source_adapter, "depttrans-api-snapshot-v1");
|
|
|
|
const gelios = normalizeZoneSourceGeneration({
|
|
schemaVersion: ZONE_SOURCE_GENERATION_SCHEMA_VERSION,
|
|
authorityId: "gelios-account",
|
|
datasetId: "gelios-geofences",
|
|
adapterId: "gelios-rest-v1",
|
|
sourceRevision: "gelios-rest-v1",
|
|
generatedAt: "2026-07-21T09:00:00.000Z",
|
|
complete: true,
|
|
zones: [{
|
|
id: 1478,
|
|
name: "Account geofence",
|
|
type: "polygon",
|
|
points: [
|
|
{ latitude: 55.74, longitude: 37.60 },
|
|
{ latitude: 55.74, longitude: 37.62 },
|
|
{ latitude: 55.76, longitude: 37.62 },
|
|
],
|
|
}],
|
|
});
|
|
assert.equal(gelios.facts[0].sourceId, "gelios-zone-1478");
|
|
assert.notEqual(gelios.facts[0].sourceId, snapshot.facts[0].sourceId);
|
|
|
|
assert.throws(() => normalizeZoneSourceGeneration({
|
|
schemaVersion: ZONE_SOURCE_GENERATION_SCHEMA_VERSION,
|
|
authorityId: "gelios-account",
|
|
datasetId: "pmd-slow-zones",
|
|
adapterId: "depttrans-mmap-snapshot-v1",
|
|
contentDigest: snapshotDigest,
|
|
generatedAt,
|
|
complete: true,
|
|
zones: [],
|
|
}), /zone_source_authority_mismatch/);
|
|
assert.throws(() => normalizeZoneSourceGeneration({
|
|
schemaVersion: ZONE_SOURCE_GENERATION_SCHEMA_VERSION,
|
|
authorityId: "moscow-department-of-transport",
|
|
datasetId: "pmd-slow-zones",
|
|
adapterId: "depttrans-mmap-snapshot-v1",
|
|
contentDigest: snapshotDigest,
|
|
generatedAt,
|
|
complete: true,
|
|
zones: [{ snapshotKey: "unknown", displayName: "Unknown", geometry: snapshot.facts[0].geometry }],
|
|
}), /zone_source_identity_crosswalk_required/);
|
|
assert.throws(() => normalizeZoneSourceGeneration({
|
|
schemaVersion: ZONE_SOURCE_GENERATION_SCHEMA_VERSION,
|
|
authorityId: "moscow-department-of-transport",
|
|
datasetId: "pmd-slow-zones",
|
|
adapterId: "depttrans-mmap-snapshot-v1",
|
|
contentDigest: snapshotDigest,
|
|
generatedAt,
|
|
complete: false,
|
|
zones: [],
|
|
}), /zone_source_generation_incomplete/);
|
|
|
|
const actualSource = await loadZoneSourceProfile(
|
|
fileURLToPath(new URL("../../../services/map-gateway/zone-sources", import.meta.url)),
|
|
"moscow-pmd-slow-zones",
|
|
);
|
|
const actual = normalizeZoneSourceGeneration(actualSource.generation);
|
|
assert.equal(actual.facts.length, 903);
|
|
assert.equal(actual.facts[0].sourceId.startsWith("depttrans-pmd-slow-zone-"), true);
|
|
assert.equal(actual.facts.every((fact) => fact.attributes.dataset_authority === "moscow-department-of-transport"), true);
|
|
assert.equal(actual.facts.every((fact) => fact.attributes.dataset_id === "pmd-slow-zones"), true);
|
|
assert.equal(actual.facts.every((fact) => fact.attributes.source_adapter === "depttrans-mmap-snapshot-v1"), true);
|
|
assert.equal(actual.facts.every((fact) => fact.attributes.weekly_speed_schedule.length === 7), true);
|
|
assert.equal(actual.facts.every((fact) => Number(fact.attributes.area_square_meters) > 0), true);
|
|
|
|
console.log("external-provider zone source: ok");
|