]> git.openstreetmap.org Git - rails.git/blob - test/controllers/changesets_controller_test.rb
Drop custom CORS rack module
[rails.git] / test / controllers / changesets_controller_test.rb
1 require "test_helper"
2
3 class ChangesetsControllerTest < ActionDispatch::IntegrationTest
4   ##
5   # test all routes which lead to this controller
6   def test_routes
7     assert_routing(
8       { :path => "/changeset/1", :method => :get },
9       { :controller => "changesets", :action => "show", :id => "1" }
10     )
11     assert_routing(
12       { :path => "/user/name/history", :method => :get },
13       { :controller => "changesets", :action => "index", :display_name => "name" }
14     )
15     assert_routing(
16       { :path => "/user/name/history/feed", :method => :get },
17       { :controller => "changesets", :action => "feed", :display_name => "name", :format => :atom }
18     )
19     assert_routing(
20       { :path => "/history/friends", :method => :get },
21       { :controller => "changesets", :action => "index", :friends => true, :format => :html }
22     )
23     assert_routing(
24       { :path => "/history/nearby", :method => :get },
25       { :controller => "changesets", :action => "index", :nearby => true, :format => :html }
26     )
27     assert_routing(
28       { :path => "/history", :method => :get },
29       { :controller => "changesets", :action => "index" }
30     )
31     assert_routing(
32       { :path => "/history/feed", :method => :get },
33       { :controller => "changesets", :action => "feed", :format => :atom }
34     )
35   end
36
37   ##
38   # This should display the last 20 changesets closed
39   def test_index
40     changesets = create_list(:changeset, 30, :num_changes => 1)
41
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"
49     end
50
51     get history_path(:format => "html", :list => "1"), :xhr => true
52     assert_response :success
53     assert_template "index"
54
55     check_index_result(changesets.last(20))
56   end
57
58   ##
59   # This should display the last 20 changesets closed
60   def test_index_xhr
61     changesets = create_list(:changeset, 30, :num_changes => 1)
62
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"
70     end
71
72     get history_path(:format => "html", :list => "1"), :xhr => true
73     assert_response :success
74     assert_template "index"
75
76     check_index_result(changesets.last(20))
77   end
78
79   ##
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
85
86       get history_path(:format => "html", :list => "1", :after => id)
87       assert_redirected_to :controller => :errors, :action => :bad_request
88     end
89   end
90
91   ##
92   # This should display the last 20 changesets closed in a specific area
93   def test_index_bbox
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])
96
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)
102
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"
111     end
112
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"
116
117     check_index_result(changesets)
118   end
119
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])
123
124     get history_path(:format => "html", :list => "1")
125     assert_response :success
126     check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
127
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])
132
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])
136
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])
140
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])
144
145     get history_path(:format => "html", :list => "1", :bbox => "-181,-10,-179,10")
146     assert_response :success
147     check_index_result([])
148
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])
153
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])
157
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])
161
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])
165
166     get history_path(:format => "html", :list => "1", :bbox => "179,-10,181,10")
167     assert_response :success
168     check_index_result([])
169   end
170
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])
176
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])
181
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])
186
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])
191
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])
196
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])
201
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])
206   end
207
208   ##
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])
212
213     get history_path(:format => "html", :list => "1", :bbox => "-180,-80,-180,80")
214     assert_response :success
215     check_index_result([])
216
217     get history_path(:format => "html", :list => "1", :bbox => "180,-80,180,80")
218     assert_response :success
219     check_index_result([])
220
221     get history_path(:format => "html", :list => "1", :bbox => "-180,-80,180,80")
222     assert_response :success
223     check_index_result([changeset])
224   end
225
226   ##
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])
231
232     get history_path(:format => "html", :list => "1", :bbox => "-90,-80,90,80")
233     assert_response :success
234     check_index_result([changeset1])
235
236     get history_path(:format => "html", :list => "1", :bbox => "-270,-80,270,80")
237     assert_response :success
238     check_index_result([changeset2, changeset1])
239   end
240
241   ##
242   # Checks the display of the user changesets listing
243   def test_index_user
244     user = create(:user)
245     create(:changeset, :user => user, :num_changes => 1)
246     create(:changeset, :closed, :user => user, :num_changes => 1)
247     user.reload
248
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)
255     end
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"
258     end
259
260     get history_path(:format => "html", :display_name => user.display_name, :list => "1"), :xhr => true
261     assert_response :success
262     assert_template "index"
263
264     check_index_result(user.changesets)
265   end
266
267   ##
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)
273
274     get history_path(:format => "html", :display_name => private_user.display_name)
275     assert_response :success
276     assert_template "history"
277
278     get history_path(:format => "html", :display_name => private_user.display_name, :list => "1"), :xhr => true
279     assert_response :success
280     assert_template "index"
281
282     check_index_result([])
283   end
284
285   ##
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"
291
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"
295   end
296
297   ##
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)
304
305     get friend_changesets_path
306     assert_redirected_to login_path(:referer => friend_changesets_path)
307
308     session_for(private_user)
309
310     get friend_changesets_path
311     assert_response :success
312     assert_template "history"
313
314     get friend_changesets_path(:list => "1"), :xhr => true
315     assert_response :success
316     assert_template "index"
317
318     check_index_result([changeset])
319   end
320
321   ##
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)
329
330     get nearby_changesets_path
331     assert_redirected_to login_path(:referer => nearby_changesets_path)
332
333     session_for(private_user)
334
335     get nearby_changesets_path
336     assert_response :success
337     assert_template "history"
338
339     get nearby_changesets_path(:list => "1"), :xhr => true
340     assert_response :success
341     assert_template "index"
342
343     check_index_result([changeset])
344   end
345
346   ##
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)
351
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
357
358     get history_path(:format => "html", :list => "1", :before => changeset2.id), :xhr => true
359     assert_response :success
360     assert_template "index"
361
362     check_index_result [changeset1]
363   end
364
365   def test_index_after_id
366     changeset1 = create(:changeset, :num_changes => 1)
367     changeset2 = create(:changeset, :num_changes => 1)
368
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
374
375     get history_path(:format => "html", :list => "1", :after => changeset1.id), :xhr => true
376     assert_response :success
377     assert_template "index"
378
379     check_index_result [changeset2]
380   end
381
382   ##
383   # Check that a list with a next page link works
384   def test_index_more
385     create_list(:changeset, 50)
386
387     get history_path(:format => "html")
388     assert_response :success
389
390     get history_path(:format => "html"), :xhr => true
391     assert_response :success
392   end
393
394   def test_show
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")
399
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)}']"
406     end
407   end
408
409   def test_show_closed_changeset
410     changeset = create(:changeset, :closed)
411
412     sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
413   end
414
415   def test_show_private_changeset
416     user = create(:user)
417     changeset = create(:changeset, :user => create(:user, :data_public => false))
418     create(:changeset, :user => user)
419
420     sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
421   end
422
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)
428
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
436   end
437
438   def test_show_paginated_element_links
439     page_size = 20
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)
444
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
453     end
454   end
455
456   def test_show_adjacent_changesets
457     user = create(:user)
458     changesets = create_list(:changeset, 3, :user => user, :num_changes => 1)
459
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
463   end
464
465   def test_show_adjacent_nonempty_changesets
466     user = create(:user)
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)
472
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
476   end
477
478   ##
479   # This should display the last 20 non-empty changesets
480   def test_feed
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)
487
488     get history_feed_path(:format => :atom)
489     assert_response :success
490     assert_template "index"
491     assert_equal "application/atom+xml", response.media_type
492
493     check_feed_result([closed_changeset, changeset])
494   end
495
496   ##
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")
501
502     get history_feed_path(:format => :atom)
503     assert_response :success
504     assert_template "index"
505     assert_equal "application/atom+xml", response.media_type
506
507     check_feed_result([changeset])
508   end
509
510   ##
511   # This should display the last 20 changesets closed in a specific area
512   def test_feed_bbox
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])
519
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
524
525     check_feed_result([closed_changeset, changeset])
526   end
527
528   ##
529   # Checks the display of the user changesets feed
530   def test_feed_user
531     user = create(:user)
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)
536
537     get history_feed_path(:format => :atom, :display_name => user.display_name)
538
539     assert_response :success
540     assert_template "index"
541     assert_equal "application/atom+xml", response.media_type
542
543     check_feed_result(changesets.reverse)
544   end
545
546   ##
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
551   end
552
553   ##
554   # Check that we can't request later pages of the changesets feed
555   def test_feed_before
556     get history_feed_path(:format => "atom", :before => 100)
557     assert_redirected_to :action => :feed
558   end
559
560   def test_feed_after
561     get history_feed_path(:format => "atom", :after => 100)
562     assert_redirected_to :action => :feed
563   end
564
565   private
566
567   ##
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
572
573       changesets.each do |changeset|
574         assert_select "li#changeset_#{changeset.id}", :count => 1
575       end
576     end
577   end
578
579   ##
580   # check the result of a feed
581   def check_feed_result(changesets)
582     assert_operator changesets.size, :<=, 20
583
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)
589
590           changeset_comment = changeset.tags["comment"]
591           if changeset_comment
592             assert_select entry, "> title", :count => 1, :text => "Changeset #{changeset.id} - #{changeset_comment}"
593           else
594             assert_select entry, "> title", :count => 1, :text => "Changeset #{changeset.id}"
595           end
596
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
600             else
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} = /
604                 end
605               end
606             end
607           end
608         end
609       end
610     end
611   end
612 end