From ad411f094330662c20607571897c200f84269960 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Fri, 19 Jul 2024 11:36:34 +0200 Subject: [PATCH] Fix #1961, add test --- src/Logic/Osm/Actions/LinkImageAction.ts | 10 ++++-- src/UI/Image/LinkableImage.svelte | 4 +-- test/Logic/ActionInteraction.spec.ts | 45 ++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 test/Logic/ActionInteraction.spec.ts diff --git a/src/Logic/Osm/Actions/LinkImageAction.ts b/src/Logic/Osm/Actions/LinkImageAction.ts index 9755fa724..d70d7fc1c 100644 --- a/src/Logic/Osm/Actions/LinkImageAction.ts +++ b/src/Logic/Osm/Actions/LinkImageAction.ts @@ -2,12 +2,12 @@ import ChangeTagAction from "./ChangeTagAction" import { Tag } from "../../Tags/Tag" import OsmChangeAction from "./OsmChangeAction" import { ChangeDescription } from "./ChangeDescription" -import { Store } from "../../UIEventSource" +import { Store, UIEventSource } from "../../UIEventSource" export default class LinkImageAction extends OsmChangeAction { private readonly _proposedKey: "image" | "mapillary" | "wiki_commons" | string public readonly _url: string - private readonly _currentTags: Store> + private readonly _currentTags: UIEventSource> private readonly _meta: { theme: string; changeType: "add-image" | "link-image" } /** @@ -23,7 +23,7 @@ export default class LinkImageAction extends OsmChangeAction { elementId: string, proposedKey: "image" | "mapillary" | "wiki_commons" | string, url: string, - currentTags: Store>, + currentTags: UIEventSource>, meta: { theme: string changeType: "add-image" | "link-image" @@ -51,6 +51,10 @@ export default class LinkImageAction extends OsmChangeAction { currentTags, this._meta ) + this._currentTags.data[key] = url + this._currentTags.ping() return tagChangeAction.CreateChangeDescriptions() } + + } diff --git a/src/UI/Image/LinkableImage.svelte b/src/UI/Image/LinkableImage.svelte index ef66c4260..d1abd41d3 100644 --- a/src/UI/Image/LinkableImage.svelte +++ b/src/UI/Image/LinkableImage.svelte @@ -34,7 +34,7 @@ id: Object.values(image.osmTags)[0], } - function applyLink(isLinked: boolean) { + async function applyLink(isLinked: boolean) { console.log("Applying linked image", isLinked, targetValue) const currentTags = tags.data const key = Object.keys(image.osmTags)[0] @@ -44,7 +44,7 @@ theme: tags.data._orig_theme ?? state.layout.id, changeType: "link-image", }) - state.changes.applyAction(action) + await state.changes.applyAction(action) } else { for (const k in currentTags) { const v = currentTags[k] diff --git a/test/Logic/ActionInteraction.spec.ts b/test/Logic/ActionInteraction.spec.ts new file mode 100644 index 000000000..f5878c03d --- /dev/null +++ b/test/Logic/ActionInteraction.spec.ts @@ -0,0 +1,45 @@ +import { ExtraFuncParams, ExtraFunctions } from "../../src/Logic/ExtraFunctions" +import { OsmFeature } from "../../src/Models/OsmFeature" +import { describe, expect, it } from "vitest" +import { Feature } from "geojson" +import { OsmConnection } from "../../src/Logic/Osm/OsmConnection" +import { ImmutableStore, UIEventSource } from "../../src/Logic/UIEventSource" +import { Changes } from "../../src/Logic/Osm/Changes" +import LinkImageAction from "../../src/Logic/Osm/Actions/LinkImageAction" +import FeaturePropertiesStore from "../../src/Logic/FeatureSource/Actors/FeaturePropertiesStore" + +describe("Changes", () => { + it("should correctly apply the image tag if an image gets linked in between", async () => { + const dryRun = new ImmutableStore(true) + const osmConnection = new OsmConnection({ dryRun }) + const changes = new Changes({ osmConnection, dryRun }) + const id = "node/42" + const tags = new UIEventSource({ id, "amenity": "shop" }) + const addImage = new LinkImageAction(id, "image", "https://example.org/uploaded_image", tags, { + theme: "test", + changeType: "add-image", + }) + const linkImage = new LinkImageAction(id, "image", "https://example.org/image_to_link", tags, { + theme: "test", + changeType: "link-image", + }) + + await changes.applyAction(linkImage) + await changes.applyAction(addImage) + + const data = tags.data + expect(data["image:0"]).toBe("https://example.org/uploaded_image") + expect(data["image"]).toBe("https://example.org/image_to_link") + + const pending = changes.pendingChanges.data + + const change0 = pending[0].tags[0] + expect(change0.k).toBe("image") + expect(change0.v).toBe("https://example.org/image_to_link") + + const change1 = pending[1].tags[0] + expect(change1.k).toBe("image:0") + expect(change1.v).toBe("https://example.org/uploaded_image") + + }) +})