]> git.openstreetmap.org Git - rails.git/blob - test/controllers/confirmations_controller_test.rb
Add social signin buttons to signup screen, avoid repeating round trip to auth provider.
[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 => :get },
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 user_new_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 user_new_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 user_new_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 user_new_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 user_new_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 user_new_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 user_new_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 user_new_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 user_new_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 user_new_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 user_new_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 user_new_path, :params => { :user => user.attributes }
193
194     assert_difference "ActionMailer::Base.deliveries.size", 1 do
195       perform_enqueued_jobs do
196         get 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
208     ActionMailer::Base.deliveries.clear
209   end
210
211   def test_confirm_resend_deleted
212     user = build(:user, :pending)
213     post user_new_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         get 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         get 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 edit_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 edit_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 edit_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 edit_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 edit_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