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