]> git.openstreetmap.org Git - rails.git/blob - test/integration/user_creation_test.rb
Add frozen_string_literal comments to ruby files
[rails.git] / test / integration / user_creation_test.rb
1 # frozen_string_literal: true
2
3 require "test_helper"
4
5 class UserCreationTest < ActionDispatch::IntegrationTest
6   def setup
7     OmniAuth.config.test_mode = true
8
9     stub_request(:get, /.*gravatar.com.*d=404/).to_return(:status => 404)
10   end
11
12   def teardown
13     OmniAuth.config.mock_auth[:google] = nil
14     OmniAuth.config.mock_auth[:apple] = nil
15     OmniAuth.config.mock_auth[:facebook] = nil
16     OmniAuth.config.mock_auth[:microsoft] = nil
17     OmniAuth.config.mock_auth[:github] = nil
18     OmniAuth.config.mock_auth[:wikipedia] = nil
19     OmniAuth.config.test_mode = false
20   end
21
22   def test_create_user_form
23     get "/user/new"
24     follow_redirect!
25     assert_response :success
26     assert_template "users/new"
27   end
28
29   def test_user_create_submit_duplicate_email
30     dup_email = create(:user).email
31     display_name = "new_tester"
32     assert_difference("User.count", 0) do
33       assert_difference("ActionMailer::Base.deliveries.size", 0) do
34         perform_enqueued_jobs do
35           post "/user",
36                :params => { :user => { :email => dup_email,
37                                        :display_name => display_name,
38                                        :pass_crypt => "testtest",
39                                        :pass_crypt_confirmation => "testtest" } }
40         end
41       end
42     end
43     assert_response :success
44     assert_template "users/new"
45     assert_select "form"
46     assert_select "form > div > input.is-invalid#user_email"
47   end
48
49   def test_user_create_association_submit_duplicate_email
50     dup_email = create(:user).email
51     display_name = "new_tester"
52     assert_difference("User.count", 0) do
53       assert_no_difference("ActionMailer::Base.deliveries.size") do
54         perform_enqueued_jobs do
55           post "/user",
56                :params => { :user => { :email => dup_email,
57                                        :display_name => display_name,
58                                        :pass_crypt => "testtest",
59                                        :pass_crypt_confirmation => "testtest",
60                                        :auth_provider => "google",
61                                        :auth_uid => "123454321" } }
62         end
63       end
64     end
65     assert_response :success
66     assert_template "users/new"
67     assert_select "form"
68     assert_select "form > div > input.is-invalid#user_email"
69   end
70
71   def test_user_create_submit_duplicate_username
72     dup_display_name = create(:user).display_name
73     email = "new_tester"
74     assert_difference("User.count", 0) do
75       assert_difference("ActionMailer::Base.deliveries.size", 0) do
76         perform_enqueued_jobs do
77           post "/user",
78                :params => { :user => { :email => email,
79                                        :display_name => dup_display_name,
80                                        :pass_crypt => "testtest",
81                                        :pass_crypt_confirmation => "testtest" } }
82         end
83       end
84     end
85     assert_response :success
86     assert_template "users/new"
87     assert_select "form > div > input.is-invalid#user_display_name"
88   end
89
90   def test_user_create_submit_mismatched_passwords
91     email = "newtester@osm.org"
92     display_name = "new_tester"
93     assert_difference("User.count", 0) do
94       assert_difference("ActionMailer::Base.deliveries.size", 0) do
95         perform_enqueued_jobs do
96           post "/user",
97                :params => { :user => { :email => email,
98                                        :display_name => display_name,
99                                        :pass_crypt => "testtest",
100                                        :pass_crypt_confirmation => "blahblah" } }
101         end
102       end
103     end
104     assert_response :success
105     assert_template "users/new"
106     assert_select "form > div > div > div > input.is-invalid#user_pass_crypt_confirmation"
107   end
108
109   def test_user_create_association_submit_duplicate_username
110     dup_display_name = create(:user).display_name
111     email = "new_tester"
112     assert_difference("User.count", 0) do
113       assert_no_difference("ActionMailer::Base.deliveries.size") do
114         perform_enqueued_jobs do
115           post "/user",
116                :params => { :user => { :email => email,
117                                        :display_name => dup_display_name,
118                                        :auth_provider => "google",
119                                        :auth_uid => "123454321" } }
120         end
121       end
122     end
123     assert_response :success
124     assert_template "users/new"
125     assert_select "form > div > input.is-invalid#user_display_name"
126   end
127
128   def test_user_create_success
129     new_email = "newtester@osm.org"
130     display_name = "new_tester"
131
132     assert_difference("User.count", 1) do
133       assert_difference("ActionMailer::Base.deliveries.size", 1) do
134         perform_enqueued_jobs do
135           post "/user",
136                :params => { :user => { :email => new_email,
137                                        :display_name => display_name,
138                                        :pass_crypt => "testtest",
139                                        :pass_crypt_confirmation => "testtest" } }
140           assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
141           follow_redirect!
142         end
143       end
144     end
145
146     assert_response :success
147     assert_template "confirmations/confirm"
148
149     user = User.find_by(:email => "newtester@osm.org")
150     assert_not_nil user
151     assert_not_predicate user, :active?
152
153     register_email = ActionMailer::Base.deliveries.first
154     assert_equal register_email.to.first, new_email
155     found_confirmation_url = register_email.parts.first.parts.first.to_s =~ %r{\shttp://test.host(/\S+)\s}
156     assert found_confirmation_url
157     confirmation_url = Regexp.last_match(1)
158
159     post confirmation_url
160
161     assert_redirected_to welcome_path
162
163     user.reload
164     assert_predicate user, :active?
165
166     assert_equal user, User.authenticate(:username => new_email, :password => "testtest")
167   end
168
169   # Check that the user can successfully recover their password
170   # def test_lost_password_recovery_success
171   #   Open the lost password form
172   #   Submit the lost password form
173   #   Check the e-mail
174   #   Submit the reset password token
175   #   Check that the password has changed, and the user can login
176   # end
177
178   def test_user_create_redirect
179     new_email = "redirect_tester@osm.org"
180     display_name = "redirect_tester"
181     password = "testtest"
182     # nothing special about this page, just need a protected page to redirect back to.
183     referer = "/traces/mine"
184     assert_difference("User.count") do
185       assert_difference("ActionMailer::Base.deliveries.size", 1) do
186         perform_enqueued_jobs do
187           post "/user",
188                :params => { :user => { :email => new_email,
189                                        :display_name => display_name,
190                                        :pass_crypt => password,
191                                        :pass_crypt_confirmation => password },
192                             :referer => referer }
193           assert_response(:redirect)
194           assert_redirected_to :controller => :confirmations, :action => :confirm, :display_name => display_name
195           follow_redirect!
196         end
197       end
198     end
199
200     # Check the e-mail
201     register_email = ActionMailer::Base.deliveries.first
202
203     assert_equal register_email.to.first, new_email
204     # Check that the confirm account url is correct
205     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
206     email_text_parts(register_email).each do |part|
207       assert_match confirm_regex, part.body.to_s
208     end
209     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
210
211     # Check the page
212     assert_response :success
213     assert_template "confirmations/confirm"
214
215     # Go to the confirmation page
216     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
217     assert_response :success
218     assert_template "confirmations/confirm"
219
220     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
221     assert_response :redirect
222     follow_redirect!
223     assert_response :success
224     assert_template "site/welcome"
225   end
226
227   def test_user_create_google_success
228     new_email = "newtester-google@osm.org"
229     email_hmac = UsersController.message_hmac(new_email)
230     display_name = "new_tester-google"
231     auth_uid = "123454321"
232
233     OmniAuth.config.add_mock(:google,
234                              :uid => auth_uid,
235                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
236                              :info => { :email => new_email, :name => display_name })
237
238     assert_difference("User.count") do
239       assert_no_difference("ActionMailer::Base.deliveries.size") do
240         perform_enqueued_jobs do
241           post auth_path(:provider => "google", :origin => "/user/new")
242           assert_redirected_to auth_success_path(:provider => "google")
243           follow_redirect!
244           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
245                                :email => new_email, :email_hmac => email_hmac,
246                                :auth_provider => "google", :auth_uid => auth_uid
247           follow_redirect!
248
249           post "/user",
250                :params => { :user => { :email => new_email,
251                                        :display_name => display_name,
252                                        :auth_provider => "google",
253                                        :auth_uid => auth_uid },
254                             :email_hmac => email_hmac }
255           assert_redirected_to welcome_path
256           follow_redirect!
257         end
258       end
259     end
260
261     # Check the page
262     assert_response :success
263     assert_template "site/welcome"
264   end
265
266   def test_user_create_google_duplicate_email
267     dup_user = create(:user)
268     display_name = "new_tester-google"
269     auth_uid = "123454321"
270
271     OmniAuth.config.add_mock(:google,
272                              :uid => auth_uid,
273                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
274                              :info => { :email => dup_user.email, :name => display_name })
275
276     post auth_path(:provider => "google", :origin => "/user/new")
277     assert_redirected_to auth_success_path(:provider => "google")
278     follow_redirect!
279     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
280                          :email_hmac => UsersController.message_hmac(dup_user.email),
281                          :auth_provider => "google", :auth_uid => auth_uid
282     follow_redirect!
283
284     assert_response :success
285     assert_template "users/new"
286     assert_select "form > div > input.is-invalid#user_email"
287   end
288
289   def test_user_create_google_failure
290     OmniAuth.config.mock_auth[:google] = :connection_failed
291
292     assert_difference("User.count", 0) do
293       assert_difference("ActionMailer::Base.deliveries.size", 0) do
294         perform_enqueued_jobs do
295           post auth_path(:provider => "google", :origin => "/user/new")
296           assert_response :redirect
297           follow_redirect!
298           assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/user/new")
299           follow_redirect!
300           assert_redirected_to "/user/new"
301         end
302       end
303     end
304   end
305
306   def test_user_create_google_redirect
307     orig_email = "redirect_tester_google_orig@google.com"
308     email_hmac = UsersController.message_hmac(orig_email)
309     new_email =  "redirect_tester_google@osm.org"
310     display_name = "redirect_tester_google"
311     auth_uid = "123454321"
312
313     OmniAuth.config.add_mock(:google,
314                              :uid => auth_uid,
315                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
316                              :info => { :email => orig_email, :name => display_name })
317
318     assert_difference("User.count") do
319       assert_difference("ActionMailer::Base.deliveries.size", 1) do
320         perform_enqueued_jobs do
321           post auth_path(:provider => "google", :origin => "/user/new")
322           assert_redirected_to auth_success_path(:provider => "google")
323           follow_redirect!
324           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
325                                :email => orig_email, :email_hmac => email_hmac,
326                                :auth_provider => "google", :auth_uid => auth_uid
327           follow_redirect!
328           post "/user",
329                :params => { :user => { :email => new_email,
330                                        :email_hmac => email_hmac,
331                                        :display_name => display_name,
332                                        :auth_provider => "google",
333                                        :auth_uid => auth_uid } }
334           assert_response :redirect
335           follow_redirect!
336         end
337       end
338     end
339
340     # Check the e-mail
341     register_email = ActionMailer::Base.deliveries.first
342
343     assert_equal register_email.to.first, new_email
344     # Check that the confirm account url is correct
345     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
346     email_text_parts(register_email).each do |part|
347       assert_match confirm_regex, part.body.to_s
348     end
349     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
350
351     # Check the page
352     assert_response :success
353     assert_template "confirmations/confirm"
354
355     # Go to the confirmation page
356     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
357     assert_response :success
358     assert_template "confirmations/confirm"
359
360     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
361     assert_response :redirect
362     follow_redirect!
363     assert_response :success
364     assert_template "site/welcome"
365   end
366
367   def test_user_create_apple_success
368     new_email = "newtester-apple@osm.org"
369     email_hmac = UsersController.message_hmac(new_email)
370     display_name = "new_tester-apple"
371     auth_uid = "123454321"
372
373     OmniAuth.config.add_mock(:apple,
374                              :uid => auth_uid,
375                              :info => { :email => new_email, :name => display_name })
376
377     assert_difference("User.count") do
378       assert_no_difference("ActionMailer::Base.deliveries.size") do
379         perform_enqueued_jobs do
380           post auth_path(:provider => "apple", :origin => "/user/new")
381           assert_redirected_to auth_success_path(:provider => "apple")
382           follow_redirect!
383           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
384                                :email => new_email, :email_hmac => email_hmac,
385                                :auth_provider => "apple", :auth_uid => auth_uid
386           post "/user",
387                :params => { :user => { :email => new_email,
388                                        :display_name => display_name,
389                                        :auth_provider => "apple",
390                                        :auth_uid => auth_uid },
391                             :email_hmac => email_hmac }
392           assert_redirected_to welcome_path
393           follow_redirect!
394         end
395       end
396     end
397
398     # Check the page
399     assert_response :success
400     assert_template "site/welcome"
401
402     ActionMailer::Base.deliveries.clear
403   end
404
405   def test_user_create_apple_duplicate_email
406     dup_user = create(:user)
407     display_name = "new_tester-apple"
408     auth_uid = "123454321"
409
410     OmniAuth.config.add_mock(:apple,
411                              :uid => auth_uid,
412                              :info => { :email => dup_user.email, :name => display_name })
413
414     post auth_path(:provider => "apple", :origin => "/user/new")
415     assert_redirected_to auth_success_path(:provider => "apple")
416     follow_redirect!
417     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
418                          :email_hmac => UsersController.message_hmac(dup_user.email),
419                          :auth_provider => "apple", :auth_uid => auth_uid
420     follow_redirect!
421
422     assert_response :success
423     assert_template "users/new"
424     assert_select "form > div > input.is-invalid#user_email"
425
426     ActionMailer::Base.deliveries.clear
427   end
428
429   def test_user_create_apple_failure
430     OmniAuth.config.mock_auth[:apple] = :connection_failed
431
432     assert_difference("User.count", 0) do
433       assert_difference("ActionMailer::Base.deliveries.size", 0) do
434         perform_enqueued_jobs do
435           post auth_path(:provider => "apple", :origin => "/user/new")
436           assert_response :redirect
437           follow_redirect!
438           assert_redirected_to auth_failure_path(:strategy => "apple", :message => "connection_failed", :origin => "/user/new")
439           follow_redirect!
440           assert_redirected_to "/user/new"
441         end
442       end
443     end
444
445     ActionMailer::Base.deliveries.clear
446   end
447
448   def test_user_create_apple_redirect
449     orig_email = "redirect_tester_apple_orig@apple.com"
450     email_hmac = UsersController.message_hmac(orig_email)
451     new_email =  "redirect_tester_apple@osm.org"
452     display_name = "redirect_tester_apple"
453     auth_uid = "123454321"
454
455     OmniAuth.config.add_mock(:apple,
456                              :uid => auth_uid,
457                              :info => { :email => orig_email, :name => display_name })
458
459     assert_difference("User.count") do
460       assert_difference("ActionMailer::Base.deliveries.size", 1) do
461         perform_enqueued_jobs do
462           post auth_path(:provider => "apple", :origin => "/user/new")
463           assert_redirected_to auth_success_path(:provider => "apple")
464           follow_redirect!
465           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
466                                :email => orig_email, :email_hmac => email_hmac,
467                                :auth_provider => "apple", :auth_uid => auth_uid
468           follow_redirect!
469           post "/user",
470                :params => { :user => { :email => new_email,
471                                        :email_hmac => email_hmac,
472                                        :display_name => display_name,
473                                        :auth_provider => "apple",
474                                        :auth_uid => auth_uid } }
475           assert_response :redirect
476           follow_redirect!
477         end
478       end
479     end
480
481     # Check the e-mail
482     register_email = ActionMailer::Base.deliveries.first
483
484     assert_equal register_email.to.first, new_email
485     # Check that the confirm account url is correct
486     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
487     email_text_parts(register_email).each do |part|
488       assert_match confirm_regex, part.body.to_s
489     end
490     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
491
492     # Check the page
493     assert_response :success
494     assert_template "confirmations/confirm"
495
496     ActionMailer::Base.deliveries.clear
497
498     # Go to the confirmation page
499     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
500     assert_response :success
501     assert_template "confirmations/confirm"
502
503     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
504     assert_response :redirect
505     follow_redirect!
506     assert_response :success
507     assert_template "site/welcome"
508   end
509
510   def test_user_create_facebook_success
511     new_email = "newtester-facebook@osm.org"
512     email_hmac = UsersController.message_hmac(new_email)
513     display_name = "new_tester-facebook"
514     auth_uid = "123454321"
515
516     OmniAuth.config.add_mock(:facebook,
517                              :uid => auth_uid,
518                              :info => { "email" => new_email, :name => display_name })
519
520     assert_difference("User.count") do
521       assert_no_difference("ActionMailer::Base.deliveries.size") do
522         perform_enqueued_jobs do
523           post auth_path(:provider => "facebook", :origin => "/user/new")
524           assert_redirected_to auth_success_path(:provider => "facebook")
525           follow_redirect!
526           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
527                                :email => new_email, :email_hmac => email_hmac,
528                                :auth_provider => "facebook", :auth_uid => auth_uid
529           follow_redirect!
530
531           post "/user",
532                :params => { :user => { :email => new_email,
533                                        :display_name => display_name,
534                                        :auth_provider => "facebook",
535                                        :auth_uid => auth_uid },
536                             :email_hmac => email_hmac }
537           assert_redirected_to welcome_path
538           follow_redirect!
539         end
540       end
541     end
542
543     # Check the page
544     assert_response :success
545     assert_template "site/welcome"
546   end
547
548   def test_user_create_facebook_duplicate_email
549     dup_user = create(:user)
550     display_name = "new_tester-facebook"
551     auth_uid = "123454321"
552
553     OmniAuth.config.add_mock(:facebook,
554                              :uid => auth_uid,
555                              :info => { :email => dup_user.email, :name => display_name })
556
557     post auth_path(:provider => "facebook", :origin => "/user/new")
558     assert_redirected_to auth_success_path(:provider => "facebook")
559     follow_redirect!
560     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
561                          :email_hmac => UsersController.message_hmac(dup_user.email),
562                          :auth_provider => "facebook", :auth_uid => auth_uid
563     follow_redirect!
564
565     assert_response :success
566     assert_template "users/new"
567     assert_select "form > div > input.is-invalid#user_email"
568   end
569
570   def test_user_create_facebook_failure
571     OmniAuth.config.mock_auth[:facebook] = :connection_failed
572
573     assert_difference("User.count", 0) do
574       assert_difference("ActionMailer::Base.deliveries.size", 0) do
575         perform_enqueued_jobs do
576           post auth_path(:provider => "facebook", :origin => "/user/new")
577           assert_response :redirect
578           follow_redirect!
579           assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/user/new")
580           follow_redirect!
581           assert_redirected_to "/user/new"
582         end
583       end
584     end
585   end
586
587   def test_user_create_facebook_redirect
588     orig_email = "redirect_tester_facebook_orig@osm.org"
589     email_hmac = UsersController.message_hmac(orig_email)
590     new_email = "redirect_tester_facebook@osm.org"
591     display_name = "redirect_tester_facebook"
592     auth_uid = "123454321"
593
594     OmniAuth.config.add_mock(:facebook,
595                              :uid => auth_uid,
596                              :info => { :email => orig_email, :name => display_name })
597
598     # nothing special about this page, just need a protected page to redirect back to.
599     assert_difference("User.count") do
600       assert_difference("ActionMailer::Base.deliveries.size", 1) do
601         perform_enqueued_jobs do
602           post auth_path(:provider => "facebook", :origin => "/user/new")
603           assert_redirected_to auth_success_path(:provider => "facebook")
604           follow_redirect!
605           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
606                                :email => orig_email, :email_hmac => email_hmac,
607                                :auth_provider => "facebook", :auth_uid => auth_uid
608           follow_redirect!
609
610           post "/user",
611                :params => { :user => { :email => new_email,
612                                        :email_hmac => email_hmac,
613                                        :display_name => display_name,
614                                        :auth_provider => "facebook",
615                                        :auth_uid => auth_uid } }
616           assert_response :redirect
617           follow_redirect!
618         end
619       end
620     end
621
622     # Check the e-mail
623     register_email = ActionMailer::Base.deliveries.first
624
625     assert_equal register_email.to.first, new_email
626     # Check that the confirm account url is correct
627     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
628     email_text_parts(register_email).each do |part|
629       assert_match confirm_regex, part.body.to_s
630     end
631     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
632
633     # Check the page
634     assert_response :success
635     assert_template "confirmations/confirm"
636
637     # Go to the confirmation page
638     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
639     assert_response :success
640     assert_template "confirmations/confirm"
641
642     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
643     assert_response :redirect
644     follow_redirect!
645     assert_response :success
646     assert_template "site/welcome"
647   end
648
649   def test_user_create_microsoft_success
650     new_email = "newtester-microsoft@osm.org"
651     email_hmac = UsersController.message_hmac(new_email)
652     display_name = "new_tester-microsoft"
653     auth_uid = "123454321"
654
655     OmniAuth.config.add_mock(:microsoft,
656                              :uid => auth_uid,
657                              :info => { "email" => new_email, :name => display_name })
658
659     assert_difference("User.count") do
660       assert_difference("ActionMailer::Base.deliveries.size", 0) do
661         perform_enqueued_jobs do
662           post auth_path(:provider => "microsoft", :origin => "/user/new")
663           assert_redirected_to auth_success_path(:provider => "microsoft")
664           follow_redirect!
665           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
666                                :email => new_email, :email_hmac => email_hmac,
667                                :auth_provider => "microsoft", :auth_uid => auth_uid
668           follow_redirect!
669           post "/user",
670                :params => { :user => { :email => new_email,
671                                        :display_name => display_name,
672                                        :auth_provider => "microsoft",
673                                        :auth_uid => auth_uid },
674                             :email_hmac => email_hmac }
675           assert_redirected_to welcome_path
676           follow_redirect!
677         end
678       end
679     end
680
681     # Check the page
682     assert_response :success
683     assert_template "site/welcome"
684   end
685
686   def test_user_create_microsoft_duplicate_email
687     dup_user = create(:user)
688     display_name = "new_tester-microsoft"
689     auth_uid = "123454321"
690
691     OmniAuth.config.add_mock(:microsoft,
692                              :uid => auth_uid,
693                              :info => { :email => dup_user.email, :name => display_name })
694
695     post auth_path(:provider => "microsoft", :origin => "/user/new")
696     assert_redirected_to auth_success_path(:provider => "microsoft")
697     follow_redirect!
698     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name, :email => dup_user.email,
699                          :email_hmac => UsersController.message_hmac(dup_user.email),
700                          :auth_provider => "microsoft", :auth_uid => auth_uid
701     follow_redirect!
702
703     assert_response :success
704     assert_template "users/new"
705     assert_select "form > div > input.is-invalid#user_email"
706   end
707
708   def test_user_create_microsoft_failure
709     OmniAuth.config.mock_auth[:microsoft] = :connection_failed
710
711     assert_difference("User.count", 0) do
712       assert_difference("ActionMailer::Base.deliveries.size", 0) do
713         perform_enqueued_jobs do
714           post auth_path(:provider => "microsoft", :origin => "/user/new")
715           assert_response :redirect
716           follow_redirect!
717           assert_redirected_to auth_failure_path(:strategy => "microsoft", :message => "connection_failed", :origin => "/user/new")
718           follow_redirect!
719           assert_redirected_to "/user/new"
720         end
721       end
722     end
723   end
724
725   def test_user_create_microsoft_redirect
726     orig_email = "redirect_tester_microsoft_orig@osm.org"
727     email_hmac = UsersController.message_hmac(orig_email)
728     new_email = "redirect_tester_microsoft@osm.org"
729     display_name = "redirect_tester_microsoft"
730     auth_uid = "123454321"
731
732     OmniAuth.config.add_mock(:microsoft,
733                              :uid => auth_uid,
734                              :info => { :email => orig_email, :name => display_name })
735
736     assert_difference("User.count") do
737       assert_difference("ActionMailer::Base.deliveries.size", 1) do
738         perform_enqueued_jobs do
739           post auth_path(:provider => "microsoft", :origin => "/user/new")
740           assert_redirected_to auth_success_path(:provider => "microsoft")
741           follow_redirect!
742           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
743                                :email => orig_email, :email_hmac => email_hmac,
744                                :auth_provider => "microsoft", :auth_uid => auth_uid
745           follow_redirect!
746
747           post "/user",
748                :params => { :user => { :email => new_email,
749                                        :email_hmac => email_hmac,
750                                        :display_name => display_name,
751                                        :auth_provider => "microsoft",
752                                        :auth_uid => auth_uid } }
753           assert_response :redirect
754           follow_redirect!
755         end
756       end
757     end
758
759     # Check the e-mail
760     register_email = ActionMailer::Base.deliveries.first
761
762     assert_equal register_email.to.first, new_email
763     # Check that the confirm account url is correct
764     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
765     email_text_parts(register_email).each do |part|
766       assert_match confirm_regex, part.body.to_s
767     end
768     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
769
770     # Check the page
771     assert_response :success
772     assert_template "confirmations/confirm"
773
774     # Go to the confirmation page
775     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
776     assert_response :success
777     assert_template "confirmations/confirm"
778
779     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
780     assert_response :redirect
781     follow_redirect!
782     assert_response :success
783     assert_template "site/welcome"
784   end
785
786   def test_user_create_github_success
787     new_email = "newtester-github@osm.org"
788     email_hmac = UsersController.message_hmac(new_email)
789     display_name = "new_tester-github"
790     password = "testtest"
791     auth_uid = "123454321"
792
793     OmniAuth.config.add_mock(:github,
794                              :uid => auth_uid,
795                              :info => { "email" => new_email, :name => display_name })
796
797     assert_difference("User.count") do
798       assert_no_difference("ActionMailer::Base.deliveries.size") do
799         perform_enqueued_jobs do
800           post auth_path(:provider => "github", :origin => "/user/new")
801           assert_redirected_to auth_success_path(:provider => "github")
802           follow_redirect!
803           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
804                                :email => new_email, :email_hmac => email_hmac,
805                                :auth_provider => "github", :auth_uid => auth_uid
806           follow_redirect!
807
808           post "/user",
809                :params => { :user => { :email => new_email,
810                                        :display_name => display_name,
811                                        :auth_provider => "github",
812                                        :auth_uid => "123454321",
813                                        :pass_crypt => password,
814                                        :pass_crypt_confirmation => password },
815                             :read_ct => 1,
816                             :read_tou => 1,
817                             :email_hmac => email_hmac }
818           assert_redirected_to welcome_path
819           follow_redirect!
820         end
821       end
822     end
823
824     # Check the page
825     assert_response :success
826     assert_template "site/welcome"
827   end
828
829   def test_user_create_github_duplicate_email
830     dup_user = create(:user)
831     display_name = "new_tester-github"
832     auth_uid = "123454321"
833
834     OmniAuth.config.add_mock(:github,
835                              :uid => auth_uid,
836                              :extra => { :id_info => { :openid_id => "http://localhost:1123/new.tester" } },
837                              :info => { :email => dup_user.email, :name => display_name })
838
839     post auth_path(:provider => "github", :origin => "/user/new")
840     assert_redirected_to auth_success_path(:provider => "github")
841     follow_redirect!
842     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
843                          :email => dup_user.email, :email_hmac => UsersController.message_hmac(dup_user.email),
844                          :auth_provider => "github", :auth_uid => auth_uid
845     follow_redirect!
846
847     assert_response :success
848     assert_template "users/new"
849     assert_select "form > div > input.is-invalid#user_email"
850   end
851
852   def test_user_create_github_failure
853     OmniAuth.config.mock_auth[:github] = :connection_failed
854
855     assert_difference("User.count", 0) do
856       assert_difference("ActionMailer::Base.deliveries.size", 0) do
857         perform_enqueued_jobs do
858           post auth_path(:provider => "github", :origin => "/user/new")
859           follow_redirect!
860           assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/user/new")
861           follow_redirect!
862           assert_redirected_to "/user/new"
863         end
864       end
865     end
866   end
867
868   def test_user_create_github_redirect
869     orig_email = "redirect_tester_github_orig@osm.org"
870     email_hmac = UsersController.message_hmac(orig_email)
871     new_email = "redirect_tester_github@osm.org"
872     display_name = "redirect_tester_github"
873     auth_uid = "123454321"
874
875     OmniAuth.config.add_mock(:github,
876                              :uid => auth_uid,
877                              :info => { :email => orig_email, :name => display_name })
878
879     assert_difference("User.count") do
880       assert_difference("ActionMailer::Base.deliveries.size", 1) do
881         perform_enqueued_jobs do
882           post auth_path(:provider => "github", :origin => "/user/new")
883           assert_redirected_to auth_success_path(:provider => "github")
884           follow_redirect!
885           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
886                                :email => orig_email, :email_hmac => email_hmac,
887                                :auth_provider => "github", :auth_uid => auth_uid
888           follow_redirect!
889           post "/user",
890                :params => { :user => { :email => new_email,
891                                        :email_hmac => email_hmac,
892                                        :display_name => display_name,
893                                        :auth_provider => "github",
894                                        :auth_uid => auth_uid } }
895           assert_response :redirect
896           follow_redirect!
897         end
898       end
899     end
900
901     # Check the e-mail
902     register_email = ActionMailer::Base.deliveries.first
903
904     assert_equal register_email.to.first, new_email
905     # Check that the confirm account url is correct
906     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
907     email_text_parts(register_email).each do |part|
908       assert_match confirm_regex, part.body.to_s
909     end
910     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
911
912     # Check the page
913     assert_response :success
914     assert_template "confirmations/confirm"
915
916     # Go to the confirmation page
917     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
918     assert_response :success
919     assert_template "confirmations/confirm"
920
921     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
922     assert_response :redirect
923     follow_redirect!
924     assert_response :success
925     assert_template "site/welcome"
926   end
927
928   def test_user_create_wikipedia_success
929     new_email = "newtester-wikipedia@osm.org"
930     email_hmac = UsersController.message_hmac(new_email)
931     display_name = "new_tester-wikipedia"
932     password = "testtest"
933     auth_uid = "123454321"
934
935     OmniAuth.config.add_mock(:wikipedia,
936                              :uid => auth_uid,
937                              :info => { :email => new_email, :name => display_name })
938
939     assert_difference("User.count") do
940       assert_no_difference("ActionMailer::Base.deliveries.size") do
941         perform_enqueued_jobs do
942           post auth_path(:provider => "wikipedia", :origin => "/user/new")
943           assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
944           follow_redirect!
945           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
946                                :email => new_email, :email_hmac => email_hmac,
947                                :auth_provider => "wikipedia", :auth_uid => auth_uid
948           follow_redirect!
949           post "/user",
950                :params => { :user => { :email => new_email,
951                                        :display_name => display_name,
952                                        :auth_provider => "wikipedia",
953                                        :auth_uid => "123454321",
954                                        :pass_crypt => password,
955                                        :pass_crypt_confirmation => password },
956                             :read_ct => 1,
957                             :read_tou => 1,
958                             :email_hmac => email_hmac }
959           assert_redirected_to welcome_path
960           follow_redirect!
961         end
962       end
963     end
964
965     # Check the page
966     assert_response :success
967     assert_template "site/welcome"
968   end
969
970   def test_user_create_wikipedia_duplicate_email
971     dup_user = create(:user)
972     display_name = "new_tester-wikipedia"
973     auth_uid = "123454321"
974
975     OmniAuth.config.add_mock(:wikipedia,
976                              :uid => auth_uid,
977                              :info => { "email" => dup_user.email, :name => display_name })
978
979     post auth_path(:provider => "wikipedia", :origin => "/user/new")
980     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
981     follow_redirect!
982     assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
983                          :email => dup_user.email, :email_hmac => UsersController.message_hmac(dup_user.email),
984                          :auth_provider => "wikipedia", :auth_uid => auth_uid
985     follow_redirect!
986
987     assert_response :success
988     assert_template "users/new"
989     assert_select "form > div > input.is-invalid#user_email"
990   end
991
992   def test_user_create_wikipedia_failure
993     OmniAuth.config.mock_auth[:wikipedia] = :connection_failed
994
995     assert_difference("User.count", 0) do
996       assert_difference("ActionMailer::Base.deliveries.size", 0) do
997         perform_enqueued_jobs do
998           post auth_path(:provider => "wikipedia", :origin => "/user/new")
999           assert_response :redirect
1000           follow_redirect!
1001           assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "connection_failed", :origin => "/user/new")
1002           follow_redirect!
1003           assert_redirected_to "/user/new"
1004         end
1005       end
1006     end
1007   end
1008
1009   def test_user_create_wikipedia_redirect
1010     orig_email = "redirect_tester_wikipedia_orig@osm.org"
1011     email_hmac = UsersController.message_hmac(orig_email)
1012     new_email = "redirect_tester_wikipedia@osm.org"
1013     display_name = "redirect_tester_wikipedia"
1014     auth_uid = "123454321"
1015
1016     OmniAuth.config.add_mock(:wikipedia,
1017                              :uid => auth_uid,
1018                              :info => { :email => orig_email, :name => display_name })
1019
1020     # nothing special about this page, just need a protected page to redirect back to.
1021     assert_difference("User.count") do
1022       assert_difference("ActionMailer::Base.deliveries.size", 1) do
1023         perform_enqueued_jobs do
1024           post auth_path(:provider => "wikipedia", :origin => "/user/new")
1025           assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/user/new")
1026           follow_redirect!
1027           assert_redirected_to :controller => :users, :action => "new", :nickname => display_name,
1028                                :email => orig_email, :email_hmac => email_hmac,
1029                                :auth_provider => "wikipedia", :auth_uid => auth_uid
1030           follow_redirect!
1031
1032           post "/user",
1033                :params => { :user => { :email => new_email,
1034                                        :email_hmac => email_hmac,
1035                                        :display_name => display_name,
1036                                        :auth_provider => "wikipedia",
1037                                        :auth_uid => auth_uid } }
1038           assert_response :redirect
1039           follow_redirect!
1040         end
1041       end
1042     end
1043
1044     # Check the e-mail
1045     register_email = ActionMailer::Base.deliveries.first
1046
1047     assert_equal register_email.to.first, new_email
1048     # Check that the confirm account url is correct
1049     confirm_regex = Regexp.new("confirm_string=([a-zA-Z0-9%_-]*)")
1050     email_text_parts(register_email).each do |part|
1051       assert_match confirm_regex, part.body.to_s
1052     end
1053     confirm_string = CGI.unescape(email_text_parts(register_email).first.body.match(confirm_regex)[1])
1054
1055     # Check the page
1056     assert_response :success
1057     assert_template "confirmations/confirm"
1058
1059     # Go to the confirmation page
1060     get "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
1061     assert_response :success
1062     assert_template "confirmations/confirm"
1063
1064     post "/user/#{display_name}/confirm", :params => { :referer => "/welcome", :confirm_string => confirm_string }
1065     assert_response :redirect
1066     follow_redirect!
1067     assert_response :success
1068     assert_template "site/welcome"
1069   end
1070 end