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