]> git.openstreetmap.org Git - rails.git/blob - test/integration/user_creation_test.rb
More work on user tests
[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.test_mode = false
17   end
18
19   def test_create_user_form
20     I18n.available_locales.each do |locale|
21       get_via_redirect "/user/new", {}, { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
22       assert_response :success
23       assert_template "user/new"
24     end
25   end
26
27   def test_user_create_submit_duplicate_email
28     I18n.available_locales.each do |locale|
29       dup_email = users(:public_user).email
30       display_name = "#{locale}_new_tester"
31       assert_difference("User.count", 0) do
32         assert_difference("ActionMailer::Base.deliveries.size", 0) do
33           post "/user/new",
34                { :user => { :email => dup_email, :email_confirmation => dup_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } },
35                { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
36         end
37       end
38       assert_response :success
39       assert_template "user/new"
40       assert_equal response.headers["Content-Language"][0..1], locale.to_s[0..1] unless locale == :root
41       assert_select "form > fieldset > div.form-row > input.field_with_errors#user_email"
42       assert_no_missing_translations
43     end
44   end
45
46   def test_user_create_submit_duplicate_username
47     I18n.available_locales.each do |locale|
48       dup_display_name = users(:public_user).display_name
49       email = "#{locale}_new_tester"
50       assert_difference("User.count", 0) do
51         assert_difference("ActionMailer::Base.deliveries.size", 0) do
52           post "/user/new",
53                { :user => { :email => email, :email_confirmation => email, :display_name => dup_display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" } },
54                { "HTTP_ACCEPT_LANGUAGE" => locale.to_s }
55         end
56       end
57       assert_response :success
58       assert_template "user/new"
59       assert_select "form > fieldset > div.form-row > input.field_with_errors#user_display_name"
60       assert_no_missing_translations
61     end
62   end
63
64   def test_user_create_success
65     I18n.available_locales.each do |locale|
66       new_email = "#{locale}newtester@osm.org"
67       display_name = "#{locale}_new_tester"
68
69       assert_difference("User.count", 0) do
70         assert_difference("ActionMailer::Base.deliveries.size", 0) do
71           post "/user/new",
72                :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest" }
73         end
74       end
75
76       assert_redirected_to "/user/terms"
77
78       assert_difference("User.count") do
79         assert_difference("ActionMailer::Base.deliveries.size", 1) do
80           post_via_redirect "/user/save", {},
81                             { "HTTP_ACCEPT_LANGUAGE" => "#{locale}" }
82         end
83       end
84
85       # Check the e-mail
86       register_email = ActionMailer::Base.deliveries.first
87
88       assert_equal register_email.to[0], new_email
89       # Check that the confirm account url is correct
90       assert_match /#{@url}/, register_email.body.to_s
91
92       # Check the page
93       assert_response :success
94       assert_template "user/confirm"
95
96       ActionMailer::Base.deliveries.clear
97     end
98   end
99
100   # Check that the user can successfully recover their password
101   def lost_password_recovery_success
102     # Open the lost password form
103     # Submit the lost password form
104     # Check the e-mail
105     # Submit the reset password token
106     # Check that the password has changed, and the user can login
107   end
108
109   def test_user_create_redirect
110     new_email = "redirect_tester@osm.org"
111     display_name = "redirect_tester"
112     password = "testtest"
113     # nothing special about this page, just need a protected page to redirect back to.
114     referer = "/traces/mine"
115     assert_difference("User.count") do
116       assert_difference("ActionMailer::Base.deliveries.size", 1) do
117         post "/user/new",
118              :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => password, :pass_crypt_confirmation => password }, :referer => referer
119         assert_redirected_to "/user/terms"
120         post_via_redirect "/user/save",
121                           :user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => password, :pass_crypt_confirmation => password }
122       end
123     end
124
125     # Check the e-mail
126     register_email = ActionMailer::Base.deliveries.first
127
128     assert_equal register_email.to[0], new_email
129     # Check that the confirm account url is correct
130     confirm_regex = Regexp.new("/user/redirect_tester/confirm\\?confirm_string=([a-zA-Z0-9]*)")
131     register_email.parts.each do |part|
132       assert_match confirm_regex, part.body.to_s
133     end
134     confirm_string = register_email.parts[0].body.match(confirm_regex)[1]
135
136     # Check the page
137     assert_response :success
138     assert_template "user/confirm"
139
140     ActionMailer::Base.deliveries.clear
141
142     # Go to the confirmation page
143     get "/user/#{display_name}/confirm", :confirm_string => confirm_string
144     assert_response :success
145     assert_template "user/confirm"
146
147     post "/user/#{display_name}/confirm", :confirm_string => confirm_string
148     assert_response :redirect
149     follow_redirect!
150     assert_response :success
151     assert_template "site/welcome"
152   end
153
154   def test_user_create_openid_success
155     OmniAuth.config.add_mock(:openid, :uid => "http://localhost:1123/new.tester")
156
157     new_email = "newtester-openid@osm.org"
158     display_name = "new_tester-openid"
159     password = "testtest"
160     assert_difference("User.count") do
161       assert_difference("ActionMailer::Base.deliveries.size", 1) do
162         post "/user/new",
163              :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 => "" }
164         assert_response :redirect
165         assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
166         follow_redirect!
167         assert_response :redirect
168         assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
169         follow_redirect!
170         assert_response :redirect
171         assert_redirected_to "/user/terms"
172         post "/user/save",
173              :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 }
174         assert_response :redirect
175         follow_redirect!
176       end
177     end
178
179     # Check the page
180     assert_response :success
181     assert_template "user/confirm"
182
183     ActionMailer::Base.deliveries.clear
184   end
185
186   def test_user_create_openid_failure
187     OmniAuth.config.mock_auth[:openid] = :connection_failed
188
189     new_email = "newtester-openid2@osm.org"
190     display_name = "new_tester-openid2"
191     assert_difference("User.count", 0) do
192       assert_difference("ActionMailer::Base.deliveries.size", 0) do
193         post "/user/new",
194              :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 => "" }
195         assert_response :redirect
196         assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
197         follow_redirect!
198         assert_response :redirect
199         assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
200         follow_redirect!
201         assert_response :redirect
202         assert_redirected_to auth_failure_path(:strategy => "openid", :message => "connection_failed", :origin => "/user/new")
203         follow_redirect!
204         assert_response :redirect
205         follow_redirect!
206         assert_response :success
207         assert_template "user/new"
208       end
209     end
210
211     ActionMailer::Base.deliveries.clear
212   end
213
214   def test_user_create_openid_redirect
215     OmniAuth.config.add_mock(:openid, :uid => "http://localhost:1123/new.tester")
216
217     new_email = "redirect_tester_openid@osm.org"
218     display_name = "redirect_tester_openid"
219     # nothing special about this page, just need a protected page to redirect back to.
220     referer = "/traces/mine"
221     assert_difference("User.count") do
222       assert_difference("ActionMailer::Base.deliveries.size", 1) do
223         post "/user/new",
224              :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
225         assert_response :redirect
226         assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
227         follow_redirect!
228         assert_response :redirect
229         assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/new.tester", :origin => "/user/new")
230         follow_redirect!
231         assert_response :redirect
232         assert_redirected_to "/user/terms"
233         post_via_redirect "/user/save",
234                           :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" }
235       end
236     end
237
238     # Check the e-mail
239     register_email = ActionMailer::Base.deliveries.first
240
241     assert_equal register_email.to[0], new_email
242     # Check that the confirm account url is correct
243     confirm_regex = Regexp.new("/user/redirect_tester_openid/confirm\\?confirm_string=([a-zA-Z0-9]*)")
244     register_email.parts.each do |part|
245       assert_match confirm_regex, part.body.to_s
246     end
247     confirm_string = register_email.parts[0].body.match(confirm_regex)[1]
248
249     # Check the page
250     assert_response :success
251     assert_template "user/confirm"
252
253     ActionMailer::Base.deliveries.clear
254
255     # Go to the confirmation page
256     get "/user/#{display_name}/confirm", :confirm_string => confirm_string
257     assert_response :success
258     assert_template "user/confirm"
259
260     post "/user/#{display_name}/confirm", :confirm_string => confirm_string
261     assert_response :redirect
262     follow_redirect!
263     assert_response :success
264     assert_template "site/welcome"
265   end
266 end