]> git.openstreetmap.org Git - rails.git/blob - test/controllers/changesets_controller_test.rb
Add frozen_string_literal comments to ruby files
[rails.git] / test / controllers / changesets_controller_test.rb
1 # frozen_string_literal: true
2
3 require "test_helper"
4
5 class ChangesetsControllerTest < ActionDispatch::IntegrationTest
6   ##
7   # test all routes which lead to this controller
8   def test_routes
9     assert_routing(
10       { :path => "/changeset/1", :method => :get },
11       { :controller => "changesets", :action => "show", :id => "1" }
12     )
13     assert_routing(
14       { :path => "/user/name/history", :method => :get },
15       { :controller => "changesets", :action => "index", :display_name => "name" }
16     )
17     assert_routing(
18       { :path => "/user/name/history/feed", :method => :get },
19       { :controller => "changesets", :action => "feed", :display_name => "name", :format => :atom }
20     )
21     assert_routing(
22       { :path => "/history/friends", :method => :get },
23       { :controller => "changesets", :action => "index", :friends => true, :format => :html }
24     )
25     assert_routing(
26       { :path => "/history/nearby", :method => :get },
27       { :controller => "changesets", :action => "index", :nearby => true, :format => :html }
28     )
29     assert_routing(
30       { :path => "/history", :method => :get },
31       { :controller => "changesets", :action => "index" }
32     )
33     assert_routing(
34       { :path => "/history/feed", :method => :get },
35       { :controller => "changesets", :action => "feed", :format => :atom }
36     )
37   end
38
39   ##
40   # This should display the last 20 changesets closed
41   def test_index
42     changesets = create_list(:changeset, 30, :num_changes => 1)
43
44     get history_path(:format => "html")
45     assert_response :success
46     assert_template "history"
47     assert_template :layout => "map"
48     assert_select "h2", :text => "Changesets", :count => 1
49     assert_select "link[rel='alternate'][type='application/atom+xml']", :count => 1 do
50       assert_select "[href=?]", "http://www.example.com/history/feed"
51     end
52
53     get history_path(:format => "html", :list => "1"), :xhr => true
54     assert_response :success
55     assert_template "index"
56
57     check_index_result(changesets.last(20))
58   end
59
60   ##
61   # This should display the last 20 changesets closed
62   def test_index_xhr
63     changesets = create_list(:changeset, 30, :num_changes => 1)
64
65     get history_path(:format => "html"), :xhr => true
66     assert_response :success
67     assert_template "history"
68     assert_template :layout => "xhr"
69     assert_select "h2", :text => "Changesets", :count => 1
70     assert_select "link[rel='alternate'][type='application/atom+xml']", :count => 1 do
71       assert_select "[href=?]", "http://www.example.com/history/feed"
72     end
73
74     get history_path(:format => "html", :list => "1"), :xhr => true
75     assert_response :success
76     assert_template "index"
77
78     check_index_result(changesets.last(20))
79   end
80
81   ##
82   # This should report an error
83   def test_index_invalid_xhr
84     %w[-1 0 fred].each do |id|
85       get history_path(:format => "html", :list => "1", :before => id)
86       assert_redirected_to :controller => :errors, :action => :bad_request
87
88       get history_path(:format => "html", :list => "1", :after => id)
89       assert_redirected_to :controller => :errors, :action => :bad_request
90     end
91   end
92
93   ##
94   # This should display the last 20 changesets closed in a specific area
95   def test_index_bbox
96     changesets = create_list(:changeset, 10, :num_changes => 1, :bbox => [5, 5, 5, 5])
97     other_changesets = create_list(:changeset, 10, :num_changes => 1, :bbox => [0, 0, 1, 1])
98
99     # First check they all show up without a bbox parameter
100     get history_path(:format => "html", :list => "1"), :xhr => true
101     assert_response :success
102     assert_template "index"
103     check_index_result(changesets + other_changesets)
104
105     # Then check with bbox parameter
106     get history_path(:format => "html", :bbox => "4.5,4.5,5.5,5.5")
107     assert_response :success
108     assert_template "history"
109     assert_template :layout => "map"
110     assert_select "h2", :text => "Changesets", :count => 1
111     assert_select "link[rel='alternate'][type='application/atom+xml']", :count => 1 do
112       assert_select "[href=?]", "http://www.example.com/history/feed?bbox=4.5%2C4.5%2C5.5%2C5.5"
113     end
114
115     get history_path(:format => "html", :bbox => "4.5,4.5,5.5,5.5", :list => "1"), :xhr => true
116     assert_response :success
117     assert_template "index"
118
119     check_index_result(changesets)
120   end
121
122   def test_index_bbox_across_antimeridian_with_changesets_close_to_antimeridian
123     west_of_antimeridian_changeset = create(:changeset, :num_changes => 1, :bbox => [176, 0, 178, 1])
124     east_of_antimeridian_changeset = create(:changeset, :num_changes => 1, :bbox => [-178, 0, -176, 1])
125
126     get history_path(:format => "html", :list => "1")
127     assert_response :success
128     check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
129
130     # negative longitudes
131     get history_path(:format => "html", :list => "1", :bbox => "-190,-10,-170,10")
132     assert_response :success
133     check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
134
135     get history_path(:format => "html", :list => "1", :bbox => "-183,-10,-177,10")
136     assert_response :success
137     check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
138
139     get history_path(:format => "html", :list => "1", :bbox => "-181,-10,-177,10")
140     assert_response :success
141     check_index_result([east_of_antimeridian_changeset])
142
143     get history_path(:format => "html", :list => "1", :bbox => "-183,-10,-179,10")
144     assert_response :success
145     check_index_result([west_of_antimeridian_changeset])
146
147     get history_path(:format => "html", :list => "1", :bbox => "-181,-10,-179,10")
148     assert_response :success
149     check_index_result([])
150
151     # positive longitudes
152     get history_path(:format => "html", :list => "1", :bbox => "170,-10,190,10")
153     assert_response :success
154     check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
155
156     get history_path(:format => "html", :list => "1", :bbox => "177,-10,183,10")
157     assert_response :success
158     check_index_result([east_of_antimeridian_changeset, west_of_antimeridian_changeset])
159
160     get history_path(:format => "html", :list => "1", :bbox => "177,-10,181,10")
161     assert_response :success
162     check_index_result([west_of_antimeridian_changeset])
163
164     get history_path(:format => "html", :list => "1", :bbox => "179,-10,183,10")
165     assert_response :success
166     check_index_result([east_of_antimeridian_changeset])
167
168     get history_path(:format => "html", :list => "1", :bbox => "179,-10,181,10")
169     assert_response :success
170     check_index_result([])
171   end
172
173   def test_index_bbox_across_antimeridian_with_changesets_around_globe
174     changeset1 = create(:changeset, :num_changes => 1, :bbox => [-150, 40, -140, 50])
175     changeset2 = create(:changeset, :num_changes => 1, :bbox => [-30, -30, -20, -20])
176     changeset3 = create(:changeset, :num_changes => 1, :bbox => [10, 60, 20, 70])
177     changeset4 = create(:changeset, :num_changes => 1, :bbox => [150, -60, 160, -50])
178
179     # no bbox, get all changesets
180     get history_path(:format => "html", :list => "1")
181     assert_response :success
182     check_index_result([changeset4, changeset3, changeset2, changeset1])
183
184     # large enough bbox within normal range
185     get history_path(:format => "html", :list => "1", :bbox => "-170,-80,170,80")
186     assert_response :success
187     check_index_result([changeset4, changeset3, changeset2, changeset1])
188
189     # bbox for [1,2] within normal range
190     get history_path(:format => "html", :list => "1", :bbox => "-160,-80,0,80")
191     assert_response :success
192     check_index_result([changeset2, changeset1])
193
194     # bbox for [1,4] containing antimeridian with negative lon
195     get history_path(:format => "html", :list => "1", :bbox => "-220,-80,-100,80")
196     assert_response :success
197     check_index_result([changeset4, changeset1])
198
199     # bbox for [1,4] containing antimeridian with positive lon
200     get history_path(:format => "html", :list => "1", :bbox => "100,-80,220,80")
201     assert_response :success
202     check_index_result([changeset4, changeset1])
203
204     # large enough bbox outside normal range
205     get history_path(:format => "html", :list => "1", :bbox => "-220,-80,220,80")
206     assert_response :success
207     check_index_result([changeset4, changeset3, changeset2, changeset1])
208   end
209
210   ##
211   # Test that -180..180 longitudes don't result in empty bbox
212   def test_index_bbox_entire_world
213     changeset = create(:changeset, :num_changes => 1, :bbox => [30, 60, 31, 61])
214
215     get history_path(:format => "html", :list => "1", :bbox => "-180,-80,-180,80")
216     assert_response :success
217     check_index_result([])
218
219     get history_path(:format => "html", :list => "1", :bbox => "180,-80,180,80")
220     assert_response :success
221     check_index_result([])
222
223     get history_path(:format => "html", :list => "1", :bbox => "-180,-80,180,80")
224     assert_response :success
225     check_index_result([changeset])
226   end
227
228   ##
229   # Test that -270..270 longitudes don't result in 90..-90 bbox
230   def test_index_bbox_larger_than_entire_world
231     changeset1 = create(:changeset, :num_changes => 1, :bbox => [30, 60, 31, 61])
232     changeset2 = create(:changeset, :num_changes => 1, :bbox => [130, 60, 131, 61])
233
234     get history_path(:format => "html", :list => "1", :bbox => "-90,-80,90,80")
235     assert_response :success
236     check_index_result([changeset1])
237
238     get history_path(:format => "html", :list => "1", :bbox => "-270,-80,270,80")
239     assert_response :success
240     check_index_result([changeset2, changeset1])
241   end
242
243   ##
244   # Checks the display of the user changesets listing
245   def test_index_user
246     user = create(:user)
247     create(:changeset, :user => user, :num_changes => 1)
248     create(:changeset, :closed, :user => user, :num_changes => 1)
249     user.reload
250
251     get history_path(:format => "html", :display_name => user.display_name)
252     assert_response :success
253     assert_template "history"
254     assert_template :layout => "map"
255     assert_select "h2", :text => "Changesets by #{user.display_name}", :count => 1 do
256       assert_select "a[href=?]", user_path(user)
257     end
258     assert_select "link[rel='alternate'][type='application/atom+xml']", :count => 1 do
259       assert_select "[href=?]", "http://www.example.com/user/#{ERB::Util.url_encode(user.display_name)}/history/feed"
260     end
261
262     get history_path(:format => "html", :display_name => user.display_name, :list => "1"), :xhr => true
263     assert_response :success
264     assert_template "index"
265
266     check_index_result(user.changesets)
267   end
268
269   ##
270   # Checks the display of the user changesets listing for a private user
271   def test_index_private_user
272     private_user = create(:user, :data_public => false)
273     create(:changeset, :user => private_user)
274     create(:changeset, :closed, :user => private_user)
275
276     get history_path(:format => "html", :display_name => private_user.display_name)
277     assert_response :success
278     assert_template "history"
279
280     get history_path(:format => "html", :display_name => private_user.display_name, :list => "1"), :xhr => true
281     assert_response :success
282     assert_template "index"
283
284     check_index_result([])
285   end
286
287   ##
288   # Check the not found of the index user changesets
289   def test_index_user_not_found
290     get history_path(:format => "html", :display_name => "Some random user")
291     assert_response :not_found
292     assert_template "users/no_such_user"
293
294     get history_path(:format => "html", :display_name => "Some random user", :list => "1"), :xhr => true
295     assert_response :not_found
296     assert_template "users/no_such_user"
297   end
298
299   ##
300   # Checks the display of the friends changesets listing
301   def test_index_friends
302     private_user = create(:user, :data_public => true)
303     follow = create(:follow, :follower => private_user)
304     changeset = create(:changeset, :user => follow.following, :num_changes => 1)
305     _changeset2 = create(:changeset, :user => create(:user), :num_changes => 1)
306
307     get friend_changesets_path
308     assert_redirected_to login_path(:referer => friend_changesets_path)
309
310     session_for(private_user)
311
312     get friend_changesets_path
313     assert_response :success
314     assert_template "history"
315
316     get friend_changesets_path(:list => "1"), :xhr => true
317     assert_response :success
318     assert_template "index"
319
320     check_index_result([changeset])
321   end
322
323   ##
324   # Checks the display of the nearby user changesets listing
325   def test_index_nearby
326     private_user = create(:user, :data_public => false, :home_lat => 51.1, :home_lon => 1.0)
327     user = create(:user, :home_lat => 51.0, :home_lon => 1.0)
328     far_away_user = create(:user, :home_lat => 51.0, :home_lon => 130)
329     changeset = create(:changeset, :user => user, :num_changes => 1)
330     _changeset2 = create(:changeset, :user => far_away_user, :num_changes => 1)
331
332     get nearby_changesets_path
333     assert_redirected_to login_path(:referer => nearby_changesets_path)
334
335     session_for(private_user)
336
337     get nearby_changesets_path
338     assert_response :success
339     assert_template "history"
340
341     get nearby_changesets_path(:list => "1"), :xhr => true
342     assert_response :success
343     assert_template "index"
344
345     check_index_result([changeset])
346   end
347
348   ##
349   # Check that we can't request later pages of the changesets index
350   def test_index_before_id
351     changeset1 = create(:changeset, :num_changes => 1)
352     changeset2 = create(:changeset, :num_changes => 1)
353
354     get history_path(:format => "html", :before => changeset2.id), :xhr => true
355     assert_response :success
356     assert_template "history"
357     assert_template :layout => "xhr"
358     assert_select "h2", :text => "Changesets", :count => 1
359
360     get history_path(:format => "html", :list => "1", :before => changeset2.id), :xhr => true
361     assert_response :success
362     assert_template "index"
363
364     check_index_result [changeset1]
365   end
366
367   def test_index_after_id
368     changeset1 = create(:changeset, :num_changes => 1)
369     changeset2 = create(:changeset, :num_changes => 1)
370
371     get history_path(:format => "html", :after => changeset1.id), :xhr => true
372     assert_response :success
373     assert_template "history"
374     assert_template :layout => "xhr"
375     assert_select "h2", :text => "Changesets", :count => 1
376
377     get history_path(:format => "html", :list => "1", :after => changeset1.id), :xhr => true
378     assert_response :success
379     assert_template "index"
380
381     check_index_result [changeset2]
382   end
383
384   ##
385   # Check that a list with a next page link works
386   def test_index_more
387     create_list(:changeset, 50)
388
389     get history_path(:format => "html")
390     assert_response :success
391
392     get history_path(:format => "html"), :xhr => true
393     assert_response :success
394   end
395
396   def test_show
397     changeset = create(:changeset)
398     create(:changeset_tag, :changeset => changeset, :k => "comment", :v => "tested-changeset-comment")
399     commenting_user = create(:user)
400     changeset_comment = create(:changeset_comment, :changeset => changeset, :author => commenting_user, :body => "Unwanted comment")
401
402     sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
403     assert_dom "h2", :text => "Changeset: #{changeset.id}"
404     assert_dom "p", :text => "tested-changeset-comment"
405     assert_dom "article#c#{changeset_comment.id}" do
406       assert_dom "> small", :text => /^Comment from #{commenting_user.display_name}/
407       assert_dom "a[href='#{user_path(commenting_user)}']"
408     end
409   end
410
411   def test_show_closed_changeset
412     changeset = create(:changeset, :closed)
413
414     sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
415   end
416
417   def test_show_private_changeset
418     user = create(:user)
419     changeset = create(:changeset, :user => create(:user, :data_public => false))
420     create(:changeset, :user => user)
421
422     sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
423   end
424
425   def test_show_element_links
426     changeset = create(:changeset)
427     node = create(:node, :with_history, :changeset => changeset)
428     way = create(:way, :with_history, :changeset => changeset)
429     relation = create(:relation, :with_history, :changeset => changeset)
430
431     sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
432     assert_dom "a[href='#{node_path node}']", :count => 1
433     assert_dom "a[href='#{old_node_path node, 1}']", :count => 1
434     assert_dom "a[href='#{way_path way}']", :count => 1
435     assert_dom "a[href='#{old_way_path way, 1}']", :count => 1
436     assert_dom "a[href='#{relation_path relation}']", :count => 1
437     assert_dom "a[href='#{old_relation_path relation, 1}']", :count => 1
438   end
439
440   def test_show_paginated_element_links
441     page_size = 20
442     changeset = create(:changeset)
443     nodes = create_list(:node, page_size + 1, :with_history, :changeset => changeset)
444     ways = create_list(:way, page_size + 1, :with_history, :changeset => changeset)
445     relations = create_list(:relation, page_size + 1, :with_history, :changeset => changeset)
446
447     sidebar_browse_check :changeset_path, changeset.id, "changesets/show"
448     page_size.times do |i|
449       assert_dom "a[href='#{node_path nodes[i]}']", :count => 1
450       assert_dom "a[href='#{old_node_path nodes[i], 1}']", :count => 1
451       assert_dom "a[href='#{way_path ways[i]}']", :count => 1
452       assert_dom "a[href='#{old_way_path ways[i], 1}']", :count => 1
453       assert_dom "a[href='#{relation_path relations[i]}']", :count => 1
454       assert_dom "a[href='#{old_relation_path relations[i], 1}']", :count => 1
455     end
456   end
457
458   def test_show_adjacent_changesets
459     user = create(:user)
460     changesets = create_list(:changeset, 3, :user => user, :num_changes => 1)
461
462     sidebar_browse_check :changeset_path, changesets[1].id, "changesets/show"
463     assert_dom "a[href='#{changeset_path changesets[0]}']", :count => 1
464     assert_dom "a[href='#{changeset_path changesets[2]}']", :count => 1
465   end
466
467   def test_show_adjacent_nonempty_changesets
468     user = create(:user)
469     changeset1 = create(:changeset, :user => user, :num_changes => 1)
470     create(:changeset, :user => user, :num_changes => 0)
471     changeset3 = create(:changeset, :user => user, :num_changes => 1)
472     create(:changeset, :user => user, :num_changes => 0)
473     changeset5 = create(:changeset, :user => user, :num_changes => 1)
474
475     sidebar_browse_check :changeset_path, changeset3.id, "changesets/show"
476     assert_dom "a[href='#{changeset_path changeset1}']", :count => 1
477     assert_dom "a[href='#{changeset_path changeset5}']", :count => 1
478   end
479
480   ##
481   # This should display the last 20 non-empty changesets
482   def test_feed
483     changeset = create(:changeset, :num_changes => 1)
484     create(:changeset_tag, :changeset => changeset)
485     create(:changeset_tag, :changeset => changeset, :k => "website", :v => "http://example.com/")
486     closed_changeset = create(:changeset, :closed, :num_changes => 1)
487     create(:changeset_tag, :changeset => closed_changeset, :k => "website", :v => "https://osm.org/")
488     _empty_changeset = create(:changeset, :num_changes => 0)
489
490     get history_feed_path(:format => :atom)
491     assert_response :success
492     assert_template "index"
493     assert_equal "application/atom+xml", response.media_type
494
495     check_feed_result([closed_changeset, changeset])
496   end
497
498   ##
499   # This should correctly escape XML special characters in the comment
500   def test_feed_with_comment_tag
501     changeset = create(:changeset, :num_changes => 1)
502     create(:changeset_tag, :changeset => changeset, :k => "comment", :v => "tested<changeset>comment")
503
504     get history_feed_path(:format => :atom)
505     assert_response :success
506     assert_template "index"
507     assert_equal "application/atom+xml", response.media_type
508
509     check_feed_result([changeset])
510   end
511
512   ##
513   # This should display the last 20 changesets closed in a specific area
514   def test_feed_bbox
515     changeset = create(:changeset, :num_changes => 1, :bbox => [5, 5, 5, 5])
516     create(:changeset_tag, :changeset => changeset)
517     create(:changeset_tag, :changeset => changeset, :k => "website", :v => "http://example.com/")
518     closed_changeset = create(:changeset, :closed, :num_changes => 1, :bbox => [5, 5, 5, 5])
519     _elsewhere_changeset = create(:changeset, :num_changes => 1, :bbox => [-5, -5, -5, -5])
520     _empty_changeset = create(:changeset, :num_changes => 0, :bbox => [5, 5, 5, 5])
521
522     get history_feed_path(:format => :atom, :bbox => "4.5,4.5,5.5,5.5")
523     assert_response :success
524     assert_template "index"
525     assert_equal "application/atom+xml", response.media_type
526
527     check_feed_result([closed_changeset, changeset])
528   end
529
530   ##
531   # Checks the display of the user changesets feed
532   def test_feed_user
533     user = create(:user)
534     changesets = create_list(:changeset, 3, :user => user, :num_changes => 4)
535     create(:changeset_tag, :changeset => changesets[1])
536     create(:changeset_tag, :changeset => changesets[1], :k => "website", :v => "http://example.com/")
537     _other_changeset = create(:changeset)
538
539     get history_feed_path(:format => :atom, :display_name => user.display_name)
540
541     assert_response :success
542     assert_template "index"
543     assert_equal "application/atom+xml", response.media_type
544
545     check_feed_result(changesets.reverse)
546   end
547
548   ##
549   # Check the not found of the user changesets feed
550   def test_feed_user_not_found
551     get history_feed_path(:format => "atom", :display_name => "Some random user")
552     assert_response :not_found
553   end
554
555   ##
556   # Check that we can't request later pages of the changesets feed
557   def test_feed_before
558     get history_feed_path(:format => "atom", :before => 100)
559     assert_redirected_to :action => :feed
560   end
561
562   def test_feed_after
563     get history_feed_path(:format => "atom", :after => 100)
564     assert_redirected_to :action => :feed
565   end
566
567   private
568
569   ##
570   # check the result of a index
571   def check_index_result(changesets)
572     if changesets.empty?
573       assert_select "ol", :count => 0
574     else
575       assert_select "ol", :count => 1 do
576         assert_select "li", :count => changesets.size
577
578         changesets.each do |changeset|
579           assert_select "li#changeset_#{changeset.id}", :count => 1
580         end
581       end
582     end
583   end
584
585   ##
586   # check the result of a feed
587   def check_feed_result(changesets)
588     assert_operator changesets.size, :<=, 20
589
590     if changesets.empty?
591       assert_select "feed", :count => 0
592     else
593       assert_select "feed", :count => 1 do
594         assert_select "> title", :count => 1, :text => /^Changesets/
595         assert_select "> entry", :count => changesets.size do |entries|
596           entries.zip(changesets) do |entry, changeset|
597             assert_select entry, "> id", :text => changeset_url(:id => changeset.id)
598
599             changeset_comment = changeset.tags["comment"]
600             if changeset_comment
601               assert_select entry, "> title", :count => 1, :text => "Changeset #{changeset.id} - #{changeset_comment}"
602             else
603               assert_select entry, "> title", :count => 1, :text => "Changeset #{changeset.id}"
604             end
605
606             assert_select entry, "> content > xhtml|div > xhtml|table" do
607               if changeset.tags.empty?
608                 assert_select "> xhtml|tr > xhtml|td > xhtml|table", :count => 0
609               else
610                 assert_select "> xhtml|tr > xhtml|td > xhtml|table", :count => 1 do
611                   changeset.tags.each_key do |key|
612                     assert_select "> xhtml|tr > xhtml|td", :text => /^#{key} = /
613                   end
614                 end
615               end
616             end
617           end
618         end
619       end
620     end
621   end
622 end