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