Fixing some of the tests, adding the new tests to make sure that you can't edit when...
authorShaun McDonald <shaun@shaunmcdonald.me.uk>
Sat, 18 Apr 2009 17:17:22 +0000 (17:17 +0000)
committerShaun McDonald <shaun@shaunmcdonald.me.uk>
Sat, 18 Apr 2009 17:17:22 +0000 (17:17 +0000)
test/fixtures/changesets.yml
test/fixtures/current_ways.yml
test/fixtures/users.yml
test/fixtures/ways.yml
test/functional/diary_entry_controller_test.rb
test/functional/way_controller_test.rb
test/unit/changeset_test.rb
test/unit/user_test.rb

index 9fe5bc6d8f8902eedf9aedbf97575d51ab52dfc9..055381ae48140af59b22c901a8f2d8bea85ffb38 100644 (file)
@@ -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
index b4b037a6104ee89371519569a47a567e0d5a09fd..51b585df057872c591f766ded4454151c7645a18 100644 (file)
@@ -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
index 709139d68e72aca707f94d21aa04eb74debf88db..46f8885d9e4b5ccdef124ffdb33f7deb458ac22e 100644 (file)
@@ -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
index 80b1da6426a8248f5b959be0fc3571eae0f8a963..62ff2458d2d44ef11fd800c032249da9f8240b5f 100644 (file)
@@ -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
index c0bd4b9ff144fb8034a72aa312024b77f791dda4..10fb908e84505b9299d5b8fb7b2e3622be6ae253 100644 (file)
@@ -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
index 0e6b3ea6a8047e060e61ea36ce444e9f2e467257..9c32ae90400508d7d3654fec1021833fd4ae6627 100644 (file)
@@ -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 "<osm><way changeset='#{changeset_id}'>" +
+      "<nd ref='#{nid1}'/><nd ref='#{nid2}'/>" + 
+      "<tag k='test' v='yes' /></way></osm>"
+    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 "<osm><way changeset='#{changeset_id}'>" +
       "<nd ref='#{nid1}'/><nd ref='#{nid2}'/>" + 
@@ -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 "<osm><way changeset='#{open_changeset_id}'>" + 
+      "<nd ref='0'/><tag k='test' v='yes' /></way></osm>"
+    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 "<osm><way changeset='#{open_changeset_id}'>" +
+      "<tag k='test' v='yes' /></way></osm>"
+    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 "<osm><way changeset='#{closed_changeset_id}'>" +
+      "<nd ref='#{nid1}'/></way></osm>"
+    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 "<osm><way changeset='#{open_changeset_id}'>" + 
       "<nd ref='0'/><tag k='test' v='yes' /></way></osm>"
@@ -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 "<osm><way id='#{current_ways(:visible_way).id}'></osm>"
+    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 << "<tag k='addr:housenumber' v='2'/>"
     way_str << "</way></osm>";
 
+    # 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 = "<osm><way changeset='1'>"
+    way_str << "<tag k='addr:housenumber' v='1'/>"
+    way_str << "<tag k='addr:housenumber' v='2'/>"
+    way_str << "</way></osm>";
+
     # try and upload it
     content way_str
     put :create
index 448289aaf838a0fe26bb5b416be2ae1eaad38fa1..bc7abe085f553325c1f66d0015faa0dd2ffad539 100644 (file)
@@ -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
index f87b5b6fc351df9fee3f5782bac97f1c903e1a77..02251b0eef865cde105883d110e950130d1d392d 100644 (file)
@@ -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