From 4f94a56d9ee8c8d284d3e12b8eac84631fecc3fa Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Sat, 3 May 2025 06:47:48 +0300 Subject: [PATCH] Move api changeset upload modify tests --- .../api/changesets/uploads_controller_test.rb | 161 +++++++++++++++++ .../api/changesets_controller_test.rb | 171 ------------------ 2 files changed, 161 insertions(+), 171 deletions(-) diff --git a/test/controllers/api/changesets/uploads_controller_test.rb b/test/controllers/api/changesets/uploads_controller_test.rb index d7ea0b505..2164d52ba 100644 --- a/test/controllers/api/changesets/uploads_controller_test.rb +++ b/test/controllers/api/changesets/uploads_controller_test.rb @@ -490,6 +490,167 @@ module Api assert_equal [["Way", way.id, "some"], ["Node", node.id, "some"], ["Relation", other_relation.id, "some"]], relation.members end + ## + # upload multiple versions of the same element in the same diff. + def test_upload_modify_multiple_node_versions + node = create(:node) + changeset = create(:changeset) + + # change the location of a node multiple times, each time referencing + # the last version. doesn't this depend on version numbers being + # sequential? + diff = <<~CHANGESET + + + + + + + + + + + + + CHANGESET + + auth_header = bearer_authorization_header changeset.user + + post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header + + assert_response :success + + assert_dom "diffResult>node", 8 + + node.reload + assert_equal 9, node.version + assert_equal 0.9 * GeoRecord::SCALE, node.latitude + assert_equal 0.9 * GeoRecord::SCALE, node.longitude + end + + ## + # upload multiple versions of the same element in the same diff, but + # keep the version numbers the same. + def test_upload_modify_duplicate_node_versions + node = create(:node, :latitude => 0, :longitude => 0) + changeset = create(:changeset) + + diff = <<~CHANGESET + + + + + + + CHANGESET + + auth_header = bearer_authorization_header changeset.user + + post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header + + assert_response :conflict + + node.reload + assert_equal 1, node.version + assert_equal 0, node.latitude + assert_equal 0, node.longitude + end + + ## + # try to upload some elements without specifying the version + def test_upload_modify_missing_node_version + node = create(:node, :latitude => 0, :longitude => 0) + changeset = create(:changeset) + + diff = <<~CHANGESET + + + + + + CHANGESET + + auth_header = bearer_authorization_header changeset.user + + post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header + + assert_response :bad_request + + node.reload + assert_equal 1, node.version + assert_equal 0, node.latitude + assert_equal 0, node.longitude + end + + ## + # create a diff which references several changesets, which should cause + # a rollback and none of the diff gets committed + def test_upload_modify_with_references_to_different_changesets + changeset1 = create(:changeset) + changeset2 = create(:changeset, :user => changeset1.user) + node1 = create(:node) + node2 = create(:node) + + # simple diff to create a node way and relation using placeholders + diff = <<~CHANGESET + + + + + + + + + CHANGESET + + auth_header = bearer_authorization_header changeset1.user + + post api_changeset_upload_path(changeset1), :params => diff, :headers => auth_header + + assert_response :conflict + + assert_nodes_are_equal(node1, Node.find(node1.id)) + assert_nodes_are_equal(node2, Node.find(node2.id)) + end + + ## + # upload a valid changeset which has a mixture of whitespace + # to check a bug https://github.com/openstreetmap/trac-tickets/issues/1565 + def test_upload_modify_with_mixed_whitespace + changeset = create(:changeset) + node = create(:node) + way = create(:way_with_nodes, :nodes_count => 2) + relation = create(:relation) + other_relation = create(:relation) + create(:relation_tag, :relation => relation) + + diff = <<~CHANGESET + + + + + + + + + CHANGESET + + auth_header = bearer_authorization_header changeset.user + + post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header + + assert_response :success + + assert_dom "diffResult>node", 2 + assert_dom "diffResult>relation", 1 + + assert_equal 1, Node.find(node.id).tags.size, "node #{node.id} should now have one tag" + assert_equal 0, Relation.find(relation.id).tags.size, "relation #{relation.id} should now have no tags" + end + # ------------------------------------- # Test deleting elements. # ------------------------------------- diff --git a/test/controllers/api/changesets_controller_test.rb b/test/controllers/api/changesets_controller_test.rb index 1a8c47c26..c81be9ae1 100644 --- a/test/controllers/api/changesets_controller_test.rb +++ b/test/controllers/api/changesets_controller_test.rb @@ -769,136 +769,6 @@ module Api end end - ## - # create a diff which references several changesets, which should cause - # a rollback and none of the diff gets committed - def test_upload_invalid_changesets - changeset = create(:changeset) - other_changeset = create(:changeset, :user => changeset.user) - node = create(:node) - way = create(:way) - relation = create(:relation) - other_relation = create(:relation) - - auth_header = bearer_authorization_header changeset.user - - # simple diff to create a node way and relation using placeholders - diff = <<~CHANGESET - - - - - - - - - - - - - - - - - - - - - - CHANGESET - - # upload it - post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header - assert_response :conflict, - "uploading a diff with multiple changesets should have failed" - - # check that objects are unmodified - assert_nodes_are_equal(node, Node.find(node.id)) - assert_ways_are_equal(way, Way.find(way.id)) - assert_relations_are_equal(relation, Relation.find(relation.id)) - end - - ## - # upload multiple versions of the same element in the same diff. - def test_upload_multiple_valid - node = create(:node) - changeset = create(:changeset) - auth_header = bearer_authorization_header changeset.user - - # change the location of a node multiple times, each time referencing - # the last version. doesn't this depend on version numbers being - # sequential? - diff = <<~CHANGESET - - - - - - - - - - - - - CHANGESET - - # upload it - post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header - assert_response :success, - "can't upload multiple versions of an element in a diff: #{@response.body}" - - # check the response is well-formed. its counter-intuitive, but the - # API will return multiple elements with the same ID and different - # version numbers for each change we made. - assert_select "diffResult>node", 8 - end - - ## - # upload multiple versions of the same element in the same diff, but - # keep the version numbers the same. - def test_upload_multiple_duplicate - node = create(:node) - changeset = create(:changeset) - - auth_header = bearer_authorization_header changeset.user - - diff = <<~CHANGESET - - - - - - - CHANGESET - - # upload it - post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header - assert_response :conflict, - "shouldn't be able to upload the same element twice in a diff: #{@response.body}" - end - - ## - # try to upload some elements without specifying the version - def test_upload_missing_version - changeset = create(:changeset) - - auth_header = bearer_authorization_header changeset.user - - diff = <<~CHANGESET - - - - - - CHANGESET - - # upload it - post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header - assert_response :bad_request, - "shouldn't be able to upload an element without version: #{@response.body}" - end - ## # try to upload with commands other than create, modify, or delete def test_action_upload_invalid @@ -918,47 +788,6 @@ module Api assert_equal("Unknown action ping, choices are create, modify, delete", @response.body) end - ## - # upload a valid changeset which has a mixture of whitespace - # to check a bug reported by ivansanchez (#1565). - def test_upload_whitespace_valid - changeset = create(:changeset) - node = create(:node) - way = create(:way_with_nodes, :nodes_count => 2) - relation = create(:relation) - other_relation = create(:relation) - create(:relation_tag, :relation => relation) - - auth_header = bearer_authorization_header changeset.user - - diff = <<~CHANGESET - - - - - - - - - CHANGESET - - # upload it - post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header - assert_response :success, - "can't upload a valid diff with whitespace variations to changeset: #{@response.body}" - - # check the response is well-formed - assert_select "diffResult>node", 2 - assert_select "diffResult>relation", 1 - - # check that the changes made it into the database - assert_equal 1, Node.find(node.id).tags.size, "node #{node.id} should now have one tag" - assert_equal 0, Relation.find(relation.id).tags.size, "relation #{relation.id} should now have no tags" - end - ## # test that a placeholder can be reused within the same upload. def test_upload_reuse_placeholder_valid -- 2.39.5