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_deleted
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).hide!
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_resend_success
193 user = build(:user, :pending)
194 post users_path, :params => { :user => user.attributes }
196 assert_difference "ActionMailer::Base.deliveries.size", 1 do
197 perform_enqueued_jobs do
198 post user_confirm_resend_path(user)
202 assert_redirected_to login_path
203 assert_equal("confirmations/resend_success_flash", flash[:notice][:partial])
204 assert_equal({ :email => user.email, :sender => Settings.email_from }, flash[:notice][:locals])
206 email = ActionMailer::Base.deliveries.last
208 assert_equal user.email, email.to.first
211 def test_confirm_resend_deleted
212 user = build(:user, :pending)
213 post users_path, :params => { :user => user.attributes }
215 User.find_by(:display_name => user.display_name).hide!
217 assert_no_difference "ActionMailer::Base.deliveries.size" do
218 perform_enqueued_jobs do
219 post user_confirm_resend_path(user)
223 assert_redirected_to login_path
224 assert_match "User #{user.display_name} not found.", flash[:error]
227 def test_confirm_resend_unknown_user
228 assert_no_difference "ActionMailer::Base.deliveries.size" do
229 perform_enqueued_jobs do
230 post user_confirm_resend_path(:display_name => "No Such User")
234 assert_redirected_to login_path
235 assert_match "User No Such User not found.", flash[:error]
238 def test_confirm_email_get
240 confirm_string = user.generate_token_for(:new_email)
242 get user_confirm_email_path, :params => { :confirm_string => confirm_string }
243 assert_response :success
244 assert_template :confirm_email
247 def test_confirm_email_success
248 user = create(:user, :new_email => "test-new@example.com")
249 stub_gravatar_request(user.new_email)
250 confirm_string = user.generate_token_for(:new_email)
252 post user_confirm_email_path, :params => { :confirm_string => confirm_string }
253 assert_redirected_to account_path
254 assert_match(/Confirmed your change of email address/, flash[:notice])
257 def test_confirm_email_already_confirmed
259 confirm_string = user.generate_token_for(:new_email)
261 post user_confirm_email_path, :params => { :confirm_string => confirm_string }
262 assert_redirected_to account_path
263 assert_match(/already been confirmed/, flash[:error])
266 def test_confirm_email_bad_token
267 post user_confirm_email_path, :params => { :confirm_string => "XXXXX" }
268 assert_redirected_to account_path
269 assert_match(/confirmation code has expired or does not exist/, flash[:error])
273 # test if testing for a gravatar works
274 # this happens when the email is actually changed
275 # which is triggered by the confirmation mail
276 def test_gravatar_auto_enable
277 # switch to email that has a gravatar
278 user = create(:user, :new_email => "test-new@example.com")
279 stub_gravatar_request(user.new_email, 200)
280 confirm_string = user.generate_token_for(:new_email)
281 # precondition gravatar should be turned off
282 assert_not user.image_use_gravatar
283 post user_confirm_email_path, :params => { :confirm_string => confirm_string }
284 assert_redirected_to account_path
285 assert_match(/Confirmed your change of email address/, flash[:notice])
286 # gravatar use should now be enabled
287 assert User.find(user.id).image_use_gravatar
290 def test_gravatar_auto_disable
291 # switch to email without a gravatar
292 user = create(:user, :new_email => "test-new@example.com", :image_use_gravatar => true)
293 stub_gravatar_request(user.new_email, 404)
294 confirm_string = user.generate_token_for(:new_email)
295 # precondition gravatar should be turned on
296 assert user.image_use_gravatar
297 post user_confirm_email_path, :params => { :confirm_string => confirm_string }
298 assert_redirected_to account_path
299 assert_match(/Confirmed your change of email address/, flash[:notice])
300 # gravatar use should now be disabled
301 assert_not User.find(user.id).image_use_gravatar