Merge remote-tracking branch 'upstream/pull/5713'

This commit is contained in:
Tom Hughes 2025-02-20 17:10:00 +00:00
commit cf9831c0af
3 changed files with 291 additions and 277 deletions

View file

@ -17,7 +17,6 @@ OpenStreetMap::Application.routes.draw do
get "capabilities" => "capabilities#show"
get "permissions" => "permissions#show"
put "changeset/create" => "changesets#create"
post "changeset/:id/upload" => "changesets#upload", :as => :changeset_upload, :id => /\d+/
get "changeset/:id/download" => "changesets#download", :as => :changeset_download, :id => /\d+/
get "changeset/:id" => "changesets#show", :as => :changeset_show, :id => /\d+/
@ -25,13 +24,15 @@ OpenStreetMap::Application.routes.draw do
post "changeset/:id/unsubscribe" => "changesets#unsubscribe", :as => :api_changeset_unsubscribe, :id => /\d+/
put "changeset/:id" => "changesets#update", :id => /\d+/
put "changeset/:id/close" => "changesets#close", :as => :changeset_close, :id => /\d+/
get "changesets" => "changesets#index"
post "changeset/:id/comment" => "changeset_comments#create", :as => :changeset_comment, :id => /\d+/
post "changeset/comment/:id/hide" => "changeset_comments#destroy", :as => :changeset_comment_hide, :id => /\d+/
post "changeset/comment/:id/unhide" => "changeset_comments#restore", :as => :changeset_comment_unhide, :id => /\d+/
end
namespace :api, :path => "api/0.6" do
resources :changesets, :only => [:index, :create]
put "changeset/create" => "changesets#create", :as => nil
resources :changeset_comments, :only => :index
resources :nodes, :only => [:index, :create]

View file

