]> git.openstreetmap.org Git - rails.git/blobdiff - test/functional/changeset_controller_test.rb
Fixed 'raw' raises by converting them to the appropriate OSM::APIError type. Made...
[rails.git] / test / functional / changeset_controller_test.rb
index 4c98fb36d037fabb064c9aded73e2172e44fbc2e..b50e1b54a43d91773e29952c1f04c18953348fdf 100644 (file)
@@ -4,14 +4,6 @@ require 'changeset_controller'
 class ChangesetControllerTest < ActionController::TestCase
   api_fixtures
 
-  def basic_authorization(user, pass)
-    @request.env["HTTP_AUTHORIZATION"] = "Basic %s" % Base64.encode64("#{user}:#{pass}")
-  end
-
-  def content(c)
-    @request.env["RAW_POST_DATA"] = c.to_s
-  end
-  
   # -----------------------
   # Test simple changeset creation
   # -----------------------
@@ -37,7 +29,7 @@ class ChangesetControllerTest < ActionController::TestCase
       assert_equal Rational(1,24), duration , "initial idle timeout should be an hour (#{cs.created_at} -> #{cs.closed_at})"
     else
       # must be number of seconds...
-      assert_equal 3600.0, duration , "initial idle timeout should be an hour (#{cs.created_at} -> #{cs.closed_at})"
+      assert_equal 3600, duration.round, "initial idle timeout should be an hour (#{cs.created_at} -> #{cs.closed_at})"
     end
   end
   
@@ -48,6 +40,18 @@ class ChangesetControllerTest < ActionController::TestCase
     assert_response :bad_request, "creating a invalid changeset should fail"
   end
 
+  def test_create_invalid_no_content
+    basic_authorization "test@openstreetmap.org", "test"
+    put :create
+    assert_response :bad_request, "creating a changeset with no content should fail"
+  end
+  
+  def test_create_wrong_method
+    basic_authorization "test@openstreetmap.org", "test"
+    get :create
+    assert_response :method_not_allowed
+  end
+    
   ##
   # check that the changeset can be read and returns the correct
   # document structure.
@@ -240,6 +244,22 @@ EOF
     assert_equal false, Node.find(node.id).visible
   end
 
+  def test_repeated_changeset_create
+    30.times do
+      basic_authorization "test@openstreetmap.org", "test"
+    
+      # create a temporary changeset
+      content "<osm><changeset>" +
+        "<tag k='created_by' v='osm test suite checking changesets'/>" + 
+        "</changeset></osm>"
+      assert_difference('Changeset.count', 1) do
+        put :create
+      end
+      assert_response :success
+      changeset_id = @response.body.to_i
+    end
+  end
+
   ##
   # test that deleting stuff in a transaction doesn't bypass the checks
   # to ensure that used elements are not deleted.
@@ -553,6 +573,114 @@ EOF
       "shouldn't be able to re-use placeholder IDs"
   end
 
+  ##
+  # test that uploading a way referencing invalid placeholders gives a 
+  # proper error, not a 500.
+  def test_upload_placeholder_invalid_way
+    basic_authorization "test@example.com", "test"
+
+    diff = <<EOF
+<osmChange>
+ <create>
+  <node id="-1" lon="0" lat="0" changeset="2" version="1"/>
+  <node id="-2" lon="1" lat="1" changeset="2" version="1"/>
+  <node id="-3" lon="2" lat="2" changeset="2" version="1"/>
+  <way id="-1" changeset="2" version="1">
+   <nd ref="-1"/>
+   <nd ref="-2"/>
+   <nd ref="-3"/>
+   <nd ref="-4"/>
+  </way>
+ </create>
+</osmChange>
+EOF
+
+    # upload it
+    content diff
+    post :upload, :id => 2
+    assert_response :bad_request, 
+      "shouldn't be able to use invalid placeholder IDs"
+    assert_equal "Placeholder node not found for reference -4 in way -1", @response.body
+
+    # the same again, but this time use an existing way
+    diff = <<EOF
+<osmChange>
+ <create>
+  <node id="-1" lon="0" lat="0" changeset="2" version="1"/>
+  <node id="-2" lon="1" lat="1" changeset="2" version="1"/>
+  <node id="-3" lon="2" lat="2" changeset="2" version="1"/>
+  <way id="1" changeset="2" version="1">
+   <nd ref="-1"/>
+   <nd ref="-2"/>
+   <nd ref="-3"/>
+   <nd ref="-4"/>
+  </way>
+ </create>
+</osmChange>
+EOF
+
+    # upload it
+    content diff
+    post :upload, :id => 2
+    assert_response :bad_request, 
+      "shouldn't be able to use invalid placeholder IDs"
+    assert_equal "Placeholder node not found for reference -4 in way 1", @response.body
+  end
+
+  ##
+  # test that uploading a relation referencing invalid placeholders gives a 
+  # proper error, not a 500.
+  def test_upload_placeholder_invalid_relation
+    basic_authorization "test@example.com", "test"
+
+    diff = <<EOF
+<osmChange>
+ <create>
+  <node id="-1" lon="0" lat="0" changeset="2" version="1"/>
+  <node id="-2" lon="1" lat="1" changeset="2" version="1"/>
+  <node id="-3" lon="2" lat="2" changeset="2" version="1"/>
+  <relation id="-1" changeset="2" version="1">
+   <member type="node" role="foo" ref="-1"/>
+   <member type="node" role="foo" ref="-2"/>
+   <member type="node" role="foo" ref="-3"/>
+   <member type="node" role="foo" ref="-4"/>
+  </relation>
+ </create>
+</osmChange>
+EOF
+
+    # upload it
+    content diff
+    post :upload, :id => 2
+    assert_response :bad_request, 
+      "shouldn't be able to use invalid placeholder IDs"
+    assert_equal "Placeholder Node not found for reference -4 in relation -1.", @response.body
+
+    # the same again, but this time use an existing way
+    diff = <<EOF
+<osmChange>
+ <create>
+  <node id="-1" lon="0" lat="0" changeset="2" version="1"/>
+  <node id="-2" lon="1" lat="1" changeset="2" version="1"/>
+  <node id="-3" lon="2" lat="2" changeset="2" version="1"/>
+  <relation id="1" changeset="2" version="1">
+   <member type="node" role="foo" ref="-1"/>
+   <member type="node" role="foo" ref="-2"/>
+   <member type="node" role="foo" ref="-3"/>
+   <member type="way" role="bar" ref="-1"/>
+  </relation>
+ </create>
+</osmChange>
+EOF
+
+    # upload it
+    content diff
+    post :upload, :id => 2
+    assert_response :bad_request, 
+      "shouldn't be able to use invalid placeholder IDs"
+    assert_equal "Placeholder Way not found for reference -1 in relation 1.", @response.body
+  end
+
   ##
   # test what happens if a diff is uploaded containing only a node
   # move.