Make node update work with the new require data public to edit policy. Added convenie...
authorShaun McDonald <shaun@shaunmcdonald.me.uk>
Sun, 26 Apr 2009 22:46:41 +0000 (22:46 +0000)
committerShaun McDonald <shaun@shaunmcdonald.me.uk>
Sun, 26 Apr 2009 22:46:41 +0000 (22:46 +0000)
test/fixtures/current_nodes.yml
test/fixtures/nodes.yml
test/functional/node_controller_test.rb
test/functional/relation_controller_test.rb
test/test_helper.rb
test/unit/node_test.rb
test/unit/old_node_test.rb

index 6f21fd47f30a1267004e5e2116652cd1fe4f9ae2..10c48196d54163e16d074cb1a8047315bd1c091f 100644 (file)
@@ -150,3 +150,14 @@ node_with_versions:
   version: 4
   tile: <%= QuadTile.tile_for_point(1,1) %>
   timestamp: 2008-01-01 00:04:00
+  
+public_visible_node:
+  id: 16
+  latitude: <%= 1*SCALE %>
+  longitude: <%= 1*SCALE %>
+  changeset_id: 2
+  visible: true
+  version: 1
+  tile: <%= QuadTile.tile_for_point(1,1) %>
+  timestamp: 2007-01-01 00:00:00
+
index 5b690696e104c86f622bcfd67f93968133a20d91..fb02fa7ee2750f3b6180c1d6932a778601f47a61 100644 (file)
@@ -180,3 +180,14 @@ node_with_versions_v4:
   version: 4
   tile: <%= QuadTile.tile_for_point(1,1) %>
   timestamp: 2008-01-01 00:04:00
+  
+public_visible_node:
+  id: 16
+  latitude: <%= 1*SCALE %>
+  longitude: <%= 1*SCALE %>
+  changeset_id: 2
+  visible: true
+  version: 1
+  tile: <%= QuadTile.tile_for_point(1,1) %>
+  timestamp: 2007-01-01 00:00:00
+
index 8d019bf7902fa549ec259b9061f71676dc5dbc49..f7b96e291335737b3d5ec49dfab0759ee1c01853 100644 (file)
@@ -127,12 +127,17 @@ class NodeControllerTest < ActionController::TestCase
   # tests whether the API works and prevents incorrect use while trying
   # to update nodes.
   def test_update
+    ## First test with no user credentials
     # try and update a node without authorisation
     # first try to delete node without auth
     content current_nodes(:visible_node).to_xml
     put :update, :id => current_nodes(:visible_node).id
     assert_response :unauthorized
     
+    
+    
+    ## Second test with the private user
+    
     # setup auth
     basic_authorization(users(:normal_user).email, "test")
 
@@ -140,7 +145,62 @@ class NodeControllerTest < ActionController::TestCase
 
     # try and update in someone else's changeset
     content update_changeset(current_nodes(:visible_node).to_xml,
-                             changesets(:second_user_first_change).id)
+                             changesets(:public_user_first_change).id)
+    put :update, :id => current_nodes(:visible_node).id
+    assert_require_public_data "update with other user's changeset should be forbidden when date isn't public"
+
+    # try and update in a closed changeset
+    content update_changeset(current_nodes(:visible_node).to_xml,
+                             changesets(:normal_user_closed_change).id)
+    put :update, :id => current_nodes(:visible_node).id
+    assert_require_public_data "update with closed changeset should be forbidden, when data isn't public"
+
+    # try and update in a non-existant changeset
+    content update_changeset(current_nodes(:visible_node).to_xml, 0)
+    put :update, :id => current_nodes(:visible_node).id
+    assert_require_public_data("update with changeset=0 should be forbidden, when data isn't public")
+
+    ## try and submit invalid updates
+    content xml_attr_rewrite(current_nodes(:visible_node).to_xml, 'lat', 91.0);
+    put :update, :id => current_nodes(:visible_node).id
+    assert_require_public_data "node at lat=91 should be forbidden, when data isn't public"
+
+    content xml_attr_rewrite(current_nodes(:visible_node).to_xml, 'lat', -91.0);
+    put :update, :id => current_nodes(:visible_node).id
+    assert_require_public_data "node at lat=-91 should be forbidden, when data isn't public"
+    
+    content xml_attr_rewrite(current_nodes(:visible_node).to_xml, 'lon', 181.0);
+    put :update, :id => current_nodes(:visible_node).id
+    assert_require_public_data "node at lon=181 should be forbidden, when data isn't public"
+
+    content xml_attr_rewrite(current_nodes(:visible_node).to_xml, 'lon', -181.0);
+    put :update, :id => current_nodes(:visible_node).id
+    assert_require_public_data "node at lon=-181 should be forbidden, when data isn't public"
+    
+    ## finally, produce a good request which should work
+    content current_nodes(:visible_node).to_xml
+    put :update, :id => current_nodes(:visible_node).id
+    assert_require_public_data "should have failed with a forbidden when data isn't public"
+
+    
+    
+    
+    ## Finally test with the public user
+    
+    # try and update a node without authorisation
+    # first try to delete node without auth
+    content current_nodes(:visible_node).to_xml
+    put :update, :id => current_nodes(:visible_node).id
+    assert_response :forbidden
+    
+    # setup auth
+    basic_authorization(users(:public_user).email, "test")
+
+    ## trying to break changesets
+
+    # try and update in someone else's changeset
+    content update_changeset(current_nodes(:visible_node).to_xml,
+                              changesets(:normal_user_first_change).id)
     put :update, :id => current_nodes(:visible_node).id
     assert_response :conflict, "update with other user's changeset should be rejected"
 
