ensure that uploads that don't supply a lat and lon for a node. Adding related test...
authorShaun McDonald <shaun@shaunmcdonald.me.uk>
Mon, 1 Dec 2008 18:32:54 +0000 (18:32 +0000)
committerShaun McDonald <shaun@shaunmcdonald.me.uk>
Mon, 1 Dec 2008 18:32:54 +0000 (18:32 +0000)
app/models/node.rb
app/models/way.rb
test/functional/changeset_controller_test.rb
test/functional/node_controller_test.rb

index b2650b6..e90c329 100644 (file)
@@ -79,11 +79,13 @@ class Node < ActiveRecord::Base
   def self.from_xml_node(pt, create=false)
     node = Node.new
     
+    raise OSM::APIBadXMLError.new("node", pt, "lat missing") if pt['lat'].nil?
+    raise OSM::APIBadXMLError.new("node", pt, "lon missing") if pt['lon'].nil?
     node.lat = pt['lat'].to_f
     node.lon = pt['lon'].to_f
     node.changeset_id = pt['changeset'].to_i
 
-    return nil unless node.in_world?
+    raise OSM::APIBadUserInput.new("The node is outside this world") unless node.in_world?
 
     # version must be present unless creating
     return nil unless create or not pt['version'].nil?
index d4bca19..d6aa12a 100644 (file)
@@ -35,7 +35,7 @@ class Way < ActiveRecord::Base
         return Way.from_xml_node(pt, create)
       end
     rescue LibXML::XML::Error => ex
-      raise OSM::APIBadXMLError.new("relation", xml, ex.message)
+      raise OSM::APIBadXMLError.new("way", xml, ex.message)
     end
   end
 
index 59c92e1..e8648e5 100644 (file)
@@ -310,7 +310,7 @@ EOF
   </relation>
  </modify>
  <create>
-  <node id='-1' changeset='4'>
+  <node id='-1' lon='0' lat='0' changeset='4'>
    <tag k='foo' v='bar'/>
    <tag k='baz' v='bat'/>
   </node>
index 9d7f48c..2289953 100644 (file)
@@ -6,7 +6,7 @@ class NodeControllerTest < ActionController::TestCase
 
   def test_create
     # cannot read password from fixture as it is stored as MD5 digest
-    basic_authorization(users(:normal_user).email, "test");
+    basic_authorization(users(:normal_user).email, "test")
     
     # create a node with random lat/lon
     lat = rand(100)-50 + rand
@@ -30,6 +30,32 @@ class NodeControllerTest < ActionController::TestCase
     assert_equal true, checknode.visible, "saved node is not visible"
   end
 
+  def test_create_invalid_xml
+    # Initial setup
+    basic_authorization(users(:normal_user).email, "test")
+    # normal user has a changeset open, so we'll use that.
+    changeset = changesets(:normal_user_first_change)
+    lat = 3.434
+    lon = 3.23
+    
+    # test that the upload is rejected when no lat is supplied
+    # create a minimal xml file
+    content("<osm><node lon='#{lon}' changeset='#{changeset.id}'/></osm>")
+    put :create
+    # hope for success
+    assert_response :bad_request, "node upload did not return bad_request status"
+    assert_equal 'Cannot parse valid node from xml string <node lon="3.23" changeset="1"/>. lat missing', @response.body
+
+    # test that the upload is rejected when no lon is supplied
+    # create a minimal xml file
+    content("<osm><node lat='#{lat}' changeset='#{changeset.id}'/></osm>")
+    put :create
+    # hope for success
+    assert_response :bad_request, "node upload did not return bad_request status"
+    assert_equal 'Cannot parse valid node from xml string <node lat="3.434" changeset="1"/>. lon missing', @response.body
+
+  end
+
   def test_read
     # check that a visible node is returned properly
     get :read, :id => current_nodes(:visible_node).id