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