]> git.openstreetmap.org Git - rails.git/blob - test/controllers/confirmations_controller_test.rb
Merge pull request #6394 from openstreetmap/dependabot/github_actions/ruby/setup...
[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_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)
179
180     User.find_by(:display_name => user.display_name).hide!
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_resend_success
193     user = build(:user, :pending)
194     post users_path, :params => { :user => user.attributes }
195
196     assert_difference "ActionMailer::Base.deliveries.size", 1 do
197       perform_enqueued_jobs do
198         post user_confirm_resend_path(user)
199       end
200     end
201
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])
205
206     email = ActionMailer::Base.deliveries.last
207
208     assert_equal user.email, email.to.first
209   end
210
211   def test_confirm_resend_deleted
212     user = build(:user, :pending)
213     post users_path, :params => { :user => user.attributes }
214
215     User.find_by(:display_name => user.display_name).hide!
216
217     assert_no_difference "ActionMailer::Base.deliveries.size" do
218       perform_enqueued_jobs do
219         post user_confirm_resend_path(user)
220       end
221     end
222
223     assert_redirected_to login_path
224     assert_match "User #{user.display_name} not found.", flash[:error]
225   end
226
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")
231       end
232     end
233
234     assert_redirected_to login_path
235     assert_match "User No Such User not found.", flash[:error]
236   end
237
238   def test_confirm_email_get
239     user = create(:user)
240     confirm_string = user.generate_token_for(:new_email)
241
242     get user_confirm_email_path, :params => { :confirm_string => confirm_string }
243     assert_response :success
244     assert_template :confirm_email
245   end
246
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)
251
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])
255   end
256
257   def test_confirm_email_already_confirmed
258     user = create(:user)
259     confirm_string = user.generate_token_for(:new_email)
260
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])
264   end
265
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])
270   end
271
272   ##
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
288   end
289
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
302   end
303 end