3 class ChangesetsControllerTest < ActionDispatch::IntegrationTest
5 # test all routes which lead to this controller
8 { :path => "/changeset/1", :method => :get },
9 { :controller => "changesets", :action => "show", :id => "1" }
12 { :path => "/user/name/history", :method => :get },
13 { :controller => "changesets", :action => "index", :display_name => "name" }
16 { :path => "/user/name/history/feed", :method => :get },
17 { :controller => "changesets", :action => "feed", :display_name => "name", :format => :atom }
20 { :path => "/history/friends", :method => :get },
21 { :controller => "changesets", :action => "index", :friends => true, :format => :html }
24 { :path => "/history/nearby", :method => :get },
25 { :controller => "changesets", :action => "index", :nearby => true, :format => :html }
28 { :path => "/history", :method => :get },
29 { :controller => "changesets", :action => "index" }
32 { :path => "/history/feed", :method => :get },
33 { :controller => "changesets", :action => "feed", :format => :atom }
38 # This should display the last 20 changesets closed
40 changesets = create_list(:changeset, 30, :num_changes => 1)
42 get history_path(:format => "html")
43 assert_response :success
44 assert_template "history"
45 assert_template :layout => "map"
46 assert_select "h2", :text => "Changesets", :count => 1
47 assert_select "link[rel='alternate'][type='application/atom+xml']", :count => 1 do
48 assert_select "[href=?]", "http://www.example.com/history/feed"
51 get history_path(:format => "html", :list => "1"), :xhr => true
52 assert_response :success
53 assert_template "index"
55 check_index_result(changesets.last(20))
59 # This should display the last 20 changesets closed
61 changesets = create_list(:changeset, 30, :num_changes => 1)
63 get history_path(:format => "html"), :xhr => true
64 assert_response :success
65 assert_template "history"
66 assert_template :layout => "xhr"
67 assert_select "h2", :text => "Changesets", :count => 1
68 assert_select "link[rel='alternate'][type='application/atom+xml']", :count => 1 do
69 assert_select "[href=?]", "http://www.example.com/history/feed"
72 get history_path(:format => "html", :list => "1"), :xhr => true
73 assert_response :success
74 assert_template "index"
76 check_index_result(changesets.last(20))
80 # This should report an error
81 def test_index_invalid_xhr
82 %w[-1 0 fred].each do |id|
83 get history_path(:format => "html", :list => "1", :before => id)
84 assert_redirected_to :controller => :errors, :action => :bad_request
86 get history_path(:format => "html", :list => "1", :after => id)
87 assert_redirected_to :controller => :errors, :action => :bad_request
92 # This should display the last 20 changesets closed in a specific area
94 changesets = create_list(:changeset, 10, :num_changes => 1, :bbox => [5, 5, 5, 5])
95 other_changesets = create_list(:changeset, 10, :num_changes => 1, :bbox => [0, 0, 1, 1])
97 # First check they all show up without a bbox parameter
98 get history_path(:format => "html", :list => "1"), :xhr => true
99 assert_response :success
100 assert_template "index"
101 check_index_result(changesets + other_changesets)
103 # Then check with bbox parameter
104 get history_path(:format => "html", :bbox => "4.5,4.5,5.5,5.5")
105 assert_response :success
106 assert_template "history"
107 assert_template :layout => "map"
108 assert_select "h2", :text => "Changesets", :count => 1
109 assert_select "link[rel='alternate'][type='application/atom+xml']", :count => 1 do
110 assert_select "[href=?]", "http://www.example.com/history/feed?bbox=4.5%2C4.5%2C5.5%2C5.5"
113 get history_path(:format => "html", :bbox => "4.5,4.5,5.5,5.5", :list => "1"), :xhr => true
114 assert_response :success
115 assert_template "index"
117 check_index_result(changesets)
120 def test_index_bbox_across_antimeridian_with_changesets_close_to_antimeridian
121 west_of_antimeridian_changeset = create(:changeset, :num_changes => 1, :bbox => [176, 0, 178, 1])
122 east_of_antimeridian_changeset = create(:changeset, :num_changes => 1, :bbox => [-178, 0, -176, 1])
124 get history_path(:format => "html", :list => "1")
125 assert_response :success
126 check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
128 # negative longitudes
129 get history_path(:format => "html", :list => "1", :bbox => "-190,-10,-170,10")
130 assert_response :success
131 check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
133 get history_path(:format => "html", :list => "1", :bbox => "-183,-10,-177,10")
134 assert_response :success
135 check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
137 get history_path(:format => "html", :list => "1", :bbox => "-181,-10,-177,10")
138 assert_response :success
139 check_index_result([east_of_antimeridian_changeset])
141 get history_path(:format => "html", :list => "1", :bbox => "-183,-10,-179,10")
142 assert_response :success
143 check_index_result([west_of_antimeridian_changeset])
145 get history_path(:format => "html", :list => "1", :bbox => "-181,-10,-179,10")
146 assert_response :success
147 check_index_result([])
149 # positive longitudes
150 get history_path(:format => "html", :list => "1", :bbox => "170,-10,190,10")
151 assert_response :success
152 check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
154 get history_path(:format => "html", :list => "1", :bbox => "177,-10,183,10")
155 assert_response :success
156 check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
158 get history_path(:format => "html", :list => "1", :bbox => "177,-10,181,10")
159 assert_response :success
160 check_index_result([west_of_antimeridian_changeset])
162 get history_path(:format => "html", :list => "1", :bbox => "179,-10,183,10")
163 assert_response :success
164 check_index_result([east_of_antimeridian_changeset])
166 get history_path(:format => "html", :list => "1", :bbox => "179,-10,181,10")
167 assert_response :success
168 check_index_result([])
171 def test_index_bbox_across_antimeridian_with_changesets_around_globe
172 changeset1 = create(:changeset, :num_changes => 1, :bbox => [-150, 40, -140, 50])
173 changeset2 = create(:changeset, :num_changes => 1, :bbox => [-30, -30, -20, -20])
174 changeset3 = create(:changeset, :num_changes => 1, :bbox => [10, 60, 20, 70])
175 changeset4 = create(:changeset, :num_changes => 1, :bbox => [150, -60, 160, -50])
177 # no bbox, get all changesets
178 get history_path(:format => "html", :list => "1")
179 assert_response :success
180 check_index_result([changeset4, changeset3, changeset2, changeset1])
182 # large enough bbox within normal range
183 get history_path(:format => "html", :list => "1", :bbox => "-170,-80,170,80")
184 assert_response :success
185 check_index_result([changeset4, changeset3, changeset2, changeset1])
187 # bbox for [1,2] within normal range
188 get history_path(:format => "html", :list => "1", :bbox => "-160,-80,0,80")
189 assert_response :success
190 check_index_result([changeset2, changeset1])
192 # bbox for [1,4] containing antimeridian with negative lon
193 get history_path(:format => "html", :list => "1", :bbox => "-220,-80,-100,80")
194 assert_response :success
195 check_index_result([changeset4, changeset1])
197 # bbox for [1,4] containing antimeridian with positive lon
198 get history_path(:format => "html", :list => "1", :bbox => "100,-80,220,80")
199 assert_response :success
200 check_index_result([changeset4, changeset1])
202 # large enough bbox outside normal range
203 get history_path(:format => "html", :list => "1", :bbox => "-220,-80,220,80")
204 assert_response :success
205 check_index_result([changeset4, changeset3, changeset2, changeset1])
209 # Test that -180..180 longitudes don't result in empty bbox
210 def test_index_bbox_entire_world
211 changeset = create(:changeset, :num_changes => 1, :bbox => [30, 60, 31, 61])
213 get history_path(:format => "html", :list => "1", :bbox => "-180,-80,-180,80")
214 assert_response :success
215 check_index_result([])
217 get history_path(:format => "html", :list => "1", :bbox => "180,-80,180,80")
218 assert_response :success
219 check_index_result([])
221 get history_path(:format => "html", :list => "1", :bbox => "-180,-80,180,80")
222 assert_response :success
223 check_index_result([changeset])
227 # Test that -270..270 longitudes don't result in 90..-90 bbox
228 def test_index_bbox_larger_than_entire_world
229 changeset1 = create(:changeset, :num_changes => 1, :bbox => [30, 60, 31, 61])
230 changeset2 = create(:changeset, :num_changes => 1, :bbox => [130, 60, 131, 61])
232 get history_path(:format => "html", :list => "1", :bbox => "-90,-80,90,80")
233 assert_response :success
234 check_index_result([changeset1])
236 get history_path(:format => "html", :list => "1", :bbox => "-270,-80,270,80")
237 assert_response :success
238 check_index_result([changeset2, changeset1])
242 # Checks the display of the user changesets listing
245 create(:changeset, :user => user, :num_changes => 1)
246 create(:changeset, :closed, :user => user, :num_changes => 1)
249 get history_path(:format => "html", :display_name => user.display_name)
250 assert_response :success
251 assert_template "history"
252 assert_template :layout => "map"
253 assert_select "h2", :text => "Changesets by #{user.display_name}", :count => 1 do
254 assert_select "a[href=?]", user_path(user)
256 assert_select "link[rel='alternate'][type='application/atom+xml']", :count => 1 do
257 assert_select "[href=?]", "http://www.example.com/user/#{ERB::Util.url_encode(user.display_name)}/history/feed"
260 get history_path(:format => "html", :display_name => user.display_name, :list => "1"), :xhr => true
261 assert_response :success
262 assert_template "index"
264 check_index_result(user.changesets)
268 # Checks the display of the user changesets listing for a private user
269 def test_index_private_user
270 private_user = create(:user, :data_public => false)
271 create(:changeset, :user => private_user)
272 create(:changeset, :closed, :user => private_user)
274 get history_path(:format => "html", :display_name => private_user.display_name)
275 assert_response :success
276 assert_template "history"
278 get history_path(:format => "html", :display_name => private_user.display_name, :list => "1"), :xhr => true
279 assert_response :success
280 assert_template "index"
282 check_index_result([])
286 # Check the not found of the index user changesets
287 def test_index_user_not_found
288 get history_path(:format => "html", :display_name => "Some random user")
289 assert_response :not_found
290 assert_template "users/no_such_user"
292 get history_path(:format => "html", :display_name => "Some random user", :list => "1"), :xhr => true
293 assert_response :not_found
294 assert_template "users/no_such_user"
298 # Checks the display of the friends changesets listing
299 def test_index_friends
300 private_user = create(:user, :data_public => true)
301 follow = create(:follow, :follower => private_user)
302 changeset = create(:changeset, :user => follow.following, :num_changes => 1)
303 _changeset2 = create(:changeset, :user => create(:user), :num_changes => 1)
305 get friend_changesets_path
306 assert_redirected_to login_path(:referer => friend_changesets_path)
308 session_for(private_user)
310 get friend_changesets_path
311 assert_response :success
312 assert_template "history"
314 get friend_changesets_path(:list => "1"), :xhr => true
315 assert_response :success
316 assert_template "index"
318 check_index_result([changeset])
322 # Checks the display of the nearby user changesets listing
323 def test_index_nearby
324 private_user = create(:user, :data_public => false, :home_lat => 51.1, :home_lon => 1.0)
325 user = create(:user, :home_lat => 51.0, :home_lon => 1.0)
326 far_away_user = create(:user, :home_lat => 51.0, :home_lon => 130)
327 changeset = create(:changeset, :user => user, :num_changes => 1)
328 _changeset2 = create(:changeset, :user => far_away_user, :num_changes => 1)
330 get nearby_changesets_path
331 assert_redirected_to login_path(:referer => nearby_changesets_path)
333 session_for(private_user)
335 get nearby_changesets_path
336 assert_response :success
337 assert_template "history"
339 get nearby_changesets_path(:list => "1"), :xhr => true
340 assert_response :success
341 assert_template "index"
343 check_index_result([changeset])
347 # Check that we can't request later pages of the changesets index
348 def test_index_before_id
349 changeset1 = create(:changeset, :num_changes => 1)
350 changeset2 = create(:changeset, :num_changes => 1)
352 get history_path(:format => "html", :before => changeset2.id), :xhr => true
353 assert_response :success
354 assert_template "history"
355 assert_template :layout => "xhr"
356 assert_select "h2", :text => "Changesets", :count => 1
358 get history_path(:format => "html", :list => "1", :before => changeset2.id), :xhr => true
359 assert_response :success
360 assert_template "index"
362 check_index_result [changeset1]
365 def test_index_after_id
366 changeset1 = create(:changeset, :num_changes => 1)
367 changeset2 = create(:changeset, :num_changes => 1)
369 get history_path(:format => "html", :after => changeset1.id), :xhr => true
370 assert_response :success
371 assert_template "history"
372 assert_template :layout => "xhr"
373 assert_select "h2", :text => "Changesets", :count => 1
375 get history_path(:format => "html", :list => "1", :after => changeset1.id), :xhr => true
376 assert_response :success
377 assert_template "index"
379 check_index_result [changeset2]
383 # Check that a list with a next page link works
385 create_list(:changeset, 50)
387 get history_path(:format => "html")
388 assert_response :success
390 get history_path(:format => "html"), :xhr => true
391 assert_response :success
395 changeset = create(:changeset)
396 create(:changeset_tag, :changeset => changeset, :k => "comment", :v => "tested-changeset-comment")
397 commenting_user = create(:user)
398 changeset_comment = create(:changeset_comment, :changeset => changeset, :author => commenting_user, :body => "Unwanted comment")
400 sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
401 assert_dom "h2", :text => "Changeset: #{changeset.id}"
402 assert_dom "p", :text => "tested-changeset-comment"
403 assert_dom "article#c#{changeset_comment.id}" do
404 assert_dom "> small", :text => /^Comment from #{commenting_user.display_name}/
405 assert_dom "a[href='#{user_path(commenting_user)}']"
409 def test_show_closed_changeset
410 changeset = create(:changeset, :closed)
412 sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
415 def test_show_private_changeset
417 changeset = create(:changeset, :user => create(:user, :data_public => false))
418 create(:changeset, :user => user)
420 sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
423 def test_show_element_links
424 changeset = create(:changeset)
425 node = create(:node, :with_history, :changeset => changeset)
426 way = create(:way, :with_history, :changeset => changeset)
427 relation = create(:relation, :with_history, :changeset => changeset)
429 sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
430 assert_dom "a[href='#{node_path node}']", :count => 1
431 assert_dom "a[href='#{old_node_path node, 1}']", :count => 1
432 assert_dom "a[href='#{way_path way}']", :count => 1
433 assert_dom "a[href='#{old_way_path way, 1}']", :count => 1
434 assert_dom "a[href='#{relation_path relation}']", :count => 1
435 assert_dom "a[href='#{old_relation_path relation, 1}']", :count => 1
438 def test_show_paginated_element_links
440 changeset = create(:changeset)
441 nodes = create_list(:node, page_size + 1, :with_history, :changeset => changeset)
442 ways = create_list(:way, page_size + 1, :with_history, :changeset => changeset)
443 relations = create_list(:relation, page_size + 1, :with_history, :changeset => changeset)
445 sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
446 page_size.times do |i|
447 assert_dom "a[href='#{node_path nodes[i]}']", :count => 1
448 assert_dom "a[href='#{old_node_path nodes[i], 1}']", :count => 1
449 assert_dom "a[href='#{way_path ways[i]}']", :count => 1
450 assert_dom "a[href='#{old_way_path ways[i], 1}']", :count => 1
451 assert_dom "a[href='#{relation_path relations[i]}']", :count => 1
452 assert_dom "a[href='#{old_relation_path relations[i], 1}']", :count => 1
456 def test_show_adjacent_changesets
458 changesets = create_list(:changeset, 3, :user => user, :num_changes => 1)
460 sidebar_browse_check :changeset_path, changesets[1].id, "changesets/show"
461 assert_dom "a[href='#{changeset_path changesets[0]}']", :count => 1
462 assert_dom "a[href='#{changeset_path changesets[2]}']", :count => 1
465 def test_show_adjacent_nonempty_changesets
467 changeset1 = create(:changeset, :user => user, :num_changes => 1)
468 create(:changeset, :user => user, :num_changes => 0)
469 changeset3 = create(:changeset, :user => user, :num_changes => 1)
470 create(:changeset, :user => user, :num_changes => 0)
471 changeset5 = create(:changeset, :user => user, :num_changes => 1)
473 sidebar_browse_check :changeset_path, changeset3.id, "changesets/show"
474 assert_dom "a[href='#{changeset_path changeset1}']", :count => 1
475 assert_dom "a[href='#{changeset_path changeset5}']", :count => 1
479 # This should display the last 20 non-empty changesets
481 changeset = create(:changeset, :num_changes => 1)
482 create(:changeset_tag, :changeset => changeset)
483 create(:changeset_tag, :changeset => changeset, :k => "website", :v => "http://example.com/")
484 closed_changeset = create(:changeset, :closed, :num_changes => 1)
485 create(:changeset_tag, :changeset => closed_changeset, :k => "website", :v => "https://osm.org/")
486 _empty_changeset = create(:changeset, :num_changes => 0)
488 get history_feed_path(:format => :atom)
489 assert_response :success
490 assert_template "index"
491 assert_equal "application/atom+xml", response.media_type
493 check_feed_result([closed_changeset, changeset])
497 # This should correctly escape XML special characters in the comment
498 def test_feed_with_comment_tag
499 changeset = create(:changeset, :num_changes => 1)
500 create(:changeset_tag, :changeset => changeset, :k => "comment", :v => "tested<changeset>comment")
502 get history_feed_path(:format => :atom)
503 assert_response :success
504 assert_template "index"
505 assert_equal "application/atom+xml", response.media_type
507 check_feed_result([changeset])
511 # This should display the last 20 changesets closed in a specific area
513 changeset = create(:changeset, :num_changes => 1, :bbox => [5, 5, 5, 5])
514 create(:changeset_tag, :changeset => changeset)
515 create(:changeset_tag, :changeset => changeset, :k => "website", :v => "http://example.com/")
516 closed_changeset = create(:changeset, :closed, :num_changes => 1, :bbox => [5, 5, 5, 5])
517 _elsewhere_changeset = create(:changeset, :num_changes => 1, :bbox => [-5, -5, -5, -5])
518 _empty_changeset = create(:changeset, :num_changes => 0, :bbox => [5, 5, 5, 5])
520 get history_feed_path(:format => :atom, :bbox => "4.5,4.5,5.5,5.5")
521 assert_response :success
522 assert_template "index"
523 assert_equal "application/atom+xml", response.media_type
525 check_feed_result([closed_changeset, changeset])
529 # Checks the display of the user changesets feed
532 changesets = create_list(:changeset, 3, :user => user, :num_changes => 4)
533 create(:changeset_tag, :changeset => changesets[1])
534 create(:changeset_tag, :changeset => changesets[1], :k => "website", :v => "http://example.com/")
535 _other_changeset = create(:changeset)
537 get history_feed_path(:format => :atom, :display_name => user.display_name)
539 assert_response :success
540 assert_template "index"
541 assert_equal "application/atom+xml", response.media_type
543 check_feed_result(changesets.reverse)
547 # Check the not found of the user changesets feed
548 def test_feed_user_not_found
549 get history_feed_path(:format => "atom", :display_name => "Some random user")
550 assert_response :not_found
554 # Check that we can't request later pages of the changesets feed
556 get history_feed_path(:format => "atom", :before => 100)
557 assert_redirected_to :action => :feed
561 get history_feed_path(:format => "atom", :after => 100)
562 assert_redirected_to :action => :feed
568 # check the result of a index
569 def check_index_result(changesets)
570 assert_select "ol.changesets", :count => [changesets.size, 1].min do
571 assert_select "li", :count => changesets.size
573 changesets.each do |changeset|
574 assert_select "li#changeset_#{changeset.id}", :count => 1
580 # check the result of a feed
581 def check_feed_result(changesets)
582 assert_operator changesets.size, :<=, 20
584 assert_select "feed", :count => [changesets.size, 1].min do
585 assert_select "> title", :count => 1, :text => /^Changesets/
586 assert_select "> entry", :count => changesets.size do |entries|
587 entries.zip(changesets) do |entry, changeset|
588 assert_select entry, "> id", :text => changeset_url(:id => changeset.id)
590 changeset_comment = changeset.tags["comment"]
592 assert_select entry, "> title", :count => 1, :text => "Changeset #{changeset.id} - #{changeset_comment}"
594 assert_select entry, "> title", :count => 1, :text => "Changeset #{changeset.id}"
597 assert_select entry, "> content > xhtml|div > xhtml|table" do
598 if changeset.tags.empty?
599 assert_select "> xhtml|tr > xhtml|td > xhtml|table", :count => 0
601 assert_select "> xhtml|tr > xhtml|td > xhtml|table", :count => 1 do
602 changeset.tags.each_key do |key|
603 assert_select "> xhtml|tr > xhtml|td", :text => /^#{key} = /