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