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