]> git.openstreetmap.org Git - rails.git/blob - test/controllers/users_controller_test.rb
Remove fallback to hostip.info
[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.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.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.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.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     get :logout
342     assert_response :success
343     assert_template :logout
344     assert_select "input[name=referer][value=?]", ""
345
346     session_id = assert_select("input[name=session]").first["value"]
347
348     get :logout, :params => { :session => session_id }
349     assert_response :redirect
350     assert_redirected_to root_path
351   end
352
353   def test_logout_with_referer
354     get :logout, :params => { :referer => "/test" }
355     assert_response :success
356     assert_template :logout
357     assert_select "input[name=referer][value=?]", "/test"
358
359     session_id = assert_select("input[name=session]").first["value"]
360
361     get :logout, :params => { :session => session_id, :referer => "/test" }
362     assert_response :redirect
363     assert_redirected_to "/test"
364   end
365
366   def test_logout_with_token
367     token = create(:user).tokens.create
368
369     session[:token] = token.token
370
371     get :logout
372     assert_response :success
373     assert_template :logout
374     assert_select "input[name=referer][value=?]", ""
375     assert_equal token.token, session[:token]
376     assert_not_nil UserToken.where(:id => token.id).first
377
378     session_id = assert_select("input[name=session]").first["value"]
379
380     get :logout, :params => { :session => session_id }
381     assert_response :redirect
382     assert_redirected_to root_path
383     assert_nil session[:token]
384     assert_nil UserToken.where(:id => token.id).first
385   end
386
387   def test_confirm_get
388     user = create(:user, :pending)
389     confirm_string = user.tokens.create.token
390
391     @request.cookies["_osm_session"] = user.display_name
392     get :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
393     assert_response :success
394     assert_template :confirm
395   end
396
397   def test_confirm_get_already_confirmed
398     user = create(:user)
399     confirm_string = user.tokens.create.token
400
401     @request.cookies["_osm_session"] = user.display_name
402     get :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
403     assert_response :redirect
404     assert_redirected_to root_path
405   end
406
407   def test_confirm_success_no_token_no_referer
408     user = create(:user, :pending)
409     stub_gravatar_request(user.email)
410     confirm_string = user.tokens.create.token
411
412     @request.cookies["_osm_session"] = user.display_name
413     post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
414     assert_redirected_to login_path
415     assert_match(/Confirmed your account/, flash[:notice])
416   end
417
418   def test_confirm_success_good_token_no_referer
419     user = create(:user, :pending)
420     stub_gravatar_request(user.email)
421     confirm_string = user.tokens.create.token
422     token = user.tokens.create.token
423
424     @request.cookies["_osm_session"] = user.display_name
425     post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }, :session => { :token => token }
426     assert_redirected_to welcome_path
427   end
428
429   def test_confirm_success_bad_token_no_referer
430     user = create(:user, :pending)
431     stub_gravatar_request(user.email)
432     confirm_string = user.tokens.create.token
433     token = create(:user).tokens.create.token
434
435     @request.cookies["_osm_session"] = user.display_name
436     post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }, :session => { :token => token }
437     assert_redirected_to login_path
438     assert_match(/Confirmed your account/, flash[:notice])
439   end
440
441   def test_confirm_success_no_token_with_referer
442     user = create(:user, :pending)
443     stub_gravatar_request(user.email)
444     confirm_string = user.tokens.create(:referer => new_diary_entry_path).token
445
446     @request.cookies["_osm_session"] = user.display_name
447     post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
448     assert_redirected_to login_path(:referer => new_diary_entry_path)
449     assert_match(/Confirmed your account/, flash[:notice])
450   end
451
452   def test_confirm_success_good_token_with_referer
453     user = create(:user, :pending)
454     stub_gravatar_request(user.email)
455     confirm_string = user.tokens.create(:referer => new_diary_entry_path).token
456     token = user.tokens.create.token
457
458     @request.cookies["_osm_session"] = user.display_name
459     post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }, :session => { :token => token }
460     assert_redirected_to new_diary_entry_path
461   end
462
463   def test_confirm_success_bad_token_with_referer
464     user = create(:user, :pending)
465     stub_gravatar_request(user.email)
466     confirm_string = user.tokens.create(:referer => new_diary_entry_path).token
467     token = create(:user).tokens.create.token
468
469     @request.cookies["_osm_session"] = user.display_name
470     post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }, :session => { :token => token }
471     assert_redirected_to login_path(:referer => new_diary_entry_path)
472     assert_match(/Confirmed your account/, flash[:notice])
473   end
474
475   def test_confirm_expired_token
476     user = create(:user, :pending)
477     confirm_string = user.tokens.create(:expiry => 1.day.ago).token
478
479     @request.cookies["_osm_session"] = user.display_name
480     post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
481     assert_redirected_to :action => "confirm"
482     assert_match(/confirmation code has expired/, flash[:error])
483   end
484
485   def test_confirm_already_confirmed
486     user = create(:user)
487     confirm_string = user.tokens.create(:referer => new_diary_entry_path).token
488
489     @request.cookies["_osm_session"] = user.display_name
490     post :confirm, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
491     assert_redirected_to :action => "login"
492     assert_match(/already been confirmed/, flash[:error])
493   end
494
495   def test_confirm_resend_success
496     user = create(:user, :pending)
497     session[:token] = user.tokens.create.token
498
499     assert_difference "ActionMailer::Base.deliveries.size", 1 do
500       perform_enqueued_jobs do
501         get :confirm_resend, :params => { :display_name => user.display_name }
502       end
503     end
504
505     assert_response :redirect
506     assert_redirected_to login_path
507     assert_match(/sent a new confirmation/, flash[:notice])
508
509     email = ActionMailer::Base.deliveries.last
510
511     assert_equal user.email, email.to.first
512
513     ActionMailer::Base.deliveries.clear
514   end
515
516   def test_confirm_resend_no_token
517     user = create(:user, :pending)
518     assert_no_difference "ActionMailer::Base.deliveries.size" do
519       perform_enqueued_jobs do
520         get :confirm_resend, :params => { :display_name => user.display_name }
521       end
522     end
523
524     assert_response :redirect
525     assert_redirected_to login_path
526     assert_match "User #{user.display_name} not found.", flash[:error]
527   end
528
529   def test_confirm_resend_unknown_user
530     assert_no_difference "ActionMailer::Base.deliveries.size" do
531       perform_enqueued_jobs do
532         get :confirm_resend, :params => { :display_name => "No Such User" }
533       end
534     end
535
536     assert_response :redirect
537     assert_redirected_to login_path
538     assert_match "User No Such User not found.", flash[:error]
539   end
540
541   def test_confirm_email_get
542     user = create(:user)
543     confirm_string = user.tokens.create.token
544
545     get :confirm_email, :params => { :confirm_string => confirm_string }
546     assert_response :success
547     assert_template :confirm_email
548   end
549
550   def test_confirm_email_success
551     user = create(:user, :new_email => "test-new@example.com")
552     stub_gravatar_request(user.new_email)
553     confirm_string = user.tokens.create.token
554
555     post :confirm_email, :params => { :confirm_string => confirm_string }
556     assert_response :redirect
557     assert_redirected_to :action => :account, :display_name => user.display_name
558     assert_match(/Confirmed your change of email address/, flash[:notice])
559   end
560
561   def test_confirm_email_already_confirmed
562     user = create(:user)
563     confirm_string = user.tokens.create.token
564
565     post :confirm_email, :params => { :confirm_string => confirm_string }
566     assert_response :redirect
567     assert_redirected_to :action => :account, :display_name => user.display_name
568     assert_match(/already been confirmed/, flash[:error])
569   end
570
571   def test_confirm_email_bad_token
572     post :confirm_email, :params => { :confirm_string => "XXXXX" }
573     assert_response :success
574     assert_template :confirm_email
575     assert_match(/confirmation code has expired or does not exist/, flash[:error])
576   end
577
578   ##
579   # test if testing for a gravatar works
580   # this happens when the email is actually changed
581   # which is triggered by the confirmation mail
582   def test_gravatar_auto_enable
583     # switch to email that has a gravatar
584     user = create(:user, :new_email => "test-new@example.com")
585     stub_gravatar_request(user.new_email, 200)
586     confirm_string = user.tokens.create.token
587     # precondition gravatar should be turned off
588     assert_not user.image_use_gravatar
589     post :confirm_email, :params => { :confirm_string => confirm_string }
590     assert_response :redirect
591     assert_redirected_to :action => :account, :display_name => user.display_name
592     assert_match(/Confirmed your change of email address/, flash[:notice])
593     # gravatar use should now be enabled
594     assert User.find(user.id).image_use_gravatar
595   end
596
597   def test_gravatar_auto_disable
598     # switch to email without a gravatar
599     user = create(:user, :new_email => "test-new@example.com", :image_use_gravatar => true)
600     stub_gravatar_request(user.new_email, 404)
601     confirm_string = user.tokens.create.token
602     # precondition gravatar should be turned on
603     assert user.image_use_gravatar
604     post :confirm_email, :params => { :confirm_string => confirm_string }
605     assert_response :redirect
606     assert_redirected_to :action => :account, :display_name => user.display_name
607     assert_match(/Confirmed your change of email address/, flash[:notice])
608     # gravatar use should now be disabled
609     assert_not User.find(user.id).image_use_gravatar
610   end
611
612   def test_terms_new_user
613     get :terms, :session => { :new_user => User.new }
614     assert_response :success
615     assert_template :terms
616   end
617
618   def test_terms_agreed
619     user = create(:user, :terms_seen => true, :terms_agreed => Date.yesterday)
620
621     session[:user] = user.id
622
623     get :terms
624     assert_response :redirect
625     assert_redirected_to :action => :account, :display_name => user.display_name
626   end
627
628   def test_terms_not_seen_without_referer
629     user = create(:user, :terms_seen => false, :terms_agreed => nil)
630
631     session[:user] = user.id
632
633     get :terms
634     assert_response :success
635     assert_template :terms
636
637     post :save, :params => { :user => { :consider_pd => true }, :read_ct => 1, :read_tou => 1 }
638     assert_response :redirect
639     assert_redirected_to :action => :account, :display_name => user.display_name
640     assert_equal "Thanks for accepting the new contributor terms!", flash[:notice]
641
642     user.reload
643
644     assert_equal true, user.consider_pd
645     assert_not_nil user.terms_agreed
646     assert_equal true, user.terms_seen
647   end
648
649   def test_terms_not_seen_with_referer
650     user = create(:user, :terms_seen => false, :terms_agreed => nil)
651
652     session[:user] = user.id
653
654     get :terms, :params => { :referer => "/test" }
655     assert_response :success
656     assert_template :terms
657
658     post :save, :params => { :user => { :consider_pd => true }, :referer => "/test", :read_ct => 1, :read_tou => 1 }
659     assert_response :redirect
660     assert_redirected_to "/test"
661     assert_equal "Thanks for accepting the new contributor terms!", flash[:notice]
662
663     user.reload
664
665     assert_equal true, user.consider_pd
666     assert_not_nil user.terms_agreed
667     assert_equal true, user.terms_seen
668   end
669
670   # Check that if you haven't seen the terms, and make a request that requires authentication,
671   # that your request is redirected to view the terms
672   def test_terms_not_seen_redirection
673     user = create(:user, :terms_seen => false, :terms_agreed => nil)
674     session[:user] = user.id
675
676     get :account, :params => { :display_name => user.display_name }
677     assert_response :redirect
678     assert_redirected_to :action => :terms, :referer => "/user/#{ERB::Util.u(user.display_name)}/account"
679   end
680
681   def test_go_public
682     user = create(:user, :data_public => false)
683     post :go_public, :session => { :user => user }
684     assert_response :redirect
685     assert_redirected_to :action => :account, :display_name => user.display_name
686     assert_equal true, User.find(user.id).data_public
687   end
688
689   def test_lost_password
690     # Test fetching the lost password page
691     get :lost_password
692     assert_response :success
693     assert_template :lost_password
694     assert_select "div#notice", false
695
696     # Test resetting using the address as recorded for a user that has an
697     # address which is duplicated in a different case by another user
698     user = create(:user)
699     uppercase_user = build(:user, :email => user.email.upcase).tap { |u| u.save(:validate => false) }
700
701     assert_difference "ActionMailer::Base.deliveries.size", 1 do
702       perform_enqueued_jobs do
703         post :lost_password, :params => { :user => { :email => user.email } }
704       end
705     end
706     assert_response :redirect
707     assert_redirected_to :action => :login
708     assert_match(/^Sorry you lost it/, flash[:notice])
709     email = ActionMailer::Base.deliveries.first
710     assert_equal 1, email.to.count
711     assert_equal user.email, email.to.first
712     ActionMailer::Base.deliveries.clear
713
714     # Test resetting using an address that matches a different user
715     # that has the same address in a different case
716     assert_difference "ActionMailer::Base.deliveries.size", 1 do
717       perform_enqueued_jobs do
718         post :lost_password, :params => { :user => { :email => user.email.upcase } }
719       end
720     end
721     assert_response :redirect
722     assert_redirected_to :action => :login
723     assert_match(/^Sorry you lost it/, flash[:notice])
724     email = ActionMailer::Base.deliveries.first
725     assert_equal 1, email.to.count
726     assert_equal uppercase_user.email, email.to.first
727     ActionMailer::Base.deliveries.clear
728
729     # Test resetting using an address that is a case insensitive match
730     # for more than one user but not an exact match for either
731     assert_no_difference "ActionMailer::Base.deliveries.size" do
732       perform_enqueued_jobs do
733         post :lost_password, :params => { :user => { :email => user.email.titlecase } }
734       end
735     end
736     assert_response :success
737     assert_template :lost_password
738     assert_select ".error", /^Could not find that email address/
739
740     # Test resetting using the address as recorded for a user that has an
741     # address which is case insensitively unique
742     third_user = create(:user)
743     assert_difference "ActionMailer::Base.deliveries.size", 1 do
744       perform_enqueued_jobs do
745         post :lost_password, :params => { :user => { :email => third_user.email } }
746       end
747     end
748     assert_response :redirect
749     assert_redirected_to :action => :login
750     assert_match(/^Sorry you lost it/, flash[:notice])
751     email = ActionMailer::Base.deliveries.first
752     assert_equal 1, email.to.count
753     assert_equal third_user.email, email.to.first
754     ActionMailer::Base.deliveries.clear
755
756     # Test resetting using an address that matches a user that has the
757     # same (case insensitively unique) address in a different case
758     assert_difference "ActionMailer::Base.deliveries.size", 1 do
759       perform_enqueued_jobs do
760         post :lost_password, :params => { :user => { :email => third_user.email.upcase } }
761       end
762     end
763     assert_response :redirect
764     assert_redirected_to :action => :login
765     assert_match(/^Sorry you lost it/, flash[:notice])
766     email = ActionMailer::Base.deliveries.first
767     assert_equal 1, email.to.count
768     assert_equal third_user.email, email.to.first
769     ActionMailer::Base.deliveries.clear
770   end
771
772   def test_reset_password
773     user = create(:user, :pending)
774     # Test a request with no token
775     get :reset_password
776     assert_response :bad_request
777
778     # Test a request with a bogus token
779     get :reset_password, :params => { :token => "made_up_token" }
780     assert_response :redirect
781     assert_redirected_to :action => :lost_password
782
783     # Create a valid token for a user
784     token = user.tokens.create
785
786     # Test a request with a valid token
787     get :reset_password, :params => { :token => token.token }
788     assert_response :success
789     assert_template :reset_password
790
791     # Test that errors are reported for erroneous submissions
792     post :reset_password, :params => { :token => token.token, :user => { :pass_crypt => "new_password", :pass_crypt_confirmation => "different_password" } }
793     assert_response :success
794     assert_template :reset_password
795     assert_select "div#errorExplanation"
796
797     # Test setting a new password
798     post :reset_password, :params => { :token => token.token, :user => { :pass_crypt => "new_password", :pass_crypt_confirmation => "new_password" } }
799     assert_response :redirect
800     assert_redirected_to root_path
801     assert_equal user.id, session[:user]
802     user.reload
803     assert_equal "active", user.status
804     assert_equal true, user.email_valid
805     assert_equal user, User.authenticate(:username => user.email, :password => "new_password")
806   end
807
808   def test_account
809     # Get a user to work with - note that this user deliberately
810     # conflicts with uppercase_user in the email and display name
811     # fields to test that we can change other fields without any
812     # validation errors being reported
813     user = create(:user, :languages => [])
814     _uppercase_user = build(:user, :email => user.email.upcase, :display_name => user.display_name.upcase).tap { |u| u.save(:validate => false) }
815
816     # Make sure that you are redirected to the login page when
817     # you are not logged in
818     get :account, :params => { :display_name => user.display_name }
819     assert_response :redirect
820     assert_redirected_to :action => "login", :referer => "/user/#{ERB::Util.u(user.display_name)}/account"
821
822     # Make sure that you are blocked when not logged in as the right user
823     get :account, :params => { :display_name => user.display_name }, :session => { :user => create(:user) }
824     assert_response :forbidden
825
826     # Make sure we get the page when we are logged in as the right user
827     get :account, :params => { :display_name => user.display_name }, :session => { :user => user }
828     assert_response :success
829     assert_template :account
830     assert_select "form#accountForm" do |form|
831       assert_equal "post", form.attr("method").to_s
832       assert_select "input[name='_method']", false
833       assert_equal "/user/#{ERB::Util.u(user.display_name)}/account", form.attr("action").to_s
834     end
835
836     # Updating the description should work
837     user.description = "new description"
838     user.preferred_editor = "default"
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 "div#errorExplanation", false
843     assert_select ".notice", /^User information updated successfully/
844     assert_select "form#accountForm > fieldset > div.form-row > div#user_description_container > div#user_description_content > textarea#user_description", user.description
845
846     # Changing to a invalid editor should fail
847     user.preferred_editor = "unknown"
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 ".notice", false
852     assert_select "div#errorExplanation"
853     assert_select "form#accountForm > fieldset > div.form-row > select#user_preferred_editor > option[selected]", false
854
855     # Changing to a valid editor should work
856     user.preferred_editor = "potlatch2"
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.form-row > select#user_preferred_editor > option[selected][value=?]", "potlatch2"
863
864     # Changing to the default editor should work
865     user.preferred_editor = "default"
866     post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :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.form-row > select#user_preferred_editor > option[selected]", false
872
873     # Changing to an uploaded image should work
874     image = Rack::Test::UploadedFile.new("test/gpx/fixtures/a.gif", "image/gif")
875     post :account, :params => { :display_name => user.display_name, :avatar_action => "new", :user => user.attributes.merge(:avatar => image) }, :session => { :user => user }
876     assert_response :success
877     assert_template :account
878     assert_select "div#errorExplanation", false
879     assert_select ".notice", /^User information updated successfully/
880     assert_select "form#accountForm > fieldset > div.form-row.accountImage input[name=avatar_action][checked][value=?]", "keep"
881
882     # Changing to a gravatar image should work
883     post :account, :params => { :display_name => user.display_name, :avatar_action => "gravatar", :user => user.attributes }, :session => { :user => user }
884     assert_response :success
885     assert_template :account
886     assert_select "div#errorExplanation", false
887     assert_select ".notice", /^User information updated successfully/
888     assert_select "form#accountForm > fieldset > div.form-row.accountImage input[name=avatar_action][checked][value=?]", "gravatar"
889
890     # Removing the image should work
891     post :account, :params => { :display_name => user.display_name, :avatar_action => "delete", :user => user.attributes }, :session => { :user => user }
892     assert_response :success
893     assert_template :account
894     assert_select "div#errorExplanation", false
895     assert_select ".notice", /^User information updated successfully/
896     assert_select "form#accountForm > fieldset > div.form-row.accountImage input[name=avatar_action][checked]", false
897
898     # Adding external authentication should redirect to the auth provider
899     post :account, :params => { :display_name => user.display_name, :user => user.attributes.merge(:auth_provider => "openid", :auth_uid => "gmail.com") }, :session => { :user => user }
900     assert_response :redirect
901     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")
902
903     # Changing name to one that exists should fail
904     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name)
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.form-row > input.field_with_errors#user_display_name"
911
912     # Changing name to one that exists should fail, regardless of case
913     new_attributes = user.attributes.dup.merge(:display_name => create(:user).display_name.upcase)
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 ".notice", false
918     assert_select "div#errorExplanation"
919     assert_select "form#accountForm > fieldset > div.form-row > input.field_with_errors#user_display_name"
920
921     # Changing name to one that doesn't exist should work
922     new_attributes = user.attributes.dup.merge(:display_name => "new tester")
923     post :account, :params => { :display_name => user.display_name, :user => new_attributes }, :session => { :user => user }
924     assert_response :success
925     assert_template :account
926     assert_select "div#errorExplanation", false
927     assert_select ".notice", /^User information updated successfully/
928     assert_select "form#accountForm > fieldset > div.form-row > input#user_display_name[value=?]", "new tester"
929
930     # Record the change of name
931     user.display_name = "new tester"
932
933     # Changing email to one that exists should fail
934     user.new_email = create(:user).email
935     assert_no_difference "ActionMailer::Base.deliveries.size" do
936       perform_enqueued_jobs do
937         post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
938       end
939     end
940     assert_response :success
941     assert_template :account
942     assert_select ".notice", false
943     assert_select "div#errorExplanation"
944     assert_select "form#accountForm > fieldset > div.form-row > input.field_with_errors#user_new_email"
945
946     # Changing email to one that exists should fail, regardless of case
947     user.new_email = create(:user).email.upcase
948     assert_no_difference "ActionMailer::Base.deliveries.size" do
949       perform_enqueued_jobs do
950         post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
951       end
952     end
953     assert_response :success
954     assert_template :account
955     assert_select ".notice", false
956     assert_select "div#errorExplanation"
957     assert_select "form#accountForm > fieldset > div.form-row > input.field_with_errors#user_new_email"
958
959     # Changing email to one that doesn't exist should work
960     user.new_email = "new_tester@example.com"
961     assert_difference "ActionMailer::Base.deliveries.size", 1 do
962       perform_enqueued_jobs do
963         post :account, :params => { :display_name => user.display_name, :user => user.attributes }, :session => { :user => user }
964       end
965     end
966     assert_response :success
967     assert_template :account
968     assert_select "div#errorExplanation", false
969     assert_select ".notice", /^User information updated successfully/
970     assert_select "form#accountForm > fieldset > div.form-row > input#user_new_email[value=?]", user.new_email
971     email = ActionMailer::Base.deliveries.first
972     assert_equal 1, email.to.count
973     assert_equal user.new_email, email.to.first
974     ActionMailer::Base.deliveries.clear
975   end
976
977   # Check that the user account page will display and contains some relevant
978   # information for the user
979   def test_show
980     # Test a non-existent user
981     get :show, :params => { :display_name => "unknown" }
982     assert_response :not_found
983
984     # Test a normal user
985     user = create(:user, :home_lon => 1.1, :home_lat => 1.1)
986     friend_user = create(:user, :home_lon => 1.2, :home_lat => 1.2)
987     create(:friendship, :befriender => user, :befriendee => friend_user)
988     create(:changeset, :user => friend_user)
989
990     get :show, :params => { :display_name => user.display_name }
991     assert_response :success
992     assert_select "div#userinformation" do
993       assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
994       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/traces']", 1
995       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary']", 1
996       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary/comments']", 1
997       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/account']", 0
998       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks']", 0
999       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks_by']", 0
1000       assert_select "a[href='/blocks/new/#{ERB::Util.u(user.display_name)}']", 0
1001     end
1002
1003     # Friends shouldn't be visible as we're not logged in
1004     assert_select "div#friends-container", :count => 0
1005
1006     # Test a user who has been blocked
1007     blocked_user = create(:user)
1008     create(:user_block, :user => blocked_user)
1009     get :show, :params => { :display_name => blocked_user.display_name }
1010     assert_response :success
1011     assert_select "div#userinformation" do
1012       assert_select "a[href^='/user/#{ERB::Util.u(blocked_user.display_name)}/history']", 1
1013       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/traces']", 1
1014       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/diary']", 1
1015       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/diary/comments']", 1
1016       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/account']", 0
1017       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/blocks']", 1
1018       assert_select "a[href='/user/#{ERB::Util.u(blocked_user.display_name)}/blocks_by']", 0
1019       assert_select "a[href='/blocks/new/#{ERB::Util.u(blocked_user.display_name)}']", 0
1020     end
1021
1022     # Test a moderator who has applied blocks
1023     moderator_user = create(:moderator_user)
1024     create(:user_block, :creator => moderator_user)
1025     get :show, :params => { :display_name => moderator_user.display_name }
1026     assert_response :success
1027     assert_select "div#userinformation" do
1028       assert_select "a[href^='/user/#{ERB::Util.u(moderator_user.display_name)}/history']", 1
1029       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/traces']", 1
1030       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/diary']", 1
1031       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/diary/comments']", 1
1032       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/account']", 0
1033       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/blocks']", 0
1034       assert_select "a[href='/user/#{ERB::Util.u(moderator_user.display_name)}/blocks_by']", 1
1035       assert_select "a[href='/blocks/new/#{ERB::Util.u(moderator_user.display_name)}']", 0
1036     end
1037
1038     # Login as a normal user
1039     session[:user] = user.id
1040
1041     # Test the normal user
1042     get :show, :params => { :display_name => user.display_name }
1043     assert_response :success
1044     assert_select "div#userinformation" do
1045       assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
1046       assert_select "a[href='/traces/mine']", 1
1047       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary']", 1
1048       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary/comments']", 1
1049       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/account']", 1
1050       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks']", 0
1051       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks_by']", 0
1052       assert_select "a[href='/blocks/new/#{ERB::Util.u(user.display_name)}']", 0
1053     end
1054
1055     # Friends should be visible as we're now logged in
1056     assert_select "div#friends-container" do
1057       assert_select "div.contact-activity", :count => 1
1058     end
1059
1060     # Login as a moderator
1061     session[:user] = create(:moderator_user).id
1062
1063     # Test the normal user
1064     get :show, :params => { :display_name => user.display_name }
1065     assert_response :success
1066     assert_select "div#userinformation" do
1067       assert_select "a[href^='/user/#{ERB::Util.u(user.display_name)}/history']", 1
1068       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/traces']", 1
1069       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary']", 1
1070       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/diary/comments']", 1
1071       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/account']", 0
1072       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks']", 0
1073       assert_select "a[href='/user/#{ERB::Util.u(user.display_name)}/blocks_by']", 0
1074       assert_select "a[href='/blocks/new/#{ERB::Util.u(user.display_name)}']", 1
1075     end
1076   end
1077
1078   # Test whether information about contributor terms is shown for users who haven't agreed
1079   def test_terms_not_agreed
1080     agreed_user = create(:user, :terms_agreed => 3.days.ago)
1081     seen_user = create(:user, :terms_seen => true, :terms_agreed => nil)
1082     not_seen_user = create(:user, :terms_seen => false, :terms_agreed => nil)
1083
1084     get :show, :params => { :display_name => agreed_user.display_name }
1085     assert_response :success
1086     assert_select "div#userinformation" do
1087       assert_select "p", :count => 0, :text => /Contributor terms/
1088     end
1089
1090     get :show, :params => { :display_name => seen_user.display_name }
1091     assert_response :success
1092     # put @response.body
1093     assert_select "div#userinformation" do
1094       assert_select "p", :count => 1, :text => /Contributor terms/
1095       assert_select "p", /Declined/
1096     end
1097
1098     get :show, :params => { :display_name => not_seen_user.display_name }
1099     assert_response :success
1100     assert_select "div#userinformation" do
1101       assert_select "p", :count => 1, :text => /Contributor terms/
1102       assert_select "p", /Undecided/
1103     end
1104   end
1105
1106   def test_make_friend
1107     # Get users to work with
1108     user = create(:user)
1109     friend = create(:user)
1110
1111     # Check that the users aren't already friends
1112     assert_nil Friendship.where(:befriender => user, :befriendee => friend).first
1113
1114     # When not logged in a GET should ask us to login
1115     get :make_friend, :params => { :display_name => friend.display_name }
1116     assert_redirected_to :action => "login", :referer => make_friend_path(:display_name => friend.display_name)
1117
1118     # When not logged in a POST should error
1119     post :make_friend, :params => { :display_name => friend.display_name }
1120     assert_response :forbidden
1121     assert_nil Friendship.where(:befriender => user, :befriendee => friend).first
1122
1123     # When logged in a GET should get a confirmation page
1124     get :make_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
1125     assert_response :success
1126     assert_template :make_friend
1127     assert_select "form" do
1128       assert_select "input[type='hidden'][name='referer']", 0
1129       assert_select "input[type='submit']", 1
1130     end
1131     assert_nil Friendship.where(:befriender => user, :befriendee => friend).first
1132
1133     # When logged in a POST should add the friendship
1134     assert_difference "ActionMailer::Base.deliveries.size", 1 do
1135       perform_enqueued_jobs do
1136         post :make_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
1137       end
1138     end
1139     assert_redirected_to user_path(friend)
1140     assert_match(/is now your friend/, flash[:notice])
1141     assert Friendship.where(:befriender => user, :befriendee => friend).first
1142     email = ActionMailer::Base.deliveries.first
1143     assert_equal 1, email.to.count
1144     assert_equal friend.email, email.to.first
1145     ActionMailer::Base.deliveries.clear
1146
1147     # A second POST should report that the friendship already exists
1148     assert_no_difference "ActionMailer::Base.deliveries.size" do
1149       perform_enqueued_jobs do
1150         post :make_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
1151       end
1152     end
1153     assert_redirected_to user_path(friend)
1154     assert_match(/You are already friends with/, flash[:warning])
1155     assert Friendship.where(:befriender => user, :befriendee => friend).first
1156   end
1157
1158   def test_make_friend_with_referer
1159     # Get users to work with
1160     user = create(:user)
1161     friend = create(:user)
1162
1163     # Check that the users aren't already friends
1164     assert_nil Friendship.where(:befriender => user, :befriendee => friend).first
1165
1166     # The GET should preserve any referer
1167     get :make_friend, :params => { :display_name => friend.display_name, :referer => "/test" }, :session => { :user => user }
1168     assert_response :success
1169     assert_template :make_friend
1170     assert_select "form" do
1171       assert_select "input[type='hidden'][name='referer'][value='/test']", 1
1172       assert_select "input[type='submit']", 1
1173     end
1174     assert_nil Friendship.where(:befriender => user, :befriendee => friend).first
1175
1176     # When logged in a POST should add the friendship and refer us
1177     assert_difference "ActionMailer::Base.deliveries.size", 1 do
1178       perform_enqueued_jobs do
1179         post :make_friend, :params => { :display_name => friend.display_name, :referer => "/test" }, :session => { :user => user }
1180       end
1181     end
1182     assert_redirected_to "/test"
1183     assert_match(/is now your friend/, flash[:notice])
1184     assert Friendship.where(:befriender => user, :befriendee => friend).first
1185     email = ActionMailer::Base.deliveries.first
1186     assert_equal 1, email.to.count
1187     assert_equal friend.email, email.to.first
1188     ActionMailer::Base.deliveries.clear
1189   end
1190
1191   def test_make_friend_unkown_user
1192     # Should error when a bogus user is specified
1193     get :make_friend, :params => { :display_name => "No Such User" }, :session => { :user => create(:user) }
1194     assert_response :not_found
1195     assert_template :no_such_user
1196   end
1197
1198   def test_remove_friend
1199     # Get users to work with
1200     user = create(:user)
1201     friend = create(:user)
1202     create(:friendship, :befriender => user, :befriendee => friend)
1203
1204     # Check that the users are friends
1205     assert Friendship.where(:befriender => user, :befriendee => friend).first
1206
1207     # When not logged in a GET should ask us to login
1208     get :remove_friend, :params => { :display_name => friend.display_name }
1209     assert_redirected_to :action => "login", :referer => remove_friend_path(:display_name => friend.display_name)
1210
1211     # When not logged in a POST should error
1212     post :remove_friend, :params => { :display_name => friend.display_name }
1213     assert_response :forbidden
1214     assert Friendship.where(:befriender => user, :befriendee => friend).first
1215
1216     # When logged in a GET should get a confirmation page
1217     get :remove_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
1218     assert_response :success
1219     assert_template :remove_friend
1220     assert_select "form" do
1221       assert_select "input[type='hidden'][name='referer']", 0
1222       assert_select "input[type='submit']", 1
1223     end
1224     assert Friendship.where(:befriender => user, :befriendee => friend).first
1225
1226     # When logged in a POST should remove the friendship
1227     post :remove_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
1228     assert_redirected_to user_path(friend)
1229     assert_match(/was removed from your friends/, flash[:notice])
1230     assert_nil Friendship.where(:befriender => user, :befriendee => friend).first
1231
1232     # A second POST should report that the friendship does not exist
1233     post :remove_friend, :params => { :display_name => friend.display_name }, :session => { :user => user }
1234     assert_redirected_to user_path(friend)
1235     assert_match(/is not one of your friends/, flash[:error])
1236     assert_nil Friendship.where(:befriender => user, :befriendee => friend).first
1237   end
1238
1239   def test_remove_friend_with_referer
1240     # Get users to work with
1241     user = create(:user)
1242     friend = create(:user)
1243     create(:friendship, :befriender => user, :befriendee => friend)
1244
1245     # Check that the users are friends
1246     assert Friendship.where(:befriender => user, :befriendee => friend).first
1247
1248     # The GET should preserve any referer
1249     get :remove_friend, :params => { :display_name => friend.display_name, :referer => "/test" }, :session => { :user => user }
1250     assert_response :success
1251     assert_template :remove_friend
1252     assert_select "form" do
1253       assert_select "input[type='hidden'][name='referer'][value='/test']", 1
1254       assert_select "input[type='submit']", 1
1255     end
1256     assert Friendship.where(:befriender => user, :befriendee => friend).first
1257
1258     # When logged in a POST should remove the friendship and refer
1259     post :remove_friend, :params => { :display_name => friend.display_name, :referer => "/test" }, :session => { :user => user }
1260     assert_redirected_to "/test"
1261     assert_match(/was removed from your friends/, flash[:notice])
1262     assert_nil Friendship.where(:befriender => user, :befriendee => friend).first
1263   end
1264
1265   def test_remove_friend_unkown_user
1266     # Should error when a bogus user is specified
1267     get :remove_friend, :params => { :display_name => "No Such User" }, :session => { :user => create(:user) }
1268     assert_response :not_found
1269     assert_template :no_such_user
1270   end
1271
1272   def test_set_status
1273     user = create(:user)
1274
1275     # Try without logging in
1276     get :set_status, :params => { :display_name => user.display_name, :status => "suspended" }
1277     assert_response :redirect
1278     assert_redirected_to :action => :login, :referer => set_status_user_path(:status => "suspended")
1279
1280     # Now try as a normal user
1281     get :set_status, :params => { :display_name => user.display_name, :status => "suspended" }, :session => { :user => user }
1282     assert_response :redirect
1283     assert_redirected_to :controller => :errors, :action => :forbidden
1284
1285     # Finally try as an administrator
1286     get :set_status, :params => { :display_name => user.display_name, :status => "suspended" }, :session => { :user => create(:administrator_user) }
1287     assert_response :redirect
1288     assert_redirected_to :action => :show, :display_name => user.display_name
1289     assert_equal "suspended", User.find(user.id).status
1290   end
1291
1292   def test_delete
1293     user = create(:user, :home_lat => 12.1, :home_lon => 12.1, :description => "test")
1294
1295     # Try without logging in
1296     get :delete, :params => { :display_name => user.display_name, :status => "suspended" }
1297     assert_response :redirect
1298     assert_redirected_to :action => :login, :referer => delete_user_path(:status => "suspended")
1299
1300     # Now try as a normal user
1301     get :delete, :params => { :display_name => user.display_name, :status => "suspended" }, :session => { :user => user }
1302     assert_response :redirect
1303     assert_redirected_to :controller => :errors, :action => :forbidden
1304
1305     # Finally try as an administrator
1306     get :delete, :params => { :display_name => user.display_name, :status => "suspended" }, :session => { :user => create(:administrator_user) }
1307     assert_response :redirect
1308     assert_redirected_to :action => :show, :display_name => user.display_name
1309
1310     # Check that the user was deleted properly
1311     user.reload
1312     assert_equal "user_#{user.id}", user.display_name
1313     assert_equal "", user.description
1314     assert_nil user.home_lat
1315     assert_nil user.home_lon
1316     assert_equal false, user.avatar.attached?
1317     assert_equal false, user.email_valid
1318     assert_nil user.new_email
1319     assert_nil user.auth_provider
1320     assert_nil user.auth_uid
1321     assert_equal "deleted", user.status
1322   end
1323
1324   def test_index_get
1325     user = create(:user)
1326     moderator_user = create(:moderator_user)
1327     administrator_user = create(:administrator_user)
1328     _suspended_user = create(:user, :suspended)
1329     _ip_user = create(:user, :creation_ip => "1.2.3.4")
1330
1331     # There are now 7 users - the five above, plus two extra "granters" for the
1332     # moderator_user and administrator_user
1333     assert_equal 7, User.count
1334
1335     # Shouldn't work when not logged in
1336     get :index
1337     assert_response :redirect
1338     assert_redirected_to :action => :login, :referer => users_path
1339
1340     session[:user] = user.id
1341
1342     # Shouldn't work when logged in as a normal user
1343     get :index
1344     assert_response :redirect
1345     assert_redirected_to :controller => :errors, :action => :forbidden
1346
1347     session[:user] = moderator_user.id
1348
1349     # Shouldn't work when logged in as a moderator
1350     get :index
1351     assert_response :redirect
1352     assert_redirected_to :controller => :errors, :action => :forbidden
1353
1354     session[:user] = administrator_user.id
1355
1356     # Note there is a header row, so all row counts are users + 1
1357     # Should work when logged in as an administrator
1358     get :index
1359     assert_response :success
1360     assert_template :index
1361     assert_select "table#user_list tr", :count => 7 + 1
1362
1363     # Should be able to limit by status
1364     get :index, :params => { :status => "suspended" }
1365     assert_response :success
1366     assert_template :index
1367     assert_select "table#user_list tr", :count => 1 + 1
1368
1369     # Should be able to limit by IP address
1370     get :index, :params => { :ip => "1.2.3.4" }
1371     assert_response :success
1372     assert_template :index
1373     assert_select "table#user_list tr", :count => 1 + 1
1374   end
1375
1376   def test_index_get_paginated
1377     1.upto(100).each do |n|
1378       User.create(:display_name => "extra_#{n}",
1379                   :email => "extra#{n}@example.com",
1380                   :pass_crypt => "extraextra")
1381     end
1382
1383     session[:user] = create(:administrator_user).id
1384
1385     # 100 examples, an administrator, and a granter for the admin.
1386     assert_equal 102, User.count
1387
1388     get :index
1389     assert_response :success
1390     assert_template :index
1391     assert_select "table#user_list tr", :count => 51
1392
1393     get :index, :params => { :page => 2 }
1394     assert_response :success
1395     assert_template :index
1396     assert_select "table#user_list tr", :count => 51
1397
1398     get :index, :params => { :page => 3 }
1399     assert_response :success
1400     assert_template :index
1401     assert_select "table#user_list tr", :count => 3
1402   end
1403
1404   def test_index_post_confirm
1405     inactive_user = create(:user, :pending)
1406     suspended_user = create(:user, :suspended)
1407
1408     # Shouldn't work when not logged in
1409     assert_no_difference "User.active.count" do
1410       post :index, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
1411     end
1412     assert_response :forbidden
1413
1414     assert_equal "pending", inactive_user.reload.status
1415     assert_equal "suspended", suspended_user.reload.status
1416
1417     session[:user] = create(:user).id
1418
1419     # Shouldn't work when logged in as a normal user
1420     assert_no_difference "User.active.count" do
1421       post :index, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
1422     end
1423     assert_response :redirect
1424     assert_redirected_to :controller => :errors, :action => :forbidden
1425     assert_equal "pending", inactive_user.reload.status
1426     assert_equal "suspended", suspended_user.reload.status
1427
1428     session[:user] = create(:moderator_user).id
1429
1430     # Shouldn't work when logged in as a moderator
1431     assert_no_difference "User.active.count" do
1432       post :index, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
1433     end
1434     assert_response :redirect
1435     assert_redirected_to :controller => :errors, :action => :forbidden
1436     assert_equal "pending", inactive_user.reload.status
1437     assert_equal "suspended", suspended_user.reload.status
1438
1439     session[:user] = create(:administrator_user).id
1440
1441     # Should work when logged in as an administrator
1442     assert_difference "User.active.count", 2 do
1443       post :index, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
1444     end
1445     assert_response :redirect
1446     assert_redirected_to :action => :index
1447     assert_equal "confirmed", inactive_user.reload.status
1448     assert_equal "confirmed", suspended_user.reload.status
1449   end
1450
1451   def test_index_post_hide
1452     normal_user = create(:user)
1453     confirmed_user = create(:user, :confirmed)
1454
1455     # Shouldn't work when not logged in
1456     assert_no_difference "User.active.count" do
1457       post :index, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
1458     end
1459     assert_response :forbidden
1460
1461     assert_equal "active", normal_user.reload.status
1462     assert_equal "confirmed", confirmed_user.reload.status
1463
1464     session[:user] = create(:user).id
1465
1466     # Shouldn't work when logged in as a normal user
1467     assert_no_difference "User.active.count" do
1468       post :index, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
1469     end
1470     assert_response :redirect
1471     assert_redirected_to :controller => :errors, :action => :forbidden
1472     assert_equal "active", normal_user.reload.status
1473     assert_equal "confirmed", confirmed_user.reload.status
1474
1475     session[:user] = create(:moderator_user).id
1476
1477     # Shouldn't work when logged in as a moderator
1478     assert_no_difference "User.active.count" do
1479       post :index, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
1480     end
1481     assert_response :redirect
1482     assert_redirected_to :controller => :errors, :action => :forbidden
1483     assert_equal "active", normal_user.reload.status
1484     assert_equal "confirmed", confirmed_user.reload.status
1485
1486     session[:user] = create(:administrator_user).id
1487
1488     # Should work when logged in as an administrator
1489     assert_difference "User.active.count", -2 do
1490       post :index, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
1491     end
1492     assert_response :redirect
1493     assert_redirected_to :action => :index
1494     assert_equal "deleted", normal_user.reload.status
1495     assert_equal "deleted", confirmed_user.reload.status
1496   end
1497 end