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