@ -6,7 +6,15 @@ module Api
# test all routes which lead to this controller
def test_routes
assert_routing(
{ :path => "/api/0.6/changeset/create", :method => :put },
{ :path => "/api/0.6/changesets", :method => :get },
{ :controller => "api/changesets", :action => "index" }
)
assert_routing(
{ :path => "/api/0.6/changesets.json", :method => :get },
{ :controller => "api/changesets", :action => "index", :format => "json" }
)
assert_routing(
{ :path => "/api/0.6/changesets", :method => :post },
{ :controller => "api/changesets", :action => "create" }
)
assert_routing(
@ -49,16 +57,256 @@ module Api
{ :path => "/api/0.6/changeset/1/close", :method => :put },
{ :controller => "api/changesets", :action => "close", :id => "1" }
)
assert_routing(
{ :path => "/api/0.6/changesets", :method => :get },
{ :controller => "api/changesets", :action => "index" }
)
assert_routing(
{ :path => "/api/0.6/changesets.json", :method => :get },
{ :controller => "api/changesets", :action => "index", :format => "json" }
assert_recognizes(
{ :controller => "api/changesets", :action => "create" },
{ :path => "/api/0.6/changeset/create", :method => :put }
)
end
##
# test the query functionality of changesets
def test_index
private_user = create(:user, :data_public => false)
private_user_changeset = create(:changeset, :user => private_user)
private_user_closed_changeset = create(:changeset, :closed, :user => private_user)
user = create(:user)
changeset = create(:changeset, :user => user)
closed_changeset = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 1, 1, 0, 0, 0), :closed_at => Time.utc(2008, 1, 2, 0, 0, 0))
changeset2 = create(:changeset, :min_lat => (5 * GeoRecord::SCALE).round, :min_lon => (5 * GeoRecord::SCALE).round, :max_lat => (15 * GeoRecord::SCALE).round, :max_lon => (15 * GeoRecord::SCALE).round)
changeset3 = create(:changeset, :min_lat => (4.5 * GeoRecord::SCALE).round, :min_lon => (4.5 * GeoRecord::SCALE).round, :max_lat => (5 * GeoRecord::SCALE).round, :max_lon => (5 * GeoRecord::SCALE).round)
get api_changesets_path(:bbox => "-10,-10, 10, 10")
assert_response :success, "can't get changesets in bbox"
assert_changesets_in_order [changeset3, changeset2]
get api_changesets_path(:bbox => "4.5,4.5,4.6,4.6")
assert_response :success, "can't get changesets in bbox"
assert_changesets_in_order [changeset3]
# not found when looking for changesets of non-existing users
get api_changesets_path(:user => User.maximum(:id) + 1)
assert_response :not_found
assert_equal "text/plain", @response.media_type
get api_changesets_path(:display_name => " ")
assert_response :not_found
assert_equal "text/plain", @response.media_type
# can't get changesets of user 1 without authenticating
get api_changesets_path(:user => private_user.id)
assert_response :not_found, "shouldn't be able to get changesets by non-public user (ID)"
get api_changesets_path(:display_name => private_user.display_name)
assert_response :not_found, "shouldn't be able to get changesets by non-public user (name)"
# but this should work
auth_header = bearer_authorization_header private_user
get api_changesets_path(:user => private_user.id), :headers => auth_header
assert_response :success, "can't get changesets by user ID"
assert_changesets_in_order [private_user_changeset, private_user_closed_changeset]
get api_changesets_path(:display_name => private_user.display_name), :headers => auth_header
assert_response :success, "can't get changesets by user name"
assert_changesets_in_order [private_user_changeset, private_user_closed_changeset]
# test json endpoint
get api_changesets_path(:display_name => private_user.display_name), :headers => auth_header, :params => { :format => "json" }
assert_response :success, "can't get changesets by user name"
js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal Settings.api_version, js["version"]
assert_equal Settings.generator, js["generator"]
assert_equal 2, js["changesets"].count
# check that the correct error is given when we provide both UID and name
get api_changesets_path(:user => private_user.id,
:display_name => private_user.display_name), :headers => auth_header
assert_response :bad_request, "should be a bad request to have both ID and name specified"
get api_changesets_path(:user => private_user.id, :open => true), :headers => auth_header
assert_response :success, "can't get changesets by user and open"
assert_changesets_in_order [private_user_changeset]
get api_changesets_path(:time => "2007-12-31"), :headers => auth_header
assert_response :success, "can't get changesets by time-since"
assert_changesets_in_order [changeset3, changeset2, changeset, private_user_changeset, private_user_closed_changeset, closed_changeset]
get api_changesets_path(:time => "2008-01-01T12:34Z"), :headers => auth_header
assert_response :success, "can't get changesets by time-since with hour"
assert_changesets_in_order [changeset3, changeset2, changeset, private_user_changeset, private_user_closed_changeset, closed_changeset]
get api_changesets_path(:time => "2007-12-31T23:59Z,2008-01-02T00:01Z"), :headers => auth_header
assert_response :success, "can't get changesets by time-range"
assert_changesets_in_order [closed_changeset]
get api_changesets_path(:open => "true"), :headers => auth_header
assert_response :success, "can't get changesets by open-ness"
assert_changesets_in_order [changeset3, changeset2, changeset, private_user_changeset]
get api_changesets_path(:closed => "true"), :headers => auth_header
assert_response :success, "can't get changesets by closed-ness"
assert_changesets_in_order [private_user_closed_changeset, closed_changeset]
get api_changesets_path(:closed => "true", :user => private_user.id), :headers => auth_header
assert_response :success, "can't get changesets by closed-ness and user"
assert_changesets_in_order [private_user_closed_changeset]
get api_changesets_path(:closed => "true", :user => user.id), :headers => auth_header
assert_response :success, "can't get changesets by closed-ness and user"
assert_changesets_in_order [closed_changeset]
get api_changesets_path(:changesets => "#{private_user_changeset.id},#{changeset.id},#{closed_changeset.id}"), :headers => auth_header
assert_response :success, "can't get changesets by id (as comma-separated string)"
assert_changesets_in_order [changeset, private_user_changeset, closed_changeset]
get api_changesets_path(:changesets => ""), :headers => auth_header
assert_response :bad_request, "should be a bad request since changesets is empty"
end
##
# test the query functionality of changesets with the limit parameter
def test_index_limit
user = create(:user)
changeset1 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 1, 1, 0, 0, 0), :closed_at => Time.utc(2008, 1, 2, 0, 0, 0))
changeset2 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 2, 1, 0, 0, 0), :closed_at => Time.utc(2008, 2, 2, 0, 0, 0))
changeset3 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 3, 1, 0, 0, 0), :closed_at => Time.utc(2008, 3, 2, 0, 0, 0))
changeset4 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 4, 1, 0, 0, 0), :closed_at => Time.utc(2008, 4, 2, 0, 0, 0))
changeset5 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 5, 1, 0, 0, 0), :closed_at => Time.utc(2008, 5, 2, 0, 0, 0))
get api_changesets_path
assert_response :success
assert_changesets_in_order [changeset5, changeset4, changeset3, changeset2, changeset1]
get api_changesets_path(:limit => "3")
assert_response :success
assert_changesets_in_order [changeset5, changeset4, changeset3]
get api_changesets_path(:limit => "0")
assert_response :bad_request
get api_changesets_path(:limit => Settings.max_changeset_query_limit)
assert_response :success
assert_changesets_in_order [changeset5, changeset4, changeset3, changeset2, changeset1]
get api_changesets_path(:limit => Settings.max_changeset_query_limit + 1)
assert_response :bad_request
end
##
# test the query functionality of sequential changesets with order and time parameters
def test_index_order
user = create(:user)
changeset1 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 1, 1, 0, 0, 0), :closed_at => Time.utc(2008, 1, 2, 0, 0, 0))
changeset2 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 2, 1, 0, 0, 0), :closed_at => Time.utc(2008, 2, 2, 0, 0, 0))
changeset3 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 3, 1, 0, 0, 0), :closed_at => Time.utc(2008, 3, 2, 0, 0, 0))
changeset4 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 4, 1, 0, 0, 0), :closed_at => Time.utc(2008, 4, 2, 0, 0, 0))
changeset5 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 5, 1, 0, 0, 0), :closed_at => Time.utc(2008, 5, 2, 0, 0, 0))
changeset6 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 6, 1, 0, 0, 0), :closed_at => Time.utc(2008, 6, 2, 0, 0, 0))
get api_changesets_path
assert_response :success
assert_changesets_in_order [changeset6, changeset5, changeset4, changeset3, changeset2, changeset1]
get api_changesets_path(:order => "oldest")
assert_response :success
assert_changesets_in_order [changeset1, changeset2, changeset3, changeset4, changeset5, changeset6]
[
# lower time bound at the opening time of a changeset
["2008-02-01T00:00:00Z", "2008-05-15T00:00:00Z", [changeset5, changeset4, changeset3, changeset2], [changeset5, changeset4, changeset3, changeset2]],
# lower time bound in the middle of a changeset
["2008-02-01T12:00:00Z", "2008-05-15T00:00:00Z", [changeset5, changeset4, changeset3, changeset2], [changeset5, changeset4, changeset3]],
# lower time bound at the closing time of a changeset
["2008-02-02T00:00:00Z", "2008-05-15T00:00:00Z", [changeset5, changeset4, changeset3, changeset2], [changeset5, changeset4, changeset3]],
# lower time bound after the closing time of a changeset
["2008-02-02T00:00:01Z", "2008-05-15T00:00:00Z", [changeset5, changeset4, changeset3], [changeset5, changeset4, changeset3]],
# upper time bound in the middle of a changeset
["2007-09-09T12:00:00Z", "2008-04-01T12:00:00Z", [changeset4, changeset3, changeset2, changeset1], [changeset4, changeset3, changeset2, changeset1]],
# empty range
["2009-02-02T00:00:01Z", "2018-05-15T00:00:00Z", [], []]
].each do |from, to, interval_changesets, point_changesets|
get api_changesets_path(:time => "#{from},#{to}")
assert_response :success
assert_changesets_in_order interval_changesets
get api_changesets_path(:from => from, :to => to)
assert_response :success
assert_changesets_in_order point_changesets
get api_changesets_path(:from => from, :to => to, :order => "oldest")
assert_response :success
assert_changesets_in_order point_changesets.reverse
end
end
##
# test the query functionality of overlapping changesets with order and time parameters
def test_index_order_overlapping
user = create(:user)
changeset1 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2015, 6, 4, 17, 0, 0), :closed_at => Time.utc(2015, 6, 4, 17, 0, 0))
changeset2 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2015, 6, 4, 16, 0, 0), :closed_at => Time.utc(2015, 6, 4, 18, 0, 0))
changeset3 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2015, 6, 4, 14, 0, 0), :closed_at => Time.utc(2015, 6, 4, 20, 0, 0))
changeset4 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2015, 6, 3, 23, 0, 0), :closed_at => Time.utc(2015, 6, 4, 23, 0, 0))
create(:changeset, :closed, :user => user, :created_at => Time.utc(2015, 6, 2, 23, 0, 0), :closed_at => Time.utc(2015, 6, 3, 23, 0, 0))
get api_changesets_path(:time => "2015-06-04T00:00:00Z")
assert_response :success
assert_changesets_in_order [changeset1, changeset2, changeset3, changeset4]
get api_changesets_path(:from => "2015-06-04T00:00:00Z")
assert_response :success
assert_changesets_in_order [changeset1, changeset2, changeset3]
get api_changesets_path(:from => "2015-06-04T00:00:00Z", :order => "oldest")
assert_response :success
assert_changesets_in_order [changeset3, changeset2, changeset1]
get api_changesets_path(:time => "2015-06-04T16:00:00Z,2015-06-04T17:30:00Z")
assert_response :success
assert_changesets_in_order [changeset1, changeset2, changeset3, changeset4]
get api_changesets_path(:from => "2015-06-04T16:00:00Z", :to => "2015-06-04T17:30:00Z")
assert_response :success
assert_changesets_in_order [changeset1, changeset2]
get api_changesets_path(:from => "2015-06-04T16:00:00Z", :to => "2015-06-04T17:30:00Z", :order => "oldest")
assert_response :success
assert_changesets_in_order [changeset2, changeset1]
end
##
# check that errors are returned if garbage is inserted
# into query strings
def test_index_invalid
["abracadabra!",
"1,2,3,F",
";drop table users;"].each do |bbox|
get api_changesets_path(:bbox => bbox)
assert_response :bad_request, "'#{bbox}' isn't a bbox"
end
["now()",
"00-00-00",
";drop table users;",
",",
"-,-"].each do |time|
get api_changesets_path(:time => time)
assert_response :bad_request, "'#{time}' isn't a valid time range"
end
["me",
"foobar",
"-1",
"0"].each do |uid|
get api_changesets_path(:user => uid)
assert_response :bad_request, "'#{uid}' isn't a valid user ID"
end
get api_changesets_path(:order => "oldest", :time => "2008-01-01T00:00Z,2018-01-01T00:00Z")
assert_response :bad_request, "cannot use order=oldest with time"
end
# -----------------------
# Test simple changeset creation
# -----------------------
@ -69,7 +317,7 @@ module Api
xml = "<osm><changeset>" \
"<tag k='created_by' v='osm test suite checking changesets'/>" \
"</changeset></osm>"
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
assert_require_public_data
auth_header = bearer_authorization_header
@ -77,7 +325,7 @@ module Api
xml = "<osm><changeset>" \
"<tag k='created_by' v='osm test suite checking changesets'/>" \
"</changeset></osm>"
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
assert_response :success, "Creation of changeset did not return success status"
newid = @response.body.to_i
@ -101,47 +349,55 @@ module Api
def test_create_invalid
auth_header = bearer_authorization_header create(:user, :data_public => false)
xml = "<osm><changeset></osm>"
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
assert_require_public_data
## Try the public user
auth_header = bearer_authorization_header
xml = "<osm><changeset></osm>"
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
assert_response :bad_request, "creating a invalid changeset should fail"
end
def test_create_invalid_no_content
## First check with no auth
put changeset_create_path
post api_changesets_path
assert_response :unauthorized, "shouldn't be able to create a changeset with no auth"
## Now try to with a non-public user
auth_header = bearer_authorization_header create(:user, :data_public => false)
put changeset_create_path, :headers => auth_header
post api_changesets_path, :headers => auth_header
assert_require_public_data
## Try an inactive user
auth_header = bearer_authorization_header create(:user, :pending)
put changeset_create_path, :headers => auth_header
post api_changesets_path, :headers => auth_header
assert_inactive_user
## Now try to use a normal user
auth_header = bearer_authorization_header
put changeset_create_path, :headers => auth_header
post api_changesets_path, :headers => auth_header
assert_response :bad_request, "creating a changeset with no content should fail"
end
def test_create_wrong_method
auth_header = bearer_authorization_header
get changeset_create_path, :headers => auth_header
put api_changesets_path, :headers => auth_header
assert_response :not_found
assert_template "rescues/routing_error"
end
post changeset_create_path, :headers => auth_header
assert_response :not_found
assert_template "rescues/routing_error"
def test_create_legacy_path
auth_header = bearer_authorization_header
xml = "<osm><changeset></changeset></osm>"
assert_difference "Changeset.count", 1 do
put "/api/0.6/changeset/create", :params => xml, :headers => auth_header
end
assert_response :success, "Creation of changeset did not return success status"
assert_equal Changeset.last.id, @response.body.to_i
end
##
@ -759,7 +1015,7 @@ module Api
"<tag k='created_by' v='osm test suite checking changesets'/>" \
"</changeset></osm>"
assert_difference "Changeset.count", 1 do
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
end
assert_response :success
end
@ -773,7 +1029,7 @@ module Api
create(:changeset, :user => user, :created_at => Time.now.utc - 28.days)
# create a changeset
put changeset_create_path, :params => "<osm><changeset/></osm>", :headers => auth_header
post api_changesets_path, :params => "<osm><changeset/></osm>", :headers => auth_header
assert_response :success, "Should be able to create a changeset: #{@response.body}"
changeset_id = @response.body.to_i
@ -1455,7 +1711,7 @@ module Api
xml = "<osm><changeset>" \
"<tag k='created_by' v='osm test suite checking changesets'/>" \
"</changeset></osm>"
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
assert_response :success
changeset_id = @response.body.to_i
@ -1492,7 +1748,7 @@ module Api
xml = "<osm><changeset>" \
"<tag k='created_by' v='osm test suite checking changesets'/>" \
"</changeset></osm>"
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
assert_response :success
changeset_id = @response.body.to_i
@ -1895,7 +2151,7 @@ module Api
xml = "<osm><changeset>" \
"<tag k='created_by' v='osm test suite checking changesets'/>" \
"</changeset></osm>"
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
assert_response :forbidden
## Now try with a normal user
@ -1905,7 +2161,7 @@ module Api
xml = "<osm><changeset>" \
"<tag k='created_by' v='osm test suite checking changesets'/>" \
"</changeset></osm>"
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
assert_response :success
changeset_id = @response.body.to_i
@ -1950,7 +2206,7 @@ module Api
xml = "<osm><changeset>" \
"<tag k='created_by' v='osm test suite checking changesets'/>" \
"</changeset></osm>"
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
assert_response :success
changeset_id = @response.body.to_i
@ -2011,7 +2267,7 @@ module Api
xml = "<osm><changeset>" \
"<tag k='created_by' v='osm test suite checking changesets'/>" \
"</changeset></osm>"
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
assert_response :success
changeset_id = @response.body.to_i
@ -2124,7 +2380,7 @@ module Api
# create a new changeset
xml = "<osm><changeset/></osm>"
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
assert_response :success, "Creating of changeset failed."
changeset_id = @response.body.to_i
@ -2174,249 +2430,6 @@ module Api
assert_select "osm>changeset[max_lat='0.3000000']", 1
end
##
# test the query functionality of changesets
def test_query
private_user = create(:user, :data_public => false)
private_user_changeset = create(:changeset, :user => private_user)
private_user_closed_changeset = create(:changeset, :closed, :user => private_user)
user = create(:user)
changeset = create(:changeset, :user => user)
closed_changeset = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 1, 1, 0, 0, 0), :closed_at => Time.utc(2008, 1, 2, 0, 0, 0))
changeset2 = create(:changeset, :min_lat => (5 * GeoRecord::SCALE).round, :min_lon => (5 * GeoRecord::SCALE).round, :max_lat => (15 * GeoRecord::SCALE).round, :max_lon => (15 * GeoRecord::SCALE).round)
changeset3 = create(:changeset, :min_lat => (4.5 * GeoRecord::SCALE).round, :min_lon => (4.5 * GeoRecord::SCALE).round, :max_lat => (5 * GeoRecord::SCALE).round, :max_lon => (5 * GeoRecord::SCALE).round)
get changesets_path(:bbox => "-10,-10, 10, 10")
assert_response :success, "can't get changesets in bbox"
assert_changesets_in_order [changeset3, changeset2]
get changesets_path(:bbox => "4.5,4.5,4.6,4.6")
assert_response :success, "can't get changesets in bbox"
assert_changesets_in_order [changeset3]
# not found when looking for changesets of non-existing users
get changesets_path(:user => User.maximum(:id) + 1)
assert_response :not_found
assert_equal "text/plain", @response.media_type
get changesets_path(:display_name => " ")
assert_response :not_found
assert_equal "text/plain", @response.media_type
# can't get changesets of user 1 without authenticating
get changesets_path(:user => private_user.id)
assert_response :not_found, "shouldn't be able to get changesets by non-public user (ID)"
get changesets_path(:display_name => private_user.display_name)
assert_response :not_found, "shouldn't be able to get changesets by non-public user (name)"
# but this should work
auth_header = bearer_authorization_header private_user
get changesets_path(:user => private_user.id), :headers => auth_header
assert_response :success, "can't get changesets by user ID"
assert_changesets_in_order [private_user_changeset, private_user_closed_changeset]
get changesets_path(:display_name => private_user.display_name), :headers => auth_header
assert_response :success, "can't get changesets by user name"
assert_changesets_in_order [private_user_changeset, private_user_closed_changeset]
# test json endpoint
get changesets_path(:display_name => private_user.display_name), :headers => auth_header, :params => { :format => "json" }
assert_response :success, "can't get changesets by user name"
js = ActiveSupport::JSON.decode(@response.body)
assert_not_nil js
assert_equal Settings.api_version, js["version"]
assert_equal Settings.generator, js["generator"]
assert_equal 2, js["changesets"].count
# check that the correct error is given when we provide both UID and name
get changesets_path(:user => private_user.id,
:display_name => private_user.display_name), :headers => auth_header
assert_response :bad_request, "should be a bad request to have both ID and name specified"
get changesets_path(:user => private_user.id, :open => true), :headers => auth_header
assert_response :success, "can't get changesets by user and open"
assert_changesets_in_order [private_user_changeset]
get changesets_path(:time => "2007-12-31"), :headers => auth_header
assert_response :success, "can't get changesets by time-since"
assert_changesets_in_order [changeset3, changeset2, changeset, private_user_changeset, private_user_closed_changeset, closed_changeset]
get changesets_path(:time => "2008-01-01T12:34Z"), :headers => auth_header
assert_response :success, "can't get changesets by time-since with hour"
assert_changesets_in_order [changeset3, changeset2, changeset, private_user_changeset, private_user_closed_changeset, closed_changeset]
get changesets_path(:time => "2007-12-31T23:59Z,2008-01-02T00:01Z"), :headers => auth_header
assert_response :success, "can't get changesets by time-range"
assert_changesets_in_order [closed_changeset]
get changesets_path(:open => "true"), :headers => auth_header
assert_response :success, "can't get changesets by open-ness"
assert_changesets_in_order [changeset3, changeset2, changeset, private_user_changeset]
get changesets_path(:closed => "true"), :headers => auth_header
assert_response :success, "can't get changesets by closed-ness"
assert_changesets_in_order [private_user_closed_changeset, closed_changeset]
get changesets_path(:closed => "true", :user => private_user.id), :headers => auth_header
assert_response :success, "can't get changesets by closed-ness and user"
assert_changesets_in_order [private_user_closed_changeset]
get changesets_path(:closed => "true", :user => user.id), :headers => auth_header
assert_response :success, "can't get changesets by closed-ness and user"
assert_changesets_in_order [closed_changeset]
get changesets_path(:changesets => "#{private_user_changeset.id},#{changeset.id},#{closed_changeset.id}"), :headers => auth_header
assert_response :success, "can't get changesets by id (as comma-separated string)"
assert_changesets_in_order [changeset, private_user_changeset, closed_changeset]
get changesets_path(:changesets => ""), :headers => auth_header
assert_response :bad_request, "should be a bad request since changesets is empty"
end
##
# test the query functionality of changesets with the limit parameter
def test_query_limit
user = create(:user)
changeset1 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 1, 1, 0, 0, 0), :closed_at => Time.utc(2008, 1, 2, 0, 0, 0))
changeset2 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 2, 1, 0, 0, 0), :closed_at => Time.utc(2008, 2, 2, 0, 0, 0))
changeset3 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 3, 1, 0, 0, 0), :closed_at => Time.utc(2008, 3, 2, 0, 0, 0))
changeset4 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 4, 1, 0, 0, 0), :closed_at => Time.utc(2008, 4, 2, 0, 0, 0))
changeset5 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 5, 1, 0, 0, 0), :closed_at => Time.utc(2008, 5, 2, 0, 0, 0))
get changesets_path
assert_response :success
assert_changesets_in_order [changeset5, changeset4, changeset3, changeset2, changeset1]
get changesets_path(:limit => "3")
assert_response :success
assert_changesets_in_order [changeset5, changeset4, changeset3]
get changesets_path(:limit => "0")
assert_response :bad_request
get changesets_path(:limit => Settings.max_changeset_query_limit)
assert_response :success
assert_changesets_in_order [changeset5, changeset4, changeset3, changeset2, changeset1]
get changesets_path(:limit => Settings.max_changeset_query_limit + 1)
assert_response :bad_request
end
##
# test the query functionality of sequential changesets with order and time parameters
def test_query_order
user = create(:user)
changeset1 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 1, 1, 0, 0, 0), :closed_at => Time.utc(2008, 1, 2, 0, 0, 0))
changeset2 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 2, 1, 0, 0, 0), :closed_at => Time.utc(2008, 2, 2, 0, 0, 0))
changeset3 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 3, 1, 0, 0, 0), :closed_at => Time.utc(2008, 3, 2, 0, 0, 0))
changeset4 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 4, 1, 0, 0, 0), :closed_at => Time.utc(2008, 4, 2, 0, 0, 0))
changeset5 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 5, 1, 0, 0, 0), :closed_at => Time.utc(2008, 5, 2, 0, 0, 0))
changeset6 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2008, 6, 1, 0, 0, 0), :closed_at => Time.utc(2008, 6, 2, 0, 0, 0))
get changesets_path
assert_response :success
assert_changesets_in_order [changeset6, changeset5, changeset4, changeset3, changeset2, changeset1]
get changesets_path(:order => "oldest")
assert_response :success
assert_changesets_in_order [changeset1, changeset2, changeset3, changeset4, changeset5, changeset6]
[
# lower time bound at the opening time of a changeset
["2008-02-01T00:00:00Z", "2008-05-15T00:00:00Z", [changeset5, changeset4, changeset3, changeset2], [changeset5, changeset4, changeset3, changeset2]],
# lower time bound in the middle of a changeset
["2008-02-01T12:00:00Z", "2008-05-15T00:00:00Z", [changeset5, changeset4, changeset3, changeset2], [changeset5, changeset4, changeset3]],
# lower time bound at the closing time of a changeset
["2008-02-02T00:00:00Z", "2008-05-15T00:00:00Z", [changeset5, changeset4, changeset3, changeset2], [changeset5, changeset4, changeset3]],
# lower time bound after the closing time of a changeset
["2008-02-02T00:00:01Z", "2008-05-15T00:00:00Z", [changeset5, changeset4, changeset3], [changeset5, changeset4, changeset3]],
# upper time bound in the middle of a changeset
["2007-09-09T12:00:00Z", "2008-04-01T12:00:00Z", [changeset4, changeset3, changeset2, changeset1], [changeset4, changeset3, changeset2, changeset1]],
# empty range
["2009-02-02T00:00:01Z", "2018-05-15T00:00:00Z", [], []]
].each do |from, to, interval_changesets, point_changesets|
get changesets_path(:time => "#{from},#{to}")
assert_response :success
assert_changesets_in_order interval_changesets
get changesets_path(:from => from, :to => to)
assert_response :success
assert_changesets_in_order point_changesets
get changesets_path(:from => from, :to => to, :order => "oldest")
assert_response :success
assert_changesets_in_order point_changesets.reverse
end
end
##
# test the query functionality of overlapping changesets with order and time parameters
def test_query_order_overlapping
user = create(:user)
changeset1 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2015, 6, 4, 17, 0, 0), :closed_at => Time.utc(2015, 6, 4, 17, 0, 0))
changeset2 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2015, 6, 4, 16, 0, 0), :closed_at => Time.utc(2015, 6, 4, 18, 0, 0))
changeset3 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2015, 6, 4, 14, 0, 0), :closed_at => Time.utc(2015, 6, 4, 20, 0, 0))
changeset4 = create(:changeset, :closed, :user => user, :created_at => Time.utc(2015, 6, 3, 23, 0, 0), :closed_at => Time.utc(2015, 6, 4, 23, 0, 0))
create(:changeset, :closed, :user => user, :created_at => Time.utc(2015, 6, 2, 23, 0, 0), :closed_at => Time.utc(2015, 6, 3, 23, 0, 0))
get changesets_path(:time => "2015-06-04T00:00:00Z")
assert_response :success
assert_changesets_in_order [changeset1, changeset2, changeset3, changeset4]
get changesets_path(:from => "2015-06-04T00:00:00Z")
assert_response :success
assert_changesets_in_order [changeset1, changeset2, changeset3]
get changesets_path(:from => "2015-06-04T00:00:00Z", :order => "oldest")
assert_response :success
assert_changesets_in_order [changeset3, changeset2, changeset1]
get changesets_path(:time => "2015-06-04T16:00:00Z,2015-06-04T17:30:00Z")
assert_response :success
assert_changesets_in_order [changeset1, changeset2, changeset3, changeset4]
get changesets_path(:from => "2015-06-04T16:00:00Z", :to => "2015-06-04T17:30:00Z")
assert_response :success
assert_changesets_in_order [changeset1, changeset2]
get changesets_path(:from => "2015-06-04T16:00:00Z", :to => "2015-06-04T17:30:00Z", :order => "oldest")
assert_response :success
assert_changesets_in_order [changeset2, changeset1]
end
##
# check that errors are returned if garbage is inserted
# into query strings
def test_query_invalid
["abracadabra!",
"1,2,3,F",
";drop table users;"].each do |bbox|
get changesets_path(:bbox => bbox)
assert_response :bad_request, "'#{bbox}' isn't a bbox"
end
["now()",
"00-00-00",
";drop table users;",
",",
"-,-"].each do |time|
get changesets_path(:time => time)
assert_response :bad_request, "'#{time}' isn't a valid time range"
end
["me",
"foobar",
"-1",
"0"].each do |uid|
get changesets_path(:user => uid)
assert_response :bad_request, "'#{uid}' isn't a valid user ID"
end
get changesets_path(:order => "oldest", :time => "2008-01-01T00:00Z,2018-01-01T00:00Z")
assert_response :bad_request, "cannot use order=oldest with time"
end
##
# check updating tags on a changeset
def test_changeset_update
@ -2501,7 +2514,7 @@ module Api
# open a new changeset
xml = "<osm><changeset/></osm>"
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
assert_response :success, "can't create a new changeset"
cs_id = @response.body.to_i

View file

@ -1043,7 +1043,7 @@ module Api
# that the bounding box will be newly-generated.
with_controller(Api::ChangesetsController.new) do
xml = "<osm><changeset/></osm>"
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
assert_response :forbidden, "shouldn't be able to create changeset for modify test, as should get forbidden"
end
@ -1054,7 +1054,7 @@ module Api
# that the bounding box will be newly-generated.
changeset_id = with_controller(Api::ChangesetsController.new) do
xml = "<osm><changeset/></osm>"
put changeset_create_path, :params => xml, :headers => auth_header
post api_changesets_path, :params => xml, :headers => auth_header
assert_response :success, "couldn't create changeset for modify test"
@response.body.to_i
end