]> git.openstreetmap.org Git - rails.git/blobdiff - test/functional/changeset_controller_test.rb
List all objects that are blocking a delete, in a well defined order
[rails.git] / test / functional / changeset_controller_test.rb
index b02f556c9faf04c5cb6a556f88ab6037206df5b1..964e18a12a133d220e78254ce038bab7af59b1f1 100644 (file)
@@ -489,7 +489,7 @@ EOF
     post :upload, :id => 2
     assert_response :precondition_failed, 
       "shouldn't be able to upload a invalid deletion diff: #{@response.body}"
-    assert_equal "Precondition failed: Way 3 still used by relation 1.", @response.body
+    assert_equal "Precondition failed: Way 3 is still used by relations 1.", @response.body
 
     # check that nothing was, in fact, deleted
     assert_equal true, Node.find(current_nodes(:node_used_by_relationship).id).visible
@@ -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
 
   ##
@@ -1539,14 +1643,14 @@ EOF
   ##
   # This should display the last 20 changesets closed.
   def test_list
-    changesets = Changeset.find(:all, :order => "created_at DESC", :conditions => ['min_lat IS NOT NULL'], :limit=> 20)
+    changesets = Changeset.find(:all, :order => "created_at DESC", :conditions => ['num_changes > 0'], :limit=> 20)
     assert changesets.size <= 20
     get :list, {:format => "html"}
     assert_response :success
     assert_template "list"
     # Now check that all 20 (or however many were returned) changesets are in the html
     assert_select "h1", :text => "Changesets", :count => 1
-    assert_select "table[id='changeset_list'] tr", :count => changesets.size + 1
+    assert_select "table[id='changeset_list'] tr", :count => changesets.size
     changesets.each do |changeset|
       # FIXME this test needs rewriting - test for table contents
     end