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