X-Git-Url: https://git.openstreetmap.org./rails.git/blobdiff_plain/a1a6c577e8f406c0d0fa31326209c98ebd78954d..54aa89a4bf8118a3fdec2d60acba6aeb7beaa8c8:/test/controllers/api/changesets_controller_test.rb
diff --git a/test/controllers/api/changesets_controller_test.rb b/test/controllers/api/changesets_controller_test.rb
index 3278b2101..17a9ad9d3 100644
--- a/test/controllers/api/changesets_controller_test.rb
+++ b/test/controllers/api/changesets_controller_test.rb
@@ -51,11 +51,11 @@ module Api
)
assert_routing(
{ :path => "/api/0.6/changesets", :method => :get },
- { :controller => "api/changesets", :action => "query" }
+ { :controller => "api/changesets", :action => "index" }
)
assert_routing(
{ :path => "/api/0.6/changesets.json", :method => :get },
- { :controller => "api/changesets", :action => "query", :format => "json" }
+ { :controller => "api/changesets", :action => "index", :format => "json" }
)
end
@@ -154,23 +154,20 @@ module Api
assert_response :success, "cannot get first changeset"
assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
- assert_select "osm>changeset[id='#{changeset.id}']", 1
- assert_select "osm>changeset>@open", "true"
- assert_select "osm>changeset>@created_at", changeset.created_at.xmlschema
- assert_select "osm>changeset>@closed_at", 0
+ assert_single_changeset changeset
assert_select "osm>changeset>discussion", 0
get changeset_show_path(changeset), :params => { :include_discussion => true }
assert_response :success, "cannot get first changeset with comments"
assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
- assert_select "osm>changeset[id='#{changeset.id}']", 1
- assert_select "osm>changeset>@open", "true"
- assert_select "osm>changeset>@created_at", changeset.created_at.xmlschema
- assert_select "osm>changeset>@closed_at", 0
+ assert_single_changeset changeset
assert_select "osm>changeset>discussion", 1
assert_select "osm>changeset>discussion>comment", 0
+ end
+ def test_show_comments
+ # all comments visible
changeset = create(:changeset, :closed)
comment1, comment2, comment3 = create_list(:changeset_comment, 3, :changeset_id => changeset.id)
@@ -178,15 +175,62 @@ module Api
assert_response :success, "cannot get closed changeset with comments"
assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
- assert_select "osm>changeset[id='#{changeset.id}']", 1
- assert_select "osm>changeset>@open", "false"
- assert_select "osm>changeset>@created_at", changeset.created_at.xmlschema
- assert_select "osm>changeset>@closed_at", changeset.closed_at.xmlschema
+ assert_single_changeset changeset
assert_select "osm>changeset>discussion", 1
assert_select "osm>changeset>discussion>comment", 3
assert_select "osm>changeset>discussion>comment:nth-child(1)>@id", comment1.id.to_s
+ assert_select "osm>changeset>discussion>comment:nth-child(1)>@visible", "true"
assert_select "osm>changeset>discussion>comment:nth-child(2)>@id", comment2.id.to_s
+ assert_select "osm>changeset>discussion>comment:nth-child(2)>@visible", "true"
assert_select "osm>changeset>discussion>comment:nth-child(3)>@id", comment3.id.to_s
+ assert_select "osm>changeset>discussion>comment:nth-child(3)>@visible", "true"
+
+ # one hidden comment not included because not asked for
+ comment2.update(:visible => false)
+
+ get changeset_show_path(changeset), :params => { :include_discussion => true }
+ assert_response :success, "cannot get closed changeset with comments"
+
+ assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
+ assert_single_changeset changeset
+ assert_select "osm>changeset>discussion", 1
+ assert_select "osm>changeset>discussion>comment", 2
+ assert_select "osm>changeset>discussion>comment:nth-child(1)>@id", comment1.id.to_s
+ assert_select "osm>changeset>discussion>comment:nth-child(1)>@visible", "true"
+ assert_select "osm>changeset>discussion>comment:nth-child(2)>@id", comment3.id.to_s
+ assert_select "osm>changeset>discussion>comment:nth-child(2)>@visible", "true"
+
+ # one hidden comment not included because no permissions
+ get changeset_show_path(changeset), :params => { :include_discussion => true, :show_hidden_comments => true }
+ assert_response :success, "cannot get closed changeset with comments"
+
+ assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
+ assert_single_changeset changeset
+ assert_select "osm>changeset>discussion", 1
+ assert_select "osm>changeset>discussion>comment", 2
+ assert_select "osm>changeset>discussion>comment:nth-child(1)>@id", comment1.id.to_s
+ assert_select "osm>changeset>discussion>comment:nth-child(1)>@visible", "true"
+ # maybe will show an empty comment element with visible=false in the future
+ assert_select "osm>changeset>discussion>comment:nth-child(2)>@id", comment3.id.to_s
+ assert_select "osm>changeset>discussion>comment:nth-child(2)>@visible", "true"
+
+ # one hidden comment shown to moderators
+ moderator_user = create(:moderator_user)
+ auth_header = basic_authorization_header moderator_user.email, "test"
+ get changeset_show_path(changeset), :params => { :include_discussion => true, :show_hidden_comments => true },
+ :headers => auth_header
+ assert_response :success, "cannot get closed changeset with comments"
+
+ assert_select "osm[version='#{Settings.api_version}'][generator='#{Settings.generator}']", 1
+ assert_single_changeset changeset
+ assert_select "osm>changeset>discussion", 1
+ assert_select "osm>changeset>discussion>comment", 3
+ assert_select "osm>changeset>discussion>comment:nth-child(1)>@id", comment1.id.to_s
+ assert_select "osm>changeset>discussion>comment:nth-child(1)>@visible", "true"
+ assert_select "osm>changeset>discussion>comment:nth-child(2)>@id", comment2.id.to_s
+ assert_select "osm>changeset>discussion>comment:nth-child(2)>@visible", "false"
+ assert_select "osm>changeset>discussion>comment:nth-child(3)>@id", comment3.id.to_s
+ assert_select "osm>changeset>discussion>comment:nth-child(3)>@visible", "true"
end
def test_show_json
@@ -200,10 +244,7 @@ module Api
assert_equal Settings.api_version, js["version"]
assert_equal Settings.generator, js["generator"]
- assert_equal changeset.id, js["changeset"]["id"]
- assert_operator js["changeset"], :[], "open"
- assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
- assert_nil js["changeset"]["closed_at"]
+ assert_single_changeset_json changeset, js
assert_nil js["changeset"]["tags"]
assert_nil js["changeset"]["comments"]
assert_equal changeset.user.id, js["changeset"]["uid"]
@@ -216,17 +257,17 @@ module Api
assert_not_nil js
assert_equal Settings.api_version, js["version"]
assert_equal Settings.generator, js["generator"]
- assert_equal changeset.id, js["changeset"]["id"]
- assert_operator js["changeset"], :[], "open"
- assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
- assert_nil js["changeset"]["closed_at"]
+ assert_single_changeset_json changeset, js
assert_nil js["changeset"]["tags"]
assert_nil js["changeset"]["min_lat"]
assert_nil js["changeset"]["min_lon"]
assert_nil js["changeset"]["max_lat"]
assert_nil js["changeset"]["max_lon"]
assert_equal 0, js["changeset"]["comments"].count
+ end
+ def test_show_comments_json
+ # all comments visible
changeset = create(:changeset, :closed)
comment0, comment1, comment2 = create_list(:changeset_comment, 3, :changeset_id => changeset.id)
@@ -237,14 +278,67 @@ module Api
assert_not_nil js
assert_equal Settings.api_version, js["version"]
assert_equal Settings.generator, js["generator"]
- assert_equal changeset.id, js["changeset"]["id"]
- assert_not js["changeset"]["open"]
- assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
- assert_equal changeset.closed_at.xmlschema, js["changeset"]["closed_at"]
+ assert_single_changeset_json changeset, js
+ assert_equal 3, js["changeset"]["comments"].count
+ assert_equal comment0.id, js["changeset"]["comments"][0]["id"]
+ assert js["changeset"]["comments"][0]["visible"]
+ assert_equal comment1.id, js["changeset"]["comments"][1]["id"]
+ assert js["changeset"]["comments"][1]["visible"]
+ assert_equal comment2.id, js["changeset"]["comments"][2]["id"]
+ assert js["changeset"]["comments"][2]["visible"]
+
+ # one hidden comment not included because not asked for
+ comment1.update(:visible => false)
+
+ get changeset_show_path(changeset), :params => { :format => "json", :include_discussion => true }
+ assert_response :success, "cannot get closed changeset with comments"
+
+ js = ActiveSupport::JSON.decode(@response.body)
+ assert_not_nil js
+ assert_equal Settings.api_version, js["version"]
+ assert_equal Settings.generator, js["generator"]
+ assert_single_changeset_json changeset, js
+ assert_equal 2, js["changeset"]["comments"].count
+ assert_equal comment0.id, js["changeset"]["comments"][0]["id"]
+ assert js["changeset"]["comments"][0]["visible"]
+ assert_equal comment2.id, js["changeset"]["comments"][1]["id"]
+ assert js["changeset"]["comments"][1]["visible"]
+
+ # one hidden comment not included because no permissions
+ get changeset_show_path(changeset), :params => { :format => "json", :include_discussion => true, :show_hidden_comments => true }
+ assert_response :success, "cannot get closed changeset with comments"
+
+ js = ActiveSupport::JSON.decode(@response.body)
+ assert_not_nil js
+ assert_equal Settings.api_version, js["version"]
+ assert_equal Settings.generator, js["generator"]
+ assert_single_changeset_json changeset, js
+ assert_equal 2, js["changeset"]["comments"].count
+ assert_equal comment0.id, js["changeset"]["comments"][0]["id"]
+ assert js["changeset"]["comments"][0]["visible"]
+ # maybe will show an empty comment element with visible=false in the future
+ assert_equal comment2.id, js["changeset"]["comments"][1]["id"]
+ assert js["changeset"]["comments"][1]["visible"]
+
+ # one hidden comment shown to moderators
+ moderator_user = create(:moderator_user)
+ auth_header = basic_authorization_header moderator_user.email, "test"
+ get changeset_show_path(changeset), :params => { :format => "json", :include_discussion => true, :show_hidden_comments => true },
+ :headers => auth_header
+ assert_response :success, "cannot get closed changeset with comments"
+
+ js = ActiveSupport::JSON.decode(@response.body)
+ assert_not_nil js
+ assert_equal Settings.api_version, js["version"]
+ assert_equal Settings.generator, js["generator"]
+ assert_single_changeset_json changeset, js
assert_equal 3, js["changeset"]["comments"].count
assert_equal comment0.id, js["changeset"]["comments"][0]["id"]
+ assert js["changeset"]["comments"][0]["visible"]
assert_equal comment1.id, js["changeset"]["comments"][1]["id"]
+ assert_not js["changeset"]["comments"][1]["visible"]
assert_equal comment2.id, js["changeset"]["comments"][2]["id"]
+ assert js["changeset"]["comments"][2]["visible"]
end
def test_show_tag_and_discussion_json
@@ -272,10 +366,7 @@ module Api
assert_not_nil js
assert_equal Settings.api_version, js["version"]
assert_equal Settings.generator, js["generator"]
- assert_equal changeset.id, js["changeset"]["id"]
- assert_not js["changeset"]["open"]
- assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
- assert_equal changeset.closed_at.xmlschema, js["changeset"]["closed_at"]
+ assert_single_changeset_json changeset, js
assert_equal 2, js["changeset"]["tags"].count
assert_equal 3, js["changeset"]["comments"].count
assert_equal 3, js["changeset"]["comments_count"]
@@ -658,7 +749,11 @@ module Api
end
def test_upload_large_changeset
- auth_header = basic_authorization_header create(:user).email, "test"
+ user = create(:user)
+ auth_header = basic_authorization_header user.email, "test"
+
+ # create an old changeset to ensure we have the maximum rate limit
+ create(:changeset, :user => user, :created_at => Time.now.utc - 28.days)
# create a changeset
put changeset_create_path, :params => "", :headers => auth_header
@@ -957,14 +1052,14 @@ module Api
diff = <<~CHANGESET
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
CHANGESET
@@ -1238,9 +1333,9 @@ module Api
diff = <<~CHANGESET
-
-
-
+
+
+
@@ -1261,9 +1356,9 @@ module Api
diff = <<~CHANGESET
-
-
-
+
+
+
@@ -1293,9 +1388,9 @@ module Api
diff = <<~CHANGESET
-
-
-
+
+
+
@@ -1316,9 +1411,9 @@ module Api
diff = <<~CHANGESET
-
-
-
+
+
+
@@ -1387,14 +1482,14 @@ module Api
changeset_id = @response.body.to_i
old_way = create(:way)
- create(:way_node, :way => old_way, :node => create(:node, :lat => 1, :lon => 1))
+ create(:way_node, :way => old_way, :node => create(:node, :lat => 0.1, :lon => 0.1))
diff = XML::Document.new
diff.root = XML::Node.new "osmChange"
modify = XML::Node.new "modify"
xml_old_way = xml_node_for_way(old_way)
nd_ref = XML::Node.new "nd"
- nd_ref["ref"] = create(:node, :lat => 3, :lon => 3).id.to_s
+ nd_ref["ref"] = create(:node, :lat => 0.3, :lon => 0.3).id.to_s
xml_old_way << nd_ref
xml_old_way["changeset"] = changeset_id.to_s
modify << xml_old_way
@@ -1407,10 +1502,10 @@ module Api
# check the bbox
changeset = Changeset.find(changeset_id)
- assert_equal 1 * GeoRecord::SCALE, changeset.min_lon, "min_lon should be 1 degree"
- assert_equal 3 * GeoRecord::SCALE, changeset.max_lon, "max_lon should be 3 degrees"
- assert_equal 1 * GeoRecord::SCALE, changeset.min_lat, "min_lat should be 1 degree"
- assert_equal 3 * GeoRecord::SCALE, changeset.max_lat, "max_lat should be 3 degrees"
+ assert_equal 0.1 * GeoRecord::SCALE, changeset.min_lon, "min_lon should be 0.1 degree"
+ assert_equal 0.3 * GeoRecord::SCALE, changeset.max_lon, "max_lon should be 0.3 degrees"
+ assert_equal 0.1 * GeoRecord::SCALE, changeset.min_lat, "min_lat should be 0.1 degree"
+ assert_equal 0.3 * GeoRecord::SCALE, changeset.max_lat, "max_lat should be 0.3 degrees"
end
##
@@ -1707,6 +1802,71 @@ module Api
assert_response :too_many_requests, "upload did not hit rate limit"
end
+ ##
+ # test initial size limit
+ def test_upload_initial_size_limit
+ # create a user
+ user = create(:user)
+
+ # create a changeset that puts us near the initial size limit
+ changeset = create(:changeset, :user => user,
+ :min_lat => (-0.5 * GeoRecord::SCALE).round, :min_lon => (0.5 * GeoRecord::SCALE).round,
+ :max_lat => (0.5 * GeoRecord::SCALE).round, :max_lon => (2.5 * GeoRecord::SCALE).round)
+
+ # create authentication header
+ auth_header = basic_authorization_header user.email, "test"
+
+ # simple diff to create a node
+ diff = <<~CHANGESET
+
+
+
+
+
+
+
+
+ CHANGESET
+
+ # upload it
+ post changeset_upload_path(changeset), :params => diff, :headers => auth_header
+ assert_response :payload_too_large, "upload did not hit size limit"
+ end
+
+ ##
+ # test size limit after one week
+ def test_upload_week_size_limit
+ # create a user
+ user = create(:user)
+
+ # create a changeset to establish our initial edit time
+ create(:changeset, :user => user, :created_at => Time.now.utc - 7.days)
+
+ # create a changeset that puts us near the initial size limit
+ changeset = create(:changeset, :user => user,
+ :min_lat => (-0.5 * GeoRecord::SCALE).round, :min_lon => (0.5 * GeoRecord::SCALE).round,
+ :max_lat => (0.5 * GeoRecord::SCALE).round, :max_lon => (2.5 * GeoRecord::SCALE).round)
+
+ # create authentication header
+ auth_header = basic_authorization_header user.email, "test"
+
+ # simple diff to create a node way and relation using placeholders
+ diff = <<~CHANGESET
+
+
+
+
+
+
+
+
+ CHANGESET
+
+ # upload it
+ post changeset_upload_path(changeset), :params => diff, :headers => auth_header
+ assert_response :payload_too_large, "upload did not hit size limit"
+ end
+
##
# when we make some simple changes we get the same changes back from the
# diff download.
@@ -1738,14 +1898,14 @@ module Api
diff = <<~CHANGESET
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
CHANGESET
@@ -1844,15 +2004,15 @@ module Api
diff = <<~CHANGESET
-
+
-
-
-
+
+
+
-
+
@@ -1904,12 +2064,46 @@ module Api
end
end
+ test "sorts downloaded elements by timestamp" do
+ changeset = create(:changeset)
+ node1 = create(:old_node, :version => 2, :timestamp => "2020-02-01", :changeset => changeset)
+ node0 = create(:old_node, :version => 2, :timestamp => "2020-01-01", :changeset => changeset)
+
+ get changeset_download_path(changeset)
+ assert_response :success
+ assert_dom "modify", :count => 2 do |modify|
+ assert_dom modify[0], ">node", :count => 1 do |node|
+ assert_dom node, ">@id", node0.node_id.to_s
+ end
+ assert_dom modify[1], ">node", :count => 1 do |node|
+ assert_dom node, ">@id", node1.node_id.to_s
+ end
+ end
+ end
+
+ test "sorts downloaded elements by version" do
+ changeset = create(:changeset)
+ node1 = create(:old_node, :version => 3, :timestamp => "2020-01-01", :changeset => changeset)
+ node0 = create(:old_node, :version => 2, :timestamp => "2020-01-01", :changeset => changeset)
+
+ get changeset_download_path(changeset)
+ assert_response :success
+ assert_dom "modify", :count => 2 do |modify|
+ assert_dom modify[0], ">node", :count => 1 do |node|
+ assert_dom node, ">@id", node0.node_id.to_s
+ end
+ assert_dom modify[1], ">node", :count => 1 do |node|
+ assert_dom node, ">@id", node1.node_id.to_s
+ end
+ end
+ end
+
##
# check that the bounding box of a changeset gets updated correctly
# FIXME: This should really be moded to a integration test due to the with_controller
def test_changeset_bbox
way = create(:way)
- create(:way_node, :way => way, :node => create(:node, :lat => 3, :lon => 3))
+ create(:way_node, :way => way, :node => create(:node, :lat => 0.3, :lon => 0.3))
auth_header = basic_authorization_header create(:user).email, "test"
@@ -1921,7 +2115,7 @@ module Api
# add a single node to it
with_controller(NodesController.new) do
- xml = ""
+ xml = ""
put node_create_path, :params => xml, :headers => auth_header
assert_response :success, "Couldn't create node."
end
@@ -1929,14 +2123,14 @@ module Api
# get the bounding box back from the changeset
get changeset_show_path(:id => changeset_id)
assert_response :success, "Couldn't read back changeset."
- assert_select "osm>changeset[min_lon='1.0000000']", 1
- assert_select "osm>changeset[max_lon='1.0000000']", 1
- assert_select "osm>changeset[min_lat='2.0000000']", 1
- assert_select "osm>changeset[max_lat='2.0000000']", 1
+ assert_select "osm>changeset[min_lon='0.1000000']", 1
+ assert_select "osm>changeset[max_lon='0.1000000']", 1
+ assert_select "osm>changeset[min_lat='0.2000000']", 1
+ assert_select "osm>changeset[max_lat='0.2000000']", 1
# add another node to it
with_controller(NodesController.new) do
- xml = ""
+ xml = ""
put node_create_path, :params => xml, :headers => auth_header
assert_response :success, "Couldn't create second node."
end
@@ -1944,10 +2138,10 @@ module Api
# get the bounding box back from the changeset
get changeset_show_path(:id => changeset_id)
assert_response :success, "Couldn't read back changeset for the second time."
- assert_select "osm>changeset[min_lon='1.0000000']", 1
- assert_select "osm>changeset[max_lon='2.0000000']", 1
- assert_select "osm>changeset[min_lat='1.0000000']", 1
- assert_select "osm>changeset[max_lat='2.0000000']", 1
+ assert_select "osm>changeset[min_lon='0.1000000']", 1
+ assert_select "osm>changeset[max_lon='0.2000000']", 1
+ assert_select "osm>changeset[min_lat='0.1000000']", 1
+ assert_select "osm>changeset[max_lat='0.2000000']", 1
# add (delete) a way to it, which contains a point at (3,3)
with_controller(WaysController.new) do
@@ -1959,10 +2153,10 @@ module Api
# get the bounding box back from the changeset
get changeset_show_path(:id => changeset_id)
assert_response :success, "Couldn't read back changeset for the third time."
- assert_select "osm>changeset[min_lon='1.0000000']", 1
- assert_select "osm>changeset[max_lon='3.0000000']", 1
- assert_select "osm>changeset[min_lat='1.0000000']", 1
- assert_select "osm>changeset[max_lat='3.0000000']", 1
+ assert_select "osm>changeset[min_lon='0.1000000']", 1
+ assert_select "osm>changeset[max_lon='0.3000000']", 1
+ assert_select "osm>changeset[min_lat='0.1000000']", 1
+ assert_select "osm>changeset[max_lat='0.3000000']", 1
end
##
@@ -2311,7 +2505,7 @@ module Api
assert_response :success, "can't create a new node"
node_id = @response.body.to_i
- get api_node_path(:id => node_id)
+ get api_node_path(node_id)
assert_response :success, "can't read back new node"
node_doc = XML::Parser.string(@response.body).parse
node_xml = node_doc.find("//osm/node").first
@@ -2322,7 +2516,7 @@ module Api
node_xml["lon"] = rand.to_s
node_xml["version"] = (i + 1).to_s
- put api_node_path(:id => node_id), :params => node_doc.to_s, :headers => auth_header
+ put api_node_path(node_id), :params => node_doc.to_s, :headers => auth_header
assert_response :success, "attempt #{i} should have succeeded"
end
@@ -2331,7 +2525,7 @@ module Api
node_xml["lon"] = rand.to_s
node_xml["version"] = offset.to_s
- put api_node_path(:id => node_id), :params => node_doc.to_s, :headers => auth_header
+ put api_node_path(node_id), :params => node_doc.to_s, :headers => auth_header
assert_response :conflict, "final attempt should have failed"
end
@@ -2462,6 +2656,33 @@ module Api
private
+ ##
+ # check that the output consists of one specific changeset
+ def assert_single_changeset(changeset)
+ assert_select "osm>changeset", 1
+ assert_select "osm>changeset>@id", changeset.id.to_s
+ assert_select "osm>changeset>@created_at", changeset.created_at.xmlschema
+ if changeset.open?
+ assert_select "osm>changeset>@open", "true"
+ assert_select "osm>changeset>@closed_at", 0
+ else
+ assert_select "osm>changeset>@open", "false"
+ assert_select "osm>changeset>@closed_at", changeset.closed_at.xmlschema
+ end
+ end
+
+ def assert_single_changeset_json(changeset, js)
+ assert_equal changeset.id, js["changeset"]["id"]
+ assert_equal changeset.created_at.xmlschema, js["changeset"]["created_at"]
+ if changeset.open?
+ assert js["changeset"]["open"]
+ assert_nil js["changeset"]["closed_at"]
+ else
+ assert_not js["changeset"]["open"]
+ assert_equal changeset.closed_at.xmlschema, js["changeset"]["closed_at"]
+ end
+ end
+
##
# check that certain changesets exist in the output
def assert_changesets(changesets)