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