forked from MapComplete/MapComplete
		
	Fix: fix tests with some refactoring
This commit is contained in:
		
							parent
							
								
									f132963485
								
							
						
					
					
						commit
						0b992e75a4
					
				
					 7 changed files with 64 additions and 401 deletions
				
			
		|  | @ -1,5 +1,5 @@ | ||||||
| import { OsmNode, OsmObject, OsmRelation, OsmWay } from "./OsmObject" | import { OsmNode, OsmObject, OsmRelation, OsmWay } from "./OsmObject" | ||||||
| import { UIEventSource } from "../UIEventSource" | import { ImmutableStore, Store, UIEventSource } from "../UIEventSource" | ||||||
| import Constants from "../../Models/Constants" | import Constants from "../../Models/Constants" | ||||||
| import OsmChangeAction from "./Actions/OsmChangeAction" | import OsmChangeAction from "./Actions/OsmChangeAction" | ||||||
| import { ChangeDescription, ChangeDescriptionTools } from "./Actions/ChangeDescription" | import { ChangeDescription, ChangeDescriptionTools } from "./Actions/ChangeDescription" | ||||||
|  | @ -14,10 +14,9 @@ import { OsmConnection } from "./OsmConnection" | ||||||
| import OsmObjectDownloader from "./OsmObjectDownloader" | import OsmObjectDownloader from "./OsmObjectDownloader" | ||||||
| import ChangeLocationAction from "./Actions/ChangeLocationAction" | import ChangeLocationAction from "./Actions/ChangeLocationAction" | ||||||
| import ChangeTagAction from "./Actions/ChangeTagAction" | import ChangeTagAction from "./Actions/ChangeTagAction" | ||||||
| import FeatureSwitchState from "../State/FeatureSwitchState" |  | ||||||
| import DeleteAction from "./Actions/DeleteAction" | import DeleteAction from "./Actions/DeleteAction" | ||||||
| import MarkdownUtils from "../../Utils/MarkdownUtils" | import MarkdownUtils from "../../Utils/MarkdownUtils" | ||||||
| import { SpecialVisualizationState } from "../../UI/SpecialVisualization" | import FeaturePropertiesStore from "../FeatureSource/Actors/FeaturePropertiesStore" | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Handles all changes made to OSM. |  * Handles all changes made to OSM. | ||||||
|  | @ -30,7 +29,9 @@ export class Changes { | ||||||
|     public readonly state: { |     public readonly state: { | ||||||
|         allElements?: IndexedFeatureSource |         allElements?: IndexedFeatureSource | ||||||
|         osmConnection: OsmConnection |         osmConnection: OsmConnection | ||||||
|         featureSwitches?: FeatureSwitchState |         featureSwitches?: { | ||||||
|  |             featureSwitchMorePrivacy?: Store<boolean> | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|     public readonly extraComment: UIEventSource<string> = new UIEventSource(undefined) |     public readonly extraComment: UIEventSource<string> = new UIEventSource(undefined) | ||||||
|     public readonly backend: string |     public readonly backend: string | ||||||
|  | @ -44,7 +45,17 @@ export class Changes { | ||||||
|     private readonly _reportError?: (string: string | Error, extramessage?: string) => void |     private readonly _reportError?: (string: string | Error, extramessage?: string) => void | ||||||
| 
 | 
 | ||||||
|     constructor( |     constructor( | ||||||
|         state: SpecialVisualizationState, |         state: { | ||||||
|  |             featureSwitches: { | ||||||
|  |                 featureSwitchMorePrivacy?: Store<boolean> | ||||||
|  |                 featureSwitchIsTesting?: Store<boolean> | ||||||
|  |             }, | ||||||
|  |             osmConnection: OsmConnection, | ||||||
|  |             reportError?: (error: string) => void, | ||||||
|  |             featureProperties?: FeaturePropertiesStore, | ||||||
|  |             historicalUserLocations?: FeatureSource, | ||||||
|  |             allElements?: IndexedFeatureSource | ||||||
|  |         }, | ||||||
|         leftRightSensitive: boolean = false, |         leftRightSensitive: boolean = false, | ||||||
|         reportError?: (string: string | Error, extramessage?: string) => void |         reportError?: (string: string | Error, extramessage?: string) => void | ||||||
|     ) { |     ) { | ||||||
|  | @ -53,7 +64,7 @@ export class Changes { | ||||||
|         this.allChanges.setData([...this.pendingChanges.data]) |         this.allChanges.setData([...this.pendingChanges.data]) | ||||||
|         // If a pending change contains a negative ID, we save that
 |         // If a pending change contains a negative ID, we save that
 | ||||||
|         this._nextId = Math.min(-1, ...(this.pendingChanges.data?.map((pch) => pch.id ?? 0) ?? [])) |         this._nextId = Math.min(-1, ...(this.pendingChanges.data?.map((pch) => pch.id ?? 0) ?? [])) | ||||||
|         if(isNaN(this._nextId)){ |         if(isNaN(this._nextId) && state.reportError !== undefined){ | ||||||
|             state.reportError("Got a NaN as nextID. Pending changes IDs are:" +this.pendingChanges.data?.map(pch => pch?.id).join(".")) |             state.reportError("Got a NaN as nextID. Pending changes IDs are:" +this.pendingChanges.data?.map(pch => pch?.id).join(".")) | ||||||
|             this._nextId = -100 |             this._nextId = -100 | ||||||
|         } |         } | ||||||
|  | @ -73,6 +84,15 @@ export class Changes { | ||||||
|         // This doesn't matter however, as the '-1' is per piecewise upload, not global per changeset
 |         // This doesn't matter however, as the '-1' is per piecewise upload, not global per changeset
 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     public static createTestObject(): Changes{ | ||||||
|  |         return new Changes({ | ||||||
|  |             osmConnection: new OsmConnection(), | ||||||
|  |             featureSwitches:{ | ||||||
|  |                 featureSwitchIsTesting: new ImmutableStore(true) | ||||||
|  |             } | ||||||
|  |         }) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     static buildChangesetXML( |     static buildChangesetXML( | ||||||
|         csId: string, |         csId: string, | ||||||
|         allChanges: { |         allChanges: { | ||||||
|  |  | ||||||
|  | @ -1,18 +1,11 @@ | ||||||
| import { ExtraFuncParams, ExtraFunctions } from "../../src/Logic/ExtraFunctions" |  | ||||||
| import { OsmFeature } from "../../src/Models/OsmFeature" |  | ||||||
| import { describe, expect, it } from "vitest" | import { describe, expect, it } from "vitest" | ||||||
| import { Feature } from "geojson" | import { UIEventSource } from "../../src/Logic/UIEventSource" | ||||||
| import { OsmConnection } from "../../src/Logic/Osm/OsmConnection" |  | ||||||
| import { ImmutableStore, UIEventSource } from "../../src/Logic/UIEventSource" |  | ||||||
| import { Changes } from "../../src/Logic/Osm/Changes" | import { Changes } from "../../src/Logic/Osm/Changes" | ||||||
| import LinkImageAction from "../../src/Logic/Osm/Actions/LinkImageAction" | import LinkImageAction from "../../src/Logic/Osm/Actions/LinkImageAction" | ||||||
| import FeaturePropertiesStore from "../../src/Logic/FeatureSource/Actors/FeaturePropertiesStore" |  | ||||||
| 
 | 
 | ||||||
| describe("Changes", () => { | describe("Changes", () => { | ||||||
|     it("should correctly apply the image tag if an image gets linked in between", async () => { |     it("should correctly apply the image tag if an image gets linked in between", async () => { | ||||||
|         const dryRun = new ImmutableStore(true) |         const changes = Changes.createTestObject() | ||||||
|         const osmConnection = new OsmConnection({ dryRun }) |  | ||||||
|         const changes = new Changes({ osmConnection, dryRun }) |  | ||||||
|         const id = "node/42" |         const id = "node/42" | ||||||
|         const tags = new UIEventSource({ id, amenity: "shop" }) |         const tags = new UIEventSource({ id, amenity: "shop" }) | ||||||
|         const addImage = new LinkImageAction( |         const addImage = new LinkImageAction( | ||||||
|  |  | ||||||
|  | @ -1,14 +1,9 @@ | ||||||
| import { Utils } from "../../../../src/Utils" | import { Utils } from "../../../../src/Utils" | ||||||
| import { OsmRelation } from "../../../../src/Logic/Osm/OsmObject" | import { OsmRelation } from "../../../../src/Logic/Osm/OsmObject" | ||||||
| import { | import { InPlaceReplacedmentRTSH, TurnRestrictionRSH } from "../../../../src/Logic/Osm/Actions/RelationSplitHandler" | ||||||
|     InPlaceReplacedmentRTSH, |  | ||||||
|     TurnRestrictionRSH, |  | ||||||
| } from "../../../../src/Logic/Osm/Actions/RelationSplitHandler" |  | ||||||
| import { Changes } from "../../../../src/Logic/Osm/Changes" | import { Changes } from "../../../../src/Logic/Osm/Changes" | ||||||
| import { describe, expect, it } from "vitest" | import { describe, expect, it } from "vitest" | ||||||
| import OsmObjectDownloader from "../../../../src/Logic/Osm/OsmObjectDownloader" | import OsmObjectDownloader from "../../../../src/Logic/Osm/OsmObjectDownloader" | ||||||
| import { ImmutableStore } from "../../../../src/Logic/UIEventSource" |  | ||||||
| import { OsmConnection } from "../../../../src/Logic/Osm/OsmConnection" |  | ||||||
| 
 | 
 | ||||||
| describe("RelationSplitHandler", () => { | describe("RelationSplitHandler", () => { | ||||||
|     Utils.injectJsonDownloadForTests("https://api.openstreetmap.org/api/0.6/node/1124134958/ways", { |     Utils.injectJsonDownloadForTests("https://api.openstreetmap.org/api/0.6/node/1124134958/ways", { | ||||||
|  | @ -653,10 +648,7 @@ describe("RelationSplitHandler", () => { | ||||||
|             downloader |             downloader | ||||||
|         ) |         ) | ||||||
|         const changeDescription = await splitter.CreateChangeDescriptions( |         const changeDescription = await splitter.CreateChangeDescriptions( | ||||||
|             new Changes({ |            Changes.createTestObject() | ||||||
|                 dryRun: new ImmutableStore(false), |  | ||||||
|                 osmConnection: new OsmConnection(), |  | ||||||
|             }) |  | ||||||
|         ) |         ) | ||||||
|         const allIds = changeDescription[0].changes["members"].map((m) => m.ref).join(",") |         const allIds = changeDescription[0].changes["members"].map((m) => m.ref).join(",") | ||||||
|         const expected = "687866206,295132739,-1,690497698" |         const expected = "687866206,295132739,-1,690497698" | ||||||
|  | @ -710,10 +702,7 @@ describe("RelationSplitHandler", () => { | ||||||
|             downloader |             downloader | ||||||
|         ) |         ) | ||||||
|         const changeDescription = await splitter.CreateChangeDescriptions( |         const changeDescription = await splitter.CreateChangeDescriptions( | ||||||
|             new Changes({ |             Changes.createTestObject() | ||||||
|                 dryRun: new ImmutableStore(false), |  | ||||||
|                 osmConnection: new OsmConnection(), |  | ||||||
|             }) |  | ||||||
|         ) |         ) | ||||||
|         const allIds = changeDescription[0].changes["members"] |         const allIds = changeDescription[0].changes["members"] | ||||||
|             .map((m) => m.type + "/" + m.ref + "-->" + m.role) |             .map((m) => m.type + "/" + m.ref + "-->" + m.role) | ||||||
|  | @ -734,10 +723,7 @@ describe("RelationSplitHandler", () => { | ||||||
|             downloader |             downloader | ||||||
|         ) |         ) | ||||||
|         const changesReverse = await splitterReverse.CreateChangeDescriptions( |         const changesReverse = await splitterReverse.CreateChangeDescriptions( | ||||||
|             new Changes({ |             Changes.createTestObject() | ||||||
|                 dryRun: new ImmutableStore(false), |  | ||||||
|                 osmConnection: new OsmConnection(), |  | ||||||
|             }) |  | ||||||
|         ) |         ) | ||||||
|         expect(changesReverse.length).toEqual(0) |         expect(changesReverse.length).toEqual(0) | ||||||
|     }) |     }) | ||||||
|  |  | ||||||
|  | @ -1,5 +1,4 @@ | ||||||
| import { Utils } from "../../../../src/Utils" | import { Utils } from "../../../../src/Utils" | ||||||
| import LayoutConfig from "../../../../src/Models/ThemeConfig/LayoutConfig" |  | ||||||
| import { BBox } from "../../../../src/Logic/BBox" | import { BBox } from "../../../../src/Logic/BBox" | ||||||
| import ReplaceGeometryAction from "../../../../src/Logic/Osm/Actions/ReplaceGeometryAction" | import ReplaceGeometryAction from "../../../../src/Logic/Osm/Actions/ReplaceGeometryAction" | ||||||
| import { describe, expect, it } from "vitest" | import { describe, expect, it } from "vitest" | ||||||
|  | @ -9,305 +8,6 @@ import { Changes } from "../../../../src/Logic/Osm/Changes" | ||||||
| import FullNodeDatabaseSource from "../../../../src/Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource" | import FullNodeDatabaseSource from "../../../../src/Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource" | ||||||
| 
 | 
 | ||||||
| describe("ReplaceGeometryAction", () => { | describe("ReplaceGeometryAction", () => { | ||||||
|     const grbStripped = { |  | ||||||
|         id: "grb", |  | ||||||
|         title: { |  | ||||||
|             nl: "GRB import helper", |  | ||||||
|         }, |  | ||||||
|         description: "Smaller version of the GRB theme", |  | ||||||
|         language: ["nl", "en"], |  | ||||||
|         socialImage: "img.jpg", |  | ||||||
|         version: "0", |  | ||||||
|         startLat: 51.0249, |  | ||||||
|         startLon: 4.026489, |  | ||||||
|         startZoom: 9, |  | ||||||
|         clustering: false, |  | ||||||
|         overrideAll: { |  | ||||||
|             minzoom: 19, |  | ||||||
|         }, |  | ||||||
|         layers: [ |  | ||||||
|             { |  | ||||||
|                 id: "type_node", |  | ||||||
|                 source: { |  | ||||||
|                     osmTags: "type=node", |  | ||||||
|                 }, |  | ||||||
|                 pointRendering: null, |  | ||||||
|                 lineRendering: [{}], |  | ||||||
|                 override: { |  | ||||||
|                     calculatedTags: [ |  | ||||||
|                         "_is_part_of_building=feat.get('parent_ways')?.some(p => p.building !== undefined && p.building !== '') ?? false", |  | ||||||
|                         "_is_part_of_grb_building=feat.get('parent_ways')?.some(p => p['source:geometry:ref'] !== undefined) ?? false", |  | ||||||
|                         "_is_part_of_building_passage=feat.get('parent_ways')?.some(p => p.tunnel === 'building_passage') ?? false", |  | ||||||
|                         "_is_part_of_highway=!feat.get('is_part_of_building_passage') && (feat.get('parent_ways')?.some(p => p.highway !== undefined && p.highway !== '') ?? false)", |  | ||||||
|                         "_is_part_of_landuse=feat.get('parent_ways')?.some(p => (p.landuse !== undefined && p.landuse !== '') || (p.natural !== undefined && p.natural !== '')) ?? false", |  | ||||||
|                         "_moveable=feat.get('_is_part_of_building') && !feat.get('_is_part_of_grb_building')", |  | ||||||
|                     ], |  | ||||||
|                     pointRendering: [ |  | ||||||
|                         { |  | ||||||
|                             marker: [ |  | ||||||
|                                 { |  | ||||||
|                                     icon: "square", |  | ||||||
|                                     color: "#cc0", |  | ||||||
|                                 }, |  | ||||||
|                             ], |  | ||||||
|                             iconSize: "5,5", |  | ||||||
|                             location: ["point"], |  | ||||||
|                         }, |  | ||||||
|                     ], |  | ||||||
|                     passAllFeatures: true, |  | ||||||
|                 }, |  | ||||||
|             }, |  | ||||||
|             { |  | ||||||
|                 id: "osm-buildings", |  | ||||||
|                 name: "All OSM-buildings", |  | ||||||
|                 source: { |  | ||||||
|                     osmTags: "building~*", |  | ||||||
|                 }, |  | ||||||
|                 calculatedTags: ["_surface:strict:=feat.get('_surface')"], |  | ||||||
|                 lineRendering: [ |  | ||||||
|                     { |  | ||||||
|                         width: { |  | ||||||
|                             render: "2", |  | ||||||
|                             mappings: [ |  | ||||||
|                                 { |  | ||||||
|                                     if: "fixme~*", |  | ||||||
|                                     then: "5", |  | ||||||
|                                 }, |  | ||||||
|                             ], |  | ||||||
|                         }, |  | ||||||
|                         color: { |  | ||||||
|                             render: "#00c", |  | ||||||
|                             mappings: [ |  | ||||||
|                                 { |  | ||||||
|                                     if: "fixme~*", |  | ||||||
|                                     then: "#ff00ff", |  | ||||||
|                                 }, |  | ||||||
|                                 { |  | ||||||
|                                     if: "building=house", |  | ||||||
|                                     then: "#a00", |  | ||||||
|                                 }, |  | ||||||
|                                 { |  | ||||||
|                                     if: "building=shed", |  | ||||||
|                                     then: "#563e02", |  | ||||||
|                                 }, |  | ||||||
|                                 { |  | ||||||
|                                     if: { |  | ||||||
|                                         or: ["building=garage", "building=garages"], |  | ||||||
|                                     }, |  | ||||||
|                                     then: "#f9bfbb", |  | ||||||
|                                 }, |  | ||||||
|                                 { |  | ||||||
|                                     if: "building=yes", |  | ||||||
|                                     then: "#0774f2", |  | ||||||
|                                 }, |  | ||||||
|                             ], |  | ||||||
|                         }, |  | ||||||
|                     }, |  | ||||||
|                 ], |  | ||||||
|                 title: "OSM-gebouw", |  | ||||||
|                 tagRenderings: [ |  | ||||||
|                     { |  | ||||||
|                         id: "building type", |  | ||||||
|                         freeform: { |  | ||||||
|                             key: "building", |  | ||||||
|                         }, |  | ||||||
|                         render: "The building type is <b>{building}</b>", |  | ||||||
|                         question: { |  | ||||||
|                             en: "What kind of building is this?", |  | ||||||
|                         }, |  | ||||||
|                         mappings: [ |  | ||||||
|                             { |  | ||||||
|                                 if: "building=house", |  | ||||||
|                                 then: "A normal house", |  | ||||||
|                             }, |  | ||||||
|                             { |  | ||||||
|                                 if: "building=detached", |  | ||||||
|                                 then: "A house detached from other building", |  | ||||||
|                             }, |  | ||||||
|                             { |  | ||||||
|                                 if: "building=semidetached_house", |  | ||||||
|                                 then: "A house sharing only one wall with another house", |  | ||||||
|                             }, |  | ||||||
|                             { |  | ||||||
|                                 if: "building=apartments", |  | ||||||
|                                 then: "An apartment building - highrise for living", |  | ||||||
|                             }, |  | ||||||
|                             { |  | ||||||
|                                 if: "building=office", |  | ||||||
|                                 then: "An office building - highrise for work", |  | ||||||
|                             }, |  | ||||||
|                             { |  | ||||||
|                                 if: "building=apartments", |  | ||||||
|                                 then: "An apartment building", |  | ||||||
|                             }, |  | ||||||
|                             { |  | ||||||
|                                 if: "building=shed", |  | ||||||
|                                 then: "A small shed, e.g. in a garden", |  | ||||||
|                             }, |  | ||||||
|                             { |  | ||||||
|                                 if: "building=garage", |  | ||||||
|                                 then: "A single garage to park a car", |  | ||||||
|                             }, |  | ||||||
|                             { |  | ||||||
|                                 if: "building=garages", |  | ||||||
|                                 then: "A building containing only garages; typically they are all identical", |  | ||||||
|                             }, |  | ||||||
|                             { |  | ||||||
|                                 if: "building=yes", |  | ||||||
|                                 then: "A building - no specification", |  | ||||||
|                             }, |  | ||||||
|                         ], |  | ||||||
|                     }, |  | ||||||
|                     { |  | ||||||
|                         id: "grb-housenumber", |  | ||||||
|                         render: { |  | ||||||
|                             nl: "Het huisnummer is <b>{addr:housenumber}</b>", |  | ||||||
|                         }, |  | ||||||
|                         question: { |  | ||||||
|                             nl: "Wat is het huisnummer?", |  | ||||||
|                         }, |  | ||||||
|                         freeform: { |  | ||||||
|                             key: "addr:housenumber", |  | ||||||
|                         }, |  | ||||||
|                         mappings: [ |  | ||||||
|                             { |  | ||||||
|                                 if: { |  | ||||||
|                                     and: ["not:addr:housenumber=yes", "addr:housenumber="], |  | ||||||
|                                 }, |  | ||||||
|                                 then: { |  | ||||||
|                                     nl: "Geen huisnummer", |  | ||||||
|                                 }, |  | ||||||
|                             }, |  | ||||||
|                         ], |  | ||||||
|                     }, |  | ||||||
|                     { |  | ||||||
|                         id: "grb-unit", |  | ||||||
|                         question: "Wat is de wooneenheid-aanduiding?", |  | ||||||
|                         render: { |  | ||||||
|                             nl: "De wooneenheid-aanduiding is <b>{addr:unit}</b> ", |  | ||||||
|                         }, |  | ||||||
|                         freeform: { |  | ||||||
|                             key: "addr:unit", |  | ||||||
|                         }, |  | ||||||
|                         mappings: [ |  | ||||||
|                             { |  | ||||||
|                                 if: "addr:unit=", |  | ||||||
|                                 then: "Geen wooneenheid-nummer", |  | ||||||
|                             }, |  | ||||||
|                         ], |  | ||||||
|                     }, |  | ||||||
|                     { |  | ||||||
|                         id: "grb-street", |  | ||||||
|                         render: { |  | ||||||
|                             nl: "De straat is <b>{addr:street}</b>", |  | ||||||
|                         }, |  | ||||||
|                         freeform: { |  | ||||||
|                             key: "addr:street", |  | ||||||
|                         }, |  | ||||||
|                         question: { |  | ||||||
|                             nl: "Wat is de straat?", |  | ||||||
|                         }, |  | ||||||
|                     }, |  | ||||||
|                     { |  | ||||||
|                         id: "grb-fixme", |  | ||||||
|                         render: { |  | ||||||
|                             nl: "De fixme is <b>{fixme}</b>", |  | ||||||
|                         }, |  | ||||||
|                         question: { |  | ||||||
|                             nl: "Wat zegt de fixme?", |  | ||||||
|                         }, |  | ||||||
|                         freeform: { |  | ||||||
|                             key: "fixme", |  | ||||||
|                         }, |  | ||||||
|                         mappings: [ |  | ||||||
|                             { |  | ||||||
|                                 if: { |  | ||||||
|                                     and: ["fixme="], |  | ||||||
|                                 }, |  | ||||||
|                                 then: { |  | ||||||
|                                     nl: "Geen fixme", |  | ||||||
|                                 }, |  | ||||||
|                             }, |  | ||||||
|                         ], |  | ||||||
|                     }, |  | ||||||
|                     { |  | ||||||
|                         id: "grb-min-level", |  | ||||||
|                         render: { |  | ||||||
|                             nl: "Dit gebouw begint maar op de {building:min_level} verdieping", |  | ||||||
|                         }, |  | ||||||
|                         question: { |  | ||||||
|                             nl: "Hoeveel verdiepingen ontbreken?", |  | ||||||
|                         }, |  | ||||||
|                         freeform: { |  | ||||||
|                             key: "building:min_level", |  | ||||||
|                             type: "pnat", |  | ||||||
|                         }, |  | ||||||
|                     }, |  | ||||||
|                     "all_tags", |  | ||||||
|                 ], |  | ||||||
|                 filter: [ |  | ||||||
|                     { |  | ||||||
|                         id: "has-fixme", |  | ||||||
|                         options: [ |  | ||||||
|                             { |  | ||||||
|                                 osmTags: "fixme~*", |  | ||||||
|                                 question: "Heeft een FIXME", |  | ||||||
|                             }, |  | ||||||
|                         ], |  | ||||||
|                     }, |  | ||||||
|                 ], |  | ||||||
|             }, |  | ||||||
|             { |  | ||||||
|                 id: "grb", |  | ||||||
|                 description: "Geometry which comes from GRB with tools to import them", |  | ||||||
|                 source: { |  | ||||||
|                     osmTags: { |  | ||||||
|                         and: ["HUISNR~*", "man_made!=mast"], |  | ||||||
|                     }, |  | ||||||
|                     geoJson: |  | ||||||
|                         "https://betadata.grbosm.site/grb?bbox={x_min},{y_min},{x_max},{y_max}", |  | ||||||
|                     geoJsonZoomLevel: 18, |  | ||||||
|                     mercatorCrs: true, |  | ||||||
|                 }, |  | ||||||
|                 name: "GRB geometries", |  | ||||||
|                 title: "GRB outline", |  | ||||||
|                 calculatedTags: [ |  | ||||||
|                     "_overlaps_with_buildings=feat.overlapWith('osm-buildings').filter(f => f.feat.properties.id.indexOf('-') < 0)", |  | ||||||
|                     "_overlaps_with=feat.get('_overlaps_with_buildings').filter(f => f.overlap > 1 /* square meter */ )[0] ?? ''", |  | ||||||
|                     "_osm_obj:source:ref=feat.get('_overlaps_with')?.feat?.properties['source:geometry:ref']", |  | ||||||
|                     "_osm_obj:id=feat.get('_overlaps_with')?.feat?.properties?.id", |  | ||||||
|                     "_osm_obj:source:date=feat.get('_overlaps_with')?.feat?.properties['source:geometry:date'].replace(/\\//g, '-')", |  | ||||||
|                     "_osm_obj:building=feat.get('_overlaps_with')?.feat?.properties?.building", |  | ||||||
|                     "_osm_obj:addr:street=(feat.get('_overlaps_with')?.feat?.properties ?? {})['addr:street']", |  | ||||||
|                     "_osm_obj:addr:housenumber=(feat.get('_overlaps_with')?.feat?.properties ?? {})['addr:housenumber']", |  | ||||||
|                     "_osm_obj:surface=(feat.get('_overlaps_with')?.feat?.properties ?? {})['_surface:strict']", |  | ||||||
| 
 |  | ||||||
|                     "_overlap_absolute=feat.get('_overlaps_with')?.overlap", |  | ||||||
|                     "_reverse_overlap_percentage=Math.round(100 * feat.get('_overlap_absolute') / feat.get('_surface'))", |  | ||||||
|                     "_overlap_percentage=Math.round(100 * feat.get('_overlap_absolute') / feat.get('_osm_obj:surface'))", |  | ||||||
|                     "_grb_ref=feat.properties['source:geometry:entity'] + '/' + feat.properties['source:geometry:oidn']", |  | ||||||
|                     "_imported_osm_object_found= feat.properties['_osm_obj:source:ref'] == feat.properties._grb_ref", |  | ||||||
|                     "_grb_date=feat.properties['source:geometry:date'].replace(/\\//g,'-')", |  | ||||||
|                     "_imported_osm_still_fresh= feat.properties['_osm_obj:source:date'] == feat.properties._grb_date", |  | ||||||
|                     "_target_building_type=feat.properties['_osm_obj:building'] === 'yes' ? feat.properties.building : (feat.properties['_osm_obj:building'] ?? feat.properties.building)", |  | ||||||
|                     "_building:min_level= feat.properties['fixme']?.startsWith('verdieping, correct the building tag, add building:level and building:min_level before upload in JOSM!') ? '1' : ''", |  | ||||||
|                     "_intersects_with_other_features=feat.intersectionsWith('generic_osm_object').map(f => \"<a href='https://osm.org/\"+f.feat.properties.id+\"' target='_blank'>\" + f.feat.properties.id + \"</a>\").join(', ')", |  | ||||||
|                 ], |  | ||||||
|                 tagRenderings: [], |  | ||||||
|                 pointRendering: [ |  | ||||||
|                     { |  | ||||||
|                         marker: [ |  | ||||||
|                             { |  | ||||||
|                                 icon: "./assets/themes/grb/housenumber_blank.svg", |  | ||||||
|                             }, |  | ||||||
|                         ], |  | ||||||
|                         iconSize: "50,50", |  | ||||||
|                         location: ["point", "centroid"], |  | ||||||
|                     }, |  | ||||||
|                 ], |  | ||||||
|             }, |  | ||||||
|         ], |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     const coordinates = <[number, number][]>[ |     const coordinates = <[number, number][]>[ | ||||||
|         [3.216690793633461, 51.21474084112525], |         [3.216690793633461, 51.21474084112525], | ||||||
|  | @ -890,10 +590,7 @@ describe("ReplaceGeometryAction", () => { | ||||||
|         const data = await Utils.downloadJson(url) |         const data = await Utils.downloadJson(url) | ||||||
|         const fullNodeDatabase = new FullNodeDatabaseSource() |         const fullNodeDatabase = new FullNodeDatabaseSource() | ||||||
|         fullNodeDatabase.handleOsmJson(data, 0, 0, 0) |         fullNodeDatabase.handleOsmJson(data, 0, 0, 0) | ||||||
|         const changes = new Changes({ |         const changes = Changes.createTestObject() | ||||||
|             dryRun: new ImmutableStore(true), |  | ||||||
|             osmConnection: new OsmConnection(), |  | ||||||
|         }) |  | ||||||
|         const osmConnection = new OsmConnection({ |         const osmConnection = new OsmConnection({ | ||||||
|             dryRun: new ImmutableStore(true), |             dryRun: new ImmutableStore(true), | ||||||
|         }) |         }) | ||||||
|  |  | ||||||
|  | @ -2,8 +2,6 @@ import { Utils } from "../../../../src/Utils" | ||||||
| import SplitAction from "../../../../src/Logic/Osm/Actions/SplitAction" | import SplitAction from "../../../../src/Logic/Osm/Actions/SplitAction" | ||||||
| import { Changes } from "../../../../src/Logic/Osm/Changes" | import { Changes } from "../../../../src/Logic/Osm/Changes" | ||||||
| import { describe, expect, it } from "vitest" | import { describe, expect, it } from "vitest" | ||||||
| import { OsmConnection } from "../../../../src/Logic/Osm/OsmConnection" |  | ||||||
| import { ImmutableStore } from "../../../../src/Logic/UIEventSource" |  | ||||||
| 
 | 
 | ||||||
| describe("SplitAction", () => { | describe("SplitAction", () => { | ||||||
|     { |     { | ||||||
|  | @ -2690,10 +2688,7 @@ describe("SplitAction", () => { | ||||||
|             theme: "test", |             theme: "test", | ||||||
|         }) |         }) | ||||||
|         const changeDescription = await splitter.CreateChangeDescriptions( |         const changeDescription = await splitter.CreateChangeDescriptions( | ||||||
|             new Changes({ |             Changes.createTestObject() | ||||||
|                 dryRun: new ImmutableStore(true), |  | ||||||
|                 osmConnection: new OsmConnection(), |  | ||||||
|             }) |  | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         expect(changeDescription[0].type).toBe("node") |         expect(changeDescription[0].type).toBe("node") | ||||||
|  | @ -2720,10 +2715,7 @@ describe("SplitAction", () => { | ||||||
|             theme: "test", |             theme: "test", | ||||||
|         }) |         }) | ||||||
|         const changeDescription = await splitter.CreateChangeDescriptions( |         const changeDescription = await splitter.CreateChangeDescriptions( | ||||||
|             new Changes({ |           Changes.createTestObject() | ||||||
|                 dryRun: new ImmutableStore(true), |  | ||||||
|                 osmConnection: new OsmConnection(), |  | ||||||
|             }) |  | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         expect(changeDescription.length).toBe(2) |         expect(changeDescription.length).toBe(2) | ||||||
|  | @ -2742,10 +2734,7 @@ describe("SplitAction", () => { | ||||||
|             theme: "test", |             theme: "test", | ||||||
|         }) |         }) | ||||||
|         const changeDescription = await splitter.CreateChangeDescriptions( |         const changeDescription = await splitter.CreateChangeDescriptions( | ||||||
|             new Changes({ |             Changes.createTestObject() | ||||||
|                 dryRun: new ImmutableStore(true), |  | ||||||
|                 osmConnection: new OsmConnection(), |  | ||||||
|             }) |  | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         // Should be a new node
 |         // Should be a new node
 | ||||||
|  | @ -2760,10 +2749,7 @@ describe("SplitAction", () => { | ||||||
|             theme: "test", |             theme: "test", | ||||||
|         }) |         }) | ||||||
|         const changes = await splitAction.Perform( |         const changes = await splitAction.Perform( | ||||||
|             new Changes({ |             Changes.createTestObject() | ||||||
|                 dryRun: new ImmutableStore(true), |  | ||||||
|                 osmConnection: new OsmConnection(), |  | ||||||
|             }) |  | ||||||
|         ) |         ) | ||||||
|         console.log(changes) |         console.log(changes) | ||||||
|         // 8715440368 is the expected point of the split
 |         // 8715440368 is the expected point of the split
 | ||||||
|  | @ -2803,10 +2789,7 @@ describe("SplitAction", () => { | ||||||
|             1 |             1 | ||||||
|         ) |         ) | ||||||
|         const changes = await splitAction.Perform( |         const changes = await splitAction.Perform( | ||||||
|             new Changes({ |            Changes.createTestObject() | ||||||
|                 dryRun: new ImmutableStore(true), |  | ||||||
|                 osmConnection: new OsmConnection(), |  | ||||||
|             }) |  | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         // THe first change is the creation of the new node
 |         // THe first change is the creation of the new node
 | ||||||
|  |  | ||||||
|  | @ -1,8 +1,6 @@ | ||||||
| import { ChangeDescription } from "../../../src/Logic/Osm/Actions/ChangeDescription" | import { ChangeDescription } from "../../../src/Logic/Osm/Actions/ChangeDescription" | ||||||
| import { Changes } from "../../../src/Logic/Osm/Changes" | import { Changes } from "../../../src/Logic/Osm/Changes" | ||||||
| import { expect, it } from "vitest" | import { expect, it } from "vitest" | ||||||
| import { ImmutableStore } from "../../../src/Logic/UIEventSource" |  | ||||||
| import { OsmConnection } from "../../../src/Logic/Osm/OsmConnection" |  | ||||||
| 
 | 
 | ||||||
| it("Generate preXML from changeDescriptions", () => { | it("Generate preXML from changeDescriptions", () => { | ||||||
|     const changeDescrs: ChangeDescription[] = [ |     const changeDescrs: ChangeDescription[] = [ | ||||||
|  | @ -29,11 +27,7 @@ it("Generate preXML from changeDescriptions", () => { | ||||||
|             }, |             }, | ||||||
|         }, |         }, | ||||||
|     ] |     ] | ||||||
|     const c = new Changes({ |     const descr = Changes.createTestObject().CreateChangesetObjects(changeDescrs, []) | ||||||
|         dryRun: new ImmutableStore(true), |  | ||||||
|         osmConnection: new OsmConnection(), |  | ||||||
|     }) |  | ||||||
|     const descr = c.CreateChangesetObjects(changeDescrs, []) |  | ||||||
|     expect(descr.modifiedObjects).toHaveLength(0) |     expect(descr.modifiedObjects).toHaveLength(0) | ||||||
|     expect(descr.deletedObjects).toHaveLength(0) |     expect(descr.deletedObjects).toHaveLength(0) | ||||||
|     expect(descr.newObjects).toHaveLength(1) |     expect(descr.newObjects).toHaveLength(1) | ||||||
|  |  | ||||||
|  | @ -6,21 +6,27 @@ import { Changes } from "../../../src/Logic/Osm/Changes" | ||||||
| import { describe, expect, it } from "vitest" | import { describe, expect, it } from "vitest" | ||||||
| 
 | 
 | ||||||
| function elstorage() { | function elstorage() { | ||||||
|     return { addAlias: (_, __) => {} } |     return { | ||||||
|  |         addAlias: (_, __) => { | ||||||
|  |         }, | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | function createChangesetHandler(): ChangesetHandler { | ||||||
|  |     const changes = Changes.createTestObject() | ||||||
|  |     return new ChangesetHandler( | ||||||
|  |         new UIEventSource<boolean>(true), | ||||||
|  |         new OsmConnection({}), | ||||||
|  |         elstorage(), | ||||||
|  |         changes, | ||||||
|  |         e => console.error(e), | ||||||
|  |     ) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| describe("ChangesetHanlder", () => { | describe("ChangesetHanlder", () => { | ||||||
|     describe("RewriteTagsOf", () => { |     describe("RewriteTagsOf", () => { | ||||||
|         it("should insert new tags", () => { |         it("should insert new tags", () => { | ||||||
|             const changesetHandler = new ChangesetHandler( |             const changesetHandler = createChangesetHandler() | ||||||
|                 new UIEventSource<boolean>(true), |  | ||||||
|                 new OsmConnection({}), |  | ||||||
|                 elstorage(), |  | ||||||
|                 new Changes({ |  | ||||||
|                     dryRun: new ImmutableStore(true), |  | ||||||
|                     osmConnection: new OsmConnection(), |  | ||||||
|                 }) |  | ||||||
|             ) |  | ||||||
| 
 | 
 | ||||||
|             const oldChangesetMeta = { |             const oldChangesetMeta = { | ||||||
|                 type: "changeset", |                 type: "changeset", | ||||||
|  | @ -57,13 +63,13 @@ describe("ChangesetHanlder", () => { | ||||||
|                     }, |                     }, | ||||||
|                 ], |                 ], | ||||||
|                 new Map<string, string>(), |                 new Map<string, string>(), | ||||||
|                 oldChangesetMeta |                 oldChangesetMeta, | ||||||
|             ) |             ) | ||||||
|             const d = Utils.asDict(rewritten) |             const d = Utils.asDict(rewritten) | ||||||
|             expect(d.size).toEqual(10) |             expect(d.size).toEqual(10) | ||||||
|             expect(d.get("answer")).toEqual("5") |             expect(d.get("answer")).toEqual("5") | ||||||
|             expect(d.get("comment")).toEqual( |             expect(d.get("comment")).toEqual( | ||||||
|                 "Adding data with #MapComplete for theme #toerisme_vlaanderen" |                 "Adding data with #MapComplete for theme #toerisme_vlaanderen", | ||||||
|             ) |             ) | ||||||
|             expect(d.get("created_by")).toEqual("MapComplete 0.16.6") |             expect(d.get("created_by")).toEqual("MapComplete 0.16.6") | ||||||
|             expect(d.get("host")).toEqual("https://mapcomplete.org/toerisme_vlaanderen.html") |             expect(d.get("host")).toEqual("https://mapcomplete.org/toerisme_vlaanderen.html") | ||||||
|  | @ -74,15 +80,7 @@ describe("ChangesetHanlder", () => { | ||||||
|             expect(d.get("newTag")).toEqual("newValue") |             expect(d.get("newTag")).toEqual("newValue") | ||||||
|         }) |         }) | ||||||
|         it("should aggregate numeric tags", () => { |         it("should aggregate numeric tags", () => { | ||||||
|             const changesetHandler = new ChangesetHandler( |             const changesetHandler = createChangesetHandler() | ||||||
|                 new UIEventSource<boolean>(true), |  | ||||||
|                 new OsmConnection({}), |  | ||||||
|                 elstorage(), |  | ||||||
|                 new Changes({ |  | ||||||
|                     dryRun: new ImmutableStore(true), |  | ||||||
|                     osmConnection: new OsmConnection(), |  | ||||||
|                 }) |  | ||||||
|             ) |  | ||||||
|             const oldChangesetMeta = { |             const oldChangesetMeta = { | ||||||
|                 type: "changeset", |                 type: "changeset", | ||||||
|                 id: 118443748, |                 id: 118443748, | ||||||
|  | @ -118,14 +116,14 @@ describe("ChangesetHanlder", () => { | ||||||
|                     }, |                     }, | ||||||
|                 ], |                 ], | ||||||
|                 new Map<string, string>(), |                 new Map<string, string>(), | ||||||
|                 oldChangesetMeta |                 oldChangesetMeta, | ||||||
|             ) |             ) | ||||||
|             const d = Utils.asDict(rewritten) |             const d = Utils.asDict(rewritten) | ||||||
| 
 | 
 | ||||||
|             expect(d.size).toEqual(9) |             expect(d.size).toEqual(9) | ||||||
|             expect(d.get("answer")).toEqual("42") |             expect(d.get("answer")).toEqual("42") | ||||||
|             expect(d.get("comment")).toEqual( |             expect(d.get("comment")).toEqual( | ||||||
|                 "Adding data with #MapComplete for theme #toerisme_vlaanderen" |                 "Adding data with #MapComplete for theme #toerisme_vlaanderen", | ||||||
|             ) |             ) | ||||||
|             expect(d.get("created_by")).toEqual("MapComplete 0.16.6") |             expect(d.get("created_by")).toEqual("MapComplete 0.16.6") | ||||||
|             expect(d.get("host")).toEqual("https://mapcomplete.org/toerisme_vlaanderen.html") |             expect(d.get("host")).toEqual("https://mapcomplete.org/toerisme_vlaanderen.html") | ||||||
|  | @ -135,15 +133,7 @@ describe("ChangesetHanlder", () => { | ||||||
|             expect(d.get("theme")).toEqual("toerisme_vlaanderen") |             expect(d.get("theme")).toEqual("toerisme_vlaanderen") | ||||||
|         }) |         }) | ||||||
|         it("should rewrite special reasons with the correct ID", () => { |         it("should rewrite special reasons with the correct ID", () => { | ||||||
|             const changesetHandler = new ChangesetHandler( |             const changesetHandler = createChangesetHandler() | ||||||
|                 new UIEventSource<boolean>(true), |  | ||||||
|                 new OsmConnection({}), |  | ||||||
|                 elstorage(), |  | ||||||
|                 new Changes({ |  | ||||||
|                     dryRun: new ImmutableStore(true), |  | ||||||
|                     osmConnection: new OsmConnection(), |  | ||||||
|                 }) |  | ||||||
|             ) |  | ||||||
|             const oldChangesetMeta = { |             const oldChangesetMeta = { | ||||||
|                 type: "changeset", |                 type: "changeset", | ||||||
|                 id: 118443748, |                 id: 118443748, | ||||||
|  | @ -173,14 +163,14 @@ describe("ChangesetHanlder", () => { | ||||||
|             const rewritten = changesetHandler.RewriteTagsOf( |             const rewritten = changesetHandler.RewriteTagsOf( | ||||||
|                 [], |                 [], | ||||||
|                 new Map<string, string>([["node/-1", "node/42"]]), |                 new Map<string, string>([["node/-1", "node/42"]]), | ||||||
|                 oldChangesetMeta |                 oldChangesetMeta, | ||||||
|             ) |             ) | ||||||
|             const d = Utils.asDict(rewritten) |             const d = Utils.asDict(rewritten) | ||||||
| 
 | 
 | ||||||
|             expect(d.size).toEqual(9) |             expect(d.size).toEqual(9) | ||||||
|             expect(d.get("answer")).toEqual("5") |             expect(d.get("answer")).toEqual("5") | ||||||
|             expect(d.get("comment")).toEqual( |             expect(d.get("comment")).toEqual( | ||||||
|                 "Adding data with #MapComplete for theme #toerisme_vlaanderen" |                 "Adding data with #MapComplete for theme #toerisme_vlaanderen", | ||||||
|             ) |             ) | ||||||
|             expect(d.get("created_by")).toEqual("MapComplete 0.16.6") |             expect(d.get("created_by")).toEqual("MapComplete 0.16.6") | ||||||
|             expect(d.get("host")).toEqual("https://mapcomplete.org/toerisme_vlaanderen.html") |             expect(d.get("host")).toEqual("https://mapcomplete.org/toerisme_vlaanderen.html") | ||||||
|  | @ -206,7 +196,7 @@ describe("ChangesetHanlder", () => { | ||||||
|             const changes = new Map<string, string>([["node/-1", "node/42"]]) |             const changes = new Map<string, string>([["node/-1", "node/42"]]) | ||||||
|             const hasSpecialMotivationChanges = ChangesetHandler.rewriteMetaTags( |             const hasSpecialMotivationChanges = ChangesetHandler.rewriteMetaTags( | ||||||
|                 extraMetaTags, |                 extraMetaTags, | ||||||
|                 changes |                 changes, | ||||||
|             ) |             ) | ||||||
|             // "Special rewrite did not trigger"
 |             // "Special rewrite did not trigger"
 | ||||||
|             expect(hasSpecialMotivationChanges).toBe(true) |             expect(hasSpecialMotivationChanges).toBe(true) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue