1 require File.dirname(__FILE__) + '/../test_helper'
3 class UserCreationTest < ActionController::IntegrationTest
8 # Test if the ROTS (Ruby OpenID Test Server) is already running
9 rots_response = Net::HTTP.get_response(URI.parse("http://localhost:1123/"))
11 # It isn't, so start a new instance.
12 IO.popen(RAILS_ROOT + "/vendor/gems/rots-0.2.1/bin/rots --silent")
14 # Wait for up to 30 seconds for the server to start and respond before continuing
18 rots_response = Net::HTTP.get_response(URI.parse("http://localhost:1123/"))
19 # If the rescue block doesn't fire, ROTS is up and running and we can continue
22 # If the connection failed, do nothing and repeat the loop
29 #TODO: The ROTS server needs closing down again at some point,
30 # but we don't want to do it after every individual test
33 def test_create_user_form
34 I18n.available_locales.each do |locale|
35 get '/user/new', {}, {"accept_language" => locale.to_s}
36 assert_response :success
37 assert_template 'user/new'
41 def test_user_create_submit_duplicate_email
42 I18n.available_locales.each do |localer|
43 dup_email = users(:public_user).email
44 display_name = "#{localer.to_s}_new_tester"
45 assert_difference('User.count', 0) do
46 assert_difference('ActionMailer::Base.deliveries.size', 0) do
48 {:user => { :email => dup_email, :email_confirmation => dup_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest"}},
49 {"accept_language" => localer.to_s}
52 assert_response :success
53 assert_template 'user/new'
54 assert_equal response.headers['Content-Language'][0..1], localer.to_s[0..1] unless localer == :root
55 assert_select "div#errorExplanation"
56 assert_select "table#signupForm > tr > td > div[class=fieldWithErrors] > input#user_email"
57 assert_no_missing_translations
61 def test_user_create_submit_duplicate_username
62 I18n.available_locales.each do |locale|
63 dup_display_name = users(:public_user).display_name
64 email = "#{locale.to_s}_new_tester"
65 assert_difference('User.count', 0) do
66 assert_difference('ActionMailer::Base.deliveries.size', 0) do
68 {:user => {:email => email, :email_confirmation => email, :display_name => dup_display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest"}},
69 {"accept_language" => locale.to_s}
72 assert_response :success
73 assert_template 'user/new'
74 assert_select "div#errorExplanation"
75 assert_select "table#signupForm > tr > td > div[class=fieldWithErrors] > input#user_display_name"
76 assert_no_missing_translations
80 def test_user_create_success
81 I18n.available_locales.each do |locale|
82 new_email = "#{locale.to_s}newtester@osm.org"
83 display_name = "#{locale.to_s}_new_tester"
84 assert_difference('User.count') do
85 assert_difference('ActionMailer::Base.deliveries.size', 1) do
86 post_via_redirect "/user/save",
87 {:user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest"}},
88 {"accept_language" => "#{locale.to_s}"}
93 register_email = ActionMailer::Base.deliveries.first
95 assert_equal register_email.to[0], new_email
96 # Check that the confirm account url is correct
97 assert_match /#{@url}/, register_email.body
100 assert_response :success
101 assert_template 'login'
103 ActionMailer::Base.deliveries.clear
107 # Check that the user can successfully recover their password
108 def lost_password_recovery_success
109 # Open the lost password form
110 # Submit the lost password form
112 # Submit the reset password token
113 # Check that the password has changed, and the user can login
116 def test_user_create_redirect
117 new_email = "redirect_tester@osm.org"
118 display_name = "redirect_tester"
119 password = "testtest"
120 # nothing special about this page, just need a protected page to redirect back to.
121 referer = "/traces/mine"
122 assert_difference('User.count') do
123 assert_difference('ActionMailer::Base.deliveries.size', 1) do
125 {:user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => password, :pass_crypt_confirmation => password}, :referer => referer }
126 assert_response :success
127 assert_template 'terms'
128 post_via_redirect "/user/save",
129 {:user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :pass_crypt => password, :pass_crypt_confirmation => password} }
134 register_email = ActionMailer::Base.deliveries.first
136 assert_equal register_email.to[0], new_email
137 # Check that the confirm account url is correct
138 confirm_regex = Regexp.new("/user/redirect_tester/confirm\\?confirm_string=([a-zA-Z0-9]*)")
139 assert_match(confirm_regex, register_email.body)
140 confirm_string = confirm_regex.match(register_email.body)[1]
143 assert_response :success
144 assert_template 'login'
146 ActionMailer::Base.deliveries.clear
148 # Go to the confirmation page
149 get 'user/confirm', { :confirm_string => confirm_string }
150 assert_response :success
151 assert_template 'user/confirm'
153 post 'user/confirm', { :confirm_string => confirm_string, :confirm_action => 'submit' }
154 assert_response :redirect # to trace/mine in original referrer
156 assert_response :redirect # but it not redirects to /user/<display_name>/traces
158 assert_response :success
159 assert_template "trace/list.html.erb"
162 def test_user_create_openid_success
163 new_email = "newtester-openid@osm.org"
164 display_name = "new_tester-openid"
165 password = "testtest"
166 assert_difference('User.count') do
167 assert_difference('ActionMailer::Base.deliveries.size', 1) do
169 {:user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :openid_url => "http://localhost:1123/john.doe?openid.success=newuser", :pass_crypt => "", :pass_crypt_confirmation => ""}}
170 assert_response :redirect
171 res = openid_request(@response.redirected_to)
172 post '/user/terms', res
173 assert_response :success
174 assert_template 'terms'
176 {:user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :openid_url => "http://localhost:1123/john.doe?openid.success=newuser", :pass_crypt => password, :pass_crypt_confirmation => password}}
177 assert_response :redirect
183 assert_response :success
184 assert_template 'login'
186 ActionMailer::Base.deliveries.clear
189 def test_user_create_openid_failure
190 new_email = "newtester-openid2@osm.org"
191 display_name = "new_tester-openid2"
192 password = "testtest2"
193 assert_difference('User.count',0) do
194 assert_difference('ActionMailer::Base.deliveries.size',0) do
196 {:user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :openid_url => "http://localhost:1123/john.doe?openid.failure=newuser", :pass_crypt => "", :pass_crypt_confirmation => ""}}
197 assert_response :redirect
198 res = openid_request(@response.redirected_to)
199 post '/user/terms', res
200 assert_response :success
201 assert_template 'user/new'
205 ActionMailer::Base.deliveries.clear
208 def test_user_create_openid_redirect
209 new_email = "redirect_tester_openid@osm.org"
210 display_name = "redirect_tester_openid"
212 # nothing special about this page, just need a protected page to redirect back to.
213 referer = "/traces/mine"
214 assert_difference('User.count') do
215 assert_difference('ActionMailer::Base.deliveries.size', 1) do
217 {:user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :openid_url => "http://localhost:1123/john.doe?openid.success=newuser", :pass_crypt => "", :pass_crypt_confirmation => ""}, :referer => referer }
218 assert_response :redirect
219 res = openid_request(@response.location)
220 post '/user/terms', res
221 assert_response :success
222 assert_template 'terms'
223 post_via_redirect "/user/save",
224 {:user => { :email => new_email, :email_confirmation => new_email, :display_name => display_name, :openid_url => "http://localhost:1123/john.doe?openid.success=newuser", :pass_crypt => "testtest", :pass_crypt_confirmation => "testtest"} }
229 register_email = ActionMailer::Base.deliveries.first
231 assert_equal register_email.to[0], new_email
232 # Check that the confirm account url is correct
233 confirm_regex = Regexp.new("/user/redirect_tester_openid/confirm\\?confirm_string=([a-zA-Z0-9]*)")
234 assert_match(confirm_regex, register_email.body)
235 confirm_string = confirm_regex.match(register_email.body)[1]
238 assert_response :success
239 assert_template 'login'
241 ActionMailer::Base.deliveries.clear
243 # Go to the confirmation page
244 get 'user/confirm', { :confirm_string => confirm_string }
245 assert_response :success
246 assert_template 'user/confirm'
248 post 'user/confirm', { :confirm_string => confirm_string, :confirm_action => 'submit' }
249 assert_response :redirect # to trace/mine in original referrer
251 assert_response :redirect # but it not redirects to /user/<display_name>/traces
253 assert_response :success
254 assert_template "trace/list.html.erb"