diff --git a/Logic/Osm/ChangesetHandler.ts b/Logic/Osm/ChangesetHandler.ts index 6bc1e85c4..d96ec14b9 100644 --- a/Logic/Osm/ChangesetHandler.ts +++ b/Logic/Osm/ChangesetHandler.ts @@ -273,8 +273,8 @@ export class ChangesetHandler { private parseUploadChangesetResponse(response: XMLDocument): Map { const nodes = response.getElementsByTagName("node"); const mappings = new Map() - // @ts-ignore - for (const node of nodes) { + + for (const node of Array.from(nodes)) { const mapping = this.handleIdRewrite(node, "node") if (mapping !== undefined) { mappings.set(mapping[0], mapping[1]) @@ -282,8 +282,7 @@ export class ChangesetHandler { } const ways = response.getElementsByTagName("way"); - // @ts-ignore - for (const way of ways) { + for (const way of Array.from(ways)) { const mapping = this.handleIdRewrite(way, "way") if (mapping !== undefined) { mappings.set(mapping[0], mapping[1]) diff --git a/testLegacy/Actors.spec.ts b/testLegacy/Actors.spec.ts deleted file mode 100644 index 50e6e0387..000000000 --- a/testLegacy/Actors.spec.ts +++ /dev/null @@ -1,140 +0,0 @@ -import T from "./TestHelper"; -import SelectedElementTagsUpdater from "../Logic/Actors/SelectedElementTagsUpdater"; -import UserRelatedState from "../Logic/State/UserRelatedState"; -import {Utils} from "../Utils"; -import SelectedFeatureHandler from "../Logic/Actors/SelectedFeatureHandler"; -import {UIEventSource} from "../Logic/UIEventSource"; -import {ElementStorage} from "../Logic/ElementStorage"; -import Loc from "../Models/Loc"; -import * as bookcaseJson from "../assets/generated/themes/bookcases.json" -import LayoutConfig from "../Models/ThemeConfig/LayoutConfig"; - -export default class ActorsSpec extends T { - - constructor() { - - const latestTags = { - "amenity": "public_bookcase", - "books": "children;adults", - "capacity": "25", - "description": "Deze boekenruilkast vindt je recht tegenover de Pim Pam Poem", - "image:0": "https://i.imgur.com/Z8a69UG.jpg", - "name": "Stubbekwartier-buurtbibliotheek", - "nobrand": "yes", - "opening_hours": "24/7", - "operator": "Huisbewoner", - "public_bookcase:type": "reading_box" - } - - Utils.injectJsonDownloadForTests( - "https://www.openstreetmap.org/api/0.6/node/5568693115", - { - "version": "0.6", - "generator": "CGImap 0.8.5 (1815943 spike-06.openstreetmap.org)", - "copyright": "OpenStreetMap and contributors", - "attribution": "http://www.openstreetmap.org/copyright", - "license": "http://opendatacommons.org/licenses/odbl/1-0/", - "elements": [{ - "type": "node", - "id": 5568693115, - "lat": 51.2179199, - "lon": 3.2154662, - "timestamp": "2021-08-21T16:22:55Z", - "version": 6, - "changeset": 110034454, - "user": "Pieter Vander Vennet", - "uid": 3818858, - "tags": latestTags - }] - } - ) - - super([ - [ - "download latest version", - () => { - const state = new UserRelatedState(new LayoutConfig( bookcaseJson, true, "tests")) - const feature = { - "type": "Feature", - "id": "node/5568693115", - "properties": { - "amenity": "public_bookcase", - "books": "children;adults", - "capacity": "25", - "description": "Deze boekenruilkast vindt je recht tegenover de Pim Pam Poem", - "image:0": "https://i.imgur.com/Z8a69UG.jpg", - "name": "OUTDATED NAME", - "nobrand": "yes", - "opening_hours": "24/7", - "operator": "Huisbewoner", - "public_bookcase:type": "reading_box", - "id": "node/5568693115", - "_lat": "51.2179199", - "_lon": "3.2154662", - "fixme": "SOME FIXME" - }, - "geometry": { - "type": "Point", - "coordinates": [ - 3.2154662, - 51.2179199 - ] - }, - "bbox": { - "maxLat": 51.2179199, - "maxLon": 3.2154662, - "minLat": 51.2179199, - "minLon": 3.2154662 - }, - "_lon": 3.2154662, - "_lat": 51.2179199 - } - state.allElements.addOrGetElement(feature) - SelectedElementTagsUpdater.installCallback(state) - - // THis should trigger a download of the latest feaures and update the tags - // However, this doesn't work with ts-node for some reason - state.selectedElement.setData(feature) - - SelectedElementTagsUpdater.applyUpdate(state, latestTags, feature.properties.id) - - // The name should be updated - T.equals("Stubbekwartier-buurtbibliotheek", feature.properties.name) - // The fixme should be removed - T.equals(undefined, feature.properties.fixme) - - }], - ["Hash without selected element should download geojson from OSM-API", async () => { - const hash = new UIEventSource("node/5568693115") - const selected = new UIEventSource(undefined) - const loc = new UIEventSource({ - lat: 0, - lon: 0, - zoom: 0 - }) - - - loc.addCallback(_ => { - T.equals("node/5568693115", selected.data.properties.id) - T.equals(14, loc.data.zoom) - T.equals(51.2179199, loc.data.lat) - }) - - new SelectedFeatureHandler(hash, { - selectedElement: selected, - allElements: new ElementStorage(), - featurePipeline: undefined, - locationControl: loc, - layoutToUse: undefined - }) - - - }] - - - ]); - - } - - -} \ No newline at end of file diff --git a/testLegacy/Changes.spec.ts b/testLegacy/Changes.spec.ts deleted file mode 100644 index 2466be54a..000000000 --- a/testLegacy/Changes.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -import T from "./TestHelper"; -import {Changes} from "../Logic/Osm/Changes"; -import {ChangeDescription, ChangeDescriptionTools} from "../Logic/Osm/Actions/ChangeDescription"; - -export default class ChangesSpec extends T { - - constructor() { - super([ - ["Generate preXML from changeDescriptions", () => { - const changeDescrs: ChangeDescription[] = [ - { - type: "node", - id: -1, - changes: { - lat: 42, - lon: -8 - }, - tags: [{k: "someKey", v: "someValue"}], - meta: { - changeType: "create", - theme: "test" - } - }, - { - type: "node", - id: -1, - tags: [{k: 'foo', v: 'bar'}], - meta: { - changeType: "answer", - theme: "test" - } - } - ] - const c = new Changes() - const descr = c.CreateChangesetObjects( - changeDescrs, - [] - ) - T.equals(0, descr.modifiedObjects.length) - T.equals(0, descr.deletedObjects.length) - T.equals(1, descr.newObjects.length) - const ch = descr.newObjects[0] - T.equals("bar", ch.tags["foo"]) - T.equals("someValue", ch.tags["someKey"]) - }] - ]); - - } - - -} \ No newline at end of file diff --git a/tests/Logic/Actors/Actors.spec.ts b/tests/Logic/Actors/Actors.spec.ts new file mode 100644 index 000000000..cb3faf9eb --- /dev/null +++ b/tests/Logic/Actors/Actors.spec.ts @@ -0,0 +1,128 @@ +import {describe} from 'mocha' +import {expect} from 'chai' +import {Utils} from "../../../Utils"; +import UserRelatedState from "../../../Logic/State/UserRelatedState"; +import LayoutConfig from "../../../Models/ThemeConfig/LayoutConfig"; +import SelectedElementTagsUpdater from "../../../Logic/Actors/SelectedElementTagsUpdater"; +import T from "../../../testLegacy/TestHelper"; + +import * as bookcaseJson from "../../../assets/generated/themes/bookcases.json" +import {UIEventSource} from "../../../Logic/UIEventSource"; +import Loc from "../../../Models/Loc"; +import SelectedFeatureHandler from "../../../Logic/Actors/SelectedFeatureHandler"; +import {ElementStorage} from "../../../Logic/ElementStorage"; + +const latestTags = { + "amenity": "public_bookcase", + "books": "children;adults", + "capacity": "25", + "description": "Deze boekenruilkast vindt je recht tegenover de Pim Pam Poem", + "image:0": "https://i.imgur.com/Z8a69UG.jpg", + "name": "Stubbekwartier-buurtbibliotheek", + "nobrand": "yes", + "opening_hours": "24/7", + "operator": "Huisbewoner", + "public_bookcase:type": "reading_box" +} + +Utils.injectJsonDownloadForTests( + "https://www.openstreetmap.org/api/0.6/node/5568693115", + { + "version": "0.6", + "generator": "CGImap 0.8.5 (1815943 spike-06.openstreetmap.org)", + "copyright": "OpenStreetMap and contributors", + "attribution": "http://www.openstreetmap.org/copyright", + "license": "http://opendatacommons.org/licenses/odbl/1-0/", + "elements": [{ + "type": "node", + "id": 5568693115, + "lat": 51.2179199, + "lon": 3.2154662, + "timestamp": "2021-08-21T16:22:55Z", + "version": 6, + "changeset": 110034454, + "user": "Pieter Vander Vennet", + "uid": 3818858, + "tags": latestTags + }] + } +) + +it("should download the latest version", () => { + const state = new UserRelatedState(new LayoutConfig( bookcaseJson, true, "tests")) + const feature = { + "type": "Feature", + "id": "node/5568693115", + "properties": { + "amenity": "public_bookcase", + "books": "children;adults", + "capacity": "25", + "description": "Deze boekenruilkast vindt je recht tegenover de Pim Pam Poem", + "image:0": "https://i.imgur.com/Z8a69UG.jpg", + "name": "OUTDATED NAME", + "nobrand": "yes", + "opening_hours": "24/7", + "operator": "Huisbewoner", + "public_bookcase:type": "reading_box", + "id": "node/5568693115", + "_lat": "51.2179199", + "_lon": "3.2154662", + "fixme": "SOME FIXME" + }, + "geometry": { + "type": "Point", + "coordinates": [ + 3.2154662, + 51.2179199 + ] + }, + "bbox": { + "maxLat": 51.2179199, + "maxLon": 3.2154662, + "minLat": 51.2179199, + "minLon": 3.2154662 + }, + "_lon": 3.2154662, + "_lat": 51.2179199 + } + state.allElements.addOrGetElement(feature) + SelectedElementTagsUpdater.installCallback(state) + + // THis should trigger a download of the latest feaures and update the tags + // However, this doesn't work with ts-node for some reason + state.selectedElement.setData(feature) + + SelectedElementTagsUpdater.applyUpdate(state, latestTags, feature.properties.id) + + // The name should be updated + T.equals("Stubbekwartier-buurtbibliotheek", feature.properties.name) + // The fixme should be removed + T.equals(undefined, feature.properties.fixme) + +}) +it("Hash without selected element should download geojson from OSM-API", async () => { + const hash = new UIEventSource("node/5568693115") + const selected = new UIEventSource(undefined) + const loc = new UIEventSource({ + lat: 0, + lon: 0, + zoom: 0 + }) + + + loc.addCallback(_ => { + T.equals("node/5568693115", selected.data.properties.id) + T.equals(14, loc.data.zoom) + T.equals(51.2179199, loc.data.lat) + }) + + new SelectedFeatureHandler(hash, { + selectedElement: selected, + allElements: new ElementStorage(), + featurePipeline: undefined, + locationControl: loc, + layoutToUse: undefined + }) + + +}) \ No newline at end of file diff --git a/tests/Logic/OSM/Changes.spec.ts b/tests/Logic/OSM/Changes.spec.ts new file mode 100644 index 000000000..21b9a7e83 --- /dev/null +++ b/tests/Logic/OSM/Changes.spec.ts @@ -0,0 +1,42 @@ +import {expect} from 'chai' +import {ChangeDescription} from "../../../Logic/Osm/Actions/ChangeDescription"; +import {Changes} from "../../../Logic/Osm/Changes"; + +it("Generate preXML from changeDescriptions", () => { + const changeDescrs: ChangeDescription[] = [ + { + type: "node", + id: -1, + changes: { + lat: 42, + lon: -8 + }, + tags: [{k: "someKey", v: "someValue"}], + meta: { + changeType: "create", + theme: "test" + } + }, + { + type: "node", + id: -1, + tags: [{k: 'foo', v: 'bar'}], + meta: { + changeType: "answer", + theme: "test" + } + } + ] + const c = new Changes() + const descr = c.CreateChangesetObjects( + changeDescrs, + [] + ) + expect(descr.modifiedObjects).length(0) + expect(descr.deletedObjects).length(0) + expect(descr.newObjects).length(1) + + const ch = descr.newObjects[0] + expect(ch.tags["foo"]).eq("bar") + expect(ch.tags["someKey"]).eq("someValue") +}) \ No newline at end of file