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