1 # frozen_string_literal: true
5 class ConfirmationsControllerTest < ActionDispatch::IntegrationTest
7 # test all routes which lead to this controller
10 { :path => "/user/username/confirm", :method => :get },
11 { :controller => "confirmations", :action => "confirm", :display_name => "username" }
14 { :path => "/user/username/confirm", :method => :post },
15 { :controller => "confirmations", :action => "confirm", :display_name => "username" }
18 { :path => "/user/username/confirm/resend", :method => :post },
19 { :controller => "confirmations", :action => "confirm_resend", :display_name => "username" }
23 { :path => "/user/confirm", :method => :get },
24 { :controller => "confirmations", :action => "confirm" }
27 { :path => "/user/confirm", :method => :post },
28 { :controller => "confirmations", :action => "confirm" }
31 { :path => "/user/confirm-email", :method => :get },
32 { :controller => "confirmations", :action => "confirm_email" }
35 { :path => "/user/confirm-email", :method => :post },
36 { :controller => "confirmations", :action => "confirm_email" }
41 user = build(:user, :pending)
42 post users_path, :params => { :user => user.attributes }
43 confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
45 get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
46 assert_response :success
47 assert_template :confirm
50 def test_confirm_get_already_confirmed
51 user = build(:user, :pending)
52 stub_gravatar_request(user.email)
53 post users_path, :params => { :user => user.attributes }
54 confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
56 # Get the confirmation page
57 get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
58 assert_response :success
59 assert_template :confirm
62 post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
63 assert_redirected_to welcome_path
65 # Now try to get the confirmation page again
66 get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
67 assert_redirected_to root_path
70 def test_confirm_success_no_token_no_referer
71 user = build(:user, :pending)
72 stub_gravatar_request(user.email)
73 post users_path, :params => { :user => user.attributes }
74 confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
78 post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
79 assert_redirected_to login_path
80 assert_match(/Confirmed your account/, flash[:notice])
83 def test_confirm_success_good_token_no_referer
84 user = build(:user, :pending)
85 stub_gravatar_request(user.email)
86 post users_path, :params => { :user => user.attributes }
87 confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
89 post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
90 assert_redirected_to welcome_path
93 def test_confirm_success_bad_token_no_referer
94 user = build(:user, :pending)
95 stub_gravatar_request(user.email)
96 post users_path, :params => { :user => user.attributes }
97 confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
100 session_for(create(:user))
102 post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
103 assert_redirected_to login_path
104 assert_match(/Confirmed your account/, flash[:notice])
107 def test_confirm_success_no_token_with_referer
108 user = build(:user, :pending)
109 stub_gravatar_request(user.email)
110 post users_path, :params => { :user => user.attributes }
111 confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
115 post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
116 assert_redirected_to login_path(:referer => new_diary_entry_path)
117 assert_match(/Confirmed your account/, flash[:notice])
120 def test_confirm_success_good_token_with_referer
121 user = build(:user, :pending)
122 stub_gravatar_request(user.email)
123 post users_path, :params => { :user => user.attributes }
124 confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
126 post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
127 assert_redirected_to new_diary_entry_path
130 def test_confirm_success_bad_token_with_referer
131 user = build(:user, :pending)
132 stub_gravatar_request(user.email)
133 post users_path, :params => { :user => user.attributes }
134 confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
137 session_for(create(:user))
139 post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
140 assert_redirected_to login_path(:referer => new_diary_entry_path)
141 assert_match(/Confirmed your account/, flash[:notice])
144 def test_confirm_expired_token
145 user = build(:user, :pending)
146 stub_gravatar_request(user.email)
147 post users_path, :params => { :user => user.attributes }
148 confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
151 post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
153 assert_redirected_to :action => "confirm"
154 assert_match(/confirmation code has expired/, flash[:error])
157 def test_confirm_already_confirmed
158 user = build(:user, :pending)
159 stub_gravatar_request(user.email)
160 post users_path, :params => { :user => user.attributes }
161 confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
163 post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
164 assert_redirected_to new_diary_entry_path
168 confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
169 post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
170 assert_redirected_to login_path
171 assert_match(/already been confirmed/, flash[:error])
174 def test_confirm_soft_destroyed
175 user = build(:user, :pending)
176 stub_gravatar_request(user.email)
177 post users_path, :params => { :user => user.attributes }
178 confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
180 User.find_by(:display_name => user.display_name).soft_destroy!
182 # Get the confirmation page
183 get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
184 assert_redirected_to root_path
187 post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
188 assert_response :not_found
189 assert_template :no_such_user
192 def test_confirm_suspended
193 user = build(:user, :pending)
194 stub_gravatar_request(user.email)
195 post users_path, :params => { :user => user.attributes }
196 confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
198 User.find_by(:display_name => user.display_name).suspend!
200 # Get the confirmation page
201 get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
202 assert_redirected_to root_path
205 post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
206 assert_response :not_found
207 assert_template :no_such_user
210 def test_confirm_resend_success
211 user = build(:user, :pending)
212 post users_path, :params => { :user => user.attributes }
214 assert_difference "ActionMailer::Base.deliveries.size", 1 do
215 perform_enqueued_jobs do
216 post user_confirm_resend_path(user)
220 assert_redirected_to login_path
221 assert_equal("confirmations/resend_success_flash", flash[:notice][:partial])
222 assert_equal({ :email => user.email, :sender => Settings.email_from }, flash[:notice][:locals])
224 email = ActionMailer::Base.deliveries.last
226 assert_equal user.email, email.to.first
229 def test_confirm_resend_soft_destroyed
230 user = build(:user, :pending)
231 post users_path, :params => { :user => user.attributes }
233 User.find_by(:display_name => user.display_name).soft_destroy!
235 assert_no_difference "ActionMailer::Base.deliveries.size" do
236 perform_enqueued_jobs do
237 post user_confirm_resend_path(user)
241 assert_redirected_to login_path
242 assert_match "User #{user.display_name} not found.", flash[:error]
245 def test_confirm_resend_suspended
246 user = build(:user, :pending)
247 post users_path, :params => { :user => user.attributes }
249 User.find_by(:display_name => user.display_name).suspend!
251 assert_no_difference "ActionMailer::Base.deliveries.size" do
252 perform_enqueued_jobs do
253 post user_confirm_resend_path(user)
257 assert_redirected_to login_path
258 assert_match "User #{user.display_name} not found.", flash[:error]
261 def test_confirm_resend_unknown_user
262 assert_no_difference "ActionMailer::Base.deliveries.size" do
263 perform_enqueued_jobs do
264 post user_confirm_resend_path(:display_name => "No Such User")
268 assert_redirected_to login_path
269 assert_match "User No Such User not found.", flash[:error]
272 def test_confirm_email_get
274 confirm_string = user.generate_token_for(:new_email)
276 get user_confirm_email_path, :params => { :confirm_string => confirm_string }
277 assert_response :success
278 assert_template :confirm_email
281 def test_confirm_email_success
282 user = create(:user, :new_email => "test-new@example.com")
283 stub_gravatar_request(user.new_email)
284 confirm_string = user.generate_token_for(:new_email)
286 post user_confirm_email_path, :params => { :confirm_string => confirm_string }
287 assert_redirected_to account_path
288 assert_match(/Confirmed your change of email address/, flash[:notice])
291 def test_confirm_email_already_confirmed
293 confirm_string = user.generate_token_for(:new_email)
295 post user_confirm_email_path, :params => { :confirm_string => confirm_string }
296 assert_redirected_to account_path
297 assert_match(/already been confirmed/, flash[:error])
300 def test_confirm_email_bad_token
301 post user_confirm_email_path, :params => { :confirm_string => "XXXXX" }
302 assert_redirected_to account_path
303 assert_match(/confirmation code has expired or does not exist/, flash[:error])
307 # test if testing for a gravatar works
308 # this happens when the email is actually changed
309 # which is triggered by the confirmation mail
310 def test_gravatar_auto_enable
311 # switch to email that has a gravatar
312 user = create(:user, :new_email => "test-new@example.com")
313 stub_gravatar_request(user.new_email, 200)
314 confirm_string = user.generate_token_for(:new_email)
315 # precondition gravatar should be turned off
316 assert_not user.image_use_gravatar
317 post user_confirm_email_path, :params => { :confirm_string => confirm_string }
318 assert_redirected_to account_path
319 assert_match(/Confirmed your change of email address/, flash[:notice])
320 # gravatar use should now be enabled
321 assert User.find(user.id).image_use_gravatar
324 def test_gravatar_auto_disable
325 # switch to email without a gravatar
326 user = create(:user, :new_email => "test-new@example.com", :image_use_gravatar => true)
327 stub_gravatar_request(user.new_email, 404)
328 confirm_string = user.generate_token_for(:new_email)
329 # precondition gravatar should be turned on
330 assert user.image_use_gravatar
331 post user_confirm_email_path, :params => { :confirm_string => confirm_string }
332 assert_redirected_to account_path
333 assert_match(/Confirmed your change of email address/, flash[:notice])
334 # gravatar use should now be disabled
335 assert_not User.find(user.id).image_use_gravatar