class AmfControllerTest < ActionController::TestCase
api_fixtures
+ ##
+ # test all routes which lead to this controller
+ def test_routes
+ assert_routing(
+ { :path => "/api/0.6/amf/read", :method => :post },
+ { :controller => "amf", :action => "amf_read" }
+ )
+ assert_routing(
+ { :path => "/api/0.6/amf/write", :method => :post },
+ { :controller => "amf", :action => "amf_write" }
+ )
+ end
+
def test_getway
# check a visible way
id = current_ways(:visible_way).id
# instead of a version number...
# try to get version 1
v1 = ways(:way_with_versions_v1)
- { latest => '',
- v1 => v1.timestamp.strftime("%d %b %Y, %H:%M:%S")
- }.each do |way, t|
- amf_content "getway_old", "/1", [way.id, t]
+ { latest.id => '',
+ v1.way_id => v1.timestamp.strftime("%d %b %Y, %H:%M:%S")
+ }.each do |id, t|
+ amf_content "getway_old", "/1", [id, t]
post :amf_read
assert_response :success
amf_parse_response
returned_way = amf_result("/1")
assert_equal 0, returned_way[0]
- assert_equal way.id, returned_way[2]
+ assert_equal id, returned_way[2]
# API returns the *latest* version, even for old ways...
assert_equal latest.version, returned_way[5]
end
v1 = ways(:way_with_versions_v1)
# try to get last visible version of non-existent way
# try to get specific version of non-existent way
- [[nil, ''],
- [nil, '1 Jan 1970, 00:00:00'],
- [v1, (v1.timestamp - 10).strftime("%d %b %Y, %H:%M:%S")]
- ].each do |way, t|
- amf_content "getway_old", "/1", [way.nil? ? 0 : way.id, t]
+ [[0, ''],
+ [0, '1 Jan 1970, 00:00:00'],
+ [v1.way_id, (v1.timestamp - 10).strftime("%d %b %Y, %H:%M:%S")]
+ ].each do |id, t|
+ amf_content "getway_old", "/1", [id, t]
post :amf_read
assert_response :success
amf_parse_response
assert_equal latest.id, history[1]
# We use dates rather than version numbers here, because you might
# have moved a node within a way (i.e. way version not incremented).
- # The timestamp is +1 (timestamp.succ) because we say "give me the
- # revision of 15:33:02", but that might actually include changes at
- # 15:33:02.457.
- assert_equal latest.timestamp.succ.strftime("%d %b %Y, %H:%M:%S"), history[2].first[0]
- assert_equal oldest.timestamp.succ.strftime("%d %b %Y, %H:%M:%S"), history[2].last[0]
+ # The timestamp is +1 because we say "give me the revision of 15:33:02",
+ # but that might actually include changes at 15:33:02.457.
+ assert_equal (latest.timestamp + 1).strftime("%d %b %Y, %H:%M:%S"), history[2].first[0]
+ assert_equal (oldest.timestamp + 1).strftime("%d %b %Y, %H:%M:%S"), history[2].last[0]
end
def test_getway_history_nonexistent
assert_equal history[1], latest.id,
'second element should be the input node ID'
assert_equal history[2].first[0],
- latest.timestamp.succ.strftime("%d %b %Y, %H:%M:%S"),
+ (latest.timestamp + 1).strftime("%d %b %Y, %H:%M:%S"),
'first element in third element (array) should be the latest version'
assert_equal history[2].last[0],
- nodes(:node_with_versions_v1).timestamp.succ.strftime("%d %b %Y, %H:%M:%S"),
+ (nodes(:node_with_versions_v1).timestamp + 1).strftime("%d %b %Y, %H:%M:%S"),
'last element in third element (array) should be the initial version'
end
# Finally check that the node that was saved has saved the data correctly
# in both the current and history tables
# First check the current table
- current_node = Node.find(result[3])
+ current_node = Node.find(result[3].to_i)
assert_in_delta lat, current_node.lat, 0.00001, "The latitude was not retreieved correctly"
assert_in_delta lon, current_node.lon, 0.00001, "The longitude was not retreived correctly"
assert_equal 0, current_node.tags.size, "There seems to be a tag that has been added to the node"
# Finally check that the node that was saved has saved the data correctly
# in both the current and history tables
# First check the current table
- current_node = Node.find(result[3])
+ current_node = Node.find(result[3].to_i)
assert_in_delta lat, current_node.lat, 0.00001, "The latitude was not retreieved correctly"
assert_in_delta lon, current_node.lon, 0.00001, "The longitude was not retreived correctly"
assert_equal 2, current_node.tags.size, "There seems to be a tag that has been added to the node"
# Finally check that the node that was saved has saved the data correctly
# in both the current and history tables
# First check the current table
- current_node = Node.find(result[3])
+ current_node = Node.find(result[3].to_i)
assert_equal 1, current_node.tags.size, "There seems to be a tag that has been added to the node"
assert_equal({ "something" => "foo\t\n\rbar" }, current_node.tags, "tags were not fixed correctly")
assert_equal result[4], current_node.version, "The version returned, is different to the one returned by the amf"
end
+ def test_startchangeset_invalid_xmlchar_comment
+ invalid = "\035\022"
+ comment = "foo#{invalid}bar"
+
+ amf_content "startchangeset", "/1", ["test@example.com:test", Hash.new, nil, comment, 1]
+ post :amf_write
+ assert_response :success
+ amf_parse_response
+ result = amf_result("/1")
+
+ assert_equal 3, result.size, result.inspect
+ assert_equal 0, result[0]
+ new_cs_id = result[2].to_i
+
+ cs = Changeset.find(new_cs_id)
+ assert_equal "foobar", cs.tags["comment"]
+ end
+
# ************************************************************
# AMF Helper functions
# The result is a hash of message_ref => data.
# The attribute @amf_result is initialised to this hash.
def amf_parse_response
- if @response.body.class.to_s == 'Proc'
- res = StringIO.new()
- @response.body.call @response, res
- req = StringIO.new(res.string)
- else
- req = StringIO.new(@response.body)
- end
+ req = StringIO.new(@response.body)
+
req.read(2) # version
# parse through any headers