Merge remote-tracking branch 'openstreetmap/pull/1004'
[rails.git] / test / integration / user_login_test.rb
1 require "test_helper"
2
3 class UserLoginTest < ActionDispatch::IntegrationTest
4   fixtures :users, :user_blocks
5
6   def setup
7     OmniAuth.config.test_mode = true
8   end
9
10   def teardown
11     OmniAuth.config.mock_auth[:openid] = nil
12     OmniAuth.config.mock_auth[:google] = nil
13     OmniAuth.config.mock_auth[:facebook] = nil
14     OmniAuth.config.mock_auth[:windowslive] = nil
15     OmniAuth.config.mock_auth[:github] = nil
16     OmniAuth.config.test_mode = false
17   end
18
19   def test_login_email_password_normal
20     user = users(:normal_user)
21
22     try_password_login user.email, "test"
23
24     assert_template "changeset/history"
25     assert_select "span.username", "test"
26   end
27
28   def test_login_email_password_normal_upcase
29     user = users(:normal_user)
30
31     try_password_login user.email.upcase, "test"
32
33     assert_template "changeset/history"
34     assert_select "span.username", "TEST"
35   end
36
37   def test_login_email_password_normal_titlecase
38     user = users(:normal_user)
39
40     try_password_login user.email.titlecase, "test"
41
42     assert_template "login"
43     assert_select "span.username", false
44   end
45
46   def test_login_email_password_public
47     user = users(:public_user)
48
49     try_password_login user.email, "test"
50
51     assert_template "changeset/history"
52     assert_select "span.username", "test2"
53   end
54
55   def test_login_email_password_public_upcase
56     user = users(:public_user)
57
58     try_password_login user.email.upcase, "test"
59
60     assert_template "changeset/history"
61     assert_select "span.username", "test2"
62   end
63
64   def test_login_email_password_public_titlecase
65     user = users(:public_user)
66
67     try_password_login user.email.titlecase, "test"
68
69     assert_template "changeset/history"
70     assert_select "span.username", "test2"
71   end
72
73   def test_login_email_password_inactive
74     user = users(:inactive_user)
75
76     try_password_login user.email, "test2"
77
78     assert_template "confirm"
79     assert_select "span.username", false
80   end
81
82   def test_login_email_password_inactive_upcase
83     user = users(:inactive_user)
84
85     try_password_login user.email.upcase, "test2"
86
87     assert_template "confirm"
88     assert_select "span.username", false
89   end
90
91   def test_login_email_password_inactive_titlecase
92     user = users(:inactive_user)
93
94     try_password_login user.email.titlecase, "test2"
95
96     assert_template "confirm"
97     assert_select "span.username", false
98   end
99
100   def test_login_email_password_suspended
101     user = users(:suspended_user)
102
103     try_password_login user.email, "test"
104
105     assert_template "login"
106     assert_select "span.username", false
107     assert_select "div.flash.error", /your account has been suspended/
108   end
109
110   def test_login_email_password_suspended_upcase
111     user = users(:suspended_user)
112
113     try_password_login user.email.upcase, "test"
114
115     assert_template "login"
116     assert_select "span.username", false
117     assert_select "div.flash.error", /your account has been suspended/
118   end
119
120   def test_login_email_password_suspended_titlecase
121     user = users(:suspended_user)
122
123     try_password_login user.email.titlecase, "test"
124
125     assert_template "login"
126     assert_select "span.username", false
127     assert_select "div.flash.error", /your account has been suspended/
128   end
129
130   def test_login_email_password_blocked
131     user = users(:blocked_user)
132
133     try_password_login user.email, "test"
134
135     assert_template "user_blocks/show"
136     assert_select "span.username", "blocked"
137   end
138
139   def test_login_email_password_blocked_upcase
140     user = users(:blocked_user)
141
142     try_password_login user.email.upcase, "test"
143
144     assert_template "user_blocks/show"
145     assert_select "span.username", "blocked"
146   end
147
148   def test_login_email_password_blocked_titlecase
149     user = users(:blocked_user)
150
151     try_password_login user.email.titlecase, "test"
152
153     assert_template "user_blocks/show"
154     assert_select "span.username", "blocked"
155   end
156
157   def test_login_username_password_normal
158     user = users(:normal_user)
159
160     try_password_login user.display_name, "test"
161
162     assert_template "changeset/history"
163     assert_select "span.username", "test"
164   end
165
166   def test_login_username_password_normal_upcase
167     user = users(:normal_user)
168
169     try_password_login user.display_name.upcase, "test"
170
171     assert_template "changeset/history"
172     assert_select "span.username", "TEST"
173   end
174
175   def test_login_username_password_normal_titlecase
176     user = users(:normal_user)
177
178     try_password_login user.display_name.titlecase, "test"
179
180     assert_template "login"
181     assert_select "span.username", false
182   end
183
184   def test_login_username_password_public
185     user = users(:public_user)
186
187     try_password_login user.display_name, "test"
188
189     assert_template "changeset/history"
190     assert_select "span.username", "test2"
191   end
192
193   def test_login_username_password_public_upcase
194     user = users(:public_user)
195
196     try_password_login user.display_name.upcase, "test"
197
198     assert_template "changeset/history"
199     assert_select "span.username", "test2"
200   end
201
202   def test_login_username_password_public_titlecase
203     user = users(:public_user)
204
205     try_password_login user.display_name.titlecase, "test"
206
207     assert_template "changeset/history"
208     assert_select "span.username", "test2"
209   end
210
211   def test_login_username_password_inactive
212     user = users(:inactive_user)
213
214     try_password_login user.display_name, "test2"
215
216     assert_template "confirm"
217     assert_select "span.username", false
218   end
219
220   def test_login_username_password_inactive_upcase
221     user = users(:inactive_user)
222
223     try_password_login user.display_name.upcase, "test2"
224
225     assert_template "confirm"
226     assert_select "span.username", false
227   end
228
229   def test_login_username_password_inactive_titlecase
230     user = users(:inactive_user)
231
232     try_password_login user.display_name.titlecase, "test2"
233
234     assert_template "confirm"
235     assert_select "span.username", false
236   end
237
238   def test_login_username_password_suspended
239     user = users(:suspended_user)
240
241     try_password_login user.display_name, "test"
242
243     assert_template "login"
244     assert_select "span.username", false
245     assert_select "div.flash.error", /your account has been suspended/
246   end
247
248   def test_login_username_password_suspended_upcase
249     user = users(:suspended_user)
250
251     try_password_login user.display_name.upcase, "test"
252
253     assert_template "login"
254     assert_select "span.username", false
255     assert_select "div.flash.error", /your account has been suspended/
256   end
257
258   def test_login_username_password_suspended_titlecase
259     user = users(:suspended_user)
260
261     try_password_login user.display_name.titlecase, "test"
262
263     assert_template "login"
264     assert_select "span.username", false
265     assert_select "div.flash.error", /your account has been suspended/
266   end
267
268   def test_login_username_password_blocked
269     user = users(:blocked_user)
270
271     try_password_login user.display_name.upcase, "test"
272
273     assert_template "user_blocks/show"
274     assert_select "span.username", "blocked"
275   end
276
277   def test_login_username_password_blocked_upcase
278     user = users(:blocked_user)
279
280     try_password_login user.display_name, "test"
281
282     assert_template "user_blocks/show"
283     assert_select "span.username", "blocked"
284   end
285
286   def test_login_username_password_blocked_titlecase
287     user = users(:blocked_user)
288
289     try_password_login user.display_name.titlecase, "test"
290
291     assert_template "user_blocks/show"
292     assert_select "span.username", "blocked"
293   end
294
295   def test_login_email_password_remember_me
296     user = users(:normal_user)
297
298     try_password_login user.email, "test", "yes"
299
300     assert_template "changeset/history"
301     assert_select "span.username", "test"
302     assert session.key?(:_remember_for)
303   end
304
305   def test_login_username_password_remember_me
306     user = users(:normal_user)
307
308     try_password_login user.display_name, "test", "yes"
309
310     assert_template "changeset/history"
311     assert_select "span.username", "test"
312     assert session.key?(:_remember_for)
313   end
314
315   def test_login_openid_success
316     OmniAuth.config.add_mock(:openid, :uid => "http://localhost:1123/john.doe")
317
318     get "/login", :referer => "/history"
319     assert_response :redirect
320     assert_redirected_to :controller => :user, :action => :login, :cookie_test => true, :referer => "/history"
321     follow_redirect!
322     assert_response :success
323     assert_template "user/login"
324     post "/login", :openid_url => "http://localhost:1123/john.doe", :referer => "/history"
325     assert_response :redirect
326     assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
327     follow_redirect!
328     assert_response :redirect
329     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
330     follow_redirect!
331     assert_response :redirect
332     follow_redirect!
333     assert_response :success
334     assert_template "changeset/history"
335     assert_select "span.username", "openIDuser"
336   end
337
338   def test_login_openid_remember_me
339     OmniAuth.config.add_mock(:openid, :uid => "http://localhost:1123/john.doe")
340
341     get "/login", :referer => "/history"
342     assert_response :redirect
343     assert_redirected_to :controller => :user, :action => :login, :cookie_test => true, :referer => "/history"
344     follow_redirect!
345     assert_response :success
346     assert_template "user/login"
347     post "/login", :openid_url => "http://localhost:1123/john.doe", :remember_me_openid => true, :referer => "/history"
348     assert_response :redirect
349     assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
350     follow_redirect!
351     assert_response :redirect
352     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
353     follow_redirect!
354     assert_response :redirect
355     follow_redirect!
356     assert_response :success
357     assert_template "changeset/history"
358     assert_select "span.username", "openIDuser"
359     assert session.key?(:_remember_for)
360   end
361
362   def test_login_openid_connection_failed
363     OmniAuth.config.mock_auth[:openid] = :connection_failed
364
365     get "/login", :referer => "/history"
366     assert_response :redirect
367     assert_redirected_to :controller => :user, :action => :login, :cookie_test => true, :referer => "/history"
368     follow_redirect!
369     assert_response :success
370     assert_template "user/login"
371     post "/login", :openid_url => "http://localhost:1123/john.doe", :referer => "/history"
372     assert_response :redirect
373     assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
374     follow_redirect!
375     assert_response :redirect
376     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
377     follow_redirect!
378     assert_response :redirect
379     assert_redirected_to auth_failure_path(:strategy => "openid", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
380     follow_redirect!
381     assert_response :redirect
382     follow_redirect!
383     assert_response :success
384     assert_template "login"
385     assert_select "div.flash.error", "Connection to authentication provider failed"
386     assert_select "span.username", false
387   end
388
389   def test_login_openid_invalid_credentials
390     OmniAuth.config.mock_auth[:openid] = :invalid_credentials
391
392     get "/login", :referer => "/history"
393     assert_response :redirect
394     assert_redirected_to :controller => :user, :action => :login, :cookie_test => true, :referer => "/history"
395     follow_redirect!
396     assert_response :success
397     assert_template "user/login"
398     post "/login", :openid_url => "http://localhost:1123/john.doe", :referer => "/history"
399     assert_response :redirect
400     assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
401     follow_redirect!
402     assert_response :redirect
403     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
404     follow_redirect!
405     assert_response :redirect
406     assert_redirected_to auth_failure_path(:strategy => "openid", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
407     follow_redirect!
408     assert_response :redirect
409     follow_redirect!
410     assert_response :success
411     assert_template "login"
412     assert_select "div.flash.error", "Invalid authentication credentials"
413     assert_select "span.username", false
414   end
415
416   def test_login_openid_unknown
417     OmniAuth.config.add_mock(:openid, :uid => "http://localhost:1123/fred.bloggs")
418
419     get "/login", :referer => "/history"
420     assert_response :redirect
421     assert_redirected_to :controller => :user, :action => :login, :cookie_test => true, :referer => "/history"
422     follow_redirect!
423     assert_response :success
424     assert_template "user/login"
425     post "/login", :openid_url => "http://localhost:1123/fred.bloggs", :referer => "/history"
426     assert_response :redirect
427     assert_redirected_to auth_path(:provider => "openid", :openid_url => "http://localhost:1123/fred.bloggs", :origin => "/login?referer=%2Fhistory", :referer => "/history")
428     follow_redirect!
429     assert_response :redirect
430     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/fred.bloggs", :origin => "/login?referer=%2Fhistory", :referer => "/history")
431     follow_redirect!
432     assert_response :redirect
433     follow_redirect!
434     assert_response :success
435     assert_template "user/new"
436     assert_select "span.username", false
437   end
438
439   def test_login_google_success
440     OmniAuth.config.add_mock(:google, :uid => "123456789", :extra => {
441                                :id_info => { "openid_id" => "http://localhost:1123/fred.bloggs" }
442                              })
443
444     get "/login", :referer => "/history"
445     assert_response :redirect
446     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
447     follow_redirect!
448     assert_response :success
449     assert_template "user/login"
450     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
451     assert_response :redirect
452     assert_redirected_to auth_success_path(:provider => "google")
453     follow_redirect!
454     assert_response :redirect
455     follow_redirect!
456     assert_response :success
457     assert_template "changeset/history"
458     assert_select "span.username", "googleuser"
459   end
460
461   def test_login_google_connection_failed
462     OmniAuth.config.mock_auth[:google] = :connection_failed
463
464     get "/login", :referer => "/history"
465     assert_response :redirect
466     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
467     follow_redirect!
468     assert_response :success
469     assert_template "user/login"
470     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
471     assert_response :redirect
472     assert_redirected_to auth_success_path(:provider => "google")
473     follow_redirect!
474     assert_response :redirect
475     assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
476     follow_redirect!
477     assert_response :redirect
478     follow_redirect!
479     assert_response :success
480     assert_template "login"
481     assert_select "div.flash.error", "Connection to authentication provider failed"
482     assert_select "span.username", false
483   end
484
485   def test_login_google_invalid_credentials
486     OmniAuth.config.mock_auth[:google] = :invalid_credentials
487
488     get "/login", :referer => "/history"
489     assert_response :redirect
490     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
491     follow_redirect!
492     assert_response :success
493     assert_template "user/login"
494     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
495     assert_response :redirect
496     assert_redirected_to auth_success_path(:provider => "google")
497     follow_redirect!
498     assert_response :redirect
499     assert_redirected_to auth_failure_path(:strategy => "google", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
500     follow_redirect!
501     assert_response :redirect
502     follow_redirect!
503     assert_response :success
504     assert_template "login"
505     assert_select "div.flash.error", "Invalid authentication credentials"
506     assert_select "span.username", false
507   end
508
509   def test_login_google_unknown
510     OmniAuth.config.add_mock(:google, :uid => "987654321", :extra => {
511                                :id_info => { "openid_id" => "http://localhost:1123/fred.bloggs" }
512                              })
513
514     get "/login", :referer => "/history"
515     assert_response :redirect
516     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
517     follow_redirect!
518     assert_response :success
519     assert_template "user/login"
520     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
521     assert_response :redirect
522     assert_redirected_to auth_success_path(:provider => "google")
523     follow_redirect!
524     assert_response :redirect
525     follow_redirect!
526     assert_response :success
527     assert_template "user/new"
528     assert_select "span.username", false
529   end
530
531   def test_login_google_upgrade
532     OmniAuth.config.add_mock(:google, :uid => "987654321", :extra => {
533                                :id_info => { "openid_id" => "http://localhost:1123/john.doe" }
534                              })
535
536     get "/login", :referer => "/history"
537     assert_response :redirect
538     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
539     follow_redirect!
540     assert_response :success
541     assert_template "user/login"
542     get auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
543     assert_response :redirect
544     assert_redirected_to auth_success_path(:provider => "google")
545     follow_redirect!
546     assert_response :redirect
547     follow_redirect!
548     assert_response :success
549     assert_template "changeset/history"
550     assert_select "span.username", "openIDuser"
551
552     user = User.find_by_display_name("openIDuser")
553     assert_equal "google", user.auth_provider
554     assert_equal "987654321", user.auth_uid
555   end
556
557   def test_login_facebook_success
558     OmniAuth.config.add_mock(:facebook, :uid => "123456789")
559
560     get "/login", :referer => "/history"
561     assert_response :redirect
562     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
563     follow_redirect!
564     assert_response :success
565     assert_template "user/login"
566     get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
567     assert_response :redirect
568     assert_redirected_to auth_success_path(:provider => "facebook")
569     follow_redirect!
570     assert_response :redirect
571     follow_redirect!
572     assert_response :success
573     assert_template "changeset/history"
574     assert_select "span.username", "facebookuser"
575   end
576
577   def test_login_facebook_connection_failed
578     OmniAuth.config.mock_auth[:facebook] = :connection_failed
579
580     get "/login", :referer => "/history"
581     assert_response :redirect
582     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
583     follow_redirect!
584     assert_response :success
585     assert_template "user/login"
586     get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
587     assert_response :redirect
588     assert_redirected_to auth_success_path(:provider => "facebook")
589     follow_redirect!
590     assert_response :redirect
591     assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
592     follow_redirect!
593     assert_response :redirect
594     follow_redirect!
595     assert_response :success
596     assert_template "login"
597     assert_select "div.flash.error", "Connection to authentication provider failed"
598     assert_select "span.username", false
599   end
600
601   def test_login_facebook_invalid_credentials
602     OmniAuth.config.mock_auth[:facebook] = :invalid_credentials
603
604     get "/login", :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     assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
616     follow_redirect!
617     assert_response :redirect
618     follow_redirect!
619     assert_response :success
620     assert_template "login"
621     assert_select "div.flash.error", "Invalid authentication credentials"
622     assert_select "span.username", false
623   end
624
625   def test_login_facebook_unknown
626     OmniAuth.config.add_mock(:facebook, :uid => "987654321")
627
628     get "/login", :referer => "/history"
629     assert_response :redirect
630     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
631     follow_redirect!
632     assert_response :success
633     assert_template "user/login"
634     get auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
635     assert_response :redirect
636     assert_redirected_to auth_success_path(:provider => "facebook")
637     follow_redirect!
638     assert_response :redirect
639     follow_redirect!
640     assert_response :success
641     assert_template "user/new"
642     assert_select "span.username", false
643   end
644
645   def test_login_windowslive_success
646     OmniAuth.config.add_mock(:windowslive, :uid => "123456789")
647
648     get "/login", :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 => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
655     assert_response :redirect
656     assert_redirected_to auth_success_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
657     follow_redirect!
658     assert_response :redirect
659     follow_redirect!
660     assert_response :success
661     assert_template "changeset/history"
662     assert_select "span.username", "windowsliveuser"
663   end
664
665   def test_login_windowslive_connection_failed
666     OmniAuth.config.mock_auth[:windowslive] = :connection_failed
667
668     get "/login", :referer => "/history"
669     assert_response :redirect
670     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
671     follow_redirect!
672     assert_response :success
673     assert_template "user/login"
674     get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
675     assert_response :redirect
676     assert_redirected_to auth_success_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
677     follow_redirect!
678     assert_response :redirect
679     assert_redirected_to auth_failure_path(:strategy => "windowslive", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
680     follow_redirect!
681     assert_response :redirect
682     follow_redirect!
683     assert_response :success
684     assert_template "login"
685     assert_select "div.flash.error", "Connection to authentication provider failed"
686     assert_select "span.username", false
687   end
688
689   def test_login_windowslive_invalid_credentials
690     OmniAuth.config.mock_auth[:windowslive] = :invalid_credentials
691
692     get "/login", :referer => "/history"
693     assert_response :redirect
694     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
695     follow_redirect!
696     assert_response :success
697     assert_template "user/login"
698     get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
699     assert_response :redirect
700     assert_redirected_to auth_success_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
701     follow_redirect!
702     assert_response :redirect
703     assert_redirected_to auth_failure_path(:strategy => "windowslive", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
704     follow_redirect!
705     assert_response :redirect
706     follow_redirect!
707     assert_response :success
708     assert_template "login"
709     assert_select "div.flash.error", "Invalid authentication credentials"
710     assert_select "span.username", false
711   end
712
713   def test_login_windowslive_unknown
714     OmniAuth.config.add_mock(:windowslive, :uid => "987654321")
715
716     get "/login", :referer => "/history"
717     assert_response :redirect
718     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
719     follow_redirect!
720     assert_response :success
721     assert_template "user/login"
722     get auth_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
723     assert_response :redirect
724     assert_redirected_to auth_success_path(:provider => "windowslive", :origin => "/login?referer=%2Fhistory", :referer => "/history")
725     follow_redirect!
726     assert_response :redirect
727     follow_redirect!
728     assert_response :success
729     assert_template "user/new"
730     assert_select "span.username", false
731   end
732
733   def test_login_github_success
734     OmniAuth.config.add_mock(:github, :uid => "123456789")
735
736     get "/login", :referer => "/history"
737     assert_response :redirect
738     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
739     follow_redirect!
740     assert_response :success
741     assert_template "user/login"
742     get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
743     assert_response :redirect
744     assert_redirected_to auth_success_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
745     follow_redirect!
746     assert_response :redirect
747     follow_redirect!
748     assert_response :success
749     assert_template "changeset/history"
750     assert_select "span.username", "githubuser"
751   end
752
753   def test_login_github_connection_failed
754     OmniAuth.config.mock_auth[:github] = :connection_failed
755
756     get "/login", :referer => "/history"
757     assert_response :redirect
758     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
759     follow_redirect!
760     assert_response :success
761     assert_template "user/login"
762     get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
763     assert_response :redirect
764     assert_redirected_to auth_success_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
765     follow_redirect!
766     assert_response :redirect
767     assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
768     follow_redirect!
769     assert_response :redirect
770     follow_redirect!
771     assert_response :success
772     assert_template "login"
773     assert_select "div.flash.error", "Connection to authentication provider failed"
774     assert_select "span.username", false
775   end
776
777   def test_login_github_invalid_credentials
778     OmniAuth.config.mock_auth[:github] = :invalid_credentials
779
780     get "/login", :referer => "/history"
781     assert_response :redirect
782     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
783     follow_redirect!
784     assert_response :success
785     assert_template "user/login"
786     get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
787     assert_response :redirect
788     assert_redirected_to auth_success_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
789     follow_redirect!
790     assert_response :redirect
791     assert_redirected_to auth_failure_path(:strategy => "github", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
792     follow_redirect!
793     assert_response :redirect
794     follow_redirect!
795     assert_response :success
796     assert_template "login"
797     assert_select "div.flash.error", "Invalid authentication credentials"
798     assert_select "span.username", false
799   end
800
801   def test_login_github_unknown
802     OmniAuth.config.add_mock(:github, :uid => "987654321")
803
804     get "/login", :referer => "/history"
805     assert_response :redirect
806     assert_redirected_to "controller" => "user", "action" => "login", "cookie_test" => "true", "referer" => "/history"
807     follow_redirect!
808     assert_response :success
809     assert_template "user/login"
810     get auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
811     assert_response :redirect
812     assert_redirected_to auth_success_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
813     follow_redirect!
814     assert_response :redirect
815     follow_redirect!
816     assert_response :success
817     assert_template "user/new"
818     assert_select "span.username", false
819   end
820
821   private
822
823   def try_password_login(username, password, remember_me = nil)
824     get "/login"
825     assert_response :redirect
826     assert_redirected_to :controller => :user, :action => :login, :cookie_test => true
827     follow_redirect!
828     assert_response :success
829     assert_template "login"
830     assert_select "input#username", 1 do
831       assert_select "[value]", false
832     end
833     assert_select "input#password", 1 do
834       assert_select "[value=?]", ""
835     end
836     assert_select "input#remember_me", 1 do
837       assert_select "[checked]", false
838     end
839
840     post "/login", :username => username, :password => "wrong", :remember_me => remember_me, :referer => "/history"
841     assert_response :redirect
842     follow_redirect!
843     assert_response :success
844     assert_template "login"
845     assert_select "input#username", 1 do
846       assert_select "[value=?]", username
847     end
848     assert_select "input#password", 1 do
849       assert_select "[value=?]", ""
850     end
851     assert_select "input#remember_me", 1 do
852       assert_select "[checked]", remember_me == "yes"
853     end
854
855     post "/login", :username => username, :password => password, :remember_me => remember_me, :referer => "/history"
856     assert_response :redirect
857     follow_redirect!
858     assert_response :success
859   end
860 end