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