From 0dd0f1881db639b968ea9f8d864bfc95efed279d Mon Sep 17 00:00:00 2001 From: Shaun McDonald Date: Sat, 18 Apr 2009 17:17:22 +0000 Subject: [PATCH] Fixing some of the tests, adding the new tests to make sure that you can't edit when your not a public user --- test/fixtures/changesets.yml | 9 +- test/fixtures/current_ways.yml | 6 +- test/fixtures/users.yml | 2 +- test/fixtures/ways.yml | 6 +- .../functional/diary_entry_controller_test.rb | 2 +- test/functional/way_controller_test.rb | 175 +++++++++++++++++- test/unit/changeset_test.rb | 2 +- test/unit/user_test.rb | 20 +- 8 files changed, 197 insertions(+), 25 deletions(-) diff --git a/test/fixtures/changesets.yml b/test/fixtures/changesets.yml index 9fe5bc6d8..055381ae4 100644 --- a/test/fixtures/changesets.yml +++ b/test/fixtures/changesets.yml @@ -14,7 +14,7 @@ normal_user_first_change: max_lat: <%= 5 * SCALE %> num_changes: 11 -second_user_first_change: +public_user_first_change: id: 2 user_id: 2 created_at: "2008-05-01 01:23:45" @@ -28,6 +28,13 @@ normal_user_closed_change: closed_at: "2007-01-02 00:00:00" num_changes: 0 +public_user_closed_change: + id: 7 + user_id: 2 + created_at: "2007-01-01 00:00:00" + closed_at: "2007-01-02 00:00:00" + num_changes: 0 + normal_user_version_change: id: 4 user_id: 1 diff --git a/test/fixtures/current_ways.yml b/test/fixtures/current_ways.yml index b4b037a61..51b585df0 100644 --- a/test/fixtures/current_ways.yml +++ b/test/fixtures/current_ways.yml @@ -1,20 +1,20 @@ visible_way: id: 1 - changeset_id: 1 + changeset_id: 2 timestamp: 2007-01-01 00:00:00 visible: true version: 1 invisible_way: id: 2 - changeset_id: 1 + changeset_id: 2 timestamp: 2007-01-01 00:00:00 visible: false version: 1 used_way: id: 3 - changeset_id: 1 + changeset_id: 2 timestamp: 2007-01-01 00:00:00 visible: true version: 1 diff --git a/test/fixtures/users.yml b/test/fixtures/users.yml index 709139d68..46f8885d9 100644 --- a/test/fixtures/users.yml +++ b/test/fixtures/users.yml @@ -12,7 +12,7 @@ normal_user: home_lon: 12.1 home_zoom: 3 -second_user: +public_user: id: 2 email: test@example.com active: true diff --git a/test/fixtures/ways.yml b/test/fixtures/ways.yml index 80b1da642..62ff2458d 100644 --- a/test/fixtures/ways.yml +++ b/test/fixtures/ways.yml @@ -1,20 +1,20 @@ visible_way: id: 1 - changeset_id: 1 + changeset_id: 2 timestamp: 2007-01-01 00:00:00 visible: true version: 1 invisible_way: id: 2 - changeset_id: 1 + changeset_id: 2 timestamp: 2007-01-01 00:00:00 visible: false version: 1 used_way: id: 3 - changeset_id: 1 + changeset_id: 2 timestamp: 2007-01-01 00:00:00 visible: true version: 1 diff --git a/test/functional/diary_entry_controller_test.rb b/test/functional/diary_entry_controller_test.rb index c0bd4b9ff..10fb908e8 100644 --- a/test/functional/diary_entry_controller_test.rb +++ b/test/functional/diary_entry_controller_test.rb @@ -117,7 +117,7 @@ class DiaryEntryControllerTest < ActionController::TestCase end # and when not logged in as the user who wrote the entry - get :view, {:id => diary_entries(:normal_user_entry_1).id, :display_name => 'test'}, {'user' => users(:second_user).id} + get :view, {:id => diary_entries(:normal_user_entry_1).id, :display_name => 'test'}, {'user' => users(:public_user).id} assert_response :success assert_template 'diary_entry/view' assert_select "html:root", :count => 1 do diff --git a/test/functional/way_controller_test.rb b/test/functional/way_controller_test.rb index 0e6b3ea6a..9c32ae904 100644 --- a/test/functional/way_controller_test.rb +++ b/test/functional/way_controller_test.rb @@ -56,13 +56,33 @@ class WayControllerTest < ActionController::TestCase # ------------------------------------- def test_create + ## First check that it fails when creating a way using a non-public user nid1 = current_nodes(:used_node_1).id nid2 = current_nodes(:used_node_2).id - basic_authorization "test@openstreetmap.org", "test" + basic_authorization users(:normal_user).email, "test" # use the first user's open changeset changeset_id = changesets(:normal_user_first_change).id + # create a way with pre-existing nodes + content "" + + "" + + "" + put :create + # hope for success + assert_response :forbidden, + "way upload did not return success status" + # read id of created way and search for it + wayid = @response.body + + ## Now use a public user + nid1 = current_nodes(:used_node_1).id + nid2 = current_nodes(:used_node_2).id + basic_authorization users(:public_user).email, "test" + + # use the first user's open changeset + changeset_id = changesets(:public_user_first_change).id + # create a way with pre-existing nodes content "" + "" + @@ -85,7 +105,7 @@ class WayControllerTest < ActionController::TestCase "saved way does not contain the right node on pos 1" assert_equal checkway.changeset_id, changeset_id, "saved way does not belong to the correct changeset" - assert_equal users(:normal_user).id, checkway.changeset.user_id, + assert_equal users(:public_user).id, checkway.changeset.user_id, "saved way does not belong to user that created it" assert_equal true, checkway.visible, "saved way is not visible" @@ -96,13 +116,47 @@ class WayControllerTest < ActionController::TestCase # ------------------------------------- def test_create_invalid - basic_authorization "test@openstreetmap.org", "test" + ## First test with a private user to make sure that they are not authorized + basic_authorization users(:normal_user).email, "test" # use the first user's open changeset open_changeset_id = changesets(:normal_user_first_change).id closed_changeset_id = changesets(:normal_user_closed_change).id nid1 = current_nodes(:used_node_1).id + # create a way with non-existing node + content "" + + "" + put :create + # expect failure + assert_response :forbidden, + "way upload with invalid node using a private user did not return 'forbidden'" + + # create a way with no nodes + content "" + + "" + put :create + # expect failure + assert_response :forbidden, + "way upload with no node using a private userdid not return 'forbidden'" + + # create a way inside a closed changeset + content "" + + "" + put :create + # expect failure + assert_response :forbidden, + "way upload to closed changeset with a private user did not return 'forbidden'" + + + ## Now test with a public user + basic_authorization users(:public_user).email, "test" + + # use the first user's open changeset + open_changeset_id = changesets(:public_user_first_change).id + closed_changeset_id = changesets(:public_user_closed_change).id + nid1 = current_nodes(:used_node_1).id + # create a way with non-existing node content "" + "" @@ -137,8 +191,59 @@ class WayControllerTest < ActionController::TestCase delete :delete, :id => current_ways(:visible_way).id assert_response :unauthorized + # now set auth using the private user + basic_authorization(users(:normal_user).email, "test"); + + # this shouldn't work as with the 0.6 api we need pay load to delete + delete :delete, :id => current_ways(:visible_way).id + assert_response :forbidden + + # Now try without having a changeset + content "" + delete :delete, :id => current_ways(:visible_way).id + assert_response :forbidden + + # try to delete with an invalid (closed) changeset + content update_changeset(current_ways(:visible_way).to_xml, + changesets(:normal_user_closed_change).id) + delete :delete, :id => current_ways(:visible_way).id + assert_response :forbidden + + # try to delete with an invalid (non-existent) changeset + content update_changeset(current_ways(:visible_way).to_xml,0) + delete :delete, :id => current_ways(:visible_way).id + assert_response :forbidden + + # Now try with a valid changeset + content current_ways(:visible_way).to_xml + delete :delete, :id => current_ways(:visible_way).id + assert_response :forbidden + + # check the returned value - should be the new version number + # valid delete should return the new version number, which should + # be greater than the old version number + #assert @response.body.to_i > current_ways(:visible_way).version, + # "delete request should return a new version number for way" + + # this won't work since the way is already deleted + content current_ways(:invisible_way).to_xml + delete :delete, :id => current_ways(:invisible_way).id + assert_response :forbidden + + # this shouldn't work as the way is used in a relation + content current_ways(:used_way).to_xml + delete :delete, :id => current_ways(:used_way).id + assert_response :forbidden, + "shouldn't be able to delete a way used in a relation (#{@response.body}), when done by a private user" + + # this won't work since the way never existed + delete :delete, :id => 0 + assert_response :forbidden + + + ### Now check with a public user # now set auth - basic_authorization("test@openstreetmap.org", "test"); + basic_authorization(users(:public_user).email, "test"); # this shouldn't work as with the 0.6 api we need pay load to delete delete :delete, :id => current_ways(:visible_way).id @@ -151,7 +256,7 @@ class WayControllerTest < ActionController::TestCase # try to delete with an invalid (closed) changeset content update_changeset(current_ways(:visible_way).to_xml, - changesets(:normal_user_closed_change).id) + changesets(:public_user_closed_change).id) delete :delete, :id => current_ways(:visible_way).id assert_response :conflict @@ -194,6 +299,7 @@ class WayControllerTest < ActionController::TestCase ## # Try adding a duplicate of an existing tag to a way def test_add_duplicate_tags + ## Try with the non-public user # setup auth basic_authorization(users(:normal_user).email, "test") @@ -206,6 +312,25 @@ class WayControllerTest < ActionController::TestCase way_xml = current_ways(:visible_way).to_xml way_xml.find("//osm/way").first << tag_xml + # try and upload it + content way_xml + put :update, :id => current_ways(:visible_way).id + assert_response :forbidden, + "adding a duplicate tag to a way for a non-public should fail with 'forbidden'" + + ## Now try with the public user + # setup auth + basic_authorization(users(:public_user).email, "test") + + # add an identical tag to the way + tag_xml = XML::Node.new("tag") + tag_xml['k'] = current_way_tags(:t1).k + tag_xml['v'] = current_way_tags(:t1).v + + # add the tag into the existing xml + way_xml = current_ways(:visible_way).to_xml + way_xml.find("//osm/way").first << tag_xml + # try and upload it content way_xml put :update, :id => current_ways(:visible_way).id @@ -217,6 +342,7 @@ class WayControllerTest < ActionController::TestCase ## # Try adding a new duplicate tags to a way def test_new_duplicate_tags + ## First test with the non-public user so should be rejected # setup auth basic_authorization(users(:normal_user).email, "test") @@ -231,12 +357,34 @@ class WayControllerTest < ActionController::TestCase # add two copies of the tag way_xml.find("//osm/way").first << tag_xml.copy(true) << tag_xml + # try and upload it + content way_xml + put :update, :id => current_ways(:visible_way).id + assert_response :forbidden, + "adding new duplicate tags to a way using a non-public user should fail with 'forbidden'" + + ## Now test with the public user + # setup auth + basic_authorization(users(:public_user).email, "test") + + # create duplicate tag + tag_xml = XML::Node.new("tag") + tag_xml['k'] = "i_am_a_duplicate" + tag_xml['v'] = "foobar" + + # add the tag into the existing xml + way_xml = current_ways(:visible_way).to_xml + + # add two copies of the tag + way_xml.find("//osm/way").first << tag_xml.copy(true) << tag_xml + # try and upload it content way_xml put :update, :id => current_ways(:visible_way).id assert_response :bad_request, "adding new duplicate tags to a way should fail with 'bad request'" assert_equal "Element way/#{current_ways(:visible_way).id} has duplicate tags with key i_am_a_duplicate.", @response.body + end ## @@ -244,6 +392,7 @@ class WayControllerTest < ActionController::TestCase # But be a bit subtle - use unicode decoding ambiguities to use different # binary strings which have the same decoding. def test_invalid_duplicate_tags + ## First make sure that you can't with a non-public user # setup auth basic_authorization(users(:normal_user).email, "test") @@ -253,6 +402,22 @@ class WayControllerTest < ActionController::TestCase way_str << "" way_str << ""; + # try and upload it + content way_str + put :create + assert_response :forbidden, + "adding new duplicate tags to a way with a non-public user should fail with 'forbidden'" + + ## Now do it with a public user + # setup auth + basic_authorization(users(:public_user).email, "test") + + # add the tag into the existing xml + way_str = "" + way_str << "" + way_str << "" + way_str << ""; + # try and upload it content way_str put :create diff --git a/test/unit/changeset_test.rb b/test/unit/changeset_test.rb index 448289aaf..bc7abe085 100644 --- a/test/unit/changeset_test.rb +++ b/test/unit/changeset_test.rb @@ -4,7 +4,7 @@ class ChangesetTest < Test::Unit::TestCase api_fixtures def test_changeset_count - assert_equal 6, Changeset.count + assert_equal 7, Changeset.count end end diff --git a/test/unit/user_test.rb b/test/unit/user_test.rb index f87b5b6fc..02251b0ee 100644 --- a/test/unit/user_test.rb +++ b/test/unit/user_test.rb @@ -97,19 +97,19 @@ class UserTest < Test::Unit::TestCase end def test_friend_with - assert_equal true, users(:normal_user).is_friends_with?(users(:second_user)) + assert_equal true, users(:normal_user).is_friends_with?(users(:public_user)) assert_equal false, users(:normal_user).is_friends_with?(users(:inactive_user)) - assert_equal false, users(:second_user).is_friends_with?(users(:normal_user)) - assert_equal false, users(:second_user).is_friends_with?(users(:inactive_user)) + assert_equal false, users(:public_user).is_friends_with?(users(:normal_user)) + assert_equal false, users(:public_user).is_friends_with?(users(:inactive_user)) assert_equal false, users(:inactive_user).is_friends_with?(users(:normal_user)) - assert_equal false, users(:inactive_user).is_friends_with?(users(:second_user)) + assert_equal false, users(:inactive_user).is_friends_with?(users(:public_user)) end def test_users_nearby # second user has their data public and is close by normal user - assert_equal [users(:second_user)], users(:normal_user).nearby + assert_equal [users(:public_user)], users(:normal_user).nearby # second_user has normal user nearby, but normal user has their data private - assert_equal [], users(:second_user).nearby + assert_equal [], users(:public_user).nearby # inactive_user has no user nearby assert_equal [], users(:inactive_user).nearby end @@ -119,7 +119,7 @@ class UserTest < Test::Unit::TestCase # it should be a one way friend accossitation assert_equal 1, Friend.count norm = users(:normal_user) - sec = users(:second_user) + sec = users(:public_user) #friend = Friend.new #friend.befriender = norm #friend.befriendee = sec @@ -130,10 +130,10 @@ class UserTest < Test::Unit::TestCase assert_equal true, norm.is_friends_with?(sec) assert_equal false, sec.is_friends_with?(norm) assert_equal false, users(:normal_user).is_friends_with?(users(:inactive_user)) - assert_equal false, users(:second_user).is_friends_with?(users(:normal_user)) - assert_equal false, users(:second_user).is_friends_with?(users(:inactive_user)) + assert_equal false, users(:public_user).is_friends_with?(users(:normal_user)) + assert_equal false, users(:public_user).is_friends_with?(users(:inactive_user)) assert_equal false, users(:inactive_user).is_friends_with?(users(:normal_user)) - assert_equal false, users(:inactive_user).is_friends_with?(users(:second_user)) + assert_equal false, users(:inactive_user).is_friends_with?(users(:public_user)) #Friend.delete(friend) #assert_equal 0, Friend.count end -- 2.43.2