X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/eebadd141a6b0aa067131d6ae807fae5f4d3c07b..152cb13a02dfcb2966b8a9b29382f84a99a23a69:/test/functional/amf_controller_test.rb diff --git a/test/functional/amf_controller_test.rb b/test/functional/amf_controller_test.rb index e0375c92f..9221a293d 100644 --- a/test/functional/amf_controller_test.rb +++ b/test/functional/amf_controller_test.rb @@ -5,6 +5,10 @@ include Potlatch class AmfControllerTest < ActionController::TestCase api_fixtures + # this should be what AMF controller returns when the bbox of a request + # is invalid or too large. + BOUNDARY_ERROR = [-2,"Sorry - I can't get the map for that area."] + def test_getway # check a visible way id = current_ways(:visible_way).id @@ -51,47 +55,37 @@ class AmfControllerTest < ActionController::TestCase # check contents of message map = amf_result "/1" - assert map[0].include?(current_ways(:used_way).id) - assert !map[0].include?(current_ways(:invisible_way).id) + assert_equal 0, map[0] + assert_equal Array, map[1].class + assert map[1].include?(current_ways(:used_way).id) + assert !map[1].include?(current_ways(:invisible_way).id) end + ## + # checks that too-large a bounding box will not be served. def test_whichways_toobig bbox = [-0.1,-0.1,1.1,1.1] - amf_content "whichways", "/1", bbox - post :amf_read - assert_response :success - amf_parse_response - - # FIXME: whichways needs to reject large bboxes and the test needs to check for this - map = amf_result "/1" - assert map[0].empty? and map[1].empty? and map[2].empty? + check_bboxes_are_bad [bbox] do |map| + assert_equal BOUNDARY_ERROR, map, "AMF controller should have returned an error." + end end + ## + # checks that an invalid bounding box will not be served. in this case + # one with max < min latitudes. def test_whichways_badlat bboxes = [[0,0.1,0.1,0], [-0.1,80,0.1,70], [0.24,54.34,0.25,54.33]] - bboxes.each do |bbox| - amf_content "whichways", "/1", bbox - post :amf_read - assert_response :success - amf_parse_response - - # FIXME: whichways needs to reject bboxes with illegal lats and the test needs to check for this - map = amf_result "/1" - assert map[0].empty? and map[1].empty? and map[2].empty? + check_bboxes_are_bad bboxes do |map| + assert_equal BOUNDARY_ERROR, map, "AMF controller should have returned an error." end end + ## + # same as test_whichways_badlat, but for longitudes def test_whichways_badlon bboxes = [[80,-0.1,70,0.1], [54.34,0.24,54.33,0.25]] - bboxes.each do |bbox| - amf_content "whichways", "/1", bbox - post :amf_read - assert_response :success - amf_parse_response - - # FIXME: whichways needs to reject bboxes with illegal lons and the test needs to check for this - map = amf_result "/1" - assert map[0].empty? and map[1].empty? and map[2].empty? + check_bboxes_are_bad bboxes do |map| + assert_equal BOUNDARY_ERROR, map, "AMF controller should have returned an error." end end @@ -107,9 +101,11 @@ class AmfControllerTest < ActionController::TestCase amf_parse_response # check contents of message - ways = amf_result "/1" - assert ways[0].include?(current_ways(:invisible_way).id) - assert !ways[0].include?(current_ways(:used_way).id) + map = amf_result "/1" + assert_equal 0, map[0] + assert_equal Array, map[1].class + assert map[1].include?(current_ways(:used_way).id) + assert !map[1].include?(current_ways(:invisible_way).id) end def test_whichways_deleted_toobig @@ -119,8 +115,8 @@ class AmfControllerTest < ActionController::TestCase assert_response :success amf_parse_response - ways = amf_result "/1" - assert ways[0].empty? + map = amf_result "/1" + assert_equal BOUNDARY_ERROR, map, "AMF controller should have returned an error." end def test_getrelation @@ -154,6 +150,99 @@ class AmfControllerTest < ActionController::TestCase assert rel[1].empty? and rel[2].empty? end + def test_getway_old + # try to get the last visible version (specified by <0) (should be current version) + latest = current_ways(:way_with_versions) + # try to get version 1 + v1 = ways(:way_with_versions_v1) + {latest => -1, v1 => v1.version}.each do |way, v| + amf_content "getway_old", "/1", [way.id, v] + post :amf_read + assert_response :success + amf_parse_response + returned_way = amf_result("/1") + assert_equal returned_way[1], way.id + assert_equal returned_way[4], way.version + end + end + + def test_getway_old_nonexistent + # try to get the last version+10 (shoudn't exist) + latest = current_ways(:way_with_versions) + # try to get last visible version of non-existent way + # try to get specific version of non-existent way + {nil => -1, nil => 1, latest => latest.version + 10}.each do |way, v| + amf_content "getway_old", "/1", [way.nil? ? 0 : way.id, v] + post :amf_read + assert_response :success + amf_parse_response + returned_way = amf_result("/1") + assert returned_way[2].empty? + assert returned_way[3].empty? + assert returned_way[4] < 0 + end + end + + def test_getway_history + latest = current_ways(:way_with_versions) + amf_content "getway_history", "/1", [latest.id] + post :amf_read + assert_response :success + amf_parse_response + history = amf_result("/1") + + # ['way',wayid,history] + assert_equal history[0], 'way' + assert_equal history[1], latest.id + assert_equal history[2].first[0], latest.version + assert_equal history[2].last[0], ways(:way_with_versions_v1).version + end + + def test_getway_history_nonexistent + amf_content "getway_history", "/1", [0] + post :amf_read + assert_response :success + amf_parse_response + history = amf_result("/1") + + # ['way',wayid,history] + assert_equal history[0], 'way' + assert_equal history[1], 0 + assert history[2].empty? + end + + def test_getnode_history + latest = current_nodes(:node_with_versions) + amf_content "getnode_history", "/1", [latest.id] + post :amf_read + assert_response :success + amf_parse_response + history = amf_result("/1") + + # ['node',nodeid,history] + assert_equal history[0], 'node' + assert_equal history[1], latest.id + assert_equal history[2].first[0], latest.timestamp.to_i + assert_equal history[2].last[0], nodes(:node_with_versions_v1).timestamp.to_i + end + + def test_getnode_history_nonexistent + amf_content "getnode_history", "/1", [0] + post :amf_read + assert_response :success + amf_parse_response + history = amf_result("/1") + + # ['node',nodeid,history] + assert_equal history[0], 'node' + assert_equal history[1], 0 + assert history[2].empty? + end + + + # ************************************************************ + # AMF Helper functions + # Get the result record for the specified ID # It's an assertion FAIL if the record does not exist def amf_result ref @@ -212,4 +301,21 @@ class AmfControllerTest < ActionController::TestCase results end + ## + # given an array of bounding boxes (each an array of 4 floats), call the + # AMF "whichways" controller for each and pass the result back to the + # caller's block for assertion testing. + def check_bboxes_are_bad(bboxes) + bboxes.each do |bbox| + amf_content "whichways", "/1", bbox + post :amf_read + assert_response :success + amf_parse_response + + # pass the response back to the caller's block to be tested + # against what the caller expected. + map = amf_result "/1" + yield map + end + end end