From 2239fb320d61d2404b82ba75dc8d20ad2868c6be Mon Sep 17 00:00:00 2001 From: Anton Khorev Date: Sat, 3 May 2025 07:27:46 +0300 Subject: [PATCH] Move api changeset upload combined action tests --- .../api/changesets/uploads_controller_test.rb | 152 ++++++++++++++++++ .../api/changesets_controller_test.rb | 135 ---------------- 2 files changed, 152 insertions(+), 135 deletions(-) diff --git a/test/controllers/api/changesets/uploads_controller_test.rb b/test/controllers/api/changesets/uploads_controller_test.rb index 3634de87c..c1370871f 100644 --- a/test/controllers/api/changesets/uploads_controller_test.rb +++ b/test/controllers/api/changesets/uploads_controller_test.rb @@ -866,6 +866,158 @@ module Api assert_equal "Precondition failed: Node #{node.id} is still used by ways #{way.id}.", @response.body end + + # ------------------------------------- + # Test combined element changes. + # ------------------------------------- + + ## + # upload something which creates new objects and inserts them into + # existing containers using placeholders. + def test_upload_create_and_insert_elements + way = create(:way) + node = create(:node) + relation = create(:relation) + create(:way_node, :way => way, :node => node) + 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 :success + + new_node_id = nil + assert_dom "diffResult[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1 do + assert_dom "> node", 1 do |(node_el)| + new_node_id = node_el["new_id"].to_i + end + assert_dom "> way", 1 + assert_dom "> relation", 1 + end + + assert_equal 2, Node.find(new_node_id).tags.size, "new node should have two tags" + assert_equal [new_node_id, node.id], Way.find(way.id).nds, "way nodes should match" + Relation.find(relation.id).members.each do |type, id, _role| + assert_equal new_node_id, id, "relation should contain new node" if type == "node" + end + end + + ## + # test that a placeholder can be reused within the same upload. + def test_upload_create_modify_delete_node_reusing_placeholder + changeset = create(:changeset) + + diff = <<~CHANGESET + + + + + + + + + + + + + + CHANGESET + + auth_header = bearer_authorization_header changeset.user + + assert_difference "Node.count", 1 do + post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header + + assert_response :success + end + + assert_dom "diffResult>node", 3 + assert_dom "diffResult>node[old_id='-1']", 3 + + node = Node.last + assert_equal 3, node.version + assert_not node.visible + end + + def test_upload_create_and_duplicate_delete + changeset = create(:changeset) + + diff = <<~CHANGESET + + + + + + + + + + CHANGESET + + auth_header = bearer_authorization_header changeset.user + + assert_no_difference "Node.count" do + post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header + + assert_response :gone + end + end + + def test_upload_create_and_duplicate_delete_if_unused + changeset = create(:changeset) + + diff = <<~CHANGESET + + + + + + + + + + CHANGESET + + auth_header = bearer_authorization_header changeset.user + + assert_difference "Node.count", 1 do + post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header + + assert_response :success + end + + assert_dom "diffResult>node", 3 + assert_dom "diffResult>node[old_id='-1']", 3 + assert_dom "diffResult>node[new_version='1']", 1 + assert_dom "diffResult>node[new_version='2']", 1 + + node = Node.last + assert_equal 2, node.version + assert_not node.visible + end end end end diff --git a/test/controllers/api/changesets_controller_test.rb b/test/controllers/api/changesets_controller_test.rb index aa2bf2c9f..ed65c2f6d 100644 --- a/test/controllers/api/changesets_controller_test.rb +++ b/test/controllers/api/changesets_controller_test.rb @@ -710,141 +710,6 @@ module Api assert_operator cs.max_lat, :<=, 90 * GeoRecord::SCALE, "Maximum latitude (#{cs.max_lat / GeoRecord::SCALE}) should be <= 90 to be valid." end - ## - # upload something which creates new objects and inserts them into - # existing containers using placeholders. - def test_upload_complex - way = create(:way) - node = create(:node) - relation = create(:relation) - create(:way_node, :way => way, :node => node) - - changeset = create(:changeset) - - 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 :success, - "can't upload a complex diff to changeset: #{@response.body}" - - # check the returned payload - new_node_id = nil - assert_dom "diffResult[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1 do - assert_dom "> node", 1 do |(node_el)| - new_node_id = node_el["new_id"].to_i - end - assert_dom "> way", 1 - assert_dom "> relation", 1 - end - - # check that the changes made it into the database - assert_equal 2, Node.find(new_node_id).tags.size, "new node should have two tags" - assert_equal [new_node_id, node.id], Way.find(way.id).nds, "way nodes should match" - Relation.find(relation.id).members.each do |type, id, _role| - assert_equal new_node_id, id, "relation should contain new node" if type == "node" - end - end - - ## - # test that a placeholder can be reused within the same upload. - def test_upload_reuse_placeholder_valid - 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 :success, - "can't upload a valid diff with re-used placeholders to changeset: #{@response.body}" - - # check the response is well-formed - assert_select "diffResult>node", 3 - assert_select "diffResult>node[old_id='-1']", 3 - end - - def test_upload_duplicate_delete - 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 :gone, - "transaction should be cancelled by second deletion" - - diff = <<~CHANGESET - - - - - - - - - - CHANGESET - - # upload it - post api_changeset_upload_path(changeset), :params => diff, :headers => auth_header - - assert_select "diffResult>node", 3 - assert_select "diffResult>node[old_id='-1']", 3 - assert_select "diffResult>node[new_version='1']", 1 - assert_select "diffResult>node[new_version='2']", 1 - end - ## # test what happens if a diff is uploaded containing only a node # move. -- 2.39.5