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