]> git.openstreetmap.org Git - rails.git/blob - test/controllers/confirmations_controller_test.rb
Convert `UserMailer#email_confirm` to new style
[rails.git] / test / controllers / confirmations_controller_test.rb
1 # frozen_string_literal: true
2
3 require "test_helper"
4
5 class ConfirmationsControllerTest < ActionDispatch::IntegrationTest
6   ##
7   # test all routes which lead to this controller
8   def test_routes
9     assert_routing(
10       { :path => "/user/username/confirm", :method => :get },
11       { :controller => "confirmations", :action => "confirm", :display_name => "username" }
12     )
13     assert_routing(
14       { :path => "/user/username/confirm", :method => :post },
15       { :controller => "confirmations", :action => "confirm", :display_name => "username" }
16     )
17     assert_routing(
18       { :path => "/user/username/confirm/resend", :method => :post },
19       { :controller => "confirmations", :action => "confirm_resend", :display_name => "username" }
20     )
21
22     assert_routing(
23       { :path => "/user/confirm", :method => :get },
24       { :controller => "confirmations", :action => "confirm" }
25     )
26     assert_routing(
27       { :path => "/user/confirm", :method => :post },
28       { :controller => "confirmations", :action => "confirm" }
29     )
30     assert_routing(
31       { :path => "/user/confirm-email", :method => :get },
32       { :controller => "confirmations", :action => "confirm_email" }
33     )
34     assert_routing(
35       { :path => "/user/confirm-email", :method => :post },
36       { :controller => "confirmations", :action => "confirm_email" }
37     )
38   end
39
40   def test_confirm_get
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)
44
45     get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
46     assert_response :success
47     assert_template :confirm
48   end
49
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)
55
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
60
61     # Confirm the user
62     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
63     assert_redirected_to welcome_path
64
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
68   end
69
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)
75
76     post logout_path
77
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])
81   end
82
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)
88
89     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
90     assert_redirected_to welcome_path
91   end
92
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)
98
99     post logout_path
100     session_for(create(:user))
101
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])
105   end
106
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)
112
113     post logout_path
114
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])
118   end
119
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)
125
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
128   end
129
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)
135
136     post logout_path
137     session_for(create(:user))
138
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])
142   end
143
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)
149
150     travel 2.weeks do
151       post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
152     end
153     assert_redirected_to :action => "confirm"
154     assert_match(/confirmation code has expired/, flash[:error])
155   end
156
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)
162
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
165
166     post logout_path
167
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])
172   end
173
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)
179
180     User.find_by(:display_name => user.display_name).soft_destroy!
181
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
185
186     # Confirm the user
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
190   end
191
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)
197
198     User.find_by(:display_name => user.display_name).suspend!
199
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
203
204     # Confirm the user
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
208   end
209
210   def test_confirm_resend_success
211     user = build(:user, :pending)
212     post users_path, :params => { :user => user.attributes }
213
214     assert_difference "ActionMailer::Base.deliveries.size", 1 do
215       perform_enqueued_jobs do
216         post user_confirm_resend_path(user)
217       end
218     end
219
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])
223
224     email = ActionMailer::Base.deliveries.last
225
226     assert_equal user.email, email.to.first
227   end
228
229   def test_confirm_resend_soft_destroyed
230     user = build(:user, :pending)
231     post users_path, :params => { :user => user.attributes }
232
233     User.find_by(:display_name => user.display_name).soft_destroy!
234
235     assert_no_difference "ActionMailer::Base.deliveries.size" do
236       perform_enqueued_jobs do
237         post user_confirm_resend_path(user)
238       end
239     end
240
241     assert_redirected_to login_path
242     assert_match "User #{user.display_name} not found.", flash[:error]
243   end
244
245   def test_confirm_resend_suspended
246     user = build(:user, :pending)
247     post users_path, :params => { :user => user.attributes }
248
249     User.find_by(:display_name => user.display_name).suspend!
250
251     assert_no_difference "ActionMailer::Base.deliveries.size" do
252       perform_enqueued_jobs do
253         post user_confirm_resend_path(user)
254       end
255     end
256
257     assert_redirected_to login_path
258     assert_match "User #{user.display_name} not found.", flash[:error]
259   end
260
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")
265       end
266     end
267
268     assert_redirected_to login_path
269     assert_match "User No Such User not found.", flash[:error]
270   end
271
272   def test_confirm_email_get
273     user = create(:user)
274     confirm_string = user.generate_token_for(:new_email)
275
276     get user_confirm_email_path, :params => { :confirm_string => confirm_string }
277     assert_response :success
278     assert_template :confirm_email
279   end
280
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)
285
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])
289   end
290
291   def test_confirm_email_already_confirmed
292     user = create(:user)
293     confirm_string = user.generate_token_for(:new_email)
294
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])
298   end
299
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])
304   end
305
306   ##
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
322   end
323
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
336   end
337 end