]> git.openstreetmap.org Git - rails.git/blob - test/controllers/users_controller_test.rb
Merge remote-tracking branch 'upstream/pull/3147'
[rails.git] / test / controllers / users_controller_test.rb
1 require "test_helper"
2
3 class UsersControllerTest < ActionDispatch::IntegrationTest
4   ##
5   # test all routes which lead to this controller
6   def test_routes
7     assert_routing(
8       { :path => "/user/new", :method => :get },
9       { :controller => "users", :action => "new" }
10     )
11
12     assert_routing(
13       { :path => "/user/new", :method => :post },
14       { :controller => "users", :action => "create" }
15     )
16
17     assert_routing(
18       { :path => "/user/terms", :method => :get },
19       { :controller => "users", :action => "terms" }
20     )
21
22     assert_routing(
23       { :path => "/user/save", :method => :post },
24       { :controller => "users", :action => "save" }
25     )
26
27     assert_routing(
28       { :path => "/user/username/confirm", :method => :get },
29       { :controller => "users", :action => "confirm", :display_name => "username" }
30     )
31     assert_routing(
32       { :path => "/user/username/confirm", :method => :post },
33       { :controller => "users", :action => "confirm", :display_name => "username" }
34     )
35     assert_routing(
36       { :path => "/user/username/confirm/resend", :method => :get },
37       { :controller => "users", :action => "confirm_resend", :display_name => "username" }
38     )
39
40     assert_routing(
41       { :path => "/user/confirm", :method => :get },
42       { :controller => "users", :action => "confirm" }
43     )
44     assert_routing(
45       { :path => "/user/confirm", :method => :post },
46       { :controller => "users", :action => "confirm" }
47     )
48     assert_routing(
49       { :path => "/user/confirm-email", :method => :get },
50       { :controller => "users", :action => "confirm_email" }
51     )
52     assert_routing(
53       { :path => "/user/confirm-email", :method => :post },
54       { :controller => "users", :action => "confirm_email" }
55     )
56
57     assert_routing(
58       { :path => "/user/go_public", :method => :post },
59       { :controller => "users", :action => "go_public" }
60     )
61
62     assert_routing(
63       { :path => "/user/forgot-password", :method => :get },
64       { :controller => "users", :action => "lost_password" }
65     )
66     assert_routing(
67       { :path => "/user/forgot-password", :method => :post },
68       { :controller => "users", :action => "lost_password" }
69     )
70     assert_routing(
71       { :path => "/user/reset-password", :method => :get },
72       { :controller => "users", :action => "reset_password" }
73     )
74     assert_routing(
75       { :path => "/user/reset-password", :method => :post },
76       { :controller => "users", :action => "reset_password" }
77     )
78
79     assert_routing(
80       { :path => "/user/suspended", :method => :get },
81       { :controller => "users", :action => "suspended" }
82     )
83
84     assert_routing(
85       { :path => "/user/username", :method => :get },
86       { :controller => "users", :action => "show", :display_name => "username" }
87     )
88
89     assert_routing(
90       { :path => "/user/username/account", :method => :get },
91       { :controller => "users", :action => "account", :display_name => "username" }
92     )
93     assert_routing(
94       { :path => "/user/username/account", :method => :post },
95       { :controller => "users", :action => "account", :display_name => "username" }
96     )
97
98     assert_routing(
99       { :path => "/user/username/set_status", :method => :post },
100       { :controller => "users", :action => "set_status", :display_name => "username" }
101     )
102     assert_routing(
103       { :path => "/user/username", :method => :delete },
104       { :controller => "users", :action => "destroy", :display_name => "username" }
105     )
106
107     assert_routing(
108       { :path => "/users", :method => :get },
109       { :controller => "users", :action => "index" }
110     )
111     assert_routing(
112       { :path => "/users", :method => :post },
113       { :controller => "users", :action => "index" }
114     )
115     assert_routing(
116       { :path => "/users/status", :method => :get },
117       { :controller => "users", :action => "index", :status => "status" }
118     )
119     assert_routing(
120       { :path => "/users/status", :method => :post },
121       { :controller => "users", :action => "index", :status => "status" }
122     )
123   end
124
125   # The user creation page loads
126   def test_new_view
127     get user_new_path
128     assert_response :redirect
129     assert_redirected_to user_new_path(:cookie_test => "true")
130
131     get user_new_path, :params => { :cookie_test => "true" }
132     assert_response :success
133
134     assert_select "html", :count => 1 do
135       assert_select "head", :count => 1 do
136         assert_select "title", :text => /Sign Up/, :count => 1
137       end
138       assert_select "body", :count => 1 do
139         assert_select "div#content", :count => 1 do
140           assert_select "form[action='/user/new'][method='post']", :count => 1 do
141             assert_select "input[id='user_email']", :count => 1
142             assert_select "input[id='user_email_confirmation']", :count => 1
143             assert_select "input[id='user_display_name']", :count => 1
144             assert_select "input[id='user_pass_crypt'][type='password']", :count => 1
145             assert_select "input[id='user_pass_crypt_confirmation'][type='password']", :count => 1
146             assert_select "input[type='submit'][value='Sign Up']", :count => 1
147           end
148         end
149       end
150     end
151   end
152
153   def test_new_view_logged_in
154     session_for(create(:user))
155
156     get user_new_path
157     assert_response :redirect
158     assert_redirected_to root_path
159
160     get user_new_path, :params => { :referer => "/test" }
161     assert_response :redirect
162     assert_redirected_to "/test"
163   end
164
165   def test_new_success
166     user = build(:user, :pending)
167
168     assert_no_difference "User.count" do
169       assert_no_difference "ActionMailer::Base.deliveries.size" do
170         perform_enqueued_jobs do
171           post user_new_path, :params => { :user => user.attributes }
172         end
173       end
174     end
175
176     assert_difference "User.count", 1 do
177       assert_difference "ActionMailer::Base.deliveries.size", 1 do
178         perform_enqueued_jobs do
179           post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
180         end
181       end
182     end
183
184     # Check the e-mail
185     register_email = ActionMailer::Base.deliveries.first
186
187     assert_equal register_email.to[0], user.email
188     assert_match(/#{@url}/, register_email.body.to_s)
189
190     # Check the page
191     assert_redirected_to :action => "confirm", :display_name => user.display_name
192
193     ActionMailer::Base.deliveries.clear
194   end
195
196   def test_new_duplicate_email
197     user = build(:user, :pending)
198     create(:user, :email => user.email)
199
200     assert_no_difference "User.count" do
201       assert_no_difference "ActionMailer::Base.deliveries.size" do
202         perform_enqueued_jobs do
203           post user_new_path, :params => { :user => user.attributes }
204         end
205       end
206     end
207
208     assert_response :success
209     assert_template "new"
210     assert_select "form > div.form-group > input.is-invalid#user_email"
211   end
212
213   def test_save_duplicate_email
214     user = build(:user, :pending)
215
216     # Set up our user as being half-way through registration
217     assert_no_difference "User.count" do
218       assert_no_difference "ActionMailer::Base.deliveries.size" do
219         perform_enqueued_jobs do
220           post user_new_path, :params => { :user => user.attributes }
221         end
222       end
223     end
224
225     # Now create another user with that email
226     create(:user, :email => user.email)
227
228     # Check that the second half of registration fails
229     assert_no_difference "User.count" do
230       assert_no_difference "ActionMailer::Base.deliveries.size" do
231         perform_enqueued_jobs do
232           post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
233         end
234       end
235     end
236
237     assert_response :success
238     assert_template "new"
239     assert_select "form > div.form-group > input.is-invalid#user_email"
240   end
241
242   def test_save_duplicate_email_uppercase
243     user = build(:user, :pending)
244
245     # Set up our user as being half-way through registration
246     assert_no_difference "User.count" do
247       assert_no_difference "ActionMailer::Base.deliveries.size" do
248         perform_enqueued_jobs do
249           post user_new_path, :params => { :user => user.attributes }
250         end
251       end
252     end
253
254     # Now create another user with that email, but uppercased
255     create(:user, :email => user.email.upcase)
256
257     # Check that the second half of registration fails
258     assert_no_difference "User.count" do
259       assert_no_difference "ActionMailer::Base.deliveries.size" do
260         perform_enqueued_jobs do
261           post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
262         end
263       end
264     end
265
266     assert_response :success
267     assert_template "new"
268     assert_select "form > div.form-group > input.is-invalid#user_email"
269   end
270
271   def test_save_duplicate_name
272     user = build(:user, :pending)
273
274     # Set up our user as being half-way through registration
275     assert_no_difference "User.count" do
276       assert_no_difference "ActionMailer::Base.deliveries.size" do
277         perform_enqueued_jobs do
278           post user_new_path, :params => { :user => user.attributes }
279         end
280       end
281     end
282
283     # Now create another user with that display name
284     create(:user, :display_name => user.display_name)
285
286     # Check that the second half of registration fails
287     assert_no_difference "User.count" do
288       assert_no_difference "ActionMailer::Base.deliveries.size" do
289         perform_enqueued_jobs do
290           post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
291         end
292       end
293     end
294
295     assert_response :success
296     assert_template "new"
297     assert_select "form > div.form-group > input.is-invalid#user_display_name"
298   end
299
300   def test_save_duplicate_name_uppercase
301     user = build(:user, :pending)
302
303     # Set up our user as being half-way through registration
304     assert_no_difference "User.count" do
305       assert_no_difference "ActionMailer::Base.deliveries.size" do
306         perform_enqueued_jobs do
307           post user_new_path, :params => { :user => user.attributes }
308         end
309       end
310     end
311
312     # Now create another user with that display_name, but uppercased
313     create(:user, :display_name => user.display_name.upcase)
314
315     # Check that the second half of registration fails
316     assert_no_difference "User.count" do
317       assert_no_difference "ActionMailer::Base.deliveries.size" do
318         perform_enqueued_jobs do
319           post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
320         end
321       end
322     end
323
324     assert_response :success
325     assert_template "new"
326     assert_select "form > div.form-group > input.is-invalid#user_display_name"
327   end
328
329   def test_save_blocked_domain
330     user = build(:user, :pending, :email => "user@example.net")
331
332     # Set up our user as being half-way through registration
333     assert_no_difference "User.count" do
334       assert_no_difference "ActionMailer::Base.deliveries.size" do
335         perform_enqueued_jobs do
336           post user_new_path, :params => { :user => user.attributes }
337         end
338       end
339     end
340
341     # Now block that domain
342     create(:acl, :domain => "example.net", :k => "no_account_creation")
343
344     # Check that the second half of registration fails
345     assert_no_difference "User.count" do
346       assert_no_difference "ActionMailer::Base.deliveries.size" do
347         perform_enqueued_jobs do
348           post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
349         end
350       end
351     end
352
353     assert_response :success
354     assert_template "blocked"
355   end
356
357   def test_save_referer_params
358     user = build(:user, :pending)
359
360     # Set up our user as being half-way through registration
361     assert_no_difference "User.count" do
362       assert_no_difference "ActionMailer::Base.deliveries.size" do
363         perform_enqueued_jobs do
364           post user_new_path, :params => { :user => user.attributes, :referer => "/edit?editor=id#map=1/2/3" }
365         end
366       end
367     end
368
369     assert_difference "User.count", 1 do
370       assert_difference "ActionMailer::Base.deliveries.size", 1 do
371         perform_enqueued_jobs do
372           post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
373         end
374       end
375     end
376
377     assert_equal welcome_path(:editor => "id", :zoom => 1, :lat => 2, :lon => 3),
378                  User.find_by(:email => user.email).tokens.order("id DESC").first.referer
379
380     ActionMailer::Base.deliveries.clear
381   end
382
383   def test_confirm_get
384     user = build(:user, :pending)
385     post user_new_path, :params => { :user => user.attributes }
386     post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
387     confirm_string = User.find_by(:email => user.email).tokens.create.token
388
389     get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
390     assert_response :success
391     assert_template :confirm
392   end
393
394   def test_confirm_get_already_confirmed
395     user = build(:user, :pending)
396     stub_gravatar_request(user.email)
397     post user_new_path, :params => { :user => user.attributes }
398     post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
399     confirm_string = User.find_by(:email => user.email).tokens.create.token
400
401     # Get the confirmation page
402     get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
403     assert_response :success
404     assert_template :confirm
405
406     # Confirm the user
407     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
408     assert_redirected_to welcome_path
409
410     # Now try to get the confirmation page again
411     get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
412     assert_response :redirect
413     assert_redirected_to root_path
414   end
415
416   def test_confirm_success_no_token_no_referer
417     user = build(:user, :pending)
418     stub_gravatar_request(user.email)
419     post user_new_path, :params => { :user => user.attributes }
420     post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
421     confirm_string = User.find_by(:email => user.email).tokens.create.token
422
423     post logout_path
424
425     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
426     assert_redirected_to login_path
427     assert_match(/Confirmed your account/, flash[:notice])
428   end
429
430   def test_confirm_success_good_token_no_referer
431     user = build(:user, :pending)
432     stub_gravatar_request(user.email)
433     post user_new_path, :params => { :user => user.attributes }
434     post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
435     confirm_string = User.find_by(:email => user.email).tokens.create.token
436
437     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
438     assert_redirected_to welcome_path
439   end
440
441   def test_confirm_success_bad_token_no_referer
442     user = build(:user, :pending)
443     stub_gravatar_request(user.email)
444     post user_new_path, :params => { :user => user.attributes }
445     post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
446     confirm_string = User.find_by(:email => user.email).tokens.create.token
447
448     post logout_path
449     session_for(create(:user))
450
451     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
452     assert_redirected_to login_path
453     assert_match(/Confirmed your account/, flash[:notice])
454   end
455
456   def test_confirm_success_no_token_with_referer
457     user = build(:user, :pending)
458     stub_gravatar_request(user.email)
459     post user_new_path, :params => { :user => user.attributes }
460     post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
461     confirm_string = User.find_by(:email => user.email).tokens.create(:referer => new_diary_entry_path).token
462
463     post logout_path
464
465     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
466     assert_redirected_to login_path(:referer => new_diary_entry_path)
467     assert_match(/Confirmed your account/, flash[:notice])
468   end
469
470   def test_confirm_success_good_token_with_referer
471     user = build(:user, :pending)
472     stub_gravatar_request(user.email)
473     post user_new_path, :params => { :user => user.attributes }
474     post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
475     confirm_string = User.find_by(:email => user.email).tokens.create(:referer => new_diary_entry_path).token
476
477     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
478     assert_redirected_to new_diary_entry_path
479   end
480
481   def test_confirm_success_bad_token_with_referer
482     user = build(:user, :pending)
483     stub_gravatar_request(user.email)
484     post user_new_path, :params => { :user => user.attributes }
485     post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
486     confirm_string = User.find_by(:email => user.email).tokens.create(:referer => new_diary_entry_path).token
487
488     post logout_path
489     session_for(create(:user))
490
491     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
492     assert_redirected_to login_path(:referer => new_diary_entry_path)
493     assert_match(/Confirmed your account/, flash[:notice])
494   end
495
496   def test_confirm_expired_token
497     user = build(:user, :pending)
498     stub_gravatar_request(user.email)
499     post user_new_path, :params => { :user => user.attributes }
500     post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
501     confirm_string = User.find_by(:email => user.email).tokens.create(:expiry => 1.day.ago).token
502
503     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
504     assert_redirected_to :action => "confirm"
505     assert_match(/confirmation code has expired/, flash[:error])
506   end
507
508   def test_confirm_already_confirmed
509     user = build(:user, :pending)
510     stub_gravatar_request(user.email)
511     post user_new_path, :params => { :user => user.attributes }
512     post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
513     confirm_string = User.find_by(:email => user.email).tokens.create(:referer => new_diary_entry_path).token
514
515     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
516     assert_redirected_to new_diary_entry_path
517
518     post logout_path
519
520     confirm_string = User.find_by(:email => user.email).tokens.create(:referer => new_diary_entry_path).token
521     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
522     assert_redirected_to login_path
523     assert_match(/already been confirmed/, flash[:error])
524   end
525
526   def test_confirm_resend_success
527     user = build(:user, :pending)
528     post user_new_path, :params => { :user => user.attributes }
529     post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
530
531     assert_difference "ActionMailer::Base.deliveries.size", 1 do
532       perform_enqueued_jobs do
533         get user_confirm_resend_path(user)
534       end
535     end
536
537     assert_response :redirect
538     assert_redirected_to login_path
539     assert_match(/sent a new confirmation/, flash[:notice])
540
541     email = ActionMailer::Base.deliveries.last
542
543     assert_equal user.email, email.to.first
544
545     ActionMailer::Base.deliveries.clear
546   end
547
548   def test_confirm_resend_no_token
549     user = build(:user, :pending)
550     # only complete first half of registration
551     post user_new_path, :params => { :user => user.attributes }
552
553     assert_no_difference "ActionMailer::Base.deliveries.size" do
554       perform_enqueued_jobs do
555         get user_confirm_resend_path(user)
556       end
557     end
558
559     assert_response :redirect
560     assert_redirected_to login_path
561     assert_match "User #{user.display_name} not found.", flash[:error]
562   end
563
564   def test_confirm_resend_unknown_user
565     assert_no_difference "ActionMailer::Base.deliveries.size" do
566       perform_enqueued_jobs do
567         get user_confirm_resend_path(:display_name => "No Such User")
568       end
569     end
570
571     assert_response :redirect
572     assert_redirected_to login_path
573     assert_match "User No Such User not found.", flash[:error]
574   end
575
576   def test_confirm_email_get
577     user = create(:user)
578     confirm_string = user.tokens.create.token
579
580     get user_confirm_email_path, :params => { :confirm_string => confirm_string }
581     assert_response :success
582     assert_template :confirm_email
583   end
584
585   def test_confirm_email_success
586     user = create(:user, :new_email => "test-new@example.com")
587     stub_gravatar_request(user.new_email)
588     confirm_string = user.tokens.create.token
589
590     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
591     assert_response :redirect
592     assert_redirected_to :action => :account, :display_name => user.display_name
593     assert_match(/Confirmed your change of email address/, flash[:notice])
594   end
595
596   def test_confirm_email_already_confirmed
597     user = create(:user)
598     confirm_string = user.tokens.create.token
599
600     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
601     assert_response :redirect
602     assert_redirected_to :action => :account, :display_name => user.display_name
603     assert_match(/already been confirmed/, flash[:error])
604   end
605
606   def test_confirm_email_bad_token
607     post user_confirm_email_path, :params => { :confirm_string => "XXXXX" }
608     assert_response :success
609     assert_template :confirm_email
610     assert_match(/confirmation code has expired or does not exist/, flash[:error])
611   end
612
613   ##
614   # test if testing for a gravatar works
615   # this happens when the email is actually changed
616   # which is triggered by the confirmation mail
617   def test_gravatar_auto_enable
618     # switch to email that has a gravatar
619     user = create(:user, :new_email => "test-new@example.com")
620     stub_gravatar_request(user.new_email, 200)
621     confirm_string = user.tokens.create.token
622     # precondition gravatar should be turned off
623     assert_not user.image_use_gravatar
624     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
625     assert_response :redirect
626     assert_redirected_to :action => :account, :display_name => user.display_name
627     assert_match(/Confirmed your change of email address/, flash[:notice])
628     # gravatar use should now be enabled
629     assert User.find(user.id).image_use_gravatar
630   end
631
632   def test_gravatar_auto_disable
633     # switch to email without a gravatar
634     user = create(:user, :new_email => "test-new@example.com", :image_use_gravatar => true)
635     stub_gravatar_request(user.new_email, 404)
636     confirm_string = user.tokens.create.token
637     # precondition gravatar should be turned on
638     assert user.image_use_gravatar
639     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
640     assert_response :redirect
641     assert_redirected_to :action => :account, :display_name => user.display_name
642     assert_match(/Confirmed your change of email address/, flash[:notice])
643     # gravatar use should now be disabled
644     assert_not User.find(user.id).image_use_gravatar
645   end
646
647   def test_terms_new_user
648     user = build(:user, :pending)
649
650     # Set up our user as being half-way through registration
651     assert_no_difference "User.count" do
652       assert_no_difference "ActionMailer::Base.deliveries.size" do
653         perform_enqueued_jobs do
654           post user_new_path, :params => { :user => user.attributes }
655         end
656       end
657     end
658
659     get user_terms_path
660
661     assert_response :success
662     assert_template :terms
663   end
664
665   def test_terms_agreed
666     user = create(:user, :terms_seen => true, :terms_agreed => Date.yesterday)
667
668     session_for(user)
669
670     get user_terms_path
671     assert_response :redirect
672     assert_redirected_to :action => :account, :display_name => user.display_name
673   end
674
675   def test_terms_not_seen_without_referer
676     user = create(:user, :terms_seen => false, :terms_agreed => nil)
677
678     session_for(user)
679
680     get user_terms_path
681     assert_response :success
682     assert_template :terms
683
684     post user_save_path, :params => { :user => { :consider_pd => true }, :read_ct => 1, :read_tou => 1 }
685     assert_response :redirect
686     assert_redirected_to :action => :account, :display_name => user.display_name
687     assert_equal "Thanks for accepting the new contributor terms!", flash[:notice]
688
689     user.reload
690
691     assert user.consider_pd
692     assert_not_nil user.terms_agreed
693     assert user.terms_seen
694   end
695
696   def test_terms_not_seen_with_referer
697     user = create(:user, :terms_seen => false, :terms_agreed => nil)
698
699     session_for(user)
700
701     get user_terms_path, :params => { :referer => "/test" }
702     assert_response :success
703     assert_template :terms
704
705     post user_save_path, :params => { :user => { :consider_pd => true }, :referer => "/test", :read_ct => 1, :read_tou => 1 }
706     assert_response :redirect
707     assert_redirected_to "/test"
708     assert_equal "Thanks for accepting the new contributor terms!", flash[:notice]
709
710     user.reload
711
712     assert user.consider_pd
713     assert_not_nil user.terms_agreed
714     assert user.terms_seen
715   end
716
717   # Check that if you haven't seen the terms, and make a request that requires authentication,
718   # that your request is redirected to view the terms
719   def test_terms_not_seen_redirection
720     user = create(:user, :terms_seen => false, :terms_agreed => nil)
721     session_for(user)
722
723     get user_account_path(user)
724     assert_response :redirect
725     assert_redirected_to :action => :terms, :referer => "/user/#{ERB::Util.u(user.display_name)}/account"
726   end
727
728   def test_go_public
729     user = create(:user, :data_public => false)
730     session_for(user)
731
732     post user_go_public_path
733
734     assert_response :redirect
735     assert_redirected_to :action => :account, :display_name => user.display_name
736     assert User.find(user.id).data_public
737   end
738
739   def test_lost_password
740     # Test fetching the lost password page
741     get user_forgot_password_path
742     assert_response :success
743     assert_template :lost_password
744     assert_select "div#notice", false
745
746     # Test resetting using the address as recorded for a user that has an
747     # address which is duplicated in a different case by another user
748     user = create(:user)
749     uppercase_user = build(:user, :email => user.email.upcase).tap { |u| u.save(:validate => false) }
750
751     # Resetting with GET should fail
752     assert_no_difference "ActionMailer::Base.deliveries.size" do
753       perform_enqueued_jobs do
754         get user_forgot_password_path, :params => { :email => user.email }
755       end
756     end
757     assert_response :success
758     assert_template :lost_password
759
760     # Resetting with POST should work
761     assert_difference "ActionMailer::Base.deliveries.size", 1 do
762       perform_enqueued_jobs do
763         post user_forgot_password_path, :params => { :email => user.email }
764       end
765     end
766     assert_response :redirect
767     assert_redirected_to login_path
768     assert_match(/^Sorry you lost it/, flash[:notice])
769     email = ActionMailer::Base.deliveries.first
770     assert_equal 1, email.to.count
771     assert_equal user.email, email.to.first
772     ActionMailer::Base.deliveries.clear
773
774     # Test resetting using an address that matches a different user
775     # that has the same address in a different case
776     assert_difference "ActionMailer::Base.deliveries.size", 1 do
777       perform_enqueued_jobs do
778         post user_forgot_password_path, :params => { :email => user.email.upcase }
779       end
780     end
781     assert_response :redirect
782     assert_redirected_to login_path
783     assert_match(/^Sorry you lost it/, flash[:notice])
784     email = ActionMailer::Base.deliveries.first
785     assert_equal 1, email.to.count
786     assert_equal uppercase_user.email, email.to.first
787     ActionMailer::Base.deliveries.clear
788
789     # Test resetting using an address that is a case insensitive match
790     # for more than one user but not an exact match for either
791     assert_no_difference "ActionMailer::Base.deliveries.size" do
792       perform_enqueued_jobs do
793         post user_forgot_password_path, :params => { :email => user.email.titlecase }
794       end
795     end
796     assert_response :success
797     assert_template :lost_password
798     assert_select ".error", /^Could not find that email address/
799
800     # Test resetting using the address as recorded for a user that has an
801     # address which is case insensitively unique
802     third_user = create(:user)
803     assert_difference "ActionMailer::Base.deliveries.size", 1 do
804       perform_enqueued_jobs do
805         post user_forgot_password_path, :params => { :email => third_user.email }
806       end
807     end
808     assert_response :redirect
809     assert_redirected_to login_path
810     assert_match(/^Sorry you lost it/, flash[:notice])
811     email = ActionMailer::Base.deliveries.first
812     assert_equal 1, email.to.count
813     assert_equal third_user.email, email.to.first
814     ActionMailer::Base.deliveries.clear
815
816     # Test resetting using an address that matches a user that has the
817     # same (case insensitively unique) address in a different case
818     assert_difference "ActionMailer::Base.deliveries.size", 1 do
819       perform_enqueued_jobs do
820         post user_forgot_password_path, :params => { :email => third_user.email.upcase }
821       end
822     end
823     assert_response :redirect
824     assert_redirected_to login_path
825     assert_match(/^Sorry you lost it/, flash[:notice])
826     email = ActionMailer::Base.deliveries.first
827     assert_equal 1, email.to.count
828     assert_equal third_user.email, email.to.first
829     ActionMailer::Base.deliveries.clear
830   end
831
832   def test_reset_password
833     user = create(:user, :pending)
834     # Test a request with no token
835     get user_reset_password_path
836     assert_response :bad_request
837
838     # Test a request with a bogus token
839     get user_reset_password_path, :params => { :token => "made_up_token" }
840     assert_response :redirect
841     assert_redirected_to :action => :lost_password
842
843     # Create a valid token for a user
844     token = user.tokens.create
845
846     # Test a request with a valid token
847     get user_reset_password_path, :params => { :token => token.token }
848     assert_response :success
849     assert_template :reset_password
850
851     # Test that errors are reported for erroneous submissions
852     post user_reset_password_path, :params => { :token => token.token, :user => { :pass_crypt => "new_password", :pass_crypt_confirmation => "different_password" } }
853     assert_response :success
854     assert_template :reset_password
855     assert_select "div.invalid-feedback"
856
857     # Test setting a new password
858     post user_reset_password_path, :params => { :token => token.token, :user => { :pass_crypt => "new_password", :pass_crypt_confirmation => "new_password" } }
859     assert_response :redirect
860     assert_redirected_to root_path
861     assert_equal user.id, session[:user]
862     user.reload
863     assert_equal "active", user.status
864     assert user.email_valid
865     assert_equal user, User.authenticate(:username => user.email, :password => "new_password")
866   end
867
868   def test_account
869     # Get a user to work with - note that this user deliberately
870     # conflicts with uppercase_user in the email and display name
871     # fields to test that we can change other fields without any
872     # validation errors being reported
873     user = create(:user, :languages => [])
874     _uppercase_user = build(:user, :email => user.email.upcase, :display_name => user.display_name.upcase).tap { |u| u.save(:validate => false) }
875
876     # Make sure that you are redirected to the login page when
877     # you are not logged in
878     get user_account_path(user)
879     assert_response :redirect
880     assert_redirected_to login_path(:referer => "/user/#{ERB::Util.u(user.display_name)}/account")
881
882     # Make sure that you are blocked when not logged in as the right user
883     session_for(create(:user))
884     get user_account_path(user)
885     assert_response :forbidden
886
887     # Make sure we get the page when we are logged in as the right user
888     session_for(user)
889     get user_account_path(user)
890     assert_response :success
891     assert_template :account
892     assert_select "form#accountForm" do |form|
893       assert_equal "post", form.attr("method").to_s
894       assert_select "input[name='_method']", false
895       assert_equal "/user/#{ERB::Util.u(user.display_name)}/account", form.attr("action").to_s
896     end
897
898     # Updating the description using GET should fail
899     user.description = "new description"
900     user.preferred_editor = "default"
901     get user_account_path(user), :params => { :user => user.attributes }
902     assert_response :success
903     assert_template :account
904     assert_not_equal user.description, User.find(user.id).description
905
906     # Updating the description should work
907     user.description = "new description"
908     user.preferred_editor = "default"
909     post user_account_path(user), :params => { :user => user.attributes }
910     assert_response :redirect
911     assert_redirected_to user_account_url(user)
912     get user_account_path(user)
913     assert_response :success
914     assert_template :account
915     assert_select ".notice", /^User information updated successfully/
916     assert_select "form#accountForm > div.form-group > div#user_description_container > div#user_description_content > textarea#user_description", user.description
917
918     # Changing to a invalid editor should fail
919     user.preferred_editor = "unknown"
920     post user_account_path(user), :params => { :user => user.attributes }
921     assert_response :success
922     assert_template :account
923     assert_select ".notice", false
924     assert_select "form#accountForm > div.form-group > select#user_preferred_editor > option[selected]", false
925
926     # Changing to a valid editor should work
927     user.preferred_editor = "id"
928     post user_account_path(user), :params => { :user => user.attributes }
929     assert_response :redirect
930     assert_redirected_to user_account_url(user)
931     get user_account_path(user)
932     assert_response :success
933     assert_template :account
934     assert_select ".notice", /^User information updated successfully/
935     assert_select "form#accountForm > div.form-group > select#user_preferred_editor > option[selected][value=?]", "id"
936
937     # Changing to the default editor should work
938     user.preferred_editor = "default"
939     post user_account_path(user), :params => { :user => user.attributes }
940     assert_response :redirect
941     assert_redirected_to user_account_url(user)
942     get user_account_path(user)
943     assert_response :success
944     assert_template :account
945     assert_select ".notice", /^User information updated successfully/
946     assert_select "form#accountForm > div.form-group > select#user_preferred_editor > option[selected]", false
947
948     # Changing to an uploaded image should work
949     image = Rack::Test::UploadedFile.new("test/gpx/fixtures/a.gif", "image/gif")
950     post user_account_path(user), :params => { :avatar_action => "new", :user => user.attributes.merge(:avatar => image) }
951     assert_response :redirect
952     assert_redirected_to user_account_url(user)
953     get user_account_path(user)
954     assert_response :success
955     assert_template :account
956     assert_select ".notice", /^User information updated successfully/
957     assert_select "form#accountForm > fieldset.form-group > div.form-row > div.col-sm-10 > div.form-check > input[name=avatar_action][checked][value=?]", "keep"
958
959     # Changing to a gravatar image should work
960     post user_account_path(user), :params => { :avatar_action => "gravatar", :user => user.attributes }
961     assert_response :redirect
962     assert_redirected_to user_account_url(user)
963     get user_account_path(user)
964     assert_response :success
965     assert_template :account
966     assert_select ".notice", /^User information updated successfully/
967     assert_select "form#accountForm > fieldset.form-group > div.form-row > div.col-sm-10 > div.form-group > div.form-check > input[name=avatar_action][checked][value=?]", "gravatar"
968
969     # Removing the image should work
970     post user_account_path(user), :params => { :avatar_action => "delete", :user => user.attributes }
971     assert_response :redirect
972     assert_redirected_to user_account_url(user)
973     get user_account_path(user)
974     assert_response :success
975     assert_template :account
976     assert_select ".notice", /^User information updated successfully/
977     assert_select "form#accountForm > fieldset.form-group > div.form-row > div.col-sm-10 > div.form-check > input[name=avatar_action][checked]", false
978     assert_select "form#accountForm > fieldset.form-group > div.form-row > div.col-sm-10 > div.form-group > div.form-check > input[name=avatar_action][checked]", false
979
980     # Adding external authentication should redirect to the auth provider
981     post user_account_path(user), :params => { :user => user.attributes.merge(:auth_provider => "openid", :auth_uid => "gmail.com") }
982     assert_response :redirect
983     assert_redirected_to auth_path(:provider => "openid", :openid_url => "https://www.google.com/accounts/o8/id", :origin => "/user/#{ERB::Util.u(user.display_name)}/account")
984
985     # Changing name to one that exists should fail
986     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name)
987     post user_account_path(user), :params => { :user => new_attributes }
988     assert_response :success
989     assert_template :account
990     assert_select ".notice", false
991     assert_select "form#accountForm > div.form-group > input.is-invalid#user_display_name"
992
993     # Changing name to one that exists should fail, regardless of case
994     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name.upcase)
995     post user_account_path(user), :params => { :user => new_attributes }
996     assert_response :success
997     assert_template :account
998     assert_select ".notice", false
999     assert_select "form#accountForm > div.form-group > input.is-invalid#user_display_name"
1000
1001     # Changing name to one that doesn't exist should work
1002     new_attributes = user.attributes.dup.merge(:display_name => "new tester")
1003     post user_account_path(user), :params => { :user => new_attributes }
1004     assert_response :redirect
1005     assert_redirected_to user_account_url(:display_name => "new tester")
1006     get user_account_path(:display_name => "new tester")
1007     assert_response :success
1008     assert_template :account
1009     assert_select ".notice", /^User information updated successfully/
1010     assert_select "form#accountForm > div.form-group > input#user_display_name[value=?]", "new tester"
1011
1012     # Record the change of name
1013     user.display_name = "new tester"
1014
1015     # Changing email to one that exists should fail
1016     user.new_email = create(:user).email
1017     assert_no_difference "ActionMailer::Base.deliveries.size" do
1018       perform_enqueued_jobs do
1019         post user_account_path(user), :params => { :user => user.attributes }
1020       end
1021     end
1022     assert_response :success
1023     assert_template :account
1024     assert_select ".notice", false
1025     assert_select "form#accountForm > div.form-group > input.is-invalid#user_new_email"
1026
1027     # Changing email to one that exists should fail, regardless of case
1028     user.new_email = create(:user).email.upcase
1029     assert_no_difference "ActionMailer::Base.deliveries.size" do
1030       perform_enqueued_jobs do
1031         post user_account_path(user), :params => { :user => user.attributes }
1032       end
1033     end
1034     assert_response :success
1035     assert_template :account
1036     assert_select ".notice", false
1037     assert_select "form#accountForm > div.form-group > input.is-invalid#user_new_email"
1038
1039     # Changing email to one that doesn't exist should work
1040     user.new_email = "new_tester@example.com"
1041     assert_difference "ActionMailer::Base.deliveries.size", 1 do
1042       perform_enqueued_jobs do
1043         post user_account_path(user), :params => { :user => user.attributes }
1044       end
1045     end
1046     assert_response :redirect
1047     assert_redirected_to user_account_url(user)
1048     get user_account_path(user)
1049     assert_response :success
1050     assert_template :account
1051     assert_select ".notice", /^User information updated successfully/
1052     assert_select "form#accountForm > div.form-group > input#user_new_email[value=?]", user.new_email
1053     email = ActionMailer::Base.deliveries.first
1054     assert_equal 1, email.to.count
1055     assert_equal user.new_email, email.to.first
1056     ActionMailer::Base.deliveries.clear
1057   end
1058
1059   # Check that the user account page will display and contains some relevant
1060   # information for the user
1061   def test_show
1062     # Test a non-existent user
1063     get user_path(:display_name => "unknown")
1064     assert_response :not_found
1065
1066     # Test a normal user
1067     user = create(:user, :home_lon => 1.1, :home_lat => 1.1)
1068     friend_user = create(:user, :home_lon => 1.2, :home_lat => 1.2)
1069     create(:friendship, :befriender => user, :befriendee => friend_user)
1070     create(:changeset, :user => friend_user)
1071
1072     get user_path(user)
1073     assert_response :success
1074     assert_select "div#userinformation" do
1075       assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
1076       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/traces']", 1
1077       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary']", 1
1078       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary/comments']", 1
1079       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/account']", 0
1080       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks']", 0
1081       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks_by']", 0
1082       assert_select "a[href='/blocks/new/#{ERB::Util.u(user.display_name)}']", 0
1083     end
1084
1085     # Friends shouldn't be visible as we're not logged in
1086     assert_select "div#friends-container", :count => 0
1087
1088     # Test a user who has been blocked
1089     blocked_user = create(:user)
1090     create(:user_block, :user => blocked_user)
1091     get user_path(blocked_user)
1092     assert_response :success
1093     assert_select "div#userinformation" do
1094       assert_select "a[href^='/user/#{ERB::Util.u(blocked_user.display_name)}/history']", 1
1095       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/traces']", 1
1096       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/diary']", 1
1097       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/diary/comments']", 1
1098       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/account']", 0
1099       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/blocks']", 1
1100       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/blocks_by']", 0
1101       assert_select "a[href='/blocks/new/#{ERB::Util.u(blocked_user.display_name)}']", 0
1102     end
1103
1104     # Test a moderator who has applied blocks
1105     moderator_user = create(:moderator_user)
1106     create(:user_block, :creator => moderator_user)
1107     get user_path(moderator_user)
1108     assert_response :success
1109     assert_select "div#userinformation" do
1110       assert_select "a[href^='/user/#{ERB::Util.u(moderator_user.display_name)}/history']", 1
1111       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/traces']", 1
1112       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/diary']", 1
1113       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/diary/comments']", 1
1114       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/account']", 0
1115       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/blocks']", 0
1116       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/blocks_by']", 1
1117       assert_select "a[href='/blocks/new/#{ERB::Util.u(moderator_user.display_name)}']", 0
1118     end
1119
1120     # Login as a normal user
1121     session_for(user)
1122
1123     # Test the normal user
1124     get user_path(user)
1125     assert_response :success
1126     assert_select "div#userinformation" do
1127       assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
1128       assert_select "a[href='/traces/mine']", 1
1129       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary']", 1
1130       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary/comments']", 1
1131       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/account']", 1
1132       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks']", 0
1133       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks_by']", 0
1134       assert_select "a[href='/blocks/new/#{ERB::Util.u(user.display_name)}']", 0
1135     end
1136
1137     # Friends should be visible as we're now logged in
1138     assert_select "div#friends-container" do
1139       assert_select "div.contact-activity", :count => 1
1140     end
1141
1142     # Login as a moderator
1143     session_for(create(:moderator_user))
1144
1145     # Test the normal user
1146     get user_path(user)
1147     assert_response :success
1148     assert_select "div#userinformation" do
1149       assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
1150       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/traces']", 1
1151       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary']", 1
1152       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary/comments']", 1
1153       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/account']", 0
1154       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks']", 0
1155       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks_by']", 0
1156       assert_select "a[href='/blocks/new/#{ERB::Util.u(user.display_name)}']", 1
1157     end
1158   end
1159
1160   # Test whether information about contributor terms is shown for users who haven't agreed
1161   def test_terms_not_agreed
1162     agreed_user = create(:user, :terms_agreed => 3.days.ago)
1163     seen_user = create(:user, :terms_seen => true, :terms_agreed => nil)
1164     not_seen_user = create(:user, :terms_seen => false, :terms_agreed => nil)
1165
1166     get user_path(agreed_user)
1167     assert_response :success
1168     assert_select "div#userinformation" do
1169       assert_select "p", :count => 0, :text => /Contributor terms/
1170     end
1171
1172     get user_path(seen_user)
1173     assert_response :success
1174     # put @response.body
1175     assert_select "div#userinformation" do
1176       assert_select "p", :count => 1, :text => /Contributor terms/
1177       assert_select "p", /Declined/
1178     end
1179
1180     get user_path(not_seen_user)
1181     assert_response :success
1182     assert_select "div#userinformation" do
1183       assert_select "p", :count => 1, :text => /Contributor terms/
1184       assert_select "p", /Undecided/
1185     end
1186   end
1187
1188   def test_set_status
1189     user = create(:user)
1190
1191     # Try without logging in
1192     post set_status_user_path(user), :params => { :status => "suspended" }
1193     assert_response :forbidden
1194
1195     # Now try as a normal user
1196     session_for(user)
1197     post set_status_user_path(user), :params => { :status => "suspended" }
1198     assert_response :redirect
1199     assert_redirected_to :controller => :errors, :action => :forbidden
1200
1201     # Finally try as an administrator
1202     session_for(create(:administrator_user))
1203     post set_status_user_path(user), :params => { :status => "suspended" }
1204     assert_response :redirect
1205     assert_redirected_to :action => :show, :display_name => user.display_name
1206     assert_equal "suspended", User.find(user.id).status
1207   end
1208
1209   def test_destroy
1210     user = create(:user, :home_lat => 12.1, :home_lon => 12.1, :description => "test")
1211
1212     # Try without logging in
1213     delete user_path(user), :params => { :status => "suspended" }
1214     assert_response :forbidden
1215
1216     # Now try as a normal user
1217     session_for(user)
1218     delete user_path(user), :params => { :status => "suspended" }
1219     assert_response :redirect
1220     assert_redirected_to :controller => :errors, :action => :forbidden
1221
1222     # Finally try as an administrator
1223     session_for(create(:administrator_user))
1224     delete user_path(user), :params => { :status => "suspended" }
1225     assert_response :redirect
1226     assert_redirected_to :action => :show, :display_name => user.display_name
1227
1228     # Check that the user was deleted properly
1229     user.reload
1230     assert_equal "user_#{user.id}", user.display_name
1231     assert_equal "", user.description
1232     assert_nil user.home_lat
1233     assert_nil user.home_lon
1234     assert_not user.avatar.attached?
1235     assert_not user.email_valid
1236     assert_nil user.new_email
1237     assert_nil user.auth_provider
1238     assert_nil user.auth_uid
1239     assert_equal "deleted", user.status
1240   end
1241
1242   def test_index_get
1243     user = create(:user)
1244     moderator_user = create(:moderator_user)
1245     administrator_user = create(:administrator_user)
1246     _suspended_user = create(:user, :suspended)
1247     _ip_user = create(:user, :creation_ip => "1.2.3.4")
1248
1249     # There are now 7 users - the five above, plus two extra "granters" for the
1250     # moderator_user and administrator_user
1251     assert_equal 7, User.count
1252
1253     # Shouldn't work when not logged in
1254     get users_path
1255     assert_response :redirect
1256     assert_redirected_to login_path(:referer => users_path)
1257
1258     session_for(user)
1259
1260     # Shouldn't work when logged in as a normal user
1261     get users_path
1262     assert_response :redirect
1263     assert_redirected_to :controller => :errors, :action => :forbidden
1264
1265     session_for(moderator_user)
1266
1267     # Shouldn't work when logged in as a moderator
1268     get users_path
1269     assert_response :redirect
1270     assert_redirected_to :controller => :errors, :action => :forbidden
1271
1272     session_for(administrator_user)
1273
1274     # Note there is a header row, so all row counts are users + 1
1275     # Should work when logged in as an administrator
1276     get users_path
1277     assert_response :success
1278     assert_template :index
1279     assert_select "table#user_list tr", :count => 7 + 1
1280
1281     # Should be able to limit by status
1282     get users_path, :params => { :status => "suspended" }
1283     assert_response :success
1284     assert_template :index
1285     assert_select "table#user_list tr", :count => 1 + 1
1286
1287     # Should be able to limit by IP address
1288     get users_path, :params => { :ip => "1.2.3.4" }
1289     assert_response :success
1290     assert_template :index
1291     assert_select "table#user_list tr", :count => 1 + 1
1292   end
1293
1294   def test_index_get_paginated
1295     1.upto(100).each do |n|
1296       User.create(:display_name => "extra_#{n}",
1297                   :email => "extra#{n}@example.com",
1298                   :pass_crypt => "extraextra")
1299     end
1300
1301     session_for(create(:administrator_user))
1302
1303     # 100 examples, an administrator, and a granter for the admin.
1304     assert_equal 102, User.count
1305
1306     get users_path
1307     assert_response :success
1308     assert_template :index
1309     assert_select "table#user_list tr", :count => 51
1310
1311     get users_path, :params => { :page => 2 }
1312     assert_response :success
1313     assert_template :index
1314     assert_select "table#user_list tr", :count => 51
1315
1316     get users_path, :params => { :page => 3 }
1317     assert_response :success
1318     assert_template :index
1319     assert_select "table#user_list tr", :count => 3
1320   end
1321
1322   def test_index_post_confirm
1323     inactive_user = create(:user, :pending)
1324     suspended_user = create(:user, :suspended)
1325
1326     # Shouldn't work when not logged in
1327     assert_no_difference "User.active.count" do
1328       post users_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
1329     end
1330     assert_response :forbidden
1331
1332     assert_equal "pending", inactive_user.reload.status
1333     assert_equal "suspended", suspended_user.reload.status
1334
1335     session_for(create(:user))
1336
1337     # Shouldn't work when logged in as a normal user
1338     assert_no_difference "User.active.count" do
1339       post users_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
1340     end
1341     assert_response :redirect
1342     assert_redirected_to :controller => :errors, :action => :forbidden
1343     assert_equal "pending", inactive_user.reload.status
1344     assert_equal "suspended", suspended_user.reload.status
1345
1346     session_for(create(:moderator_user))
1347
1348     # Shouldn't work when logged in as a moderator
1349     assert_no_difference "User.active.count" do
1350       post users_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
1351     end
1352     assert_response :redirect
1353     assert_redirected_to :controller => :errors, :action => :forbidden
1354     assert_equal "pending", inactive_user.reload.status
1355     assert_equal "suspended", suspended_user.reload.status
1356
1357     session_for(create(:administrator_user))
1358
1359     # Should work when logged in as an administrator
1360     assert_difference "User.active.count", 2 do
1361       post users_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
1362     end
1363     assert_response :redirect
1364     assert_redirected_to :action => :index
1365     assert_equal "confirmed", inactive_user.reload.status
1366     assert_equal "confirmed", suspended_user.reload.status
1367   end
1368
1369   def test_index_post_hide
1370     normal_user = create(:user)
1371     confirmed_user = create(:user, :confirmed)
1372
1373     # Shouldn't work when not logged in
1374     assert_no_difference "User.active.count" do
1375       post users_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
1376     end
1377     assert_response :forbidden
1378
1379     assert_equal "active", normal_user.reload.status
1380     assert_equal "confirmed", confirmed_user.reload.status
1381
1382     session_for(create(:user))
1383
1384     # Shouldn't work when logged in as a normal user
1385     assert_no_difference "User.active.count" do
1386       post users_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
1387     end
1388     assert_response :redirect
1389     assert_redirected_to :controller => :errors, :action => :forbidden
1390     assert_equal "active", normal_user.reload.status
1391     assert_equal "confirmed", confirmed_user.reload.status
1392
1393     session_for(create(:moderator_user))
1394
1395     # Shouldn't work when logged in as a moderator
1396     assert_no_difference "User.active.count" do
1397       post users_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
1398     end
1399     assert_response :redirect
1400     assert_redirected_to :controller => :errors, :action => :forbidden
1401     assert_equal "active", normal_user.reload.status
1402     assert_equal "confirmed", confirmed_user.reload.status
1403
1404     session_for(create(:administrator_user))
1405
1406     # Should work when logged in as an administrator
1407     assert_difference "User.active.count", -2 do
1408       post users_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
1409     end
1410     assert_response :redirect
1411     assert_redirected_to :action => :index
1412     assert_equal "deleted", normal_user.reload.status
1413     assert_equal "deleted", confirmed_user.reload.status
1414   end
1415 end