who_need_help/assets/js/map_cluster_features.test.mjs

118 lines
3.4 KiB
JavaScript

import assert from "node:assert/strict"
import test from "node:test"
import {
clusterCountLabel,
clusterExpansionTarget,
clusterSizeClass,
pointFeatureCollection,
pointSourceOptions,
serverClusterDescriptor
} from "./map_cluster_features.mjs"
test("server hierarchy metadata survives GeoJSON conversion without becoming a native cluster", () => {
const feature = pointFeatureCollection([
{
id: "request:11:1197:1378",
type: "cluster",
cluster_id: "request:11:1197:1378",
parent_cluster_id: "request:10:598:689",
hierarchy_level: 11,
expansion_zoom: 13,
longitude: 30.52,
latitude: 50.45,
count: 27
}
]).features[0]
assert.equal(feature.properties.server_cluster_id, "request:11:1197:1378")
assert.equal(feature.properties.parent_cluster_id, "request:10:598:689")
assert.equal(feature.properties.hierarchy_level, 11)
assert.equal(feature.properties.expansion_zoom, 13)
assert.equal(feature.properties.weight, 27)
assert.equal(feature.properties.count_label, "27")
assert.equal("point_count" in feature.properties, false)
})
test("browser source leaves server hierarchy nodes unclustered", () => {
const collection = pointFeatureCollection([
{
id: "request:11:1197:1378",
type: "cluster",
longitude: 30.52,
latitude: 50.45,
count: 27
}
])
const source = pointSourceOptions(collection)
assert.equal(source.cluster, false)
assert.equal(source.data, collection)
})
test("cluster size classes remain stable for accessible count buttons", () => {
assert.equal(clusterSizeClass(999), "is-md")
assert.equal(clusterSizeClass(1_000), "is-lg")
assert.equal(clusterSizeClass(10_000), "is-xl")
assert.equal(clusterSizeClass(100_000), "is-xxl")
})
test("large visual counts are compact while exact values remain available to accessibility text", () => {
assert.equal(clusterCountLabel(999, "en"), "999")
assert.equal(clusterCountLabel(1_250, "en"), "1.3K")
assert.equal(clusterCountLabel(48_533, "en"), "49K")
assert.equal(clusterCountLabel(1_000_000, "en"), "1M")
})
test("server cluster count labels are compacted before rendering", () => {
const feature = pointFeatureCollection([
{
id: "request:12:2402:2406",
type: "cluster",
longitude: 31.3,
latitude: 30.2,
count: 48_533
}
], "en").features[0]
assert.equal(feature.properties.count_label, "49K")
})
test("only server hierarchy nodes become cluster markers", () => {
assert.deepEqual(
serverClusterDescriptor({
id: "request:12:2402:2406",
type: "cluster",
longitude: 31.3,
latitude: 30.2,
count: 1_727,
urgent_count: 8
}),
{
key: "server:request:12:2402:2406",
count: 1_727,
urgentCount: 8,
longitude: 31.3,
latitude: 30.2
}
)
assert.equal(
serverClusterDescriptor({
id: "request-1",
type: "request",
longitude: 31.3,
latitude: 30.2
}),
null
)
})
test("cluster expansion always advances at least one integer zoom level", () => {
assert.equal(clusterExpansionTarget(9, 9), 10)
assert.equal(clusterExpansionTarget(8.999_999_096_835_52, 9), 10)
assert.equal(clusterExpansionTarget(10.999_994_193_019_71, 11), 12)
assert.equal(clusterExpansionTarget(9.6, 10), 10)
assert.equal(clusterExpansionTarget(9.6, 13), 13)
assert.equal(clusterExpansionTarget(21.9, 24), 22)
})