]> git.openstreetmap.org Git - rails.git/blobdiff - test/functional/changeset_controller_test.rb
Update Potlatch 2 to 0.5-295-g3fdb3c2 build
[rails.git] / test / functional / changeset_controller_test.rb
index b02f556c9faf04c5cb6a556f88ab6037206df5b1..01600c2d99d47466368c5fc99fcc60f7eb2981ff 100644 (file)
@@ -497,6 +497,56 @@ EOF
     assert_equal true, Relation.find(current_relations(:visible_relation).id).visible
   end
 
+  ##
+  # test that a conditional delete of an in use object works.
+  def test_upload_delete_if_unused
+    basic_authorization users(:public_user).email, "test"
+
+    diff = XML::Document.new
+    diff.root = XML::Node.new "osmChange"
+    delete = XML::Node.new "delete"
+    diff.root << delete
+    delete["if-unused"] = ""
+    delete << current_relations(:public_used_relation).to_xml_node
+    delete << current_ways(:used_way).to_xml_node
+    delete << current_nodes(:node_used_by_relationship).to_xml_node
+
+    # upload it
+    content diff
+    post :upload, :id => 2
+    assert_response :success, 
+      "can't do a conditional delete of in use objects: #{@response.body}"
+
+    # check the returned payload
+    assert_select "diffResult[version=#{API_VERSION}][generator=\"OpenStreetMap server\"]", 1
+    assert_select "diffResult>node", 1
+    assert_select "diffresult>way", 1
+    assert_select "diffResult>relation", 1
+
+    # parse the response
+    doc = XML::Parser.string(@response.body).parse
+
+    # check the old IDs are all present and what we expect
+    assert_equal current_nodes(:node_used_by_relationship).id, doc.find("//diffResult/node").first["old_id"].to_i
+    assert_equal current_ways(:used_way).id, doc.find("//diffResult/way").first["old_id"].to_i
+    assert_equal current_relations(:public_used_relation).id, doc.find("//diffResult/relation").first["old_id"].to_i
+
+    # check the new IDs are all present and unchanged
+    assert_equal current_nodes(:node_used_by_relationship).id, doc.find("//diffResult/node").first["new_id"].to_i
+    assert_equal current_ways(:used_way).id, doc.find("//diffResult/way").first["new_id"].to_i
+    assert_equal current_relations(:public_used_relation).id, doc.find("//diffResult/relation").first["new_id"].to_i
+
+    # check the new versions are all present and unchanged
+    assert_equal current_nodes(:node_used_by_relationship).version, doc.find("//diffResult/node").first["new_version"].to_i
+    assert_equal current_ways(:used_way).version, doc.find("//diffResult/way").first["new_version"].to_i
+    assert_equal current_relations(:public_used_relation).version, doc.find("//diffResult/relation").first["new_version"].to_i
+
+    # check that nothing was, in fact, deleted
+    assert_equal true, Node.find(current_nodes(:node_used_by_relationship).id).visible
+    assert_equal true, Way.find(current_ways(:used_way).id).visible
+    assert_equal true, Relation.find(current_relations(:public_used_relation).id).visible
+  end
+
   ##
   # upload an element with a really long tag value
   def test_upload_invalid_too_long_tag
@@ -1024,6 +1074,32 @@ EOF
     end
   end
 
+  ##
+  # test that the X-Error-Format header works to request XML errors
+  def test_upload_xml_errors
+    basic_authorization users(:public_user).email, "test"
+
+    # try and delete a node that is in use
+    diff = XML::Document.new
+    diff.root = XML::Node.new "osmChange"
+    delete = XML::Node.new "delete"
+    diff.root << delete
+    delete << current_nodes(:node_used_by_relationship).to_xml_node
+
+    # upload it
+    content diff
+    error_format "xml"
+    post :upload, :id => 2
+    assert_response :success, 
+      "failed to return error in XML format"
+
+    # check the returned payload
+    assert_select "osmError[version=#{API_VERSION}][generator=\"OpenStreetMap server\"]", 1
+    assert_select "osmError>status", 1
+    assert_select "osmError>message", 1
+
+  end
+
   ##
   # when we make some simple changes we get the same changes back from the 
   # diff download.
@@ -1337,16 +1413,32 @@ EOF
     assert_response :success, "can't get changesets in bbox"
     assert_changesets [1]
 
+    # not found when looking for changesets of non-existing users
+    get :query, :user => User.maximum(:id) + 1
+    assert_response :not_found
+    get :query, :display_name => " "
+    assert_response :not_found
+
     # can't get changesets of user 1 without authenticating
     get :query, :user => users(:normal_user).id
-    assert_response :not_found, "shouldn't be able to get changesets by non-public user"
+    assert_response :not_found, "shouldn't be able to get changesets by non-public user (ID)"
+    get :query, :display_name => users(:normal_user).display_name
+    assert_response :not_found, "shouldn't be able to get changesets by non-public user (name)"
 
     # but this should work
     basic_authorization "test@openstreetmap.org", "test"
     get :query, :user => users(:normal_user).id
-    assert_response :success, "can't get changesets by user"
+    assert_response :success, "can't get changesets by user ID"
+    assert_changesets [1,3,6]
+
+    get :query, :display_name => users(:normal_user).display_name
+    assert_response :success, "can't get changesets by user name"
     assert_changesets [1,3,6]
 
+    # check that the correct error is given when we provide both UID and name
+    get :query, :user => users(:normal_user).id, :display_name => users(:normal_user).display_name
+    assert_response :bad_request, "should be a bad request to have both ID and name specified"
+
     get :query, :user => users(:normal_user).id, :open => true
     assert_response :success, "can't get changesets by user and open"
     assert_changesets [1]
@@ -1366,6 +1458,18 @@ EOF
     get :query, :open => 'true'
     assert_response :success, "can't get changesets by open-ness"
     assert_changesets [1,2,4]
+
+    get :query, :closed => 'true'
+    assert_response :success, "can't get changesets by closed-ness"
+    assert_changesets [3,5,6,7]
+
+    get :query, :closed => 'true', :user => users(:normal_user).id
+    assert_response :success, "can't get changesets by closed-ness and user"
+    assert_changesets [3,6]
+
+    get :query, :closed => 'true', :user => users(:public_user).id
+    assert_response :success, "can't get changesets by closed-ness and user"
+    assert_changesets [7]
   end
 
   ##