Ignore coverage data
[rails.git] / test / integration / user_creation_test.rb
1 require "test_helper"
2
3 class UserCreationTest < ActionDispatch::IntegrationTest
4   fixtures :users
5
6   def setup
7     I18n.locale = "en"
8
9     OmniAuth.config.test_mode = true
10   end
11
12   def teardown
13     I18n.locale = "en"
14
15     OmniAuth.config.mock_auth[:openid] = nil
16     OmniAuth.config.mock_auth[:google] = nil
17     OmniAuth.config.test_mode = false
18   end
19
20   def test_create_user_form
21     I18n.available_locales.each do |locale|
22       get_via_redirect "/user/new", {}, { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
23       assert_response :success
24       assert_template "user/new"
25     end
26   end
27
28   def test_user_create_submit_duplicate_email
29     I18n.available_locales.each do |locale|
30       dup_email = users(:public_user).email
31       display_name = "#{locale}_new_tester"
32       assert_difference("User.count", 0) do
33         assert_difference("ActionMailer::Base.deliveries.size", 0) do
34           post "/user/new",
35                { :user => { :email => dup_email, :email_confirmation => dup_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } },
36                { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
37         end
38       end
39       assert_response :success
40       assert_template "user/new"
41       assert_equal response.headers["Content-Language"][0..1], locale.to_s[0..1] unless locale == :root
42       assert_select "form > fieldset > div.form-row > input.field_with_errors#user_email"
43       assert_no_missing_translations
44     end
45   end
46
47   def test_user_create_submit_duplicate_username
48     I18n.available_locales.each do |locale|
49       dup_display_name = users(:public_user).display_name
50       email = "#{locale}_new_tester"
51       assert_difference("User.count", 0) do
52         assert_difference("ActionMailer::Base.deliveries.size", 0) do
53           post "/user/new",
54                { :user => { :email => email, :email_confirmation => email, :display_name => dup_display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } },
55                { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
56         end
57       end
58       assert_response :success
59       assert_template "user/new"
60       assert_select "form > fieldset > div.form-row > input.field_with_errors#user_display_name"
61       assert_no_missing_translations
62     end
63   end
64
65   def test_user_create_success
66     I18n.available_locales.each do |locale|
67       new_email = "#{locale}newtester@osm.org"
68       display_name = "#{locale}_new_tester"
69
70       assert_difference("User.count", 0) do
71         assert_difference("ActionMailer::Base.deliveries.size", 0) do
72           post "/user/new",
73                :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" }
74         end
75       end
76
77       assert_redirected_to "/user/terms"
78
79       assert_difference("User.count") do
80         assert_difference("ActionMailer::Base.deliveries.size", 1) do
81           post_via_redirect "/user/save", {},
82                             { "HTTP_ACCEPT_LANGUAGE" => "#{locale}" }
83         end
84       end
85
86       # Check the e-mail
87       register_email = ActionMailer::Base.deliveries.first
88
89       assert_equal register_email.to[0], new_email
90       # Check that the confirm account url is correct
91       assert_match /#{@url}/, register_email.body.to_s
92
93       # Check the page
94       assert_response :success
95       assert_template "user/confirm"
96
97       ActionMailer::Base.deliveries.clear
98     end
99   end
100
101   # Check that the user can successfully recover their password
102   def lost_password_recovery_success
103     # Open the lost password form
104     # Submit the lost password form
105     # Check the e-mail
106     # Submit the reset password token
107     # Check that the password has changed, and the user can login
108   end
109
110   def test_user_create_redirect
111     new_email = "redirect_tester@osm.org"
112     display_name = "redirect_tester"
113     password = "testtest"
114     # nothing special about this page, just need a protected page to redirect back to.
115     referer = "/traces/mine"
116     assert_difference("User.count") do
117       assert_difference("ActionMailer::Base.deliveries.size", 1) do
118         post "/user/new",
119              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => password, :pass_crypt_confirmation => password }, :referer => referer
120         assert_redirected_to "/user/terms"
121         post_via_redirect "/user/save",
122                           :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => password, :pass_crypt_confirmation => password }
123       end
124     end
125
126     # Check the e-mail
127     register_email = ActionMailer::Base.deliveries.first
128
129     assert_equal register_email.to[0], new_email
130     # Check that the confirm account url is correct
131     confirm_regex = Regexp.new("/user/redirect_tester/confirm\\?confirm_string=([a-zA-Z0-9]*)")
132     register_email.parts.each do |part|
133       assert_match confirm_regex, part.body.to_s
134     end
135     confirm_string = register_email.parts[0].body.match(confirm_regex)[1]
136
137     # Check the page
138     assert_response :success
139     assert_template "user/confirm"
140
141     ActionMailer::Base.deliveries.clear
142
143     # Go to the confirmation page
144     get "/user/#{display_name}/confirm", :confirm_string => confirm_string
145     assert_response :success
146     assert_template "user/confirm"
147
148     post "/user/#{display_name}/confirm", :confirm_string => confirm_string
149     assert_response :redirect
150     follow_redirect!
151     assert_response :success
152     assert_template "site/welcome"
153   end
154
155   def test_user_create_openid_success
156     OmniAuth.config.add_mock(:openid, :uid => "http://localhost:1123/new.tester")
157
158     new_email = "newtester-openid@osm.org"
159     display_name = "new_tester-openid"
160     password = "testtest"
161     assert_difference("User.count") do
162       assert_difference("ActionMailer::Base.deliveries.size", 1) do
163         post "/user/new",
164              :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 => "" }
165         assert_response :redirect
166         assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
167         follow_redirect!
168         assert_response :redirect
169         assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
170         follow_redirect!
171         assert_response :redirect
172         assert_redirected_to "/user/terms"
173         post "/user/save",
174              :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 }
175         assert_response :redirect
176         follow_redirect!
177       end
178     end
179
180     # Check the page
181     assert_response :success
182     assert_template "user/confirm"
183
184     ActionMailer::Base.deliveries.clear
185   end
186
187   def test_user_create_openid_failure
188     OmniAuth.config.mock_auth[:openid] = :connection_failed
189
190     new_email = "newtester-openid2@osm.org"
191     display_name = "new_tester-openid2"
192     assert_difference("User.count", 0) do
193       assert_difference("ActionMailer::Base.deliveries.size", 0) do
194         post "/user/new",
195              :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 => "" }
196         assert_response :redirect
197         assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
198         follow_redirect!
199         assert_response :redirect
200         assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
201         follow_redirect!
202         assert_response :redirect
203         assert_redirected_to auth_failure_path(:strategy => "openid", :message => "connection_failed", :origin => "/user/new")
204         follow_redirect!
205         assert_response :redirect
206         follow_redirect!
207         assert_response :success
208         assert_template "user/new"
209       end
210     end
211
212     ActionMailer::Base.deliveries.clear
213   end
214
215   def test_user_create_openid_redirect
216     OmniAuth.config.add_mock(:openid, :uid => "http://localhost:1123/new.tester")
217
218     new_email = "redirect_tester_openid@osm.org"
219     display_name = "redirect_tester_openid"
220     # nothing special about this page, just need a protected page to redirect back to.
221     referer = "/traces/mine"
222     assert_difference("User.count") do
223       assert_difference("ActionMailer::Base.deliveries.size", 1) do
224         post "/user/new",
225              :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
226         assert_response :redirect
227         assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
228         follow_redirect!
229         assert_response :redirect
230         assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
231         follow_redirect!
232         assert_response :redirect
233         assert_redirected_to "/user/terms"
234         post_via_redirect "/user/save",
235                           :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" }
236       end
237     end
238
239     # Check the e-mail
240     register_email = ActionMailer::Base.deliveries.first
241
242     assert_equal register_email.to[0], new_email
243     # Check that the confirm account url is correct
244     confirm_regex = Regexp.new("/user/redirect_tester_openid/confirm\\?confirm_string=([a-zA-Z0-9]*)")
245     register_email.parts.each do |part|
246       assert_match confirm_regex, part.body.to_s
247     end
248     confirm_string = register_email.parts[0].body.match(confirm_regex)[1]
249
250     # Check the page
251     assert_response :success
252     assert_template "user/confirm"
253
254     ActionMailer::Base.deliveries.clear
255
256     # Go to the confirmation page
257     get "/user/#{display_name}/confirm", :confirm_string => confirm_string
258     assert_response :success
259     assert_template "user/confirm"
260
261     post "/user/#{display_name}/confirm", :confirm_string => confirm_string
262     assert_response :redirect
263     follow_redirect!
264     assert_response :success
265     assert_template "site/welcome"
266   end
267
268   def test_user_create_google_success
269     OmniAuth.config.add_mock(:google, :uid => "123454321", :extra => {
270                                :id_info => { "openid_id" => "http://localhost:1123/new.tester" }
271                              })
272
273     new_email = "newtester-google@osm.org"
274     display_name = "new_tester-google"
275     password = "testtest"
276     assert_difference("User.count") do
277       assert_difference("ActionMailer::Base.deliveries.size", 1) do
278         post "/user/new",
279              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :pass_crypt => "", :pass_crypt_confirmation => "" }
280         assert_response :redirect
281         assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
282         follow_redirect!
283         assert_response :redirect
284         assert_redirected_to auth_success_path(:provider => "google")
285         follow_redirect!
286         assert_response :redirect
287         assert_redirected_to "/user/terms"
288         post "/user/save",
289              :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 }
290         assert_response :redirect
291         follow_redirect!
292       end
293     end
294
295     # Check the page
296     assert_response :success
297     assert_template "user/confirm"
298
299     ActionMailer::Base.deliveries.clear
300   end
301
302   def test_user_create_google_failure
303     OmniAuth.config.mock_auth[:google] = :connection_failed
304
305     new_email = "newtester-google2@osm.org"
306     display_name = "new_tester-google2"
307     assert_difference("User.count", 0) do
308       assert_difference("ActionMailer::Base.deliveries.size", 0) do
309         post "/user/new",
310              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :pass_crypt => "", :pass_crypt_confirmation => "" }
311         assert_response :redirect
312         assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
313         follow_redirect!
314         assert_response :redirect
315         assert_redirected_to auth_success_path(:provider => "google")
316         follow_redirect!
317         assert_response :redirect
318         assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/user/new")
319         follow_redirect!
320         assert_response :redirect
321         follow_redirect!
322         assert_response :success
323         assert_template "user/new"
324       end
325     end
326
327     ActionMailer::Base.deliveries.clear
328   end
329
330   def test_user_create_google_redirect
331     OmniAuth.config.add_mock(:google, :uid => "123454321", :extra => {
332                                :id_info => { "openid_id" => "http://localhost:1123/new.tester" }
333                              })
334
335     new_email = "redirect_tester_google@osm.org"
336     display_name = "redirect_tester_google"
337     # nothing special about this page, just need a protected page to redirect back to.
338     referer = "/traces/mine"
339     assert_difference("User.count") do
340       assert_difference("ActionMailer::Base.deliveries.size", 1) do
341         post "/user/new",
342              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :auth_provider => "google", :pass_crypt => "", :pass_crypt_confirmation => "" }, :referer => referer
343         assert_response :redirect
344         assert_redirected_to auth_path(:provider => "google", :origin => "/user/new")
345         follow_redirect!
346         assert_response :redirect
347         assert_redirected_to auth_success_path(:provider => "google")
348         follow_redirect!
349         assert_response :redirect
350         assert_redirected_to "/user/terms"
351         post_via_redirect "/user/save",
352                           :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" }
353       end
354     end
355
356     # Check the e-mail
357     register_email = ActionMailer::Base.deliveries.first
358
359     assert_equal register_email.to[0], new_email
360     # Check that the confirm account url is correct
361     confirm_regex = Regexp.new("/user/redirect_tester_google/confirm\\?confirm_string=([a-zA-Z0-9]*)")
362     register_email.parts.each do |part|
363       assert_match confirm_regex, part.body.to_s
364     end
365     confirm_string = register_email.parts[0].body.match(confirm_regex)[1]
366
367     # Check the page
368     assert_response :success
369     assert_template "user/confirm"
370
371     ActionMailer::Base.deliveries.clear
372
373     # Go to the confirmation page
374     get "/user/#{display_name}/confirm", :confirm_string => confirm_string
375     assert_response :success
376     assert_template "user/confirm"
377
378     post "/user/#{display_name}/confirm", :confirm_string => confirm_string
379     assert_response :redirect
380     follow_redirect!
381     assert_response :success
382     assert_template "site/welcome"
383   end
384 end