@@ -195,8 +255,8 @@ class NodeControllerTest < ActionController::TestCase
        "should not be able to put 'p1r4at3s!' in the version field"
     
     ## finally, produce a good request which should work
-    content current_nodes(:visible_node).to_xml
-    put :update, :id => current_nodes(:visible_node).id
+    content current_nodes(:public_visible_node).to_xml
+    put :update, :id => current_nodes(:public_visible_node).id
     assert_response :success, "a valid update request failed"
   end
 
index 9942353991286ba104c57687ee83e328953adf72..c7e9ca6beb18b8d822309afccff2c8617aff22ac 100644 (file)
@@ -269,6 +269,7 @@ class RelationControllerTest < ActionController::TestCase
   # happen to the correct tables and the API gives sensible results. 
   # this is to test a case that gregory marler noticed and posted to
   # josm-dev.
+  ## FIXME Move this to an integration test
   def test_update_relation_tags
     basic_authorization "test@example.com", "test"
     rel_id = current_relations(:multi_tag_relation).id
index 8c270c6820e34fbe0673295ffb0e2d8e2f0fb9c7..b32dd0a797f880fdbb28ba9887120580f569f119 100644 (file)
@@ -122,6 +122,13 @@ class Test::Unit::TestCase
   def content(c)
     @request.env["RAW_POST_DATA"] = c.to_s
   end
-
+  
+  # Used to check that the error header and the forbidden responses are given
+  # when the owner of the changset has their data not marked as public
+  def assert_require_public_data(msg = "Shouldn't be able to use API when the user's data is not public")
+    assert_response :forbidden, msg
+    assert_equal @response.headers['Error'], "You must make your edits public to upload new data", "Wrong error message"
+  end
+  
   # Add more helper methods to be used by all tests here...
 end
index 51cf82d123d1670cb0ef7f1704ec325d4831166d..d1ec98e0d1b856f3db787f0e26ae06048ed6e0ae 100644 (file)
@@ -2,6 +2,10 @@ require File.dirname(__FILE__) + '/../test_helper'
 
 class NodeTest < Test::Unit::TestCase
   api_fixtures
+  
+  def test_node_count
+    assert_equal 16, Node.count
+  end
 
   def test_node_too_far_north
          invalid_node_test(:node_too_far_north)
index 4915e40b641b4a90ba4d0717cfeb5f3f9d4b80c0..eb68baafb26521497c2723f7debdc5bf358fd643 100644 (file)
@@ -2,6 +2,10 @@ require File.dirname(__FILE__) + '/../test_helper'
 
 class OldNodeTest < Test::Unit::TestCase
   api_fixtures
+  
+  def test_old_node_count
+    assert_equal 19, OldNode.count
+  end
 
   def test_node_too_far_north
          invalid_node_test(:node_too_far_north)