ensure that uploads that don't supply a lat and lon for a node. Adding related test and fixing other tests.

This commit is contained in:
Shaun McDonald 2008-12-01 18:32:54 +00:00
parent 6e98e324e5
commit e989b1a880
4 changed files with 32 additions and 4 deletions

View file

@ -79,11 +79,13 @@ class Node < ActiveRecord::Base
def self.from_xml_node(pt, create=false) def self.from_xml_node(pt, create=false)
node = Node.new 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.lat = pt['lat'].to_f
node.lon = pt['lon'].to_f node.lon = pt['lon'].to_f
node.changeset_id = pt['changeset'].to_i 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 # version must be present unless creating
return nil unless create or not pt['version'].nil? return nil unless create or not pt['version'].nil?

View file

@ -35,7 +35,7 @@ class Way < ActiveRecord::Base
return Way.from_xml_node(pt, create) return Way.from_xml_node(pt, create)
end end
rescue LibXML::XML::Error => ex rescue LibXML::XML::Error => ex
raise OSM::APIBadXMLError.new("relation", xml, ex.message) raise OSM::APIBadXMLError.new("way", xml, ex.message)
end end
end end

View file

@ -310,7 +310,7 @@ EOF
</relation> </relation>
</modify> </modify>
<create> <create>
<node id='-1' changeset='4'> <node id='-1' lon='0' lat='0' changeset='4'>
<tag k='foo' v='bar'/> <tag k='foo' v='bar'/>
<tag k='baz' v='bat'/> <tag k='baz' v='bat'/>
</node> </node>

View file

@ -6,7 +6,7 @@ class NodeControllerTest < ActionController::TestCase
def test_create def test_create
# cannot read password from fixture as it is stored as MD5 digest # 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 # create a node with random lat/lon
lat = rand(100)-50 + rand lat = rand(100)-50 + rand
@ -30,6 +30,32 @@ class NodeControllerTest < ActionController::TestCase
assert_equal true, checknode.visible, "saved node is not visible" assert_equal true, checknode.visible, "saved node is not visible"
end 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 def test_read
# check that a visible node is returned properly # check that a visible node is returned properly
get :read, :id => current_nodes(:visible_node).id get :read, :id => current_nodes(:visible_node).id