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