]> git.openstreetmap.org Git - rails.git/blob - test/controllers/confirmations_controller_test.rb
Create relation version redaction resource
[rails.git] / test / controllers / confirmations_controller_test.rb
1 require "test_helper"
2
3 class UsersControllerTest < ActionDispatch::IntegrationTest
4   ##
5   # test all routes which lead to this controller
6   def test_routes
7     assert_routing(
8       { :path => "/user/username/confirm", :method => :get },
9       { :controller => "confirmations", :action => "confirm", :display_name => "username" }
10     )
11     assert_routing(
12       { :path => "/user/username/confirm", :method => :post },
13       { :controller => "confirmations", :action => "confirm", :display_name => "username" }
14     )
15     assert_routing(
16       { :path => "/user/username/confirm/resend", :method => :post },
17       { :controller => "confirmations", :action => "confirm_resend", :display_name => "username" }
18     )
19
20     assert_routing(
21       { :path => "/user/confirm", :method => :get },
22       { :controller => "confirmations", :action => "confirm" }
23     )
24     assert_routing(
25       { :path => "/user/confirm", :method => :post },
26       { :controller => "confirmations", :action => "confirm" }
27     )
28     assert_routing(
29       { :path => "/user/confirm-email", :method => :get },
30       { :controller => "confirmations", :action => "confirm_email" }
31     )
32     assert_routing(
33       { :path => "/user/confirm-email", :method => :post },
34       { :controller => "confirmations", :action => "confirm_email" }
35     )
36   end
37
38   def test_confirm_get
39     user = build(:user, :pending)
40     post users_path, :params => { :user => user.attributes }
41     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
42
43     get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
44     assert_response :success
45     assert_template :confirm
46   end
47
48   def test_confirm_get_already_confirmed
49     user = build(:user, :pending)
50     stub_gravatar_request(user.email)
51     post users_path, :params => { :user => user.attributes }
52     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
53
54     # Get the confirmation page
55     get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
56     assert_response :success
57     assert_template :confirm
58
59     # Confirm the user
60     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
61     assert_redirected_to welcome_path
62
63     # Now try to get the confirmation page again
64     get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
65     assert_redirected_to root_path
66   end
67
68   def test_confirm_success_no_token_no_referer
69     user = build(:user, :pending)
70     stub_gravatar_request(user.email)
71     post users_path, :params => { :user => user.attributes }
72     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
73
74     post logout_path
75
76     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
77     assert_redirected_to login_path
78     assert_match(/Confirmed your account/, flash[:notice])
79   end
80
81   def test_confirm_success_good_token_no_referer
82     user = build(:user, :pending)
83     stub_gravatar_request(user.email)
84     post users_path, :params => { :user => user.attributes }
85     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
86
87     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
88     assert_redirected_to welcome_path
89   end
90
91   def test_confirm_success_bad_token_no_referer
92     user = build(:user, :pending)
93     stub_gravatar_request(user.email)
94     post users_path, :params => { :user => user.attributes }
95     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
96
97     post logout_path
98     session_for(create(:user))
99
100     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
101     assert_redirected_to login_path
102     assert_match(/Confirmed your account/, flash[:notice])
103   end
104
105   def test_confirm_success_no_token_with_referer
106     user = build(:user, :pending)
107     stub_gravatar_request(user.email)
108     post users_path, :params => { :user => user.attributes }
109     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
110
111     post logout_path
112
113     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
114     assert_redirected_to login_path(:referer => new_diary_entry_path)
115     assert_match(/Confirmed your account/, flash[:notice])
116   end
117
118   def test_confirm_success_good_token_with_referer
119     user = build(:user, :pending)
120     stub_gravatar_request(user.email)
121     post users_path, :params => { :user => user.attributes }
122     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
123
124     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
125     assert_redirected_to new_diary_entry_path
126   end
127
128   def test_confirm_success_bad_token_with_referer
129     user = build(:user, :pending)
130     stub_gravatar_request(user.email)
131     post users_path, :params => { :user => user.attributes }
132     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
133
134     post logout_path
135     session_for(create(:user))
136
137     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
138     assert_redirected_to login_path(:referer => new_diary_entry_path)
139     assert_match(/Confirmed your account/, flash[:notice])
140   end
141
142   def test_confirm_expired_token
143     user = build(:user, :pending)
144     stub_gravatar_request(user.email)
145     post users_path, :params => { :user => user.attributes }
146     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
147
148     travel 2.weeks do
149       post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
150     end
151     assert_redirected_to :action => "confirm"
152     assert_match(/confirmation code has expired/, flash[:error])
153   end
154
155   def test_confirm_already_confirmed
156     user = build(:user, :pending)
157     stub_gravatar_request(user.email)
158     post users_path, :params => { :user => user.attributes }
159     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
160
161     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
162     assert_redirected_to new_diary_entry_path
163
164     post logout_path
165
166     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
167     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string, :referer => new_diary_entry_path }
168     assert_redirected_to login_path
169     assert_match(/already been confirmed/, flash[:error])
170   end
171
172   def test_confirm_deleted
173     user = build(:user, :pending)
174     stub_gravatar_request(user.email)
175     post users_path, :params => { :user => user.attributes }
176     confirm_string = User.find_by(:email => user.email).generate_token_for(:new_user)
177
178     User.find_by(:display_name => user.display_name).hide!
179
180     # Get the confirmation page
181     get user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
182     assert_redirected_to root_path
183
184     # Confirm the user
185     post user_confirm_path, :params => { :display_name => user.display_name, :confirm_string => confirm_string }
186     assert_response :not_found
187     assert_template :no_such_user
188   end
189
190   def test_confirm_resend_success
191     user = build(:user, :pending)
192     post users_path, :params => { :user => user.attributes }
193
194     assert_difference "ActionMailer::Base.deliveries.size", 1 do
195       perform_enqueued_jobs do
196         post user_confirm_resend_path(user)
197       end
198     end
199
200     assert_redirected_to login_path
201     assert_equal("confirmations/resend_success_flash", flash[:notice][:partial])
202     assert_equal({ :email => user.email, :sender => Settings.email_from }, flash[:notice][:locals])
203
204     email = ActionMailer::Base.deliveries.last
205
206     assert_equal user.email, email.to.first
207   end
208
209   def test_confirm_resend_deleted
210     user = build(:user, :pending)
211     post users_path, :params => { :user => user.attributes }
212
213     User.find_by(:display_name => user.display_name).hide!
214
215     assert_no_difference "ActionMailer::Base.deliveries.size" do
216       perform_enqueued_jobs do
217         post user_confirm_resend_path(user)
218       end
219     end
220
221     assert_redirected_to login_path
222     assert_match "User #{user.display_name} not found.", flash[:error]
223   end
224
225   def test_confirm_resend_unknown_user
226     assert_no_difference "ActionMailer::Base.deliveries.size" do
227       perform_enqueued_jobs do
228         post user_confirm_resend_path(:display_name => "No Such User")
229       end
230     end
231
232     assert_redirected_to login_path
233     assert_match "User No Such User not found.", flash[:error]
234   end
235
236   def test_confirm_email_get
237     user = create(:user)
238     confirm_string = user.generate_token_for(:new_email)
239
240     get user_confirm_email_path, :params => { :confirm_string => confirm_string }
241     assert_response :success
242     assert_template :confirm_email
243   end
244
245   def test_confirm_email_success
246     user = create(:user, :new_email => "test-new@example.com")
247     stub_gravatar_request(user.new_email)
248     confirm_string = user.generate_token_for(:new_email)
249
250     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
251     assert_redirected_to edit_account_path
252     assert_match(/Confirmed your change of email address/, flash[:notice])
253   end
254
255   def test_confirm_email_already_confirmed
256     user = create(:user)
257     confirm_string = user.generate_token_for(:new_email)
258
259     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
260     assert_redirected_to edit_account_path
261     assert_match(/already been confirmed/, flash[:error])
262   end
263
264   def test_confirm_email_bad_token
265     post user_confirm_email_path, :params => { :confirm_string => "XXXXX" }
266     assert_redirected_to edit_account_path
267     assert_match(/confirmation code has expired or does not exist/, flash[:error])
268   end
269
270   ##
271   # test if testing for a gravatar works
272   # this happens when the email is actually changed
273   # which is triggered by the confirmation mail
274   def test_gravatar_auto_enable
275     # switch to email that has a gravatar
276     user = create(:user, :new_email => "test-new@example.com")
277     stub_gravatar_request(user.new_email, 200)
278     confirm_string = user.generate_token_for(:new_email)
279     # precondition gravatar should be turned off
280     assert_not user.image_use_gravatar
281     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
282     assert_redirected_to edit_account_path
283     assert_match(/Confirmed your change of email address/, flash[:notice])
284     # gravatar use should now be enabled
285     assert User.find(user.id).image_use_gravatar
286   end
287
288   def test_gravatar_auto_disable
289     # switch to email without a gravatar
290     user = create(:user, :new_email => "test-new@example.com", :image_use_gravatar => true)
291     stub_gravatar_request(user.new_email, 404)
292     confirm_string = user.generate_token_for(:new_email)
293     # precondition gravatar should be turned on
294     assert user.image_use_gravatar
295     post user_confirm_email_path, :params => { :confirm_string => confirm_string }
296     assert_redirected_to edit_account_path
297     assert_match(/Confirmed your change of email address/, flash[:notice])
298     # gravatar use should now be disabled
299     assert_not User.find(user.id).image_use_gravatar
300   end
301 end