Ignore:
Timestamp:
2024-03-28T15:04:04+01:00 (13 months ago)
Author:
taylor.smock
Message:

Fix #23582: Reverter plugin reverts nodes that were not modified by the reverted changeset

Location:
applications/editors/josm/plugins/reverter/test
Files:
12 added
1 edited

Legend:

Unmodified
Added
Removed
  • applications/editors/josm/plugins/reverter/test/unit/reverter/ChangesetReverterTest.java

    r36122 r36233  
    44import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
    55import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
     6import static org.junit.jupiter.api.Assertions.assertEquals;
     7import static org.junit.jupiter.api.Assertions.assertInstanceOf;
    68import static org.junit.jupiter.api.Assertions.assertNotNull;
    79import static org.junit.jupiter.api.Assertions.assertTrue;
     
    2123import java.util.stream.Collectors;
    2224
    23 import jakarta.json.Json;
    24 import jakarta.json.JsonArray;
    25 import jakarta.json.JsonNumber;
    26 import jakarta.json.JsonObject;
    27 import jakarta.json.JsonReader;
    28 import jakarta.json.JsonString;
    29 import jakarta.json.JsonValue;
     25import org.junit.jupiter.api.Test;
     26import org.junit.jupiter.api.extension.RegisterExtension;
     27import org.openstreetmap.josm.TestUtils;
     28import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
     29import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
     30import org.openstreetmap.josm.data.UndoRedoHandler;
     31import org.openstreetmap.josm.data.osm.DataSet;
     32import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     33import org.openstreetmap.josm.data.osm.PrimitiveId;
     34import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
     35import org.openstreetmap.josm.data.osm.Way;
     36import org.openstreetmap.josm.gui.MainApplication;
     37import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     38import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
     39import org.openstreetmap.josm.gui.util.GuiHelper;
     40import org.openstreetmap.josm.spi.preferences.Config;
     41import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
     42import org.openstreetmap.josm.testutils.annotations.HTTP;
     43import org.openstreetmap.josm.testutils.annotations.Main;
     44import org.openstreetmap.josm.testutils.annotations.Projection;
     45import org.openstreetmap.josm.tools.JosmRuntimeException;
     46import org.openstreetmap.josm.tools.Logging;
    3047
    3148import com.github.tomakehurst.wiremock.client.WireMock;
     
    3855import com.github.tomakehurst.wiremock.junit5.WireMockExtension;
    3956import com.github.tomakehurst.wiremock.junit5.WireMockRuntimeInfo;
    40 import org.junit.jupiter.api.Test;
    41 import org.junit.jupiter.api.extension.RegisterExtension;
    42 import org.openstreetmap.josm.TestUtils;
    43 import org.openstreetmap.josm.actions.downloadtasks.DownloadOsmTask;
    44 import org.openstreetmap.josm.actions.downloadtasks.DownloadParams;
    45 import org.openstreetmap.josm.data.UndoRedoHandler;
    46 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    47 import org.openstreetmap.josm.data.osm.PrimitiveId;
    48 import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
    49 import org.openstreetmap.josm.gui.MainApplication;
    50 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    51 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
    52 import org.openstreetmap.josm.gui.util.GuiHelper;
    53 import org.openstreetmap.josm.spi.preferences.Config;
    54 import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
    55 import org.openstreetmap.josm.testutils.annotations.HTTP;
    56 import org.openstreetmap.josm.tools.JosmRuntimeException;
    57 import org.openstreetmap.josm.tools.Logging;
     57import jakarta.json.Json;
     58import jakarta.json.JsonArray;
     59import jakarta.json.JsonNumber;
     60import jakarta.json.JsonObject;
     61import jakarta.json.JsonReader;
     62import jakarta.json.JsonString;
     63import jakarta.json.JsonValue;
    5864
    5965/**
     
    6268@BasicPreferences
    6369@HTTP
     70@Main
     71@Projection
    6472class ChangesetReverterTest {
    6573    @RegisterExtension
     
    7482    void testTicket22520(WireMockRuntimeInfo wireMockRuntimeInfo) throws ExecutionException, InterruptedException {
    7583        wireMockRuntimeInfo.getWireMock().loadMappingsFrom(TestUtils.getRegressionDataDir(22520));
    76         wireMockRuntimeInfo.getWireMock().register(WireMock.get(WireMock.urlPathMatching("/0.6/nodes")).willReturn(WireMock.aResponse().withTransformers("MultiplePrimitiveTransformer")));
    77         wireMockRuntimeInfo.getWireMock().register(WireMock.get(WireMock.urlPathMatching("/0.6/relations")).willReturn(WireMock.aResponse().withTransformers("MultiplePrimitiveTransformer")));
    78         wireMockRuntimeInfo.getWireMock().register(WireMock.get(WireMock.urlPathMatching("/0.6/ways")).willReturn(WireMock.aResponse().withTransformers("MultiplePrimitiveTransformer")));
     84        wireMockRuntimeInfo.getWireMock().register(WireMock.get(WireMock.urlPathMatching("/0.6/nodes")).willReturn(WireMock.aResponse().withTransformer("MultiplePrimitiveTransformer", "ticket", 22520)));
     85        wireMockRuntimeInfo.getWireMock().register(WireMock.get(WireMock.urlPathMatching("/0.6/relations")).willReturn(WireMock.aResponse().withTransformer("MultiplePrimitiveTransformer", "ticket", 22520)));
     86        wireMockRuntimeInfo.getWireMock().register(WireMock.get(WireMock.urlPathMatching("/0.6/ways")).willReturn(WireMock.aResponse().withTransformer("MultiplePrimitiveTransformer", "ticket", 22520)));
    7987        Config.getPref().put("osm-server.url", wireMockRuntimeInfo.getHttpBaseUrl());
    8088        PrimitiveId building = new SimplePrimitiveId(233056719, OsmPrimitiveType.WAY);
     
    9098
    9199    /**
     100     * Non-regression test for #23582: Nodes that were not modified by a changeset should not be reverted.
     101     * Note: This might not be the intended behavior, but it was the behavior prior to r36230.
     102     */
     103    @Test
     104    void testTicket23582(WireMockRuntimeInfo wireMockRuntimeInfo) {
     105        wireMockRuntimeInfo.getWireMock().loadMappingsFrom(TestUtils.getRegressionDataDir(23582));
     106        wireMockRuntimeInfo.getWireMock().register(WireMock.get(WireMock.urlPathMatching("/0.6/nodes")).willReturn(WireMock.aResponse().withTransformer("MultiplePrimitiveTransformer", "ticket", 23582)));
     107        wireMockRuntimeInfo.getWireMock().register(WireMock.get(WireMock.urlPathMatching("/0.6/relations")).willReturn(WireMock.aResponse().withTransformer("MultiplePrimitiveTransformer", "ticket", 23582)));
     108        wireMockRuntimeInfo.getWireMock().register(WireMock.get(WireMock.urlPathMatching("/0.6/ways")).willReturn(WireMock.aResponse().withTransformer("MultiplePrimitiveTransformer", "ticket", 23582)));
     109        Config.getPref().put("osm-server.url", wireMockRuntimeInfo.getHttpBaseUrl());
     110        final RevertChangesetTask task = new RevertChangesetTask(149181932, ChangesetReverter.RevertType.FULL, true, true);
     111        task.run();
     112        GuiHelper.runInEDTAndWait(() -> { /* Sync UI thread (some actions are taken on this thread which modify primitives) */ });
     113        final DataSet reverted = MainApplication.getLayerManager().getEditDataSet();
     114        assertEquals(1, reverted.allModifiedPrimitives().size());
     115        final Way oldWay = assertInstanceOf(Way.class, reverted.allModifiedPrimitives().iterator().next());
     116        assertEquals(8, oldWay.getNodesCount());
     117    }
     118
     119    /**
    92120     * A transformer for the /nodes?node, /ways?ways, and /relations?relations endpoints. This is needed since we don't always do the requests in the same order.
    93121     */
     
    100128        @Override
    101129        public Response transform(Request request, Response response, FileSource files, Parameters parameters) {
     130            final int ticket = parameters.getInt("ticket");
    102131            final QueryParameter wayParam = request.queryParameter("ways");
    103132            final QueryParameter nodeParam = request.queryParameter("nodes");
    104133            final QueryParameter relParam = request.queryParameter("relations");
    105134            if (wayParam.isPresent()) {
    106                 return Response.Builder.like(response).but().body(getReturnXml(OsmPrimitiveType.WAY, wayParam)).build();
     135                return Response.Builder.like(response).but().body(getReturnXml(ticket, OsmPrimitiveType.WAY, wayParam)).build();
    107136            } else if (nodeParam.isPresent()) {
    108                 return Response.Builder.like(response).but().body(getReturnXml(OsmPrimitiveType.NODE, nodeParam)).build();
     137                return Response.Builder.like(response).but().body(getReturnXml(ticket, OsmPrimitiveType.NODE, nodeParam)).build();
    109138            } else if (relParam.isPresent()) {
    110                 return Response.Builder.like(response).but().body(getReturnXml(OsmPrimitiveType.RELATION, relParam)).build();
     139                return Response.Builder.like(response).but().body(getReturnXml(ticket, OsmPrimitiveType.RELATION, relParam)).build();
    111140            } else {
    112141                IllegalArgumentException e = new IllegalArgumentException("No query parameter present");
     
    121150        }
    122151
    123         private static String getReturnXml(OsmPrimitiveType type, QueryParameter parameter) {
     152        private static String getReturnXml(int ticket, OsmPrimitiveType type, QueryParameter parameter) {
    124153            final String file;
    125154            switch (type) {
     
    140169                    : parameter.values())
    141170                    .stream().map(s -> new OsmParameterInformation(type, s)).collect(Collectors.toSet());
    142             try (InputStream fis = Files.newInputStream(Paths.get(TestUtils.getRegressionDataDir(22520), file));
     171            try (InputStream fis = Files.newInputStream(Paths.get(TestUtils.getRegressionDataDir(ticket), file));
    143172                 JsonReader reader = Json.createReader(fis)) {
    144173                String version = "0.6";
Note: See TracChangeset for help on using the changeset viewer.