]> git.openstreetmap.org Git - rails.git/blob - test/controllers/users_controller_test.rb
Don't allow deleted users to be confirmed
[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_deleted
527     user = build(:user, :pending)
528     stub_gravatar_request(user.email)
529     post user_new_path, :params => { :user => user.attributes }
530     post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
531     confirm_string = User.find_by(:email => user.email).tokens.create.token
532
533     User.find_by(:display_name => user.display_name).update(:status => "deleted")
534
535     # Get the confirmation page
536     get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
537     assert_response :redirect
538     assert_redirected_to root_path
539
540     # Confirm the user
541     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
542     assert_response :not_found
543     assert_template :no_such_user
544   end
545
546   def test_confirm_resend_success
547     user = build(:user, :pending)
548     post user_new_path, :params => { :user => user.attributes }
549     post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
550
551     assert_difference "ActionMailer::Base.deliveries.size", 1 do
552       perform_enqueued_jobs do
553         get user_confirm_resend_path(user)
554       end
555     end
556
557     assert_response :redirect
558     assert_redirected_to login_path
559     assert_match(/sent a new confirmation/, flash[:notice])
560
561     email = ActionMailer::Base.deliveries.last
562
563     assert_equal user.email, email.to.first
564
565     ActionMailer::Base.deliveries.clear
566   end
567
568   def test_confirm_resend_no_token
569     user = build(:user, :pending)
570     # only complete first half of registration
571     post user_new_path, :params => { :user => user.attributes }
572
573     assert_no_difference "ActionMailer::Base.deliveries.size" do
574       perform_enqueued_jobs do
575         get user_confirm_resend_path(user)
576       end
577     end
578
579     assert_response :redirect
580     assert_redirected_to login_path
581     assert_match "User #{user.display_name} not found.", flash[:error]
582   end
583
584   def test_confirm_resend_deleted
585     user = build(:user, :pending)
586     post user_new_path, :params => { :user => user.attributes }
587     post user_save_path, :params => { :read_ct => 1, :read_tou => 1 }
588
589     User.find_by(:display_name => user.display_name).update(:status => "deleted")
590
591     assert_no_difference "ActionMailer::Base.deliveries.size" do
592       perform_enqueued_jobs do
593         get user_confirm_resend_path(user)
594       end
595     end
596
597     assert_response :redirect
598     assert_redirected_to login_path
599     assert_match "User #{user.display_name} not found.", flash[:error]
600   end
601
602   def test_confirm_resend_unknown_user
603     assert_no_difference "ActionMailer::Base.deliveries.size" do
604       perform_enqueued_jobs do
605         get user_confirm_resend_path(:display_name => "No Such User")
606       end
607     end
608
609     assert_response :redirect
610     assert_redirected_to login_path
611     assert_match "User No Such User not found.", flash[:error]
612   end
613
614   def test_confirm_email_get
615     user = create(:user)
616     confirm_string = user.tokens.create.token
617
618     get user_confirm_email_path, :params => { :confirm_string => confirm_string }
619     assert_response :success
620     assert_template :confirm_email
621   end
622
623   def test_confirm_email_success
624     user = create(:user, :new_email => "test-new@example.com")
625     stub_gravatar_request(user.new_email)
626     confirm_string = user.tokens.create.token
627
628     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
629     assert_response :redirect
630     assert_redirected_to :action => :account, :display_name => user.display_name
631     assert_match(/Confirmed your change of email address/, flash[:notice])
632   end
633
634   def test_confirm_email_already_confirmed
635     user = create(:user)
636     confirm_string = user.tokens.create.token
637
638     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
639     assert_response :redirect
640     assert_redirected_to :action => :account, :display_name => user.display_name
641     assert_match(/already been confirmed/, flash[:error])
642   end
643
644   def test_confirm_email_bad_token
645     post user_confirm_email_path, :params => { :confirm_string => "XXXXX" }
646     assert_response :success
647     assert_template :confirm_email
648     assert_match(/confirmation code has expired or does not exist/, flash[:error])
649   end
650
651   ##
652   # test if testing for a gravatar works
653   # this happens when the email is actually changed
654   # which is triggered by the confirmation mail
655   def test_gravatar_auto_enable
656     # switch to email that has a gravatar
657     user = create(:user, :new_email => "test-new@example.com")
658     stub_gravatar_request(user.new_email, 200)
659     confirm_string = user.tokens.create.token
660     # precondition gravatar should be turned off
661     assert_not user.image_use_gravatar
662     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
663     assert_response :redirect
664     assert_redirected_to :action => :account, :display_name => user.display_name
665     assert_match(/Confirmed your change of email address/, flash[:notice])
666     # gravatar use should now be enabled
667     assert User.find(user.id).image_use_gravatar
668   end
669
670   def test_gravatar_auto_disable
671     # switch to email without a gravatar
672     user = create(:user, :new_email => "test-new@example.com", :image_use_gravatar => true)
673     stub_gravatar_request(user.new_email, 404)
674     confirm_string = user.tokens.create.token
675     # precondition gravatar should be turned on
676     assert user.image_use_gravatar
677     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
678     assert_response :redirect
679     assert_redirected_to :action => :account, :display_name => user.display_name
680     assert_match(/Confirmed your change of email address/, flash[:notice])
681     # gravatar use should now be disabled
682     assert_not User.find(user.id).image_use_gravatar
683   end
684
685   def test_terms_new_user
686     user = build(:user, :pending)
687
688     # Set up our user as being half-way through registration
689     assert_no_difference "User.count" do
690       assert_no_difference "ActionMailer::Base.deliveries.size" do
691         perform_enqueued_jobs do
692           post user_new_path, :params => { :user => user.attributes }
693         end
694       end
695     end
696
697     get user_terms_path
698
699     assert_response :success
700     assert_template :terms
701   end
702
703   def test_terms_agreed
704     user = create(:user, :terms_seen => true, :terms_agreed => Date.yesterday)
705
706     session_for(user)
707
708     get user_terms_path
709     assert_response :redirect
710     assert_redirected_to :action => :account, :display_name => user.display_name
711   end
712
713   def test_terms_not_seen_without_referer
714     user = create(:user, :terms_seen => false, :terms_agreed => nil)
715
716     session_for(user)
717
718     get user_terms_path
719     assert_response :success
720     assert_template :terms
721
722     post user_save_path, :params => { :user => { :consider_pd => true }, :read_ct => 1, :read_tou => 1 }
723     assert_response :redirect
724     assert_redirected_to :action => :account, :display_name => user.display_name
725     assert_equal "Thanks for accepting the new contributor terms!", flash[:notice]
726
727     user.reload
728
729     assert user.consider_pd
730     assert_not_nil user.terms_agreed
731     assert user.terms_seen
732   end
733
734   def test_terms_not_seen_with_referer
735     user = create(:user, :terms_seen => false, :terms_agreed => nil)
736
737     session_for(user)
738
739     get user_terms_path, :params => { :referer => "/test" }
740     assert_response :success
741     assert_template :terms
742
743     post user_save_path, :params => { :user => { :consider_pd => true }, :referer => "/test", :read_ct => 1, :read_tou => 1 }
744     assert_response :redirect
745     assert_redirected_to "/test"
746     assert_equal "Thanks for accepting the new contributor terms!", flash[:notice]
747
748     user.reload
749
750     assert user.consider_pd
751     assert_not_nil user.terms_agreed
752     assert user.terms_seen
753   end
754
755   # Check that if you haven't seen the terms, and make a request that requires authentication,
756   # that your request is redirected to view the terms
757   def test_terms_not_seen_redirection
758     user = create(:user, :terms_seen => false, :terms_agreed => nil)
759     session_for(user)
760
761     get user_account_path(user)
762     assert_response :redirect
763     assert_redirected_to :action => :terms, :referer => "/user/#{ERB::Util.u(user.display_name)}/account"
764   end
765
766   def test_go_public
767     user = create(:user, :data_public => false)
768     session_for(user)
769
770     post user_go_public_path
771
772     assert_response :redirect
773     assert_redirected_to :action => :account, :display_name => user.display_name
774     assert User.find(user.id).data_public
775   end
776
777   def test_lost_password
778     # Test fetching the lost password page
779     get user_forgot_password_path
780     assert_response :success
781     assert_template :lost_password
782     assert_select "div#notice", false
783
784     # Test resetting using the address as recorded for a user that has an
785     # address which is duplicated in a different case by another user
786     user = create(:user)
787     uppercase_user = build(:user, :email => user.email.upcase).tap { |u| u.save(:validate => false) }
788
789     # Resetting with GET should fail
790     assert_no_difference "ActionMailer::Base.deliveries.size" do
791       perform_enqueued_jobs do
792         get user_forgot_password_path, :params => { :email => user.email }
793       end
794     end
795     assert_response :success
796     assert_template :lost_password
797
798     # Resetting with POST should work
799     assert_difference "ActionMailer::Base.deliveries.size", 1 do
800       perform_enqueued_jobs do
801         post user_forgot_password_path, :params => { :email => user.email }
802       end
803     end
804     assert_response :redirect
805     assert_redirected_to login_path
806     assert_match(/^Sorry you lost it/, flash[:notice])
807     email = ActionMailer::Base.deliveries.first
808     assert_equal 1, email.to.count
809     assert_equal user.email, email.to.first
810     ActionMailer::Base.deliveries.clear
811
812     # Test resetting using an address that matches a different user
813     # that has the same address in a different case
814     assert_difference "ActionMailer::Base.deliveries.size", 1 do
815       perform_enqueued_jobs do
816         post user_forgot_password_path, :params => { :email => user.email.upcase }
817       end
818     end
819     assert_response :redirect
820     assert_redirected_to login_path
821     assert_match(/^Sorry you lost it/, flash[:notice])
822     email = ActionMailer::Base.deliveries.first
823     assert_equal 1, email.to.count
824     assert_equal uppercase_user.email, email.to.first
825     ActionMailer::Base.deliveries.clear
826
827     # Test resetting using an address that is a case insensitive match
828     # for more than one user but not an exact match for either
829     assert_no_difference "ActionMailer::Base.deliveries.size" do
830       perform_enqueued_jobs do
831         post user_forgot_password_path, :params => { :email => user.email.titlecase }
832       end
833     end
834     assert_response :success
835     assert_template :lost_password
836     assert_select ".error", /^Could not find that email address/
837
838     # Test resetting using the address as recorded for a user that has an
839     # address which is case insensitively unique
840     third_user = create(:user)
841     assert_difference "ActionMailer::Base.deliveries.size", 1 do
842       perform_enqueued_jobs do
843         post user_forgot_password_path, :params => { :email => third_user.email }
844       end
845     end
846     assert_response :redirect
847     assert_redirected_to login_path
848     assert_match(/^Sorry you lost it/, flash[:notice])
849     email = ActionMailer::Base.deliveries.first
850     assert_equal 1, email.to.count
851     assert_equal third_user.email, email.to.first
852     ActionMailer::Base.deliveries.clear
853
854     # Test resetting using an address that matches a user that has the
855     # same (case insensitively unique) address in a different case
856     assert_difference "ActionMailer::Base.deliveries.size", 1 do
857       perform_enqueued_jobs do
858         post user_forgot_password_path, :params => { :email => third_user.email.upcase }
859       end
860     end
861     assert_response :redirect
862     assert_redirected_to login_path
863     assert_match(/^Sorry you lost it/, flash[:notice])
864     email = ActionMailer::Base.deliveries.first
865     assert_equal 1, email.to.count
866     assert_equal third_user.email, email.to.first
867     ActionMailer::Base.deliveries.clear
868   end
869
870   def test_reset_password
871     user = create(:user, :pending)
872     # Test a request with no token
873     get user_reset_password_path
874     assert_response :bad_request
875
876     # Test a request with a bogus token
877     get user_reset_password_path, :params => { :token => "made_up_token" }
878     assert_response :redirect
879     assert_redirected_to :action => :lost_password
880
881     # Create a valid token for a user
882     token = user.tokens.create
883
884     # Test a request with a valid token
885     get user_reset_password_path, :params => { :token => token.token }
886     assert_response :success
887     assert_template :reset_password
888
889     # Test that errors are reported for erroneous submissions
890     post user_reset_password_path, :params => { :token => token.token, :user => { :pass_crypt => "new_password", :pass_crypt_confirmation => "different_password" } }
891     assert_response :success
892     assert_template :reset_password
893     assert_select "div.invalid-feedback"
894
895     # Test setting a new password
896     post user_reset_password_path, :params => { :token => token.token, :user => { :pass_crypt => "new_password", :pass_crypt_confirmation => "new_password" } }
897     assert_response :redirect
898     assert_redirected_to root_path
899     assert_equal user.id, session[:user]
900     user.reload
901     assert_equal "active", user.status
902     assert user.email_valid
903     assert_equal user, User.authenticate(:username => user.email, :password => "new_password")
904   end
905
906   def test_account
907     # Get a user to work with - note that this user deliberately
908     # conflicts with uppercase_user in the email and display name
909     # fields to test that we can change other fields without any
910     # validation errors being reported
911     user = create(:user, :languages => [])
912     _uppercase_user = build(:user, :email => user.email.upcase, :display_name => user.display_name.upcase).tap { |u| u.save(:validate => false) }
913
914     # Make sure that you are redirected to the login page when
915     # you are not logged in
916     get user_account_path(user)
917     assert_response :redirect
918     assert_redirected_to login_path(:referer => "/user/#{ERB::Util.u(user.display_name)}/account")
919
920     # Make sure that you are blocked when not logged in as the right user
921     session_for(create(:user))
922     get user_account_path(user)
923     assert_response :forbidden
924
925     # Make sure we get the page when we are logged in as the right user
926     session_for(user)
927     get user_account_path(user)
928     assert_response :success
929     assert_template :account
930     assert_select "form#accountForm" do |form|
931       assert_equal "post", form.attr("method").to_s
932       assert_select "input[name='_method']", false
933       assert_equal "/user/#{ERB::Util.u(user.display_name)}/account", form.attr("action").to_s
934     end
935
936     # Updating the description using GET should fail
937     user.description = "new description"
938     user.preferred_editor = "default"
939     get user_account_path(user), :params => { :user => user.attributes }
940     assert_response :success
941     assert_template :account
942     assert_not_equal user.description, User.find(user.id).description
943
944     # Updating the description should work
945     user.description = "new description"
946     user.preferred_editor = "default"
947     post user_account_path(user), :params => { :user => user.attributes }
948     assert_response :redirect
949     assert_redirected_to user_account_url(user)
950     get user_account_path(user)
951     assert_response :success
952     assert_template :account
953     assert_select ".notice", /^User information updated successfully/
954     assert_select "form#accountForm > div.form-group > div#user_description_container > div#user_description_content > textarea#user_description", user.description
955
956     # Changing to a invalid editor should fail
957     user.preferred_editor = "unknown"
958     post user_account_path(user), :params => { :user => user.attributes }
959     assert_response :success
960     assert_template :account
961     assert_select ".notice", false
962     assert_select "form#accountForm > div.form-group > select#user_preferred_editor > option[selected]", false
963
964     # Changing to a valid editor should work
965     user.preferred_editor = "id"
966     post user_account_path(user), :params => { :user => user.attributes }
967     assert_response :redirect
968     assert_redirected_to user_account_url(user)
969     get user_account_path(user)
970     assert_response :success
971     assert_template :account
972     assert_select ".notice", /^User information updated successfully/
973     assert_select "form#accountForm > div.form-group > select#user_preferred_editor > option[selected][value=?]", "id"
974
975     # Changing to the default editor should work
976     user.preferred_editor = "default"
977     post user_account_path(user), :params => { :user => user.attributes }
978     assert_response :redirect
979     assert_redirected_to user_account_url(user)
980     get user_account_path(user)
981     assert_response :success
982     assert_template :account
983     assert_select ".notice", /^User information updated successfully/
984     assert_select "form#accountForm > div.form-group > select#user_preferred_editor > option[selected]", false
985
986     # Changing to an uploaded image should work
987     image = Rack::Test::UploadedFile.new("test/gpx/fixtures/a.gif", "image/gif")
988     post user_account_path(user), :params => { :avatar_action => "new", :user => user.attributes.merge(:avatar => image) }
989     assert_response :redirect
990     assert_redirected_to user_account_url(user)
991     get user_account_path(user)
992     assert_response :success
993     assert_template :account
994     assert_select ".notice", /^User information updated successfully/
995     assert_select "form#accountForm > fieldset.form-group > div.form-row > div.col-sm-10 > div.form-check > input[name=avatar_action][checked][value=?]", "keep"
996
997     # Changing to a gravatar image should work
998     post user_account_path(user), :params => { :avatar_action => "gravatar", :user => user.attributes }
999     assert_response :redirect
1000     assert_redirected_to user_account_url(user)
1001     get user_account_path(user)
1002     assert_response :success
1003     assert_template :account
1004     assert_select ".notice", /^User information updated successfully/
1005     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"
1006
1007     # Removing the image should work
1008     post user_account_path(user), :params => { :avatar_action => "delete", :user => user.attributes }
1009     assert_response :redirect
1010     assert_redirected_to user_account_url(user)
1011     get user_account_path(user)
1012     assert_response :success
1013     assert_template :account
1014     assert_select ".notice", /^User information updated successfully/
1015     assert_select "form#accountForm > fieldset.form-group > div.form-row > div.col-sm-10 > div.form-check > input[name=avatar_action][checked]", false
1016     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
1017
1018     # Adding external authentication should redirect to the auth provider
1019     post user_account_path(user), :params => { :user => user.attributes.merge(:auth_provider => "openid", :auth_uid => "gmail.com") }
1020     assert_response :redirect
1021     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")
1022
1023     # Changing name to one that exists should fail
1024     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name)
1025     post user_account_path(user), :params => { :user => new_attributes }
1026     assert_response :success
1027     assert_template :account
1028     assert_select ".notice", false
1029     assert_select "form#accountForm > div.form-group > input.is-invalid#user_display_name"
1030
1031     # Changing name to one that exists should fail, regardless of case
1032     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name.upcase)
1033     post user_account_path(user), :params => { :user => new_attributes }
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_display_name"
1038
1039     # Changing name to one that doesn't exist should work
1040     new_attributes = user.attributes.dup.merge(:display_name => "new tester")
1041     post user_account_path(user), :params => { :user => new_attributes }
1042     assert_response :redirect
1043     assert_redirected_to user_account_url(:display_name => "new tester")
1044     get user_account_path(:display_name => "new tester")
1045     assert_response :success
1046     assert_template :account
1047     assert_select ".notice", /^User information updated successfully/
1048     assert_select "form#accountForm > div.form-group > input#user_display_name[value=?]", "new tester"
1049
1050     # Record the change of name
1051     user.display_name = "new tester"
1052
1053     # Changing email to one that exists should fail
1054     user.new_email = create(:user).email
1055     assert_no_difference "ActionMailer::Base.deliveries.size" do
1056       perform_enqueued_jobs do
1057         post user_account_path(user), :params => { :user => user.attributes }
1058       end
1059     end
1060     assert_response :success
1061     assert_template :account
1062     assert_select ".notice", false
1063     assert_select "form#accountForm > div.form-group > input.is-invalid#user_new_email"
1064
1065     # Changing email to one that exists should fail, regardless of case
1066     user.new_email = create(:user).email.upcase
1067     assert_no_difference "ActionMailer::Base.deliveries.size" do
1068       perform_enqueued_jobs do
1069         post user_account_path(user), :params => { :user => user.attributes }
1070       end
1071     end
1072     assert_response :success
1073     assert_template :account
1074     assert_select ".notice", false
1075     assert_select "form#accountForm > div.form-group > input.is-invalid#user_new_email"
1076
1077     # Changing email to one that doesn't exist should work
1078     user.new_email = "new_tester@example.com"
1079     assert_difference "ActionMailer::Base.deliveries.size", 1 do
1080       perform_enqueued_jobs do
1081         post user_account_path(user), :params => { :user => user.attributes }
1082       end
1083     end
1084     assert_response :redirect
1085     assert_redirected_to user_account_url(user)
1086     get user_account_path(user)
1087     assert_response :success
1088     assert_template :account
1089     assert_select ".notice", /^User information updated successfully/
1090     assert_select "form#accountForm > div.form-group > input#user_new_email[value=?]", user.new_email
1091     email = ActionMailer::Base.deliveries.first
1092     assert_equal 1, email.to.count
1093     assert_equal user.new_email, email.to.first
1094     ActionMailer::Base.deliveries.clear
1095   end
1096
1097   # Check that the user account page will display and contains some relevant
1098   # information for the user
1099   def test_show
1100     # Test a non-existent user
1101     get user_path(:display_name => "unknown")
1102     assert_response :not_found
1103
1104     # Test a normal user
1105     user = create(:user, :home_lon => 1.1, :home_lat => 1.1)
1106     friend_user = create(:user, :home_lon => 1.2, :home_lat => 1.2)
1107     create(:friendship, :befriender => user, :befriendee => friend_user)
1108     create(:changeset, :user => friend_user)
1109
1110     get user_path(user)
1111     assert_response :success
1112     assert_select "div#userinformation" do
1113       assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
1114       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/traces']", 1
1115       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary']", 1
1116       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary/comments']", 1
1117       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/account']", 0
1118       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks']", 0
1119       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks_by']", 0
1120       assert_select "a[href='/blocks/new/#{ERB::Util.u(user.display_name)}']", 0
1121     end
1122
1123     # Friends shouldn't be visible as we're not logged in
1124     assert_select "div#friends-container", :count => 0
1125
1126     # Test a user who has been blocked
1127     blocked_user = create(:user)
1128     create(:user_block, :user => blocked_user)
1129     get user_path(blocked_user)
1130     assert_response :success
1131     assert_select "div#userinformation" do
1132       assert_select "a[href^='/user/#{ERB::Util.u(blocked_user.display_name)}/history']", 1
1133       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/traces']", 1
1134       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/diary']", 1
1135       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/diary/comments']", 1
1136       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/account']", 0
1137       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/blocks']", 1
1138       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/blocks_by']", 0
1139       assert_select "a[href='/blocks/new/#{ERB::Util.u(blocked_user.display_name)}']", 0
1140     end
1141
1142     # Test a moderator who has applied blocks
1143     moderator_user = create(:moderator_user)
1144     create(:user_block, :creator => moderator_user)
1145     get user_path(moderator_user)
1146     assert_response :success
1147     assert_select "div#userinformation" do
1148       assert_select "a[href^='/user/#{ERB::Util.u(moderator_user.display_name)}/history']", 1
1149       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/traces']", 1
1150       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/diary']", 1
1151       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/diary/comments']", 1
1152       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/account']", 0
1153       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/blocks']", 0
1154       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/blocks_by']", 1
1155       assert_select "a[href='/blocks/new/#{ERB::Util.u(moderator_user.display_name)}']", 0
1156     end
1157
1158     # Login as a normal user
1159     session_for(user)
1160
1161     # Test the normal user
1162     get user_path(user)
1163     assert_response :success
1164     assert_select "div#userinformation" do
1165       assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
1166       assert_select "a[href='/traces/mine']", 1
1167       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary']", 1
1168       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary/comments']", 1
1169       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/account']", 1
1170       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks']", 0
1171       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks_by']", 0
1172       assert_select "a[href='/blocks/new/#{ERB::Util.u(user.display_name)}']", 0
1173     end
1174
1175     # Friends should be visible as we're now logged in
1176     assert_select "div#friends-container" do
1177       assert_select "div.contact-activity", :count => 1
1178     end
1179
1180     # Login as a moderator
1181     session_for(create(:moderator_user))
1182
1183     # Test the normal user
1184     get user_path(user)
1185     assert_response :success
1186     assert_select "div#userinformation" do
1187       assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
1188       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/traces']", 1
1189       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary']", 1
1190       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary/comments']", 1
1191       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/account']", 0
1192       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks']", 0
1193       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks_by']", 0
1194       assert_select "a[href='/blocks/new/#{ERB::Util.u(user.display_name)}']", 1
1195     end
1196   end
1197
1198   # Test whether information about contributor terms is shown for users who haven't agreed
1199   def test_terms_not_agreed
1200     agreed_user = create(:user, :terms_agreed => 3.days.ago)
1201     seen_user = create(:user, :terms_seen => true, :terms_agreed => nil)
1202     not_seen_user = create(:user, :terms_seen => false, :terms_agreed => nil)
1203
1204     get user_path(agreed_user)
1205     assert_response :success
1206     assert_select "div#userinformation" do
1207       assert_select "p", :count => 0, :text => /Contributor terms/
1208     end
1209
1210     get user_path(seen_user)
1211     assert_response :success
1212     # put @response.body
1213     assert_select "div#userinformation" do
1214       assert_select "p", :count => 1, :text => /Contributor terms/
1215       assert_select "p", /Declined/
1216     end
1217
1218     get user_path(not_seen_user)
1219     assert_response :success
1220     assert_select "div#userinformation" do
1221       assert_select "p", :count => 1, :text => /Contributor terms/
1222       assert_select "p", /Undecided/
1223     end
1224   end
1225
1226   def test_set_status
1227     user = create(:user)
1228
1229     # Try without logging in
1230     post set_status_user_path(user), :params => { :status => "suspended" }
1231     assert_response :forbidden
1232
1233     # Now try as a normal user
1234     session_for(user)
1235     post set_status_user_path(user), :params => { :status => "suspended" }
1236     assert_response :redirect
1237     assert_redirected_to :controller => :errors, :action => :forbidden
1238
1239     # Finally try as an administrator
1240     session_for(create(:administrator_user))
1241     post set_status_user_path(user), :params => { :status => "suspended" }
1242     assert_response :redirect
1243     assert_redirected_to :action => :show, :display_name => user.display_name
1244     assert_equal "suspended", User.find(user.id).status
1245   end
1246
1247   def test_destroy
1248     user = create(:user, :home_lat => 12.1, :home_lon => 12.1, :description => "test")
1249
1250     # Try without logging in
1251     delete user_path(user), :params => { :status => "suspended" }
1252     assert_response :forbidden
1253
1254     # Now try as a normal user
1255     session_for(user)
1256     delete user_path(user), :params => { :status => "suspended" }
1257     assert_response :redirect
1258     assert_redirected_to :controller => :errors, :action => :forbidden
1259
1260     # Finally try as an administrator
1261     session_for(create(:administrator_user))
1262     delete user_path(user), :params => { :status => "suspended" }
1263     assert_response :redirect
1264     assert_redirected_to :action => :show, :display_name => user.display_name
1265
1266     # Check that the user was deleted properly
1267     user.reload
1268     assert_equal "user_#{user.id}", user.display_name
1269     assert_equal "", user.description
1270     assert_nil user.home_lat
1271     assert_nil user.home_lon
1272     assert_not user.avatar.attached?
1273     assert_not user.email_valid
1274     assert_nil user.new_email
1275     assert_nil user.auth_provider
1276     assert_nil user.auth_uid
1277     assert_equal "deleted", user.status
1278   end
1279
1280   def test_index_get
1281     user = create(:user)
1282     moderator_user = create(:moderator_user)
1283     administrator_user = create(:administrator_user)
1284     _suspended_user = create(:user, :suspended)
1285     _ip_user = create(:user, :creation_ip => "1.2.3.4")
1286
1287     # There are now 7 users - the five above, plus two extra "granters" for the
1288     # moderator_user and administrator_user
1289     assert_equal 7, User.count
1290
1291     # Shouldn't work when not logged in
1292     get users_path
1293     assert_response :redirect
1294     assert_redirected_to login_path(:referer => users_path)
1295
1296     session_for(user)
1297
1298     # Shouldn't work when logged in as a normal user
1299     get users_path
1300     assert_response :redirect
1301     assert_redirected_to :controller => :errors, :action => :forbidden
1302
1303     session_for(moderator_user)
1304
1305     # Shouldn't work when logged in as a moderator
1306     get users_path
1307     assert_response :redirect
1308     assert_redirected_to :controller => :errors, :action => :forbidden
1309
1310     session_for(administrator_user)
1311
1312     # Note there is a header row, so all row counts are users + 1
1313     # Should work when logged in as an administrator
1314     get users_path
1315     assert_response :success
1316     assert_template :index
1317     assert_select "table#user_list tr", :count => 7 + 1
1318
1319     # Should be able to limit by status
1320     get users_path, :params => { :status => "suspended" }
1321     assert_response :success
1322     assert_template :index
1323     assert_select "table#user_list tr", :count => 1 + 1
1324
1325     # Should be able to limit by IP address
1326     get users_path, :params => { :ip => "1.2.3.4" }
1327     assert_response :success
1328     assert_template :index
1329     assert_select "table#user_list tr", :count => 1 + 1
1330   end
1331
1332   def test_index_get_paginated
1333     1.upto(100).each do |n|
1334       User.create(:display_name => "extra_#{n}",
1335                   :email => "extra#{n}@example.com",
1336                   :pass_crypt => "extraextra")
1337     end
1338
1339     session_for(create(:administrator_user))
1340
1341     # 100 examples, an administrator, and a granter for the admin.
1342     assert_equal 102, User.count
1343
1344     get users_path
1345     assert_response :success
1346     assert_template :index
1347     assert_select "table#user_list tr", :count => 51
1348
1349     get users_path, :params => { :page => 2 }
1350     assert_response :success
1351     assert_template :index
1352     assert_select "table#user_list tr", :count => 51
1353
1354     get users_path, :params => { :page => 3 }
1355     assert_response :success
1356     assert_template :index
1357     assert_select "table#user_list tr", :count => 3
1358   end
1359
1360   def test_index_post_confirm
1361     inactive_user = create(:user, :pending)
1362     suspended_user = create(:user, :suspended)
1363
1364     # Shouldn't work when not logged in
1365     assert_no_difference "User.active.count" do
1366       post users_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
1367     end
1368     assert_response :forbidden
1369
1370     assert_equal "pending", inactive_user.reload.status
1371     assert_equal "suspended", suspended_user.reload.status
1372
1373     session_for(create(:user))
1374
1375     # Shouldn't work when logged in as a normal user
1376     assert_no_difference "User.active.count" do
1377       post users_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
1378     end
1379     assert_response :redirect
1380     assert_redirected_to :controller => :errors, :action => :forbidden
1381     assert_equal "pending", inactive_user.reload.status
1382     assert_equal "suspended", suspended_user.reload.status
1383
1384     session_for(create(:moderator_user))
1385
1386     # Shouldn't work when logged in as a moderator
1387     assert_no_difference "User.active.count" do
1388       post users_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
1389     end
1390     assert_response :redirect
1391     assert_redirected_to :controller => :errors, :action => :forbidden
1392     assert_equal "pending", inactive_user.reload.status
1393     assert_equal "suspended", suspended_user.reload.status
1394
1395     session_for(create(:administrator_user))
1396
1397     # Should work when logged in as an administrator
1398     assert_difference "User.active.count", 2 do
1399       post users_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
1400     end
1401     assert_response :redirect
1402     assert_redirected_to :action => :index
1403     assert_equal "confirmed", inactive_user.reload.status
1404     assert_equal "confirmed", suspended_user.reload.status
1405   end
1406
1407   def test_index_post_hide
1408     normal_user = create(:user)
1409     confirmed_user = create(:user, :confirmed)
1410
1411     # Shouldn't work when not logged in
1412     assert_no_difference "User.active.count" do
1413       post users_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
1414     end
1415     assert_response :forbidden
1416
1417     assert_equal "active", normal_user.reload.status
1418     assert_equal "confirmed", confirmed_user.reload.status
1419
1420     session_for(create(:user))
1421
1422     # Shouldn't work when logged in as a normal user
1423     assert_no_difference "User.active.count" do
1424       post users_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
1425     end
1426     assert_response :redirect
1427     assert_redirected_to :controller => :errors, :action => :forbidden
1428     assert_equal "active", normal_user.reload.status
1429     assert_equal "confirmed", confirmed_user.reload.status
1430
1431     session_for(create(:moderator_user))
1432
1433     # Shouldn't work when logged in as a moderator
1434     assert_no_difference "User.active.count" do
1435       post users_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
1436     end
1437     assert_response :redirect
1438     assert_redirected_to :controller => :errors, :action => :forbidden
1439     assert_equal "active", normal_user.reload.status
1440     assert_equal "confirmed", confirmed_user.reload.status
1441
1442     session_for(create(:administrator_user))
1443
1444     # Should work when logged in as an administrator
1445     assert_difference "User.active.count", -2 do
1446       post users_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
1447     end
1448     assert_response :redirect
1449     assert_redirected_to :action => :index
1450     assert_equal "deleted", normal_user.reload.status
1451     assert_equal "deleted", confirmed_user.reload.status
1452   end
1453 end