]> git.openstreetmap.org Git - rails.git/blob - test/integration/user_login_test.rb
use a controller method to handle cancan denials
[rails.git] / test / integration / user_login_test.rb
1 require "test_helper"
2
3 class UserLoginTest < ActionDispatch::IntegrationTest
4   def setup
5     OmniAuth.config.test_mode = true
6   end
7
8   def teardown
9     OmniAuth.config.mock_auth[:openid] = nil
10     OmniAuth.config.mock_auth[:google] = nil
11     OmniAuth.config.mock_auth[:facebook] = nil
12     OmniAuth.config.mock_auth[:windowslive] = nil
13     OmniAuth.config.mock_auth[:github] = nil
14     OmniAuth.config.mock_auth[:wikipedia] = nil
15     OmniAuth.config.test_mode = false
16   end
17
18   # It's possible to have multiple accounts in the database with only differences
19   # in email case, for hysterical raisins. We need to bypass the validation checks to
20   # create users like this nowadays.
21   def test_login_email_password_duplicate
22     # Attempt to log in as one user, it should work
23     user = create(:user)
24     _uppercase_user = build(:user, :email => user.email.upcase).tap { |u| u.save(:validate => false) }
25
26     try_password_login user.email, "test"
27
28     assert_template "changeset/history"
29     assert_select "span.username", user.display_name
30   end
31
32   def test_login_email_password_duplicate_upcase
33     # Attempt to log in as the uppercase_user, it should also work
34     user = create(:user)
35     uppercase_user = build(:user, :email => user.email.upcase).tap { |u| u.save(:validate => false) }
36
37     try_password_login uppercase_user.email, "test"
38
39     assert_template "changeset/history"
40     assert_select "span.username", uppercase_user.display_name
41   end
42
43   def test_login_email_password_duplicate_titlecase
44     # When there's no exact match for case, and two possible users, it should fail
45     user = create(:user)
46     _uppercase_user = build(:user, :email => user.email.upcase).tap { |u| u.save(:validate => false) }
47
48     try_password_login user.email.titlecase, "test"
49
50     assert_template "login"
51     assert_select "span.username", false
52   end
53
54   # When there are no duplicate emails, any variation of cases should work
55   def test_login_email_password
56     user = create(:user)
57
58     try_password_login user.email, "test"
59
60     assert_template "changeset/history"
61     assert_select "span.username", user.display_name
62   end
63
64   def test_login_email_password_upcase
65     user = create(:user)
66
67     try_password_login user.email.upcase, "test"
68
69     assert_template "changeset/history"
70     assert_select "span.username", user.display_name
71   end
72
73   def test_login_email_password_titlecase
74     user = create(:user)
75
76     try_password_login user.email.titlecase, "test"
77
78     assert_template "changeset/history"
79     assert_select "span.username", user.display_name
80   end
81
82   def test_login_email_password_pending
83     user = create(:user, :pending)
84
85     try_password_login user.email, "test"
86
87     assert_template "confirm"
88     assert_select "span.username", false
89   end
90
91   def test_login_email_password_pending_upcase
92     user = create(:user, :pending)
93
94     try_password_login user.email.upcase, "test"
95
96     assert_template "confirm"
97     assert_select "span.username", false
98   end
99
100   def test_login_email_password_pending_titlecase
101     user = create(:user, :pending)
102
103     try_password_login user.email.titlecase, "test"
104
105     assert_template "confirm"
106     assert_select "span.username", false
107   end
108
109   def test_login_email_password_suspended
110     user = create(:user, :suspended)
111
112     try_password_login user.email, "test"
113
114     assert_template "login"
115     assert_select "span.username", false
116     assert_select "div.flash.error", /your account has been suspended/ do
117       assert_select "a[href='mailto:openstreetmap@example.com']", "webmaster"
118     end
119   end
120
121   def test_login_email_password_suspended_upcase
122     user = create(:user, :suspended)
123
124     try_password_login user.email.upcase, "test"
125
126     assert_template "login"
127     assert_select "span.username", false
128     assert_select "div.flash.error", /your account has been suspended/ do
129       assert_select "a[href='mailto:openstreetmap@example.com']", "webmaster"
130     end
131   end
132
133   def test_login_email_password_suspended_titlecase
134     user = create(:user, :suspended)
135
136     try_password_login user.email.titlecase, "test"
137
138     assert_template "login"
139     assert_select "span.username", false
140     assert_select "div.flash.error", /your account has been suspended/ do
141       assert_select "a[href='mailto:openstreetmap@example.com']", "webmaster"
142     end
143   end
144
145   def test_login_email_password_blocked
146     user = create(:user)
147     create(:user_block, :needs_view, :user => user)
148
149     try_password_login user.email, "test"
150
151     assert_template "user_blocks/show"
152     assert_select "span.username", user.display_name
153   end
154
155   def test_login_email_password_blocked_upcase
156     user = create(:user)
157     create(:user_block, :needs_view, :user => user)
158
159     try_password_login user.email.upcase, "test"
160
161     assert_template "user_blocks/show"
162     assert_select "span.username", user.display_name
163   end
164
165   def test_login_email_password_blocked_titlecase
166     user = create(:user)
167     create(:user_block, :needs_view, :user => user)
168
169     try_password_login user.email.titlecase, "test"
170
171     assert_template "user_blocks/show"
172     assert_select "span.username", user.display_name
173   end
174
175   # As above, it's possible to have multiple accounts in the database with only
176   # differences in display_name case, for hysterical raisins. We need to bypass
177   # the validation checks to create users like this nowadays.
178   def test_login_username_password_duplicate
179     # Attempt to log in as one user, it should work
180     user = create(:user)
181     _uppercase_user = build(:user, :display_name => user.display_name.upcase).tap { |u| u.save(:validate => false) }
182
183     try_password_login user.display_name, "test"
184
185     assert_template "changeset/history"
186     assert_select "span.username", user.display_name
187   end
188
189   def test_login_username_password_duplicate_upcase
190     # Attempt to log in as the uppercase_user, it should also work
191     user = create(:user)
192     uppercase_user = build(:user, :display_name => user.display_name.upcase).tap { |u| u.save(:validate => false) }
193
194     try_password_login uppercase_user.display_name, "test"
195
196     assert_template "changeset/history"
197     assert_select "span.username", uppercase_user.display_name
198   end
199
200   def test_login_username_password_duplicate_downcase
201     # When there's no exact match for case, and two possible users, it should fail
202     user = create(:user)
203     _uppercase_user = build(:user, :display_name => user.display_name.upcase).tap { |u| u.save(:validate => false) }
204
205     try_password_login user.display_name.downcase, "test"
206
207     assert_template "login"
208     assert_select "span.username", false
209   end
210
211   # When there are no duplicate emails, any variation of cases should work
212   def test_login_username_password
213     user = create(:user)
214
215     try_password_login user.display_name, "test"
216
217     assert_template "changeset/history"
218     assert_select "span.username", user.display_name
219   end
220
221   def test_login_username_password_upcase
222     user = create(:user)
223
224     try_password_login user.display_name.upcase, "test"
225
226     assert_template "changeset/history"
227     assert_select "span.username", user.display_name
228   end
229
230   def test_login_username_password_downcase
231     user = create(:user)
232
233     try_password_login user.display_name.downcase, "test"
234
235     assert_template "changeset/history"
236     assert_select "span.username", user.display_name
237   end
238
239   def test_login_username_password_pending
240     user = create(:user, :pending)
241
242     try_password_login user.display_name, "test"
243
244     assert_template "confirm"
245     assert_select "span.username", false
246   end
247
248   def test_login_username_password_pending_upcase
249     user = create(:user, :pending)
250
251     try_password_login user.display_name.upcase, "test"
252
253     assert_template "confirm"
254     assert_select "span.username", false
255   end
256
257   def test_login_username_password_pending_downcase
258     user = create(:user, :pending)
259
260     try_password_login user.display_name.downcase, "test"
261
262     assert_template "confirm"
263     assert_select "span.username", false
264   end
265
266   def test_login_username_password_suspended
267     user = create(:user, :suspended)
268
269     try_password_login user.display_name, "test"
270
271     assert_template "login"
272     assert_select "span.username", false
273     assert_select "div.flash.error", /your account has been suspended/ do
274       assert_select "a[href='mailto:openstreetmap@example.com']", "webmaster"
275     end
276   end
277
278   def test_login_username_password_suspended_upcase
279     user = create(:user, :suspended)
280
281     try_password_login user.display_name.upcase, "test"
282
283     assert_template "login"
284     assert_select "span.username", false
285     assert_select "div.flash.error", /your account has been suspended/ do
286       assert_select "a[href='mailto:openstreetmap@example.com']", "webmaster"
287     end
288   end
289
290   def test_login_username_password_suspended_downcase
291     user = create(:user, :suspended)
292
293     try_password_login user.display_name.downcase, "test"
294
295     assert_template "login"
296     assert_select "span.username", false
297     assert_select "div.flash.error", /your account has been suspended/ do
298       assert_select "a[href='mailto:openstreetmap@example.com']", "webmaster"
299     end
300   end
301
302   def test_login_username_password_blocked
303     user = create(:user)
304     create(:user_block, :needs_view, :user => user)
305
306     try_password_login user.display_name.upcase, "test"
307
308     assert_template "user_blocks/show"
309     assert_select "span.username", user.display_name
310   end
311
312   def test_login_username_password_blocked_upcase
313     user = create(:user)
314     create(:user_block, :needs_view, :user => user)
315
316     try_password_login user.display_name, "test"
317
318     assert_template "user_blocks/show"
319     assert_select "span.username", user.display_name
320   end
321
322   def test_login_username_password_blocked_downcase
323     user = create(:user)
324     create(:user_block, :needs_view, :user => user)
325
326     try_password_login user.display_name.downcase, "test"
327
328     assert_template "user_blocks/show"
329     assert_select "span.username", user.display_name
330   end
331
332   def test_login_email_password_remember_me
333     user = create(:user)
334
335     try_password_login user.email, "test", "yes"
336
337     assert_template "changeset/history"
338     assert_select "span.username", user.display_name
339     assert session.key?(:_remember_for)
340   end
341
342   def test_login_username_password_remember_me
343     user = create(:user)
344
345     try_password_login user.display_name, "test", "yes"
346
347     assert_template "changeset/history"
348     assert_select "span.username", user.display_name
349     assert session.key?(:_remember_for)
350   end
351
352   def test_login_openid_success
353     user = create(:user, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
354     OmniAuth.config.add_mock(:openid, :uid => user.auth_uid)
355
356     get "/login", :params => { :referer => "/history" }
357     assert_response :redirect
358     assert_redirected_to :controller => :user, :action => :login, :cookie_test => true, :referer => "/history"
359     follow_redirect!
360     assert_response :success
361     assert_template "user/login"
362     post "/login", :params => { :openid_url => "http://localhost:1123/john.doe", :referer => "/history" }
363     assert_response :redirect
364     assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
365     follow_redirect!
366     assert_response :redirect
367     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
368     follow_redirect!
369     assert_response :redirect
370     follow_redirect!
371     assert_response :success
372     assert_template "changeset/history"
373     assert_select "span.username", user.display_name
374   end
375
376   def test_login_openid_remember_me
377     user = create(:user, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
378     OmniAuth.config.add_mock(:openid, :uid => user.auth_uid)
379
380     get "/login", :params => { :referer => "/history" }
381     assert_response :redirect
382     assert_redirected_to :controller => :user, :action => :login, :cookie_test => true, :referer => "/history"
383     follow_redirect!
384     assert_response :success
385     assert_template "user/login"
386     post "/login", :params => { :openid_url => user.auth_uid, :remember_me_openid => true, :referer => "/history" }
387     assert_response :redirect
388     assert_redirected_to auth_path(:provider => "openid", :openid_url => user.auth_uid, :origin => "/login?referer=%2Fhistory", :referer => "/history")
389     follow_redirect!
390     assert_response :redirect
391     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => user.auth_uid, :origin => "/login?referer=%2Fhistory", :referer => "/history")
392     follow_redirect!
393     assert_response :redirect
394     follow_redirect!
395     assert_response :success
396     assert_template "changeset/history"
397     assert_select "span.username", user.display_name
398     assert session.key?(:_remember_for)
399   end
400
401   def test_login_openid_connection_failed
402     user = create(:user, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
403     OmniAuth.config.mock_auth[:openid] = :connection_failed
404
405     get "/login", :params => { :referer => "/history" }
406     assert_response :redirect
407     assert_redirected_to :controller => :user, :action => :login, :cookie_test => true, :referer => "/history"
408     follow_redirect!
409     assert_response :success
410     assert_template "user/login"
411     post "/login", :params => { :openid_url => user.auth_uid, :referer => "/history" }
412     assert_response :redirect
413     assert_redirected_to auth_path(:provider => "openid", :openid_url => user.auth_uid, :origin => "/login?referer=%2Fhistory", :referer => "/history")
414     follow_redirect!
415     assert_response :redirect
416     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => user.auth_uid, :origin => "/login?referer=%2Fhistory", :referer => "/history")
417     follow_redirect!
418     assert_response :redirect
419     assert_redirected_to auth_failure_path(:strategy => "openid", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
420     follow_redirect!
421     assert_response :redirect
422     follow_redirect!
423     assert_response :success
424     assert_template "login"
425     assert_select "div.flash.error", "Connection to authentication provider failed"
426     assert_select "span.username", false
427   end
428
429   def test_login_openid_invalid_credentials
430     user = create(:user, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
431     OmniAuth.config.mock_auth[:openid] = :invalid_credentials
432
433     get "/login", :params => { :referer => "/history" }
434     assert_response :redirect
435     assert_redirected_to :controller => :user, :action => :login, :cookie_test => true, :referer => "/history"
436     follow_redirect!
437     assert_response :success
438     assert_template "user/login"
439     post "/login", :params => { :openid_url => user.auth_uid, :referer => "/history" }
440     assert_response :redirect
441     assert_redirected_to auth_path(:provider => "openid", :openid_url => user.auth_uid, :origin => "/login?referer=%2Fhistory", :referer => "/history")
442     follow_redirect!
443     assert_response :redirect
444     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => user.auth_uid, :origin => "/login?referer=%2Fhistory", :referer => "/history")
445     follow_redirect!
446     assert_response :redirect
447     assert_redirected_to auth_failure_path(:strategy => "openid", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
448     follow_redirect!
449     assert_response :redirect
450     follow_redirect!
451     assert_response :success
452     assert_template "login"
453     assert_select "div.flash.error", "Invalid authentication credentials"
454     assert_select "span.username", false
455   end
456
457   def test_login_openid_unknown
458     OmniAuth.config.add_mock(:openid, :uid => "http://localhost:1123/fred.bloggs")
459
460     get "/login", :params => { :referer => "/history" }
461     assert_response :redirect
462     assert_redirected_to :controller => :user, :action => :login, :cookie_test => true, :referer => "/history"
463     follow_redirect!
464     assert_response :success
465     assert_template "user/login"
466     post "/login", :params => { :openid_url => "http://localhost:1123/fred.bloggs", :referer => "/history" }
467     assert_response :redirect
468     assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/fred.bloggs", :origin => "/login?referer=%2Fhistory", :referer => "/history")
469     follow_redirect!
470     assert_response :redirect
471     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/fred.bloggs", :origin => "/login?referer=%2Fhistory", :referer => "/history")
472     follow_redirect!
473     assert_response :redirect
474     follow_redirect!
475     assert_response :success
476     assert_template "user/new"
477     assert_select "span.username", false
478   end
479
480   def test_login_google_success
481     user = create(:user, :auth_provider => "google", :auth_uid => "1234567890")
482     OmniAuth.config.add_mock(:google, :uid => user.auth_uid, :extra => {
483                                :id_info => { "openid_id" => "http://localhost:1123/fred.bloggs" }
484                              })
485
486     get "/login", :params => { :referer => "/history" }
487     assert_response :redirect
488     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
489     follow_redirect!
490     assert_response :success
491     assert_template "user/login"
492     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
493     assert_response :redirect
494     assert_redirected_to auth_success_path(:provider => "google")
495     follow_redirect!
496     assert_response :redirect
497     follow_redirect!
498     assert_response :success
499     assert_template "changeset/history"
500     assert_select "span.username", user.display_name
501   end
502
503   def test_login_google_connection_failed
504     OmniAuth.config.mock_auth[:google] = :connection_failed
505
506     get "/login", :params => { :referer => "/history" }
507     assert_response :redirect
508     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
509     follow_redirect!
510     assert_response :success
511     assert_template "user/login"
512     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
513     assert_response :redirect
514     assert_redirected_to auth_success_path(:provider => "google")
515     follow_redirect!
516     assert_response :redirect
517     assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
518     follow_redirect!
519     assert_response :redirect
520     follow_redirect!
521     assert_response :success
522     assert_template "login"
523     assert_select "div.flash.error", "Connection to authentication provider failed"
524     assert_select "span.username", false
525   end
526
527   def test_login_google_invalid_credentials
528     OmniAuth.config.mock_auth[:google] = :invalid_credentials
529
530     get "/login", :params => { :referer => "/history" }
531     assert_response :redirect
532     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
533     follow_redirect!
534     assert_response :success
535     assert_template "user/login"
536     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
537     assert_response :redirect
538     assert_redirected_to auth_success_path(:provider => "google")
539     follow_redirect!
540     assert_response :redirect
541     assert_redirected_to auth_failure_path(:strategy => "google", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
542     follow_redirect!
543     assert_response :redirect
544     follow_redirect!
545     assert_response :success
546     assert_template "login"
547     assert_select "div.flash.error", "Invalid authentication credentials"
548     assert_select "span.username", false
549   end
550
551   def test_login_google_unknown
552     OmniAuth.config.add_mock(:google, :uid => "987654321", :extra => {
553                                :id_info => { "openid_id" => "http://localhost:1123/fred.bloggs" }
554                              })
555
556     get "/login", :params => { :referer => "/history" }
557     assert_response :redirect
558     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
559     follow_redirect!
560     assert_response :success
561     assert_template "user/login"
562     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
563     assert_response :redirect
564     assert_redirected_to auth_success_path(:provider => "google")
565     follow_redirect!
566     assert_response :redirect
567     follow_redirect!
568     assert_response :success
569     assert_template "user/new"
570     assert_select "span.username", false
571   end
572
573   def test_login_google_upgrade
574     user = create(:user, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
575     OmniAuth.config.add_mock(:google, :uid => "987654321", :extra => {
576                                :id_info => { "openid_id" => user.auth_uid }
577                              })
578
579     get "/login", :params => { :referer => "/history" }
580     assert_response :redirect
581     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
582     follow_redirect!
583     assert_response :success
584     assert_template "user/login"
585     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
586     assert_response :redirect
587     assert_redirected_to auth_success_path(:provider => "google")
588     follow_redirect!
589     assert_response :redirect
590     follow_redirect!
591     assert_response :success
592     assert_template "changeset/history"
593     assert_select "span.username", user.display_name
594
595     u = User.find_by(:display_name => user.display_name)
596     assert_equal "google", u.auth_provider
597     assert_equal "987654321", u.auth_uid
598   end
599
600   def test_login_facebook_success
601     user = create(:user, :auth_provider => "facebook", :auth_uid => "1234567890")
602     OmniAuth.config.add_mock(:facebook, :uid => user.auth_uid)
603
604     get "/login", :params => { :referer => "/history" }
605     assert_response :redirect
606     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
607     follow_redirect!
608     assert_response :success
609     assert_template "user/login"
610     get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
611     assert_response :redirect
612     assert_redirected_to auth_success_path(:provider => "facebook")
613     follow_redirect!
614     assert_response :redirect
615     follow_redirect!
616     assert_response :success
617     assert_template "changeset/history"
618     assert_select "span.username", user.display_name
619   end
620
621   def test_login_facebook_connection_failed
622     OmniAuth.config.mock_auth[:facebook] = :connection_failed
623
624     get "/login", :params => { :referer => "/history" }
625     assert_response :redirect
626     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
627     follow_redirect!
628     assert_response :success
629     assert_template "user/login"
630     get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
631     assert_response :redirect
632     assert_redirected_to auth_success_path(:provider => "facebook")
633     follow_redirect!
634     assert_response :redirect
635     assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
636     follow_redirect!
637     assert_response :redirect
638     follow_redirect!
639     assert_response :success
640     assert_template "login"
641     assert_select "div.flash.error", "Connection to authentication provider failed"
642     assert_select "span.username", false
643   end
644
645   def test_login_facebook_invalid_credentials
646     OmniAuth.config.mock_auth[:facebook] = :invalid_credentials
647
648     get "/login", :params => { :referer => "/history" }
649     assert_response :redirect
650     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
651     follow_redirect!
652     assert_response :success
653     assert_template "user/login"
654     get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
655     assert_response :redirect
656     assert_redirected_to auth_success_path(:provider => "facebook")
657     follow_redirect!
658     assert_response :redirect
659     assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
660     follow_redirect!
661     assert_response :redirect
662     follow_redirect!
663     assert_response :success
664     assert_template "login"
665     assert_select "div.flash.error", "Invalid authentication credentials"
666     assert_select "span.username", false
667   end
668
669   def test_login_facebook_unknown
670     OmniAuth.config.add_mock(:facebook, :uid => "987654321")
671
672     get "/login", :params => { :referer => "/history" }
673     assert_response :redirect
674     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
675     follow_redirect!
676     assert_response :success
677     assert_template "user/login"
678     get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
679     assert_response :redirect
680     assert_redirected_to auth_success_path(:provider => "facebook")
681     follow_redirect!
682     assert_response :redirect
683     follow_redirect!
684     assert_response :success
685     assert_template "user/new"
686     assert_select "span.username", false
687   end
688
689   def test_login_windowslive_success
690     user = create(:user, :auth_provider => "windowslive", :auth_uid => "1234567890")
691     OmniAuth.config.add_mock(:windowslive, :uid => user.auth_uid)
692
693     get "/login", :params => { :referer => "/history" }
694     assert_response :redirect
695     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
696     follow_redirect!
697     assert_response :success
698     assert_template "user/login"
699     get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
700     assert_response :redirect
701     assert_redirected_to auth_success_path(:provider => "windowslive")
702     follow_redirect!
703     assert_response :redirect
704     follow_redirect!
705     assert_response :success
706     assert_template "changeset/history"
707     assert_select "span.username", user.display_name
708   end
709
710   def test_login_windowslive_connection_failed
711     OmniAuth.config.mock_auth[:windowslive] = :connection_failed
712
713     get "/login", :params => { :referer => "/history" }
714     assert_response :redirect
715     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
716     follow_redirect!
717     assert_response :success
718     assert_template "user/login"
719     get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
720     assert_response :redirect
721     assert_redirected_to auth_success_path(:provider => "windowslive")
722     follow_redirect!
723     assert_response :redirect
724     assert_redirected_to auth_failure_path(:strategy => "windowslive", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
725     follow_redirect!
726     assert_response :redirect
727     follow_redirect!
728     assert_response :success
729     assert_template "login"
730     assert_select "div.flash.error", "Connection to authentication provider failed"
731     assert_select "span.username", false
732   end
733
734   def test_login_windowslive_invalid_credentials
735     OmniAuth.config.mock_auth[:windowslive] = :invalid_credentials
736
737     get "/login", :params => { :referer => "/history" }
738     assert_response :redirect
739     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
740     follow_redirect!
741     assert_response :success
742     assert_template "user/login"
743     get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
744     assert_response :redirect
745     assert_redirected_to auth_success_path(:provider => "windowslive")
746     follow_redirect!
747     assert_response :redirect
748     assert_redirected_to auth_failure_path(:strategy => "windowslive", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
749     follow_redirect!
750     assert_response :redirect
751     follow_redirect!
752     assert_response :success
753     assert_template "login"
754     assert_select "div.flash.error", "Invalid authentication credentials"
755     assert_select "span.username", false
756   end
757
758   def test_login_windowslive_unknown
759     OmniAuth.config.add_mock(:windowslive, :uid => "987654321")
760
761     get "/login", :params => { :referer => "/history" }
762     assert_response :redirect
763     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
764     follow_redirect!
765     assert_response :success
766     assert_template "user/login"
767     get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
768     assert_response :redirect
769     assert_redirected_to auth_success_path(:provider => "windowslive")
770     follow_redirect!
771     assert_response :redirect
772     follow_redirect!
773     assert_response :success
774     assert_template "user/new"
775     assert_select "span.username", false
776   end
777
778   def test_login_github_success
779     user = create(:user, :auth_provider => "github", :auth_uid => "1234567890")
780     OmniAuth.config.add_mock(:github, :uid => user.auth_uid)
781
782     get "/login", :params => { :referer => "/history" }
783     assert_response :redirect
784     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
785     follow_redirect!
786     assert_response :success
787     assert_template "user/login"
788     get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
789     assert_response :redirect
790     assert_redirected_to auth_success_path(:provider => "github")
791     follow_redirect!
792     assert_response :redirect
793     follow_redirect!
794     assert_response :success
795     assert_template "changeset/history"
796     assert_select "span.username", user.display_name
797   end
798
799   def test_login_github_connection_failed
800     OmniAuth.config.mock_auth[:github] = :connection_failed
801
802     get "/login", :params => { :referer => "/history" }
803     assert_response :redirect
804     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
805     follow_redirect!
806     assert_response :success
807     assert_template "user/login"
808     get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
809     assert_response :redirect
810     assert_redirected_to auth_success_path(:provider => "github")
811     follow_redirect!
812     assert_response :redirect
813     assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
814     follow_redirect!
815     assert_response :redirect
816     follow_redirect!
817     assert_response :success
818     assert_template "login"
819     assert_select "div.flash.error", "Connection to authentication provider failed"
820     assert_select "span.username", false
821   end
822
823   def test_login_github_invalid_credentials
824     OmniAuth.config.mock_auth[:github] = :invalid_credentials
825
826     get "/login", :params => { :referer => "/history" }
827     assert_response :redirect
828     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
829     follow_redirect!
830     assert_response :success
831     assert_template "user/login"
832     get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
833     assert_response :redirect
834     assert_redirected_to auth_success_path(:provider => "github")
835     follow_redirect!
836     assert_response :redirect
837     assert_redirected_to auth_failure_path(:strategy => "github", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
838     follow_redirect!
839     assert_response :redirect
840     follow_redirect!
841     assert_response :success
842     assert_template "login"
843     assert_select "div.flash.error", "Invalid authentication credentials"
844     assert_select "span.username", false
845   end
846
847   def test_login_github_unknown
848     OmniAuth.config.add_mock(:github, :uid => "987654321")
849
850     get "/login", :params => { :referer => "/history" }
851     assert_response :redirect
852     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
853     follow_redirect!
854     assert_response :success
855     assert_template "user/login"
856     get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
857     assert_response :redirect
858     assert_redirected_to auth_success_path(:provider => "github")
859     follow_redirect!
860     assert_response :redirect
861     follow_redirect!
862     assert_response :success
863     assert_template "user/new"
864     assert_select "span.username", false
865   end
866
867   def test_login_wikipedia_success
868     user = create(:user, :auth_provider => "wikipedia", :auth_uid => "1234567890")
869     OmniAuth.config.add_mock(:wikipedia, :uid => user.auth_uid)
870
871     get "/login", :params => { :referer => "/history" }
872     assert_response :redirect
873     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
874     follow_redirect!
875     assert_response :success
876     assert_template "user/login"
877     get auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
878     assert_response :redirect
879     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
880     follow_redirect!
881     assert_response :redirect
882     follow_redirect!
883     assert_response :success
884     assert_template "changeset/history"
885     assert_select "span.username", user.display_name
886   end
887
888   def test_login_wikipedia_connection_failed
889     OmniAuth.config.mock_auth[:wikipedia] = :connection_failed
890
891     get "/login", :params => { :referer => "/history" }
892     assert_response :redirect
893     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
894     follow_redirect!
895     assert_response :success
896     assert_template "user/login"
897     get auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
898     assert_response :redirect
899     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
900     follow_redirect!
901     assert_response :redirect
902     assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
903     follow_redirect!
904     assert_response :redirect
905     follow_redirect!
906     assert_response :success
907     assert_template "login"
908     assert_select "div.flash.error", "Connection to authentication provider failed"
909     assert_select "span.username", false
910   end
911
912   def test_login_wikipedia_invalid_credentials
913     OmniAuth.config.mock_auth[:wikipedia] = :invalid_credentials
914
915     get "/login", :params => { :referer => "/history" }
916     assert_response :redirect
917     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
918     follow_redirect!
919     assert_response :success
920     assert_template "user/login"
921     get auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
922     assert_response :redirect
923     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
924     follow_redirect!
925     assert_response :redirect
926     assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
927     follow_redirect!
928     assert_response :redirect
929     follow_redirect!
930     assert_response :success
931     assert_template "login"
932     assert_select "div.flash.error", "Invalid authentication credentials"
933     assert_select "span.username", false
934   end
935
936   def test_login_wikipedia_unknown
937     OmniAuth.config.add_mock(:wikipedia, :uid => "987654321")
938
939     get "/login", :params => { :referer => "/history" }
940     assert_response :redirect
941     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
942     follow_redirect!
943     assert_response :success
944     assert_template "user/login"
945     get auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
946     assert_response :redirect
947     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
948     follow_redirect!
949     assert_response :redirect
950     follow_redirect!
951     assert_response :success
952     assert_template "user/new"
953     assert_select "span.username", false
954   end
955
956   private
957
958   def try_password_login(username, password, remember_me = nil)
959     get "/login"
960     assert_response :redirect
961     assert_redirected_to :controller => :user, :action => :login, :cookie_test => true
962     follow_redirect!
963     assert_response :success
964     assert_template "login"
965     assert_select "input#username", 1 do
966       assert_select "[value]", false
967     end
968     assert_select "input#password", 1 do
969       assert_select "[value=?]", ""
970     end
971     assert_select "input#remember_me", 1 do
972       assert_select "[checked]", false
973     end
974
975     post "/login", :params => { :username => username, :password => "wrong", :remember_me => remember_me, :referer => "/history" }
976     assert_response :redirect
977     follow_redirect!
978     assert_response :success
979     assert_template "login"
980     assert_select "input#username", 1 do
981       assert_select "[value=?]", username
982     end
983     assert_select "input#password", 1 do
984       assert_select "[value=?]", ""
985     end
986     assert_select "input#remember_me", 1 do
987       assert_select "[checked]", remember_me == "yes"
988     end
989
990     post "/login", :params => { :username => username, :password => password, :remember_me => remember_me, :referer => "/history" }
991     assert_response :redirect
992     follow_redirect!
993     assert_response :success
994   end
995 end