require "changeset_controller"
class ChangesetControllerTest < ActionController::TestCase
- api_fixtures
-
##
# test all routes which lead to this controller
def test_routes
def test_upload_create_valid
user = create(:user)
changeset = create(:changeset, :user => user)
+ node = create(:node)
+ way = create(:way_with_nodes, :nodes_count => 2)
+ relation = create(:relation)
basic_authorization user.email, "test"
<tag k='baz' v='bat'/>
</node>
<way id='-1' changeset='#{changeset.id}'>
- <nd ref='3'/>
+ <nd ref='#{node.id}'/>
</way>
</create>
<create>
<relation id='-1' changeset='#{changeset.id}'>
- <member type='way' role='some' ref='3'/>
- <member type='node' role='some' ref='5'/>
- <member type='relation' role='some' ref='3'/>
+ <member type='way' role='some' ref='#{way.id}'/>
+ <member type='node' role='some' ref='#{node.id}'/>
+ <member type='relation' role='some' ref='#{relation.id}'/>
</relation>
</create>
</osmChange>
##
# upload multiple versions of the same element in the same diff.
def test_upload_multiple_valid
+ node = create(:node)
changeset = create(:changeset)
basic_authorization changeset.user.email, "test"
diff = <<EOF
<osmChange>
<modify>
- <node id='1' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
- <node id='1' lon='1' lat='0' changeset='#{changeset.id}' version='2'/>
- <node id='1' lon='1' lat='1' changeset='#{changeset.id}' version='3'/>
- <node id='1' lon='1' lat='2' changeset='#{changeset.id}' version='4'/>
- <node id='1' lon='2' lat='2' changeset='#{changeset.id}' version='5'/>
- <node id='1' lon='3' lat='2' changeset='#{changeset.id}' version='6'/>
- <node id='1' lon='3' lat='3' changeset='#{changeset.id}' version='7'/>
- <node id='1' lon='9' lat='9' changeset='#{changeset.id}' version='8'/>
+ <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
+ <node id='#{node.id}' lon='1' lat='0' changeset='#{changeset.id}' version='2'/>
+ <node id='#{node.id}' lon='1' lat='1' changeset='#{changeset.id}' version='3'/>
+ <node id='#{node.id}' lon='1' lat='2' changeset='#{changeset.id}' version='4'/>
+ <node id='#{node.id}' lon='2' lat='2' changeset='#{changeset.id}' version='5'/>
+ <node id='#{node.id}' lon='3' lat='2' changeset='#{changeset.id}' version='6'/>
+ <node id='#{node.id}' lon='3' lat='3' changeset='#{changeset.id}' version='7'/>
+ <node id='#{node.id}' lon='9' lat='9' changeset='#{changeset.id}' version='8'/>
</modify>
</osmChange>
EOF
# upload multiple versions of the same element in the same diff, but
# keep the version numbers the same.
def test_upload_multiple_duplicate
+ node = create(:node)
changeset = create(:changeset)
basic_authorization changeset.user.email, "test"
diff = <<EOF
<osmChange>
<modify>
- <node id='1' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
- <node id='1' lon='1' lat='1' changeset='#{changeset.id}' version='1'/>
+ <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset.id}' version='1'/>
+ <node id='#{node.id}' lon='1' lat='1' changeset='#{changeset.id}' version='1'/>
</modify>
</osmChange>
EOF
# when we make some simple changes we get the same changes back from the
# diff download.
def test_diff_download_simple
+ node = create(:node)
+
## First try with a non-public user, which should get a forbidden
basic_authorization(create(:user, :data_public => false).email, "test")
diff = <<EOF
<osmChange>
<modify>
- <node id='1' lon='0' lat='0' changeset='#{changeset_id}' version='1'/>
- <node id='1' lon='1' lat='0' changeset='#{changeset_id}' version='2'/>
- <node id='1' lon='1' lat='1' changeset='#{changeset_id}' version='3'/>
- <node id='1' lon='1' lat='2' changeset='#{changeset_id}' version='4'/>
- <node id='1' lon='2' lat='2' changeset='#{changeset_id}' version='5'/>
- <node id='1' lon='3' lat='2' changeset='#{changeset_id}' version='6'/>
- <node id='1' lon='3' lat='3' changeset='#{changeset_id}' version='7'/>
- <node id='1' lon='9' lat='9' changeset='#{changeset_id}' version='8'/>
+ <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset_id}' version='1'/>
+ <node id='#{node.id}' lon='1' lat='0' changeset='#{changeset_id}' version='2'/>
+ <node id='#{node.id}' lon='1' lat='1' changeset='#{changeset_id}' version='3'/>
+ <node id='#{node.id}' lon='1' lat='2' changeset='#{changeset_id}' version='4'/>
+ <node id='#{node.id}' lon='2' lat='2' changeset='#{changeset_id}' version='5'/>
+ <node id='#{node.id}' lon='3' lat='2' changeset='#{changeset_id}' version='6'/>
+ <node id='#{node.id}' lon='3' lat='3' changeset='#{changeset_id}' version='7'/>
+ <node id='#{node.id}' lon='9' lat='9' changeset='#{changeset_id}' version='8'/>
</modify>
</osmChange>
EOF
# when we make some complex changes we get the same changes back from the
# diff download.
def test_diff_download_complex
+ node = create(:node)
+ node2 = create(:node)
+ way = create(:way)
basic_authorization(create(:user).email, "test")
# create a temporary changeset
diff = <<EOF
<osmChange>
<delete>
- <node id='1' lon='0' lat='0' changeset='#{changeset_id}' version='1'/>
+ <node id='#{node.id}' lon='0' lat='0' changeset='#{changeset_id}' version='1'/>
</delete>
<create>
<node id='-1' lon='9' lat='9' changeset='#{changeset_id}' version='0'/>
<node id='-3' lon='7' lat='9' changeset='#{changeset_id}' version='0'/>
</create>
<modify>
- <node id='3' lon='20' lat='15' changeset='#{changeset_id}' version='1'/>
- <way id='1' changeset='#{changeset_id}' version='1'>
- <nd ref='3'/>
+ <node id='#{node2.id}' lon='20' lat='15' changeset='#{changeset_id}' version='1'/>
+ <way id='#{way.id}' changeset='#{changeset_id}' version='1'>
+ <nd ref='#{node2.id}'/>
<nd ref='-1'/>
<nd ref='-2'/>
<nd ref='-3'/>
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, :min_lon => 5 * GeoRecord::SCALE, :max_lat => 15 * GeoRecord::SCALE, :max_lon => 15 * GeoRecord::SCALE)
+ changeset3 = create(:changeset, :min_lat => 4.5 * GeoRecord::SCALE, :min_lon => 4.5 * GeoRecord::SCALE, :max_lat => 5 * GeoRecord::SCALE, :max_lon => 5 * GeoRecord::SCALE)
get :query, :bbox => "-10,-10, 10, 10"
assert_response :success, "can't get changesets in bbox"
- assert_changesets [1, 4, 6]
+ assert_changesets [changeset2, changeset3]
get :query, :bbox => "4.5,4.5,4.6,4.6"
assert_response :success, "can't get changesets in bbox"
- assert_changesets [1]
+ assert_changesets [changeset3]
# not found when looking for changesets of non-existing users
get :query, :user => User.maximum(:id) + 1
basic_authorization private_user.email, "test"
get :query, :user => private_user.id
assert_response :success, "can't get changesets by user ID"
- assert_changesets [private_user_changeset.id, private_user_closed_changeset.id]
+ assert_changesets [private_user_changeset, private_user_closed_changeset]
get :query, :display_name => private_user.display_name
assert_response :success, "can't get changesets by user name"
- assert_changesets [private_user_changeset.id, private_user_closed_changeset.id]
+ assert_changesets [private_user_changeset, private_user_closed_changeset]
# check that the correct error is given when we provide both UID and name
get :query, :user => private_user.id, :display_name => private_user.display_name
get :query, :user => private_user.id, :open => true
assert_response :success, "can't get changesets by user and open"
- assert_changesets [private_user_changeset.id]
+ assert_changesets [private_user_changeset]
get :query, :time => "2007-12-31"
assert_response :success, "can't get changesets by time-since"
- assert_changesets [1, 2, 4, 5, 6, private_user_changeset.id, private_user_closed_changeset.id, changeset.id, closed_changeset.id]
+ assert_changesets [private_user_changeset, private_user_closed_changeset, changeset, closed_changeset, changeset2, changeset3]
get :query, :time => "2008-01-01T12:34Z"
assert_response :success, "can't get changesets by time-since with hour"
- assert_changesets [1, 2, 4, 5, 6, private_user_changeset.id, private_user_closed_changeset.id, changeset.id, closed_changeset.id]
+ assert_changesets [private_user_changeset, private_user_closed_changeset, changeset, closed_changeset, changeset2, changeset3]
get :query, :time => "2007-12-31T23:59Z,2008-01-02T00:01Z"
assert_response :success, "can't get changesets by time-range"
- assert_changesets [1, 5, 6, closed_changeset.id]
+ assert_changesets [closed_changeset]
get :query, :open => "true"
assert_response :success, "can't get changesets by open-ness"
- assert_changesets [1, 2, 4, private_user_changeset.id, changeset.id]
+ assert_changesets [private_user_changeset, changeset, changeset2, changeset3]
get :query, :closed => "true"
assert_response :success, "can't get changesets by closed-ness"
- assert_changesets [3, 5, 6, 7, 8, 9, private_user_closed_changeset.id, closed_changeset.id]
+ assert_changesets [private_user_closed_changeset, closed_changeset]
get :query, :closed => "true", :user => private_user.id
assert_response :success, "can't get changesets by closed-ness and user"
- assert_changesets [private_user_closed_changeset.id]
+ assert_changesets [private_user_closed_changeset]
get :query, :closed => "true", :user => user.id
assert_response :success, "can't get changesets by closed-ness and user"
- assert_changesets [closed_changeset.id]
+ assert_changesets [closed_changeset]
get :query, :changesets => "#{private_user_changeset.id},#{changeset.id},#{closed_changeset.id}"
assert_response :success, "can't get changesets by id (as comma-separated string)"
- assert_changesets [private_user_changeset.id, changeset.id, closed_changeset.id]
+ assert_changesets [private_user_changeset, changeset, closed_changeset]
get :query, :changesets => ""
assert_response :bad_request, "should be a bad request since changesets is empty"
##
# This should display the last 20 changesets closed
def test_feed
+ changeset = create(:changeset, :num_changes => 1)
+ _empty_changeset = create(:changeset, :num_changes => 0)
+
get :feed, :format => :atom
assert_response :success
assert_template "list"
assert_equal "application/atom+xml", response.content_type
- check_feed_result(Changeset.all)
+ check_feed_result([changeset])
end
##
# This should display the last 20 changesets closed in a specific area
def test_feed_bbox
+ changeset = create(:changeset, :num_changes => 1, :min_lat => 5 * GeoRecord::SCALE, :min_lon => 5 * GeoRecord::SCALE, :max_lat => 5 * GeoRecord::SCALE, :max_lon => 5 * GeoRecord::SCALE)
+ closed_changeset = create(:changeset, :closed, :num_changes => 1, :min_lat => 5 * GeoRecord::SCALE, :min_lon => 5 * GeoRecord::SCALE, :max_lat => 5 * GeoRecord::SCALE, :max_lon => 5 * GeoRecord::SCALE)
+ _elsewhere_changeset = create(:changeset, :num_changes => 1, :min_lat => -5 * GeoRecord::SCALE, :min_lon => -5 * GeoRecord::SCALE, :max_lat => -5 * GeoRecord::SCALE, :max_lon => -5 * GeoRecord::SCALE)
+ _empty_changeset = create(:changeset, :num_changes => 0, :min_lat => -5 * GeoRecord::SCALE, :min_lon => -5 * GeoRecord::SCALE, :max_lat => -5 * GeoRecord::SCALE, :max_lon => -5 * GeoRecord::SCALE)
+
get :feed, :format => :atom, :bbox => "4.5,4.5,5.5,5.5"
assert_response :success
assert_template "list"
assert_equal "application/atom+xml", response.content_type
- check_feed_result(Changeset.where("min_lon < 55000000 and max_lon > 45000000 and min_lat < 55000000 and max_lat > 45000000"))
+ check_feed_result([changeset, closed_changeset])
end
##
# Checks the display of the user changesets feed
def test_feed_user
user = create(:user)
- create_list(:changeset, 3, :user => user, :num_changes => 4)
+ changesets = create_list(:changeset, 3, :user => user, :num_changes => 4)
+ _other_changeset = create(:changeset)
get :feed, :format => :atom, :display_name => user.display_name
assert_response :success
assert_template "list"
assert_equal "application/atom+xml", response.content_type
- check_feed_result(user.changesets)
+ check_feed_result(changesets)
end
##
##
# boilerplate for checking that certain changesets exist in the
# output.
- def assert_changesets(ids)
- assert_select "osm>changeset", ids.size
- ids.each do |id|
- assert_select "osm>changeset[id='#{id}']", 1
+ def assert_changesets(changesets)
+ assert_select "osm>changeset", changesets.size
+ changesets.each do |changeset|
+ assert_select "osm>changeset[id='#{changeset.id}']", 1
end
end
##
# check the result of a feed
def check_feed_result(changesets)
- changesets = changesets.where("num_changes > 0")
- .order(:created_at => :desc)
- .limit(20)
assert changesets.size <= 20
assert_select "feed", :count => [changesets.size, 1].min do