assert_select "osm>changeset[id=#{changeset_id}]", 1
end
+ ##
+ # check that a changeset that doesn't exist returns an appropriate message
+ def test_read_not_found
+ [0, -32, 233455644, "afg", "213"].each do |id|
+ get :read, :id => id
+ assert_response :not_found, "should get a not found"
+ end
+ end
+
##
# test that the user who opened a change can close it
def test_close
- basic_authorization "test@openstreetmap.org", "test"
+ ## Try without authentication
+ put :close, :id => changesets(:public_user_first_change).id
+ assert_response :unauthorized
+
+
+ ## Try using the non-public user
+ basic_authorization users(:normal_user).email, "test"
+ put :close, :id => changesets(:normal_user_first_change).id
+ assert_require_public_data
+
+
+ ## The try with the public user
+ basic_authorization users(:public_user).email, "test"
- cs_id = changesets(:normal_user_first_change).id
+ cs_id = changesets(:public_user_first_change).id
put :close, :id => cs_id
assert_response :success
##
# test that a different user can't close another user's changeset
def test_close_invalid
- basic_authorization user(:public_user).email, "test"
+ basic_authorization users(:public_user).email, "test"
put :close, :id => changesets(:normal_user_first_change).id
assert_response :conflict
assert_equal "The user doesn't own that changeset", @response.body
end
+
+ ##
+ # test that you can't close using another method
+ def test_close_method_invalid
+ basic_authorization users(:public_user).email, "test"
+
+ cs_id = changesets(:public_user_first_change).id
+ get :close, :id => cs_id
+ assert_response :method_not_allowed
+
+ post :close, :id => cs_id
+ assert_response :method_not_allowed
+ end
+
+ ##
+ # check that you can't close a changeset that isn't found
+ def test_close_not_found
+ cs_ids = [0, -132, "123"]
+
+ # First try to do it with no auth
+ cs_ids.each do |id|
+ put :close, :id => id
+ assert_response :unauthorized, "Shouldn't be able close the non-existant changeset #{id}, when not authorized"
+ end
+
+ # Now try with auth
+ basic_authorization users(:public_user).email, "test"
+ cs_ids.each do |id|
+ put :close, :id => id
+ assert_response :not_found, "The changeset #{id} doesn't exist, so can't be closed"
+ end
+ end
##
# upload something simple, but valid and check that it can
##
# upload something which creates new objects using placeholders
def test_upload_create_valid
- basic_authorization "test@openstreetmap.org", "test"
+ basic_authorization users(:public_user).email, "test"
+ cs_id = changesets(:public_user_first_change).id
# simple diff to create a node way and relation using placeholders
diff = <<EOF
<osmChange>
<create>
- <node id='-1' lon='0' lat='0' changeset='1'>
+ <node id='-1' lon='0' lat='0' changeset='#{cs_id}'>
<tag k='foo' v='bar'/>
<tag k='baz' v='bat'/>
</node>
- <way id='-1' changeset='1'>
+ <way id='-1' changeset='#{cs_id}'>
<nd ref='3'/>
</way>
</create>
<create>
- <relation id='-1' changeset='1'>
+ <relation id='-1' changeset='#{cs_id}'>
<member type='way' role='some' ref='3'/>
<member type='node' role='some' ref='5'/>
<member type='relation' role='some' ref='3'/>
# upload it
content diff
- post :upload, :id => 1
+ post :upload, :id => cs_id
assert_response :success,
"can't upload a simple valid creation to changeset: #{@response.body}"
# test a complex delete where we delete elements which rely on eachother
# in the same transaction.
def test_upload_delete
- basic_authorization "test@openstreetmap.org", "test"
+ basic_authorization users(:public_user).display_name, "test"
diff = XML::Document.new
diff.root = XML::Node.new "osmChange"
delete << current_ways(:used_way).to_xml_node
delete << current_nodes(:node_used_by_relationship).to_xml_node
+ # update the changeset to one that this user owns
+ changeset_id = changesets(:public_user_first_change).id
+ ["node", "way", "relation"].each do |type|
+ delete.find("//osmChange/delete/#{type}").each do |n|
+ n['changeset'] = changeset_id.to_s
+ end
+ end
+
# upload it
content diff
- post :upload, :id => 1
+ post :upload, :id => changeset_id
assert_response :success,
"can't upload a deletion diff to changeset: #{@response.body}"
# test uploading a delete with no lat/lon, as they are optional in
# the osmChange spec.
def test_upload_nolatlon_delete
- basic_authorization "test@openstreetmap.org", "test"
+ basic_authorization users(:public_user).display_name, "test"
- node = current_nodes(:visible_node)
- cs = changesets(:normal_user_first_change)
+ node = current_nodes(:public_visible_node)
+ cs = changesets(:public_user_first_change)
diff = "<osmChange><delete><node id='#{node.id}' version='#{node.version}' changeset='#{cs.id}'/></delete></osmChange>"
# upload it
def test_repeated_changeset_create
30.times do
- basic_authorization "test@openstreetmap.org", "test"
+ basic_authorization users(:public_user).email, "test"
# create a temporary changeset
content "<osm><changeset>" +
# test that deleting stuff in a transaction doesn't bypass the checks
# to ensure that used elements are not deleted.
def test_upload_delete_invalid
- basic_authorization "test@openstreetmap.org", "test"
+ 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 << current_relations(:visible_relation).to_xml_node
+ delete << current_relations(:public_visible_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 => 1
+ 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
# check that nothing was, in fact, deleted
assert_equal true, Node.find(current_nodes(:node_used_by_relationship).id).visible
# upload something which creates new objects and inserts them into
# existing containers using placeholders.
def test_upload_complex
- basic_authorization "test@openstreetmap.org", "test"
+ basic_authorization users(:public_user).email, "test"
+ cs_id = changesets(:public_user_first_change).id
# simple diff to create a node way and relation using placeholders
diff = <<EOF
<osmChange>
<create>
- <node id='-1' lon='0' lat='0' changeset='1'>
+ <node id='-1' lon='0' lat='0' changeset='#{cs_id}'>
<tag k='foo' v='bar'/>
<tag k='baz' v='bat'/>
</node>
</create>
<modify>
- <way id='1' changeset='1' version='1'>
+ <way id='1' changeset='#{cs_id}' version='1'>
<nd ref='-1'/>
<nd ref='3'/>
</way>
- <relation id='1' changeset='1' version='1'>
+ <relation id='1' changeset='#{cs_id}' version='1'>
<member type='way' role='some' ref='3'/>
<member type='node' role='some' ref='-1'/>
<member type='relation' role='some' ref='3'/>
# upload it
content diff
- post :upload, :id => 1
+ post :upload, :id => cs_id
assert_response :success,
"can't upload a complex diff to changeset: #{@response.body}"
# create a diff which references several changesets, which should cause
# a rollback and none of the diff gets committed
def test_upload_invalid_changesets
- basic_authorization "test@openstreetmap.org", "test"
+ basic_authorization users(:public_user).email, "test"
+ cs_id = changesets(:public_user_first_change).id
# simple diff to create a node way and relation using placeholders
diff = <<EOF
<osmChange>
<modify>
- <node id='1' lon='0' lat='0' changeset='1' version='1'/>
- <way id='1' changeset='1' version='1'>
+ <node id='1' lon='0' lat='0' changeset='#{cs_id}' version='1'/>
+ <way id='1' changeset='#{cs_id}' version='1'>
<nd ref='3'/>
</way>
</modify>
<modify>
- <relation id='1' changeset='1' version='1'>
+ <relation id='1' changeset='#{cs_id}' version='1'>
<member type='way' role='some' ref='3'/>
<member type='node' role='some' ref='5'/>
<member type='relation' role='some' ref='3'/>
# upload it
content diff
- post :upload, :id => 1
+ post :upload, :id => cs_id
assert_response :conflict,
"uploading a diff with multiple changsets should have failed"
##
# upload multiple versions of the same element in the same diff.
def test_upload_multiple_valid
- basic_authorization "test@openstreetmap.org", "test"
+ basic_authorization users(:public_user).email, "test"
+ cs_id = changesets(:public_user_first_change).id
# change the location of a node multiple times, each time referencing
# the last version. doesn't this depend on version numbers being
diff = <<EOF
<osmChange>
<modify>
- <node id='1' lon='0' lat='0' changeset='1' version='1'/>
- <node id='1' lon='1' lat='0' changeset='1' version='2'/>
- <node id='1' lon='1' lat='1' changeset='1' version='3'/>
- <node id='1' lon='1' lat='2' changeset='1' version='4'/>
- <node id='1' lon='2' lat='2' changeset='1' version='5'/>
- <node id='1' lon='3' lat='2' changeset='1' version='6'/>
- <node id='1' lon='3' lat='3' changeset='1' version='7'/>
- <node id='1' lon='9' lat='9' changeset='1' version='8'/>
+ <node id='1' lon='0' lat='0' changeset='#{cs_id}' version='1'/>
+ <node id='1' lon='1' lat='0' changeset='#{cs_id}' version='2'/>
+ <node id='1' lon='1' lat='1' changeset='#{cs_id}' version='3'/>
+ <node id='1' lon='1' lat='2' changeset='#{cs_id}' version='4'/>
+ <node id='1' lon='2' lat='2' changeset='#{cs_id}' version='5'/>
+ <node id='1' lon='3' lat='2' changeset='#{cs_id}' version='6'/>
+ <node id='1' lon='3' lat='3' changeset='#{cs_id}' version='7'/>
+ <node id='1' lon='9' lat='9' changeset='#{cs_id}' version='8'/>
</modify>
</osmChange>
EOF
# upload it
content diff
- post :upload, :id => 1
+ post :upload, :id => cs_id
assert_response :success,
"can't upload multiple versions of an element in a diff: #{@response.body}"
# upload multiple versions of the same element in the same diff, but
# keep the version numbers the same.
def test_upload_multiple_duplicate
- basic_authorization "test@openstreetmap.org", "test"
+ basic_authorization users(:public_user).email, "test"
+ cs_id = changesets(:public_user_first_change).id
diff = <<EOF
<osmChange>
<modify>
- <node id='1' lon='0' lat='0' changeset='1' version='1'/>
- <node id='1' lon='1' lat='1' changeset='1' version='1'/>
+ <node id='1' lon='0' lat='0' changeset='#{cs_id}' version='1'/>
+ <node id='1' lon='1' lat='1' changeset='#{cs_id}' version='1'/>
</modify>
</osmChange>
EOF
# upload it
content diff
- post :upload, :id => 1
+ post :upload, :id => cs_id
assert_response :conflict,
"shouldn't be able to upload the same element twice in a diff: #{@response.body}"
end
##
# try to upload some elements without specifying the version
def test_upload_missing_version
- basic_authorization "test@openstreetmap.org", "test"
+ basic_authorization users(:public_user).email, "test"
+ cs_id = changesets(:public_user_first_change).id
diff = <<EOF
<osmChange>
<modify>
- <node id='1' lon='1' lat='1' changeset='1'/>
+ <node id='1' lon='1' lat='1' changeset='cs_id'/>
</modify>
</osmChange>
EOF
# upload it
content diff
- post :upload, :id => 1
+ post :upload, :id => cs_id
assert_response :bad_request,
"shouldn't be able to upload an element without version: #{@response.body}"
end
##
# try to upload with commands other than create, modify, or delete
def test_action_upload_invalid
- basic_authorization "test@openstreetmap.org", "test"
+ basic_authorization users(:public_user).email, "test"
+ cs_id = changesets(:public_user_first_change).id
diff = <<EOF
<osmChange>
<ping>
- <node id='1' lon='1' lat='1' changeset='1' />
+ <node id='1' lon='1' lat='1' changeset='#{cs_id}' />
</ping>
</osmChange>
EOF
content diff
- post :upload, :id => 1
+ post :upload, :id => cs_id
assert_response :bad_request, "Shouldn't be able to upload a diff with the action ping"
assert_equal @response.body, "Unknown action ping, choices are create, modify, delete."
end