cdf4fcfe9cffafb1d924a7286dc34a6d7851a556
[rails.git] / test / integration / user_creation_test.rb
1 require "test_helper"
2
3 class UserCreationTest < ActionDispatch::IntegrationTest
4   fixtures :users
5
6   def setup
7     I18n.locale = "en"
8
9     OmniAuth.config.test_mode = true
10
11     stub_request(:get, /.*gravatar.com.*d=404/).to_return(:status => 404)
12   end
13
14   def teardown
15     I18n.locale = "en"
16
17     OmniAuth.config.mock_auth[:openid] = nil
18     OmniAuth.config.mock_auth[:google] = nil
19     OmniAuth.config.mock_auth[:facebook] = nil
20     OmniAuth.config.mock_auth[:windowslive] = nil
21     OmniAuth.config.mock_auth[:github] = nil
22     OmniAuth.config.test_mode = false
23   end
24
25   def test_create_user_form
26     I18n.available_locales.each do |locale|
27       get_via_redirect "/user/new", {}, { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
28       assert_response :success
29       assert_template "user/new"
30     end
31   end
32
33   def test_user_create_submit_duplicate_email
34     I18n.available_locales.each do |locale|
35       dup_email = users(:public_user).email
36       display_name = "#{locale}_new_tester"
37       assert_difference("User.count", 0) do
38         assert_difference("ActionMailer::Base.deliveries.size", 0) do
39           post "/user/new",
40                { :user => { :email => dup_email, :email_confirmation => dup_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } },
41                { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
42         end
43       end
44       assert_response :success
45       assert_template "user/new"
46       assert_equal locale.to_s, response.headers["Content-Language"] unless locale == :root
47       assert_select "form > fieldset > div.form-row > input.field_with_errors#user_email"
48       assert_no_missing_translations
49     end
50   end
51
52   def test_user_create_submit_duplicate_username
53     I18n.available_locales.each do |locale|
54       dup_display_name = users(:public_user).display_name
55       email = "#{locale}_new_tester"
56       assert_difference("User.count", 0) do
57         assert_difference("ActionMailer::Base.deliveries.size", 0) do
58           post "/user/new",
59                { :user => { :email => email, :email_confirmation => email, :display_name => dup_display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } },
60                { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
61         end
62       end
63       assert_response :success
64       assert_template "user/new"
65       assert_select "form > fieldset > div.form-row > input.field_with_errors#user_display_name"
66       assert_no_missing_translations
67     end
68   end
69
70   def test_user_create_success
71     I18n.available_locales.each do |locale|
72       new_email = "#{locale}newtester@osm.org"
73       display_name = "#{locale}_new_tester"
74
75       assert_difference("User.count", 0) do
76         assert_difference("ActionMailer::Base.deliveries.size", 0) do
77           post "/user/new",
78                :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" }
79         end
80       end
81
82       assert_redirected_to "/user/terms"
83
84       assert_difference("User.count") do
85         assert_difference("ActionMailer::Base.deliveries.size", 1) do
86           post_via_redirect "/user/save", {},
87                             { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
88         end
89       end
90
91       # Check the e-mail
92       register_email = ActionMailer::Base.deliveries.first
93
94       assert_equal register_email.to[0], new_email
95       # Check that the confirm account url is correct
96       assert_match /#{@url}/, register_email.body.to_s
97
98       # Check the page
99       assert_response :success
100       assert_template "user/confirm"
101
102       ActionMailer::Base.deliveries.clear
103     end
104   end
105
106   # Check that the user can successfully recover their password
107   def lost_password_recovery_success
108     # Open the lost password form
109     # Submit the lost password form
110     # Check the e-mail
111     # Submit the reset password token
112     # Check that the password has changed, and the user can login
113   end
114
115   def test_user_create_redirect
116     new_email = "redirect_tester@osm.org"
117     display_name = "redirect_tester"
118     password = "testtest"
119     # nothing special about this page, just need a protected page to redirect back to.
120     referer = "/traces/mine"
121     assert_difference("User.count") do
122       assert_difference("ActionMailer::Base.deliveries.size", 1) do
123         post "/user/new",
124              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => password, :pass_crypt_confirmation => password }, :referer => referer
125         assert_redirected_to "/user/terms"
126         post_via_redirect "/user/save",
127                           :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => password, :pass_crypt_confirmation => password }
128       end
129     end
130
131     # Check the e-mail
132     register_email = ActionMailer::Base.deliveries.first
133
134     assert_equal register_email.to[0], new_email
135     # Check that the confirm account url is correct
136     confirm_regex = Regexp.new("/user/redirect_tester/confirm\\?confirm_string=([a-zA-Z0-9]*)")
137     register_email.parts.each do |part|
138       assert_match confirm_regex, part.body.to_s
139     end
140     confirm_string = register_email.parts[0].body.match(confirm_regex)[1]
141
142     # Check the page
143     assert_response :success
144     assert_template "user/confirm"
145
146     ActionMailer::Base.deliveries.clear
147
148     # Go to the confirmation page
149     get "/user/#{display_name}/confirm", :confirm_string => confirm_string
150     assert_response :success
151     assert_template "user/confirm"
152
153     post "/user/#{display_name}/confirm", :confirm_string => confirm_string
154     assert_response :redirect
155     follow_redirect!
156     assert_response :success
157     assert_template "site/welcome"
158   end
159
160   def test_user_create_openid_success
161     OmniAuth.config.add_mock(:openid, :uid => "http://localhost:1123/new.tester")
162
163     new_email = "newtester-openid@osm.org"
164     display_name = "new_tester-openid"
165     password = "testtest"
166     assert_difference("User.count") do
167       assert_difference("ActionMailer::Base.deliveries.size", 1) do
168         post "/user/new",
169              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "", :pass_crypt_confirmation => "" }
170         assert_response :redirect
171         assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
172         follow_redirect!
173         assert_response :redirect
174         assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
175         follow_redirect!
176         assert_response :redirect
177         assert_redirected_to "/user/terms"
178         post "/user/save",
179              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => password, :pass_crypt_confirmation => password }
180         assert_response :redirect
181         follow_redirect!
182       end
183     end
184
185     # Check the page
186     assert_response :success
187     assert_template "user/confirm"
188
189     ActionMailer::Base.deliveries.clear
190   end
191
192   def test_user_create_openid_failure
193     OmniAuth.config.mock_auth[:openid] = :connection_failed
194
195     new_email = "newtester-openid2@osm.org"
196     display_name = "new_tester-openid2"
197     assert_difference("User.count", 0) do
198       assert_difference("ActionMailer::Base.deliveries.size", 0) do
199         post "/user/new",
200              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "", :pass_crypt_confirmation => "" }
201         assert_response :redirect
202         assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
203         follow_redirect!
204         assert_response :redirect
205         assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
206         follow_redirect!
207         assert_response :redirect
208         assert_redirected_to auth_failure_path(:strategy => "openid", :message => "connection_failed", :origin => "/user/new")
209         follow_redirect!
210         assert_response :redirect
211         follow_redirect!
212         assert_response :success
213         assert_template "user/new"
214       end
215     end
216
217     ActionMailer::Base.deliveries.clear
218   end
219
220   def test_user_create_openid_redirect
221     OmniAuth.config.add_mock(:openid, :uid => "http://localhost:1123/new.tester")
222
223     new_email = "redirect_tester_openid@osm.org"
224     display_name = "redirect_tester_openid"
225     # nothing special about this page, just need a protected page to redirect back to.
226     referer = "/traces/mine"
227     assert_difference("User.count") do
228       assert_difference("ActionMailer::Base.deliveries.size", 1) do
229         post "/user/new",
230              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer
231         assert_response :redirect
232         assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
233         follow_redirect!
234         assert_response :redirect
235         assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
236         follow_redirect!
237         assert_response :redirect
238         assert_redirected_to "/user/terms"
239         post_via_redirect "/user/save",
240                           :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "openid", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" }
241       end
242     end
243
244     # Check the e-mail
245     register_email = ActionMailer::Base.deliveries.first
246
247     assert_equal register_email.to[0], new_email
248     # Check that the confirm account url is correct
249     confirm_regex = Regexp.new("/user/redirect_tester_openid/confirm\\?confirm_string=([a-zA-Z0-9]*)")
250     register_email.parts.each do |part|
251       assert_match confirm_regex, part.body.to_s
252     end
253     confirm_string = register_email.parts[0].body.match(confirm_regex)[1]
254
255     # Check the page
256     assert_response :success
257     assert_template "user/confirm"
258
259     ActionMailer::Base.deliveries.clear
260
261     # Go to the confirmation page
262     get "/user/#{display_name}/confirm", :confirm_string => confirm_string
263     assert_response :success
264     assert_template "user/confirm"
265
266     post "/user/#{display_name}/confirm", :confirm_string => confirm_string
267     assert_response :redirect
268     follow_redirect!
269     assert_response :success
270     assert_template "site/welcome"
271   end
272
273   def test_user_create_google_success
274     OmniAuth.config.add_mock(:google, :uid => "123454321", :extra => {
275                                :id_info => { "openid_id" => "http://localhost:1123/new.tester" }
276                              })
277
278     new_email = "newtester-google@osm.org"
279     display_name = "new_tester-google"
280     password = "testtest"
281     assert_difference("User.count") do
282       assert_difference("ActionMailer::Base.deliveries.size", 1) do
283         post "/user/new",
284              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :pass_crypt => "", :pass_crypt_confirmation => "" }
285         assert_response :redirect
286         assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
287         follow_redirect!
288         assert_response :redirect
289         assert_redirected_to auth_success_path(:provider => "google")
290         follow_redirect!
291         assert_response :redirect
292         assert_redirected_to "/user/terms"
293         post "/user/save",
294              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password }
295         assert_response :redirect
296         follow_redirect!
297       end
298     end
299
300     # Check the page
301     assert_response :success
302     assert_template "user/confirm"
303
304     ActionMailer::Base.deliveries.clear
305   end
306
307   def test_user_create_google_failure
308     OmniAuth.config.mock_auth[:google] = :connection_failed
309
310     new_email = "newtester-google2@osm.org"
311     display_name = "new_tester-google2"
312     assert_difference("User.count", 0) do
313       assert_difference("ActionMailer::Base.deliveries.size", 0) do
314         post "/user/new",
315              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :pass_crypt => "", :pass_crypt_confirmation => "" }
316         assert_response :redirect
317         assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
318         follow_redirect!
319         assert_response :redirect
320         assert_redirected_to auth_success_path(:provider => "google")
321         follow_redirect!
322         assert_response :redirect
323         assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/user/new")
324         follow_redirect!
325         assert_response :redirect
326         follow_redirect!
327         assert_response :success
328         assert_template "user/new"
329       end
330     end
331
332     ActionMailer::Base.deliveries.clear
333   end
334
335   def test_user_create_google_redirect
336     OmniAuth.config.add_mock(:google, :uid => "123454321", :extra => {
337                                :id_info => { "openid_id" => "http://localhost:1123/new.tester" }
338                              })
339
340     new_email = "redirect_tester_google@osm.org"
341     display_name = "redirect_tester_google"
342     # nothing special about this page, just need a protected page to redirect back to.
343     referer = "/traces/mine"
344     assert_difference("User.count") do
345       assert_difference("ActionMailer::Base.deliveries.size", 1) do
346         post "/user/new",
347              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer
348         assert_response :redirect
349         assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
350         follow_redirect!
351         assert_response :redirect
352         assert_redirected_to auth_success_path(:provider => "google")
353         follow_redirect!
354         assert_response :redirect
355         assert_redirected_to "/user/terms"
356         post_via_redirect "/user/save",
357                           :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" }
358       end
359     end
360
361     # Check the e-mail
362     register_email = ActionMailer::Base.deliveries.first
363
364     assert_equal register_email.to[0], new_email
365     # Check that the confirm account url is correct
366     confirm_regex = Regexp.new("/user/redirect_tester_google/confirm\\?confirm_string=([a-zA-Z0-9]*)")
367     register_email.parts.each do |part|
368       assert_match confirm_regex, part.body.to_s
369     end
370     confirm_string = register_email.parts[0].body.match(confirm_regex)[1]
371
372     # Check the page
373     assert_response :success
374     assert_template "user/confirm"
375
376     ActionMailer::Base.deliveries.clear
377
378     # Go to the confirmation page
379     get "/user/#{display_name}/confirm", :confirm_string => confirm_string
380     assert_response :success
381     assert_template "user/confirm"
382
383     post "/user/#{display_name}/confirm", :confirm_string => confirm_string
384     assert_response :redirect
385     follow_redirect!
386     assert_response :success
387     assert_template "site/welcome"
388   end
389
390   def test_user_create_facebook_success
391     OmniAuth.config.add_mock(:facebook, :uid => "123454321")
392
393     new_email = "newtester-facebook@osm.org"
394     display_name = "new_tester-facebook"
395     password = "testtest"
396     assert_difference("User.count") do
397       assert_difference("ActionMailer::Base.deliveries.size", 1) do
398         post "/user/new",
399              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :pass_crypt => "", :pass_crypt_confirmation => "" }
400         assert_response :redirect
401         assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
402         follow_redirect!
403         assert_response :redirect
404         assert_redirected_to auth_success_path(:provider => "facebook")
405         follow_redirect!
406         assert_response :redirect
407         assert_redirected_to "/user/terms"
408         post "/user/save",
409              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password }
410         assert_response :redirect
411         follow_redirect!
412       end
413     end
414
415     # Check the page
416     assert_response :success
417     assert_template "user/confirm"
418
419     ActionMailer::Base.deliveries.clear
420   end
421
422   def test_user_create_facebook_failure
423     OmniAuth.config.mock_auth[:facebook] = :connection_failed
424
425     new_email = "newtester-facebook2@osm.org"
426     display_name = "new_tester-facebook2"
427     assert_difference("User.count", 0) do
428       assert_difference("ActionMailer::Base.deliveries.size", 0) do
429         post "/user/new",
430              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :pass_crypt => "", :pass_crypt_confirmation => "" }
431         assert_response :redirect
432         assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
433         follow_redirect!
434         assert_response :redirect
435         assert_redirected_to auth_success_path(:provider => "facebook")
436         follow_redirect!
437         assert_response :redirect
438         assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/user/new")
439         follow_redirect!
440         assert_response :redirect
441         follow_redirect!
442         assert_response :success
443         assert_template "user/new"
444       end
445     end
446
447     ActionMailer::Base.deliveries.clear
448   end
449
450   def test_user_create_facebook_redirect
451     OmniAuth.config.add_mock(:facebook, :uid => "123454321")
452
453     new_email = "redirect_tester_facebook@osm.org"
454     display_name = "redirect_tester_facebook"
455     # nothing special about this page, just need a protected page to redirect back to.
456     referer = "/traces/mine"
457     assert_difference("User.count") do
458       assert_difference("ActionMailer::Base.deliveries.size", 1) do
459         post "/user/new",
460              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer
461         assert_response :redirect
462         assert_redirected_to auth_path(:provider => "facebook", :origin => "/user/new")
463         follow_redirect!
464         assert_response :redirect
465         assert_redirected_to auth_success_path(:provider => "facebook")
466         follow_redirect!
467         assert_response :redirect
468         assert_redirected_to "/user/terms"
469         post_via_redirect "/user/save",
470                           :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "facebook", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" }
471       end
472     end
473
474     # Check the e-mail
475     register_email = ActionMailer::Base.deliveries.first
476
477     assert_equal register_email.to[0], new_email
478     # Check that the confirm account url is correct
479     confirm_regex = Regexp.new("/user/redirect_tester_facebook/confirm\\?confirm_string=([a-zA-Z0-9]*)")
480     register_email.parts.each do |part|
481       assert_match confirm_regex, part.body.to_s
482     end
483     confirm_string = register_email.parts[0].body.match(confirm_regex)[1]
484
485     # Check the page
486     assert_response :success
487     assert_template "user/confirm"
488
489     ActionMailer::Base.deliveries.clear
490
491     # Go to the confirmation page
492     get "/user/#{display_name}/confirm", :confirm_string => confirm_string
493     assert_response :success
494     assert_template "user/confirm"
495
496     post "/user/#{display_name}/confirm", :confirm_string => confirm_string
497     assert_response :redirect
498     follow_redirect!
499     assert_response :success
500     assert_template "site/welcome"
501   end
502
503   def test_user_create_windowslive_success
504     OmniAuth.config.add_mock(:windowslive, :uid => "123454321")
505
506     new_email = "newtester-windowslive@osm.org"
507     display_name = "new_tester-windowslive"
508     password = "testtest"
509     assert_difference("User.count") do
510       assert_difference("ActionMailer::Base.deliveries.size", 1) do
511         post "/user/new",
512              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :pass_crypt => "", :pass_crypt_confirmation => "" }
513         assert_response :redirect
514         assert_redirected_to auth_path(:provider => "windowslive", :origin => "/user/new")
515         follow_redirect!
516         assert_response :redirect
517         assert_redirected_to auth_success_path(:provider => "windowslive", :origin => "/user/new")
518         follow_redirect!
519         assert_response :redirect
520         assert_redirected_to "/user/terms"
521         post "/user/save",
522              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password }
523         assert_response :redirect
524         follow_redirect!
525       end
526     end
527
528     # Check the page
529     assert_response :success
530     assert_template "user/confirm"
531
532     ActionMailer::Base.deliveries.clear
533   end
534
535   def test_user_create_windowslive_failure
536     OmniAuth.config.mock_auth[:windowslive] = :connection_failed
537
538     new_email = "newtester-windowslive2@osm.org"
539     display_name = "new_tester-windowslive2"
540     assert_difference("User.count", 0) do
541       assert_difference("ActionMailer::Base.deliveries.size", 0) do
542         post "/user/new",
543              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :pass_crypt => "", :pass_crypt_confirmation => "" }
544         assert_response :redirect
545         assert_redirected_to auth_path(:provider => "windowslive", :origin => "/user/new")
546         follow_redirect!
547         assert_response :redirect
548         assert_redirected_to auth_success_path(:provider => "windowslive", :origin => "/user/new")
549         follow_redirect!
550         assert_response :redirect
551         assert_redirected_to auth_failure_path(:strategy => "windowslive", :message => "connection_failed", :origin => "/user/new")
552         follow_redirect!
553         assert_response :redirect
554         follow_redirect!
555         assert_response :success
556         assert_template "user/new"
557       end
558     end
559
560     ActionMailer::Base.deliveries.clear
561   end
562
563   def test_user_create_windowslive_redirect
564     OmniAuth.config.add_mock(:windowslive, :uid => "123454321")
565
566     new_email = "redirect_tester_windowslive@osm.org"
567     display_name = "redirect_tester_windowslive"
568     # nothing special about this page, just need a protected page to redirect back to.
569     referer = "/traces/mine"
570     assert_difference("User.count") do
571       assert_difference("ActionMailer::Base.deliveries.size", 1) do
572         post "/user/new",
573              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer
574         assert_response :redirect
575         assert_redirected_to auth_path(:provider => "windowslive", :origin => "/user/new")
576         follow_redirect!
577         assert_response :redirect
578         assert_redirected_to auth_success_path(:provider => "windowslive", :origin => "/user/new")
579         follow_redirect!
580         assert_response :redirect
581         assert_redirected_to "/user/terms"
582         post_via_redirect "/user/save",
583                           :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "windowslive", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" }
584       end
585     end
586
587     # Check the e-mail
588     register_email = ActionMailer::Base.deliveries.first
589
590     assert_equal register_email.to[0], new_email
591     # Check that the confirm account url is correct
592     confirm_regex = Regexp.new("/user/redirect_tester_windowslive/confirm\\?confirm_string=([a-zA-Z0-9]*)")
593     register_email.parts.each do |part|
594       assert_match confirm_regex, part.body.to_s
595     end
596     confirm_string = register_email.parts[0].body.match(confirm_regex)[1]
597
598     # Check the page
599     assert_response :success
600     assert_template "user/confirm"
601
602     ActionMailer::Base.deliveries.clear
603
604     # Go to the confirmation page
605     get "/user/#{display_name}/confirm", :confirm_string => confirm_string
606     assert_response :success
607     assert_template "user/confirm"
608
609     post "/user/#{display_name}/confirm", :confirm_string => confirm_string
610     assert_response :redirect
611     follow_redirect!
612     assert_response :success
613     assert_template "site/welcome"
614   end
615
616   def test_user_create_github_success
617     OmniAuth.config.add_mock(:github, :uid => "123454321")
618
619     new_email = "newtester-github@osm.org"
620     display_name = "new_tester-github"
621     password = "testtest"
622     assert_difference("User.count") do
623       assert_difference("ActionMailer::Base.deliveries.size", 1) do
624         post "/user/new",
625              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :pass_crypt => "", :pass_crypt_confirmation => "" }
626         assert_response :redirect
627         assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
628         follow_redirect!
629         assert_response :redirect
630         assert_redirected_to auth_success_path(:provider => "github", :origin => "/user/new")
631         follow_redirect!
632         assert_response :redirect
633         assert_redirected_to "/user/terms"
634         post "/user/save",
635              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :auth_uid => "123454321", :pass_crypt => password, :pass_crypt_confirmation => password }
636         assert_response :redirect
637         follow_redirect!
638       end
639     end
640
641     # Check the page
642     assert_response :success
643     assert_template "user/confirm"
644
645     ActionMailer::Base.deliveries.clear
646   end
647
648   def test_user_create_github_failure
649     OmniAuth.config.mock_auth[:github] = :connection_failed
650
651     new_email = "newtester-github2@osm.org"
652     display_name = "new_tester-github2"
653     assert_difference("User.count", 0) do
654       assert_difference("ActionMailer::Base.deliveries.size", 0) do
655         post "/user/new",
656              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :pass_crypt => "", :pass_crypt_confirmation => "" }
657         assert_response :redirect
658         assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
659         follow_redirect!
660         assert_response :redirect
661         assert_redirected_to auth_success_path(:provider => "github", :origin => "/user/new")
662         follow_redirect!
663         assert_response :redirect
664         assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/user/new")
665         follow_redirect!
666         assert_response :redirect
667         follow_redirect!
668         assert_response :success
669         assert_template "user/new"
670       end
671     end
672
673     ActionMailer::Base.deliveries.clear
674   end
675
676   def test_user_create_github_redirect
677     OmniAuth.config.add_mock(:github, :uid => "123454321")
678
679     new_email = "redirect_tester_github@osm.org"
680     display_name = "redirect_tester_github"
681     # nothing special about this page, just need a protected page to redirect back to.
682     referer = "/traces/mine"
683     assert_difference("User.count") do
684       assert_difference("ActionMailer::Base.deliveries.size", 1) do
685         post "/user/new",
686              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer
687         assert_response :redirect
688         assert_redirected_to auth_path(:provider => "github", :origin => "/user/new")
689         follow_redirect!
690         assert_response :redirect
691         assert_redirected_to auth_success_path(:provider => "github", :origin => "/user/new")
692         follow_redirect!
693         assert_response :redirect
694         assert_redirected_to "/user/terms"
695         post_via_redirect "/user/save",
696                           :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "github", :auth_uid => "http://localhost:1123/new.tester", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" }
697       end
698     end
699
700     # Check the e-mail
701     register_email = ActionMailer::Base.deliveries.first
702
703     assert_equal register_email.to[0], new_email
704     # Check that the confirm account url is correct
705     confirm_regex = Regexp.new("/user/redirect_tester_github/confirm\\?confirm_string=([a-zA-Z0-9]*)")
706     register_email.parts.each do |part|
707       assert_match confirm_regex, part.body.to_s
708     end
709     confirm_string = register_email.parts[0].body.match(confirm_regex)[1]
710
711     # Check the page
712     assert_response :success
713     assert_template "user/confirm"
714
715     ActionMailer::Base.deliveries.clear
716
717     # Go to the confirmation page
718     get "/user/#{display_name}/confirm", :confirm_string => confirm_string
719     assert_response :success
720     assert_template "user/confirm"
721
722     post "/user/#{display_name}/confirm", :confirm_string => confirm_string
723     assert_response :redirect
724     follow_redirect!
725     assert_response :success
726     assert_template "site/welcome"
727   end
728 end