mapcomplete/test/Logic/FeatureSource/OsmFeatureSource.spec.ts

164 lines
6.2 KiB
TypeScript

import OsmFeatureSource from "../../../Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource"
import { UIEventSource } from "../../../Logic/UIEventSource"
import ScriptUtils from "../../../scripts/ScriptUtils"
import FilteredLayer, { FilterState } from "../../../Models/FilteredLayer"
import { Tiles } from "../../../Models/TileRange"
import { readFileSync } from "fs"
import { Utils } from "../../../Utils"
import { Tag } from "../../../Logic/Tags/Tag"
import LayerConfig from "../../../Models/ThemeConfig/LayerConfig"
import { describe, expect, it } from "vitest"
const expected = {
type: "Feature",
id: "relation/5759328",
properties: {
timestamp: "2022-06-10T00:46:55Z",
version: 6,
changeset: 122187206,
user: "Pieter Vander Vennet",
uid: 3818858,
amenity: "school",
"isced:2011:level": "vocational_lower_secondary;vocational_upper_secondary",
name: "Koninklijk Technisch Atheneum Pro Technica",
"school:gender": "mixed",
type: "multipolygon",
website: "http://ktahalle.be/",
id: "relation/5759328",
_backend: "https://osm.org",
},
geometry: {
type: "MultiPolygon",
coordinates: [
[
[
[4.2461832, 50.7335751],
[4.2463167, 50.7336785],
[4.2463473, 50.7337021],
[4.2464497, 50.7337814],
[4.2471698, 50.7343389],
[4.2469541, 50.7344768],
[4.2467571, 50.7346116],
[4.2467727, 50.7346199],
[4.2465714, 50.7347511],
[4.2462398, 50.7349687],
[4.2453546, 50.734601],
[4.2451895, 50.7345103],
[4.2448867, 50.7342629],
[4.244899, 50.7342069],
[4.2461832, 50.7335751],
],
],
[
[
[4.2444209, 50.7353737],
[4.2439986, 50.7352034],
[4.2440303, 50.7351755],
[4.2440602, 50.7351058],
[4.2439776, 50.7350326],
[4.2439558, 50.7350132],
[4.2438246, 50.7348961],
[4.2437848, 50.73486],
[4.2436555, 50.7347455],
[4.2435905, 50.734689],
[4.2435494, 50.7346601],
[4.2435038, 50.7346256],
[4.2434769, 50.7346026],
[4.2430948, 50.734275],
[4.2427978, 50.7340052],
[4.2430556, 50.7338391],
[4.2438957, 50.7334942],
[4.2440204, 50.7336368],
[4.2442806, 50.7338922],
[4.2444173, 50.7340119],
[4.2447379, 50.7342925],
[4.2450107, 50.7345294],
[4.2450236, 50.7346021],
[4.2449643, 50.7347019],
[4.244711, 50.7350821],
[4.2444209, 50.7353737],
],
],
],
},
}
function test(done: () => void) {
let fetchedTile = undefined
const neededTiles = new UIEventSource<number[]>([Tiles.tile_index(17, 67081, 44033)])
new OsmFeatureSource({
allowedFeatures: new Tag("amenity", "school"),
handleTile: (tile) => {
fetchedTile = tile
const data = tile.features.data[0].feature
expect(data.properties).toEqual({
id: "relation/5759328",
timestamp: "2022-06-10T00:46:55Z",
version: 6,
changeset: 122187206,
user: "Pieter Vander Vennet",
uid: 3818858,
amenity: "school",
"isced:2011:level": "vocational_lower_secondary;vocational_upper_secondary",
name: "Koninklijk Technisch Atheneum Pro Technica",
"school:gender": "mixed",
type: "multipolygon",
website: "http://ktahalle.be/",
_backend: "https://osm.org",
})
expect(data.geometry.type).toBe("MultiPolygon")
expect(data).toEqual(expected)
done()
},
isActive: new UIEventSource<boolean>(true),
neededTiles,
state: {
osmConnection: {
Backend(): string {
return "https://osm.org"
},
},
filteredLayers: new UIEventSource<FilteredLayer[]>([
{
appliedFilters: new UIEventSource<Map<string, FilterState>>(undefined),
layerDef: new LayerConfig({
id: "school",
source: {
osmTags: "amenity=school",
},
mapRendering: null,
}),
isDisplayed: new UIEventSource<boolean>(true),
},
]),
},
})
}
describe("OsmFeatureSource", () => {
it("downloading the full school should give a multipolygon", (done) => {
ScriptUtils.fixUtils()
let data = JSON.parse(readFileSync("./test/Logic/FeatureSource/osmdata.json", "utf8"))
Utils.injectJsonDownloadForTests(
"https://osm.org/api/0.6/map?bbox=4.24346923828125,50.732978448277514,4.2462158203125,50.73471682490244",
data
)
test(done)
})
it("downloading the partial school polygon should give a multipolygon", (done) => {
ScriptUtils.fixUtils()
Utils.injectJsonDownloadForTests(
"https://www.openstreetmap.org/api/0.6/relation/5759328/full",
JSON.parse(readFileSync("./test/data/relation_5759328.json", { encoding: "utf-8" }))
)
let data = JSON.parse(
readFileSync("./test/Logic/FeatureSource/small_box.json", { encoding: "utf-8" })
)
Utils.injectJsonDownloadForTests(
"https://osm.org/api/0.6/map?bbox=4.24346923828125,50.732978448277514,4.2462158203125,50.73471682490244",
data
)
test(done)
})
})