Avoid CSP issues with OpenID login
[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 "changesets/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 "changesets/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 "changesets/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 "changesets/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 "changesets/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 "changesets/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 "changesets/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 "changesets/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 "changesets/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 "changesets/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 "changesets/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 "changesets/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 => :users, :action => :login, :cookie_test => true, :referer => "/history"
359     follow_redirect!
360     assert_response :success
361     assert_template "users/login"
362     get auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
363     assert_response :redirect
364     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
365     follow_redirect!
366     assert_response :redirect
367     follow_redirect!
368     assert_response :success
369     assert_template "changesets/history"
370     assert_select "span.username", user.display_name
371   end
372
373   def test_login_openid_connection_failed
374     user = create(:user, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
375     OmniAuth.config.mock_auth[:openid] = :connection_failed
376
377     get "/login", :params => { :referer => "/history" }
378     assert_response :redirect
379     assert_redirected_to :controller => :users, :action => :login, :cookie_test => true, :referer => "/history"
380     follow_redirect!
381     assert_response :success
382     assert_template "users/login"
383     get auth_path(:provider => "openid", :openid_url => user.auth_uid, :origin => "/login?referer=%2Fhistory", :referer => "/history")
384     assert_response :redirect
385     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => user.auth_uid, :origin => "/login?referer=%2Fhistory", :referer => "/history")
386     follow_redirect!
387     assert_response :redirect
388     assert_redirected_to auth_failure_path(:strategy => "openid", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
389     follow_redirect!
390     assert_response :redirect
391     follow_redirect!
392     assert_response :success
393     assert_template "login"
394     assert_select "div.flash.error", "Connection to authentication provider failed"
395     assert_select "span.username", false
396   end
397
398   def test_login_openid_invalid_credentials
399     user = create(:user, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
400     OmniAuth.config.mock_auth[:openid] = :invalid_credentials
401
402     get "/login", :params => { :referer => "/history" }
403     assert_response :redirect
404     assert_redirected_to :controller => :users, :action => :login, :cookie_test => true, :referer => "/history"
405     follow_redirect!
406     assert_response :success
407     assert_template "users/login"
408     get auth_path(:provider => "openid", :openid_url => user.auth_uid, :origin => "/login?referer=%2Fhistory", :referer => "/history")
409     assert_response :redirect
410     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => user.auth_uid, :origin => "/login?referer=%2Fhistory", :referer => "/history")
411     follow_redirect!
412     assert_response :redirect
413     assert_redirected_to auth_failure_path(:strategy => "openid", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
414     follow_redirect!
415     assert_response :redirect
416     follow_redirect!
417     assert_response :success
418     assert_template "login"
419     assert_select "div.flash.error", "Invalid authentication credentials"
420     assert_select "span.username", false
421   end
422
423   def test_login_openid_unknown
424     OmniAuth.config.add_mock(:openid, :uid => "http://localhost:1123/fred.bloggs")
425
426     get "/login", :params => { :referer => "/history" }
427     assert_response :redirect
428     assert_redirected_to :controller => :users, :action => :login, :cookie_test => true, :referer => "/history"
429     follow_redirect!
430     assert_response :success
431     assert_template "users/login"
432     get auth_path(:provider => "openid", :openid_url => "http://localhost:1123/fred.bloggs", :origin => "/login?referer=%2Fhistory", :referer => "/history")
433     assert_response :redirect
434     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/fred.bloggs", :origin => "/login?referer=%2Fhistory", :referer => "/history")
435     follow_redirect!
436     assert_response :redirect
437     follow_redirect!
438     assert_response :success
439     assert_template "users/new"
440     assert_select "span.username", false
441   end
442
443   def test_login_google_success
444     user = create(:user, :auth_provider => "google", :auth_uid => "1234567890")
445     OmniAuth.config.add_mock(:google, :uid => user.auth_uid, :extra => {
446                                :id_info => { "openid_id" => "http://localhost:1123/fred.bloggs" }
447                              })
448
449     get "/login", :params => { :referer => "/history" }
450     assert_response :redirect
451     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
452     follow_redirect!
453     assert_response :success
454     assert_template "users/login"
455     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
456     assert_response :redirect
457     assert_redirected_to auth_success_path(:provider => "google")
458     follow_redirect!
459     assert_response :redirect
460     follow_redirect!
461     assert_response :success
462     assert_template "changesets/history"
463     assert_select "span.username", user.display_name
464   end
465
466   def test_login_google_connection_failed
467     OmniAuth.config.mock_auth[:google] = :connection_failed
468
469     get "/login", :params => { :referer => "/history" }
470     assert_response :redirect
471     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
472     follow_redirect!
473     assert_response :success
474     assert_template "users/login"
475     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
476     assert_response :redirect
477     assert_redirected_to auth_success_path(:provider => "google")
478     follow_redirect!
479     assert_response :redirect
480     assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
481     follow_redirect!
482     assert_response :redirect
483     follow_redirect!
484     assert_response :success
485     assert_template "login"
486     assert_select "div.flash.error", "Connection to authentication provider failed"
487     assert_select "span.username", false
488   end
489
490   def test_login_google_invalid_credentials
491     OmniAuth.config.mock_auth[:google] = :invalid_credentials
492
493     get "/login", :params => { :referer => "/history" }
494     assert_response :redirect
495     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
496     follow_redirect!
497     assert_response :success
498     assert_template "users/login"
499     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
500     assert_response :redirect
501     assert_redirected_to auth_success_path(:provider => "google")
502     follow_redirect!
503     assert_response :redirect
504     assert_redirected_to auth_failure_path(:strategy => "google", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
505     follow_redirect!
506     assert_response :redirect
507     follow_redirect!
508     assert_response :success
509     assert_template "login"
510     assert_select "div.flash.error", "Invalid authentication credentials"
511     assert_select "span.username", false
512   end
513
514   def test_login_google_unknown
515     OmniAuth.config.add_mock(:google, :uid => "987654321", :extra => {
516                                :id_info => { "openid_id" => "http://localhost:1123/fred.bloggs" }
517                              })
518
519     get "/login", :params => { :referer => "/history" }
520     assert_response :redirect
521     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
522     follow_redirect!
523     assert_response :success
524     assert_template "users/login"
525     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
526     assert_response :redirect
527     assert_redirected_to auth_success_path(:provider => "google")
528     follow_redirect!
529     assert_response :redirect
530     follow_redirect!
531     assert_response :success
532     assert_template "users/new"
533     assert_select "span.username", false
534   end
535
536   def test_login_google_upgrade
537     user = create(:user, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
538     OmniAuth.config.add_mock(:google, :uid => "987654321", :extra => {
539                                :id_info => { "openid_id" => user.auth_uid }
540                              })
541
542     get "/login", :params => { :referer => "/history" }
543     assert_response :redirect
544     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
545     follow_redirect!
546     assert_response :success
547     assert_template "users/login"
548     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
549     assert_response :redirect
550     assert_redirected_to auth_success_path(:provider => "google")
551     follow_redirect!
552     assert_response :redirect
553     follow_redirect!
554     assert_response :success
555     assert_template "changesets/history"
556     assert_select "span.username", user.display_name
557
558     u = User.find_by(:display_name => user.display_name)
559     assert_equal "google", u.auth_provider
560     assert_equal "987654321", u.auth_uid
561   end
562
563   def test_login_facebook_success
564     user = create(:user, :auth_provider => "facebook", :auth_uid => "1234567890")
565     OmniAuth.config.add_mock(:facebook, :uid => user.auth_uid)
566
567     get "/login", :params => { :referer => "/history" }
568     assert_response :redirect
569     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
570     follow_redirect!
571     assert_response :success
572     assert_template "users/login"
573     get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
574     assert_response :redirect
575     assert_redirected_to auth_success_path(:provider => "facebook")
576     follow_redirect!
577     assert_response :redirect
578     follow_redirect!
579     assert_response :success
580     assert_template "changesets/history"
581     assert_select "span.username", user.display_name
582   end
583
584   def test_login_facebook_connection_failed
585     OmniAuth.config.mock_auth[:facebook] = :connection_failed
586
587     get "/login", :params => { :referer => "/history" }
588     assert_response :redirect
589     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
590     follow_redirect!
591     assert_response :success
592     assert_template "users/login"
593     get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
594     assert_response :redirect
595     assert_redirected_to auth_success_path(:provider => "facebook")
596     follow_redirect!
597     assert_response :redirect
598     assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
599     follow_redirect!
600     assert_response :redirect
601     follow_redirect!
602     assert_response :success
603     assert_template "login"
604     assert_select "div.flash.error", "Connection to authentication provider failed"
605     assert_select "span.username", false
606   end
607
608   def test_login_facebook_invalid_credentials
609     OmniAuth.config.mock_auth[:facebook] = :invalid_credentials
610
611     get "/login", :params => { :referer => "/history" }
612     assert_response :redirect
613     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
614     follow_redirect!
615     assert_response :success
616     assert_template "users/login"
617     get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
618     assert_response :redirect
619     assert_redirected_to auth_success_path(:provider => "facebook")
620     follow_redirect!
621     assert_response :redirect
622     assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
623     follow_redirect!
624     assert_response :redirect
625     follow_redirect!
626     assert_response :success
627     assert_template "login"
628     assert_select "div.flash.error", "Invalid authentication credentials"
629     assert_select "span.username", false
630   end
631
632   def test_login_facebook_unknown
633     OmniAuth.config.add_mock(:facebook, :uid => "987654321")
634
635     get "/login", :params => { :referer => "/history" }
636     assert_response :redirect
637     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
638     follow_redirect!
639     assert_response :success
640     assert_template "users/login"
641     get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
642     assert_response :redirect
643     assert_redirected_to auth_success_path(:provider => "facebook")
644     follow_redirect!
645     assert_response :redirect
646     follow_redirect!
647     assert_response :success
648     assert_template "users/new"
649     assert_select "span.username", false
650   end
651
652   def test_login_windowslive_success
653     user = create(:user, :auth_provider => "windowslive", :auth_uid => "1234567890")
654     OmniAuth.config.add_mock(:windowslive, :uid => user.auth_uid)
655
656     get "/login", :params => { :referer => "/history" }
657     assert_response :redirect
658     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
659     follow_redirect!
660     assert_response :success
661     assert_template "users/login"
662     get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
663     assert_response :redirect
664     assert_redirected_to auth_success_path(:provider => "windowslive")
665     follow_redirect!
666     assert_response :redirect
667     follow_redirect!
668     assert_response :success
669     assert_template "changesets/history"
670     assert_select "span.username", user.display_name
671   end
672
673   def test_login_windowslive_connection_failed
674     OmniAuth.config.mock_auth[:windowslive] = :connection_failed
675
676     get "/login", :params => { :referer => "/history" }
677     assert_response :redirect
678     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
679     follow_redirect!
680     assert_response :success
681     assert_template "users/login"
682     get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
683     assert_response :redirect
684     assert_redirected_to auth_success_path(:provider => "windowslive")
685     follow_redirect!
686     assert_response :redirect
687     assert_redirected_to auth_failure_path(:strategy => "windowslive", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
688     follow_redirect!
689     assert_response :redirect
690     follow_redirect!
691     assert_response :success
692     assert_template "login"
693     assert_select "div.flash.error", "Connection to authentication provider failed"
694     assert_select "span.username", false
695   end
696
697   def test_login_windowslive_invalid_credentials
698     OmniAuth.config.mock_auth[:windowslive] = :invalid_credentials
699
700     get "/login", :params => { :referer => "/history" }
701     assert_response :redirect
702     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
703     follow_redirect!
704     assert_response :success
705     assert_template "users/login"
706     get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
707     assert_response :redirect
708     assert_redirected_to auth_success_path(:provider => "windowslive")
709     follow_redirect!
710     assert_response :redirect
711     assert_redirected_to auth_failure_path(:strategy => "windowslive", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
712     follow_redirect!
713     assert_response :redirect
714     follow_redirect!
715     assert_response :success
716     assert_template "login"
717     assert_select "div.flash.error", "Invalid authentication credentials"
718     assert_select "span.username", false
719   end
720
721   def test_login_windowslive_unknown
722     OmniAuth.config.add_mock(:windowslive, :uid => "987654321")
723
724     get "/login", :params => { :referer => "/history" }
725     assert_response :redirect
726     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
727     follow_redirect!
728     assert_response :success
729     assert_template "users/login"
730     get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
731     assert_response :redirect
732     assert_redirected_to auth_success_path(:provider => "windowslive")
733     follow_redirect!
734     assert_response :redirect
735     follow_redirect!
736     assert_response :success
737     assert_template "users/new"
738     assert_select "span.username", false
739   end
740
741   def test_login_github_success
742     user = create(:user, :auth_provider => "github", :auth_uid => "1234567890")
743     OmniAuth.config.add_mock(:github, :uid => user.auth_uid)
744
745     get "/login", :params => { :referer => "/history" }
746     assert_response :redirect
747     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
748     follow_redirect!
749     assert_response :success
750     assert_template "users/login"
751     get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
752     assert_response :redirect
753     assert_redirected_to auth_success_path(:provider => "github")
754     follow_redirect!
755     assert_response :redirect
756     follow_redirect!
757     assert_response :success
758     assert_template "changesets/history"
759     assert_select "span.username", user.display_name
760   end
761
762   def test_login_github_connection_failed
763     OmniAuth.config.mock_auth[:github] = :connection_failed
764
765     get "/login", :params => { :referer => "/history" }
766     assert_response :redirect
767     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
768     follow_redirect!
769     assert_response :success
770     assert_template "users/login"
771     get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
772     assert_response :redirect
773     assert_redirected_to auth_success_path(:provider => "github")
774     follow_redirect!
775     assert_response :redirect
776     assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
777     follow_redirect!
778     assert_response :redirect
779     follow_redirect!
780     assert_response :success
781     assert_template "login"
782     assert_select "div.flash.error", "Connection to authentication provider failed"
783     assert_select "span.username", false
784   end
785
786   def test_login_github_invalid_credentials
787     OmniAuth.config.mock_auth[:github] = :invalid_credentials
788
789     get "/login", :params => { :referer => "/history" }
790     assert_response :redirect
791     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
792     follow_redirect!
793     assert_response :success
794     assert_template "users/login"
795     get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
796     assert_response :redirect
797     assert_redirected_to auth_success_path(:provider => "github")
798     follow_redirect!
799     assert_response :redirect
800     assert_redirected_to auth_failure_path(:strategy => "github", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
801     follow_redirect!
802     assert_response :redirect
803     follow_redirect!
804     assert_response :success
805     assert_template "login"
806     assert_select "div.flash.error", "Invalid authentication credentials"
807     assert_select "span.username", false
808   end
809
810   def test_login_github_unknown
811     OmniAuth.config.add_mock(:github, :uid => "987654321")
812
813     get "/login", :params => { :referer => "/history" }
814     assert_response :redirect
815     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
816     follow_redirect!
817     assert_response :success
818     assert_template "users/login"
819     get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
820     assert_response :redirect
821     assert_redirected_to auth_success_path(:provider => "github")
822     follow_redirect!
823     assert_response :redirect
824     follow_redirect!
825     assert_response :success
826     assert_template "users/new"
827     assert_select "span.username", false
828   end
829
830   def test_login_wikipedia_success
831     user = create(:user, :auth_provider => "wikipedia", :auth_uid => "1234567890")
832     OmniAuth.config.add_mock(:wikipedia, :uid => user.auth_uid)
833
834     get "/login", :params => { :referer => "/history" }
835     assert_response :redirect
836     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
837     follow_redirect!
838     assert_response :success
839     assert_template "users/login"
840     get auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
841     assert_response :redirect
842     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
843     follow_redirect!
844     assert_response :redirect
845     follow_redirect!
846     assert_response :success
847     assert_template "changesets/history"
848     assert_select "span.username", user.display_name
849   end
850
851   def test_login_wikipedia_connection_failed
852     OmniAuth.config.mock_auth[:wikipedia] = :connection_failed
853
854     get "/login", :params => { :referer => "/history" }
855     assert_response :redirect
856     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
857     follow_redirect!
858     assert_response :success
859     assert_template "users/login"
860     get auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
861     assert_response :redirect
862     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
863     follow_redirect!
864     assert_response :redirect
865     assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
866     follow_redirect!
867     assert_response :redirect
868     follow_redirect!
869     assert_response :success
870     assert_template "login"
871     assert_select "div.flash.error", "Connection to authentication provider failed"
872     assert_select "span.username", false
873   end
874
875   def test_login_wikipedia_invalid_credentials
876     OmniAuth.config.mock_auth[:wikipedia] = :invalid_credentials
877
878     get "/login", :params => { :referer => "/history" }
879     assert_response :redirect
880     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
881     follow_redirect!
882     assert_response :success
883     assert_template "users/login"
884     get auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
885     assert_response :redirect
886     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
887     follow_redirect!
888     assert_response :redirect
889     assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
890     follow_redirect!
891     assert_response :redirect
892     follow_redirect!
893     assert_response :success
894     assert_template "login"
895     assert_select "div.flash.error", "Invalid authentication credentials"
896     assert_select "span.username", false
897   end
898
899   def test_login_wikipedia_unknown
900     OmniAuth.config.add_mock(:wikipedia, :uid => "987654321")
901
902     get "/login", :params => { :referer => "/history" }
903     assert_response :redirect
904     assert_redirected_to "controller" => "users", "action" => "login", "cookie_test" => "true", "referer" => "/history"
905     follow_redirect!
906     assert_response :success
907     assert_template "users/login"
908     get auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
909     assert_response :redirect
910     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
911     follow_redirect!
912     assert_response :redirect
913     follow_redirect!
914     assert_response :success
915     assert_template "users/new"
916     assert_select "span.username", false
917   end
918
919   private
920
921   def try_password_login(username, password, remember_me = nil)
922     get "/login"
923     assert_response :redirect
924     assert_redirected_to :controller => :users, :action => :login, :cookie_test => true
925     follow_redirect!
926     assert_response :success
927     assert_template "login"
928     assert_select "input#username", 1 do
929       assert_select "[value]", false
930     end
931     assert_select "input#password", 1 do
932       assert_select "[value=?]", ""
933     end
934     assert_select "input#remember_me", 1 do
935       assert_select "[checked]", false
936     end
937
938     post "/login", :params => { :username => username, :password => "wrong", :remember_me => remember_me, :referer => "/history" }
939     assert_response :redirect
940     follow_redirect!
941     assert_response :success
942     assert_template "login"
943     assert_select "input#username", 1 do
944       assert_select "[value=?]", username
945     end
946     assert_select "input#password", 1 do
947       assert_select "[value=?]", ""
948     end
949     assert_select "input#remember_me", 1 do
950       assert_select "[checked]", remember_me == "yes"
951     end
952
953     post "/login", :params => { :username => username, :password => password, :remember_me => remember_me, :referer => "/history" }
954     assert_response :redirect
955     follow_redirect!
956     assert_response :success
957   end
958 end