]> git.openstreetmap.org Git - rails.git/blob - test/integration/user_login_test.rb
Merge remote-tracking branch 'upstream/pull/5179'
[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[:microsoft] = 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 "sessions/new"
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 "sessions/new"
115     assert_select "span.username", false
116     assert_select "div.alert.alert-danger", /your account has been suspended/ do
117       assert_select "a[href='mailto:openstreetmap@example.com']", "support"
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 "sessions/new"
127     assert_select "span.username", false
128     assert_select "div.alert.alert-danger", /your account has been suspended/ do
129       assert_select "a[href='mailto:openstreetmap@example.com']", "support"
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 "sessions/new"
139     assert_select "span.username", false
140     assert_select "div.alert.alert-danger", /your account has been suspended/ do
141       assert_select "a[href='mailto:openstreetmap@example.com']", "support"
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 "sessions/new"
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 "sessions/new"
272     assert_select "span.username", false
273     assert_select "div.alert.alert-danger", /your account has been suspended/ do
274       assert_select "a[href='mailto:openstreetmap@example.com']", "support"
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 "sessions/new"
284     assert_select "span.username", false
285     assert_select "div.alert.alert-danger", /your account has been suspended/ do
286       assert_select "a[href='mailto:openstreetmap@example.com']", "support"
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 "sessions/new"
296     assert_select "span.username", false
297     assert_select "div.alert.alert-danger", /your account has been suspended/ do
298       assert_select "a[href='mailto:openstreetmap@example.com']", "support"
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_redirected_to login_path(:cookie_test => true, :referer => "/history")
358     follow_redirect!
359     assert_response :success
360     assert_template "sessions/new"
361     post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
362     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
363     follow_redirect!
364     assert_response :redirect
365     follow_redirect!
366     assert_response :success
367     assert_template "changesets/history"
368     assert_select "span.username", user.display_name
369   end
370
371   def test_login_openid_pending
372     user = create(:user, :pending, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
373     OmniAuth.config.add_mock(:openid, :uid => user.auth_uid)
374
375     get "/login", :params => { :referer => "/history" }
376     assert_redirected_to login_path(:cookie_test => true, :referer => "/history")
377     follow_redirect!
378     assert_response :success
379     assert_template "sessions/new"
380     post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
381     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
382     follow_redirect!
383     assert_response :redirect
384     follow_redirect!
385     assert_response :success
386     assert_template "confirm"
387   end
388
389   def test_login_openid_suspended
390     user = create(:user, :suspended, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
391     OmniAuth.config.add_mock(:openid, :uid => user.auth_uid)
392
393     get "/login", :params => { :referer => "/history" }
394     assert_redirected_to login_path(:cookie_test => true, :referer => "/history")
395     follow_redirect!
396     assert_response :success
397     assert_template "sessions/new"
398     post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
399     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
400     follow_redirect!
401     assert_response :redirect
402     follow_redirect!
403     assert_response :success
404     assert_template "sessions/new"
405     assert_select "span.username", false
406     assert_select "div.alert.alert-danger", /your account has been suspended/ do
407       assert_select "a[href='mailto:openstreetmap@example.com']", "support"
408     end
409   end
410
411   def test_login_openid_blocked
412     user = create(:user, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
413     create(:user_block, :needs_view, :user => user)
414     OmniAuth.config.add_mock(:openid, :uid => user.auth_uid)
415
416     get "/login", :params => { :referer => "/history" }
417     assert_redirected_to login_path(:cookie_test => true, :referer => "/history")
418     follow_redirect!
419     assert_response :success
420     assert_template "sessions/new"
421     post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
422     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/john.doe", :origin => "/login?referer=%2Fhistory", :referer => "/history")
423     follow_redirect!
424     assert_response :redirect
425     follow_redirect!
426     assert_response :success
427     assert_template "user_blocks/show"
428     assert_select "span.username", user.display_name
429   end
430
431   def test_login_openid_connection_failed
432     user = create(:user, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
433     OmniAuth.config.mock_auth[:openid] = :connection_failed
434
435     get "/login", :params => { :referer => "/history" }
436     assert_redirected_to login_path(:cookie_test => true, :referer => "/history")
437     follow_redirect!
438     assert_response :success
439     assert_template "sessions/new"
440     post auth_path(:provider => "openid", :openid_url => user.auth_uid, :origin => "/login?referer=%2Fhistory", :referer => "/history")
441     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => user.auth_uid, :origin => "/login?referer=%2Fhistory", :referer => "/history")
442     follow_redirect!
443     assert_redirected_to auth_failure_path(:strategy => "openid", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
444     follow_redirect!
445     assert_response :redirect
446     follow_redirect!
447     assert_response :success
448     assert_template "sessions/new"
449     assert_select "div.alert.alert-danger", "Connection to authentication provider failed"
450     assert_select "span.username", false
451   end
452
453   def test_login_openid_invalid_credentials
454     user = create(:user, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
455     OmniAuth.config.mock_auth[:openid] = :invalid_credentials
456
457     get "/login", :params => { :referer => "/history" }
458     assert_redirected_to login_path(:cookie_test => true, :referer => "/history")
459     follow_redirect!
460     assert_response :success
461     assert_template "sessions/new"
462     post auth_path(:provider => "openid", :openid_url => user.auth_uid, :origin => "/login?referer=%2Fhistory", :referer => "/history")
463     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => user.auth_uid, :origin => "/login?referer=%2Fhistory", :referer => "/history")
464     follow_redirect!
465     assert_redirected_to auth_failure_path(:strategy => "openid", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
466     follow_redirect!
467     assert_response :redirect
468     follow_redirect!
469     assert_response :success
470     assert_template "sessions/new"
471     assert_select "div.alert.alert-danger", "Invalid authentication credentials"
472     assert_select "span.username", false
473   end
474
475   def test_login_openid_unknown
476     OmniAuth.config.add_mock(:openid, :uid => "http://localhost:1123/fred.bloggs")
477
478     get "/login", :params => { :referer => "/history" }
479     assert_redirected_to login_path(:cookie_test => true, :referer => "/history")
480     follow_redirect!
481     assert_response :success
482     assert_template "sessions/new"
483     post auth_path(:provider => "openid", :openid_url => "http://localhost:1123/fred.bloggs", :origin => "/login?referer=%2Fhistory", :referer => "/history")
484     assert_redirected_to auth_success_path(:provider => "openid", :openid_url => "http://localhost:1123/fred.bloggs", :origin => "/login?referer=%2Fhistory", :referer => "/history")
485     follow_redirect!
486     assert_response :redirect
487     follow_redirect!
488     assert_response :success
489     assert_template "users/new"
490     assert_select "span.username", false
491   end
492
493   def test_login_google_success
494     user = create(:user, :auth_provider => "google", :auth_uid => "1234567890")
495     OmniAuth.config.add_mock(:google, :uid => user.auth_uid, :extra => {
496                                :id_info => { "openid_id" => "http://localhost:1123/fred.bloggs" }
497                              })
498
499     get "/login", :params => { :referer => "/history" }
500     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
501     follow_redirect!
502     assert_response :success
503     assert_template "sessions/new"
504     post auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
505     assert_redirected_to auth_success_path(:provider => "google")
506     follow_redirect!
507     assert_response :redirect
508     follow_redirect!
509     assert_response :success
510     assert_template "changesets/history"
511     assert_select "span.username", user.display_name
512   end
513
514   def test_login_google_pending
515     user = create(:user, :pending, :auth_provider => "google", :auth_uid => "1234567890")
516     OmniAuth.config.add_mock(:google, :uid => user.auth_uid, :extra => {
517                                :id_info => { "openid_id" => "http://localhost:1123/fred.bloggs" }
518                              })
519
520     get "/login", :params => { :referer => "/history" }
521     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
522     follow_redirect!
523     assert_response :success
524     assert_template "sessions/new"
525     post auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
526     assert_redirected_to auth_success_path(:provider => "google")
527     follow_redirect!
528     assert_response :redirect
529     follow_redirect!
530     assert_response :success
531     assert_template "confirm"
532   end
533
534   def test_login_google_suspended
535     user = create(:user, :suspended, :auth_provider => "google", :auth_uid => "1234567890")
536     OmniAuth.config.add_mock(:google, :uid => user.auth_uid, :extra => {
537                                :id_info => { "openid_id" => "http://localhost:1123/fred.bloggs" }
538                              })
539
540     get "/login", :params => { :referer => "/history" }
541     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
542     follow_redirect!
543     assert_response :success
544     assert_template "sessions/new"
545     post auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
546     assert_redirected_to auth_success_path(:provider => "google")
547     follow_redirect!
548     assert_response :redirect
549     follow_redirect!
550     assert_response :success
551     assert_template "sessions/new"
552     assert_select "span.username", false
553     assert_select "div.alert.alert-danger", /your account has been suspended/ do
554       assert_select "a[href='mailto:openstreetmap@example.com']", "support"
555     end
556   end
557
558   def test_login_google_blocked
559     user = create(:user, :auth_provider => "google", :auth_uid => "1234567890")
560     create(:user_block, :needs_view, :user => user)
561     OmniAuth.config.add_mock(:google, :uid => user.auth_uid, :extra => {
562                                :id_info => { "openid_id" => "http://localhost:1123/fred.bloggs" }
563                              })
564
565     get "/login", :params => { :referer => "/history" }
566     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
567     follow_redirect!
568     assert_response :success
569     assert_template "sessions/new"
570     post auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
571     assert_redirected_to auth_success_path(:provider => "google")
572     follow_redirect!
573     assert_response :redirect
574     follow_redirect!
575     assert_response :success
576     assert_template "user_blocks/show"
577     assert_select "span.username", user.display_name
578   end
579
580   def test_login_google_connection_failed
581     OmniAuth.config.mock_auth[:google] = :connection_failed
582
583     get "/login", :params => { :referer => "/history" }
584     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
585     follow_redirect!
586     assert_response :success
587     assert_template "sessions/new"
588     post auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
589     assert_redirected_to auth_success_path(:provider => "google")
590     follow_redirect!
591     assert_redirected_to auth_failure_path(:strategy => "google", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
592     follow_redirect!
593     assert_response :redirect
594     follow_redirect!
595     assert_response :success
596     assert_template "sessions/new"
597     assert_select "div.alert.alert-danger", "Connection to authentication provider failed"
598     assert_select "span.username", false
599   end
600
601   def test_login_google_invalid_credentials
602     OmniAuth.config.mock_auth[:google] = :invalid_credentials
603
604     get "/login", :params => { :referer => "/history" }
605     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
606     follow_redirect!
607     assert_response :success
608     assert_template "sessions/new"
609     post auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
610     assert_redirected_to auth_success_path(:provider => "google")
611     follow_redirect!
612     assert_redirected_to auth_failure_path(:strategy => "google", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
613     follow_redirect!
614     assert_response :redirect
615     follow_redirect!
616     assert_response :success
617     assert_template "sessions/new"
618     assert_select "div.alert.alert-danger", "Invalid authentication credentials"
619     assert_select "span.username", false
620   end
621
622   def test_login_google_unknown
623     OmniAuth.config.add_mock(:google, :uid => "987654321", :extra => {
624                                :id_info => { "openid_id" => "http://localhost:1123/fred.bloggs" }
625                              })
626
627     get "/login", :params => { :referer => "/history" }
628     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
629     follow_redirect!
630     assert_response :success
631     assert_template "sessions/new"
632     post auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
633     assert_redirected_to auth_success_path(:provider => "google")
634     follow_redirect!
635     assert_response :redirect
636     follow_redirect!
637     assert_response :success
638     assert_template "users/new"
639     assert_select "span.username", false
640   end
641
642   def test_login_google_upgrade
643     user = create(:user, :auth_provider => "openid", :auth_uid => "http://example.com/john.doe")
644     OmniAuth.config.add_mock(:google, :uid => "987654321", :extra => {
645                                :id_info => { "openid_id" => user.auth_uid }
646                              })
647
648     get "/login", :params => { :referer => "/history" }
649     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
650     follow_redirect!
651     assert_response :success
652     assert_template "sessions/new"
653     post auth_path(:provider => "google", :origin => "/login?referer=%2Fhistory", :referer => "/history")
654     assert_redirected_to auth_success_path(:provider => "google")
655     follow_redirect!
656     assert_response :redirect
657     follow_redirect!
658     assert_response :success
659     assert_template "changesets/history"
660     assert_select "span.username", user.display_name
661
662     u = User.find_by(:display_name => user.display_name)
663     assert_equal "google", u.auth_provider
664     assert_equal "987654321", u.auth_uid
665   end
666
667   def test_login_facebook_success
668     user = create(:user, :auth_provider => "facebook", :auth_uid => "1234567890")
669     OmniAuth.config.add_mock(:facebook, :uid => user.auth_uid)
670
671     get "/login", :params => { :referer => "/history" }
672     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
673     follow_redirect!
674     assert_response :success
675     assert_template "sessions/new"
676     post auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
677     assert_redirected_to auth_success_path(:provider => "facebook")
678     follow_redirect!
679     assert_response :redirect
680     follow_redirect!
681     assert_response :success
682     assert_template "changesets/history"
683     assert_select "span.username", user.display_name
684   end
685
686   def test_login_facebook_pending
687     user = create(:user, :pending, :auth_provider => "facebook", :auth_uid => "1234567890")
688     OmniAuth.config.add_mock(:facebook, :uid => user.auth_uid)
689
690     get "/login", :params => { :referer => "/history" }
691     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
692     follow_redirect!
693     assert_response :success
694     assert_template "sessions/new"
695     post auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
696     assert_redirected_to auth_success_path(:provider => "facebook")
697     follow_redirect!
698     assert_response :redirect
699     follow_redirect!
700     assert_response :success
701     assert_template "confirm"
702   end
703
704   def test_login_facebook_suspended
705     user = create(:user, :suspended, :auth_provider => "facebook", :auth_uid => "1234567890")
706     OmniAuth.config.add_mock(:facebook, :uid => user.auth_uid)
707
708     get "/login", :params => { :referer => "/history" }
709     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
710     follow_redirect!
711     assert_response :success
712     assert_template "sessions/new"
713     post auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
714     assert_redirected_to auth_success_path(:provider => "facebook")
715     follow_redirect!
716     assert_response :redirect
717     follow_redirect!
718     assert_response :success
719     assert_template "sessions/new"
720     assert_select "span.username", false
721     assert_select "div.alert.alert-danger", /your account has been suspended/ do
722       assert_select "a[href='mailto:openstreetmap@example.com']", "support"
723     end
724   end
725
726   def test_login_facebook_blocked
727     user = create(:user, :auth_provider => "facebook", :auth_uid => "1234567890")
728     create(:user_block, :needs_view, :user => user)
729     OmniAuth.config.add_mock(:facebook, :uid => user.auth_uid)
730
731     get "/login", :params => { :referer => "/history" }
732     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
733     follow_redirect!
734     assert_response :success
735     assert_template "sessions/new"
736     post auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
737     assert_redirected_to auth_success_path(:provider => "facebook")
738     follow_redirect!
739     assert_response :redirect
740     follow_redirect!
741     assert_response :success
742     assert_template "user_blocks/show"
743     assert_select "span.username", user.display_name
744   end
745
746   def test_login_facebook_connection_failed
747     OmniAuth.config.mock_auth[:facebook] = :connection_failed
748
749     get "/login", :params => { :referer => "/history" }
750     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
751     follow_redirect!
752     assert_response :success
753     assert_template "sessions/new"
754     post auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
755     assert_redirected_to auth_success_path(:provider => "facebook")
756     follow_redirect!
757     assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
758     follow_redirect!
759     assert_response :redirect
760     follow_redirect!
761     assert_response :success
762     assert_template "sessions/new"
763     assert_select "div.alert.alert-danger", "Connection to authentication provider failed"
764     assert_select "span.username", false
765   end
766
767   def test_login_facebook_invalid_credentials
768     OmniAuth.config.mock_auth[:facebook] = :invalid_credentials
769
770     get "/login", :params => { :referer => "/history" }
771     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
772     follow_redirect!
773     assert_response :success
774     assert_template "sessions/new"
775     post auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
776     assert_redirected_to auth_success_path(:provider => "facebook")
777     follow_redirect!
778     assert_redirected_to auth_failure_path(:strategy => "facebook", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
779     follow_redirect!
780     assert_response :redirect
781     follow_redirect!
782     assert_response :success
783     assert_template "sessions/new"
784     assert_select "div.alert.alert-danger", "Invalid authentication credentials"
785     assert_select "span.username", false
786   end
787
788   def test_login_facebook_unknown
789     OmniAuth.config.add_mock(:facebook, :uid => "987654321")
790
791     get "/login", :params => { :referer => "/history" }
792     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
793     follow_redirect!
794     assert_response :success
795     assert_template "sessions/new"
796     post auth_path(:provider => "facebook", :origin => "/login?referer=%2Fhistory", :referer => "/history")
797     assert_redirected_to auth_success_path(:provider => "facebook")
798     follow_redirect!
799     assert_response :redirect
800     follow_redirect!
801     assert_response :success
802     assert_template "users/new"
803     assert_select "span.username", false
804   end
805
806   def test_login_microsoft_success
807     user = create(:user, :auth_provider => "microsoft", :auth_uid => "1234567890")
808     OmniAuth.config.add_mock(:microsoft, :uid => user.auth_uid)
809
810     get "/login", :params => { :referer => "/history" }
811     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
812     follow_redirect!
813     assert_response :success
814     assert_template "sessions/new"
815     post auth_path(:provider => "microsoft", :origin => "/login?referer=%2Fhistory", :referer => "/history")
816     assert_redirected_to auth_success_path(:provider => "microsoft")
817     follow_redirect!
818     assert_response :redirect
819     follow_redirect!
820     assert_response :success
821     assert_template "changesets/history"
822     assert_select "span.username", user.display_name
823   end
824
825   def test_login_microsoft_pending
826     user = create(:user, :pending, :auth_provider => "microsoft", :auth_uid => "1234567890")
827     OmniAuth.config.add_mock(:microsoft, :uid => user.auth_uid)
828
829     get "/login", :params => { :referer => "/history" }
830     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
831     follow_redirect!
832     assert_response :success
833     assert_template "sessions/new"
834     post auth_path(:provider => "microsoft", :origin => "/login?referer=%2Fhistory", :referer => "/history")
835     assert_redirected_to auth_success_path(:provider => "microsoft")
836     follow_redirect!
837     assert_response :redirect
838     follow_redirect!
839     assert_response :success
840     assert_template "confirm"
841   end
842
843   def test_login_microsoft_suspended
844     user = create(:user, :suspended, :auth_provider => "microsoft", :auth_uid => "1234567890")
845     OmniAuth.config.add_mock(:microsoft, :uid => user.auth_uid)
846
847     get "/login", :params => { :referer => "/history" }
848     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
849     follow_redirect!
850     assert_response :success
851     assert_template "sessions/new"
852     post auth_path(:provider => "microsoft", :origin => "/login?referer=%2Fhistory", :referer => "/history")
853     assert_redirected_to auth_success_path(:provider => "microsoft")
854     follow_redirect!
855     assert_response :redirect
856     follow_redirect!
857     assert_response :success
858     assert_template "sessions/new"
859     assert_select "span.username", false
860     assert_select "div.alert.alert-danger", /your account has been suspended/ do
861       assert_select "a[href='mailto:openstreetmap@example.com']", "support"
862     end
863   end
864
865   def test_login_microsoft_blocked
866     user = create(:user, :auth_provider => "microsoft", :auth_uid => "1234567890")
867     create(:user_block, :needs_view, :user => user)
868     OmniAuth.config.add_mock(:microsoft, :uid => user.auth_uid)
869
870     get "/login", :params => { :referer => "/history" }
871     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
872     follow_redirect!
873     assert_response :success
874     assert_template "sessions/new"
875     post auth_path(:provider => "microsoft", :origin => "/login?referer=%2Fhistory", :referer => "/history")
876     assert_redirected_to auth_success_path(:provider => "microsoft")
877     follow_redirect!
878     assert_response :redirect
879     follow_redirect!
880     assert_response :success
881     assert_template "user_blocks/show"
882     assert_select "span.username", user.display_name
883   end
884
885   def test_login_microsoft_connection_failed
886     OmniAuth.config.mock_auth[:microsoft] = :connection_failed
887
888     get "/login", :params => { :referer => "/history" }
889     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
890     follow_redirect!
891     assert_response :success
892     assert_template "sessions/new"
893     post auth_path(:provider => "microsoft", :origin => "/login?referer=%2Fhistory", :referer => "/history")
894     assert_redirected_to auth_success_path(:provider => "microsoft")
895     follow_redirect!
896     assert_redirected_to auth_failure_path(:strategy => "microsoft", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
897     follow_redirect!
898     assert_response :redirect
899     follow_redirect!
900     assert_response :success
901     assert_template "sessions/new"
902     assert_select "div.alert.alert-danger", "Connection to authentication provider failed"
903     assert_select "span.username", false
904   end
905
906   def test_login_microsoft_invalid_credentials
907     OmniAuth.config.mock_auth[:microsoft] = :invalid_credentials
908
909     get "/login", :params => { :referer => "/history" }
910     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
911     follow_redirect!
912     assert_response :success
913     assert_template "sessions/new"
914     post auth_path(:provider => "microsoft", :origin => "/login?referer=%2Fhistory", :referer => "/history")
915     assert_redirected_to auth_success_path(:provider => "microsoft")
916     follow_redirect!
917     assert_redirected_to auth_failure_path(:strategy => "microsoft", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
918     follow_redirect!
919     assert_response :redirect
920     follow_redirect!
921     assert_response :success
922     assert_template "sessions/new"
923     assert_select "div.alert.alert-danger", "Invalid authentication credentials"
924     assert_select "span.username", false
925   end
926
927   def test_login_microsoft_unknown
928     OmniAuth.config.add_mock(:microsoft, :uid => "987654321")
929
930     get "/login", :params => { :referer => "/history" }
931     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
932     follow_redirect!
933     assert_response :success
934     assert_template "sessions/new"
935     post auth_path(:provider => "microsoft", :origin => "/login?referer=%2Fhistory", :referer => "/history")
936     assert_redirected_to auth_success_path(:provider => "microsoft")
937     follow_redirect!
938     assert_response :redirect
939     follow_redirect!
940     assert_response :success
941     assert_template "users/new"
942     assert_select "span.username", false
943   end
944
945   def test_login_github_success
946     user = create(:user, :auth_provider => "github", :auth_uid => "1234567890")
947     OmniAuth.config.add_mock(:github, :uid => user.auth_uid)
948
949     get "/login", :params => { :referer => "/history" }
950     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
951     follow_redirect!
952     assert_response :success
953     assert_template "sessions/new"
954     post auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
955     assert_redirected_to auth_success_path(:provider => "github")
956     follow_redirect!
957     assert_response :redirect
958     follow_redirect!
959     assert_response :success
960     assert_template "changesets/history"
961     assert_select "span.username", user.display_name
962   end
963
964   def test_login_github_pending
965     user = create(:user, :pending, :auth_provider => "github", :auth_uid => "1234567890")
966     OmniAuth.config.add_mock(:github, :uid => user.auth_uid)
967
968     get "/login", :params => { :referer => "/history" }
969     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
970     follow_redirect!
971     assert_response :success
972     assert_template "sessions/new"
973     post auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
974     assert_redirected_to auth_success_path(:provider => "github")
975     follow_redirect!
976     assert_response :redirect
977     follow_redirect!
978     assert_response :success
979     assert_template "confirm"
980   end
981
982   def test_login_github_suspended
983     user = create(:user, :suspended, :auth_provider => "github", :auth_uid => "1234567890")
984     OmniAuth.config.add_mock(:github, :uid => user.auth_uid)
985
986     get "/login", :params => { :referer => "/history" }
987     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
988     follow_redirect!
989     assert_response :success
990     assert_template "sessions/new"
991     post auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
992     assert_redirected_to auth_success_path(:provider => "github")
993     follow_redirect!
994     assert_response :redirect
995     follow_redirect!
996     assert_response :success
997     assert_template "sessions/new"
998     assert_select "span.username", false
999     assert_select "div.alert.alert-danger", /your account has been suspended/ do
1000       assert_select "a[href='mailto:openstreetmap@example.com']", "support"
1001     end
1002   end
1003
1004   def test_login_github_blocked
1005     user = create(:user, :auth_provider => "github", :auth_uid => "1234567890")
1006     create(:user_block, :needs_view, :user => user)
1007     OmniAuth.config.add_mock(:github, :uid => user.auth_uid)
1008
1009     get "/login", :params => { :referer => "/history" }
1010     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
1011     follow_redirect!
1012     assert_response :success
1013     assert_template "sessions/new"
1014     post auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1015     assert_redirected_to auth_success_path(:provider => "github")
1016     follow_redirect!
1017     assert_response :redirect
1018     follow_redirect!
1019     assert_response :success
1020     assert_template "user_blocks/show"
1021     assert_select "span.username", user.display_name
1022   end
1023
1024   def test_login_github_connection_failed
1025     OmniAuth.config.mock_auth[:github] = :connection_failed
1026
1027     get "/login", :params => { :referer => "/history" }
1028     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
1029     follow_redirect!
1030     assert_response :success
1031     assert_template "sessions/new"
1032     post auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1033     assert_redirected_to auth_success_path(:provider => "github")
1034     follow_redirect!
1035     assert_redirected_to auth_failure_path(:strategy => "github", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
1036     follow_redirect!
1037     assert_response :redirect
1038     follow_redirect!
1039     assert_response :success
1040     assert_template "sessions/new"
1041     assert_select "div.alert.alert-danger", "Connection to authentication provider failed"
1042     assert_select "span.username", false
1043   end
1044
1045   def test_login_github_invalid_credentials
1046     OmniAuth.config.mock_auth[:github] = :invalid_credentials
1047
1048     get "/login", :params => { :referer => "/history" }
1049     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
1050     follow_redirect!
1051     assert_response :success
1052     assert_template "sessions/new"
1053     post auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1054     assert_redirected_to auth_success_path(:provider => "github")
1055     follow_redirect!
1056     assert_redirected_to auth_failure_path(:strategy => "github", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
1057     follow_redirect!
1058     assert_response :redirect
1059     follow_redirect!
1060     assert_response :success
1061     assert_template "sessions/new"
1062     assert_select "div.alert.alert-danger", "Invalid authentication credentials"
1063     assert_select "span.username", false
1064   end
1065
1066   def test_login_github_unknown
1067     OmniAuth.config.add_mock(:github, :uid => "987654321")
1068
1069     get "/login", :params => { :referer => "/history" }
1070     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
1071     follow_redirect!
1072     assert_response :success
1073     assert_template "sessions/new"
1074     post auth_path(:provider => "github", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1075     assert_redirected_to auth_success_path(:provider => "github")
1076     follow_redirect!
1077     assert_response :redirect
1078     follow_redirect!
1079     assert_response :success
1080     assert_template "users/new"
1081     assert_select "span.username", false
1082   end
1083
1084   def test_login_wikipedia_success
1085     user = create(:user, :auth_provider => "wikipedia", :auth_uid => "1234567890")
1086     OmniAuth.config.add_mock(:wikipedia, :uid => user.auth_uid)
1087
1088     get "/login", :params => { :referer => "/history" }
1089     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
1090     follow_redirect!
1091     assert_response :success
1092     assert_template "sessions/new"
1093     post auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1094     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1095     follow_redirect!
1096     assert_response :redirect
1097     follow_redirect!
1098     assert_response :success
1099     assert_template "changesets/history"
1100     assert_select "span.username", user.display_name
1101   end
1102
1103   def test_login_wikipedia_pending
1104     user = create(:user, :pending, :auth_provider => "wikipedia", :auth_uid => "1234567890")
1105     OmniAuth.config.add_mock(:wikipedia, :uid => user.auth_uid)
1106
1107     get "/login", :params => { :referer => "/history" }
1108     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
1109     follow_redirect!
1110     assert_response :success
1111     assert_template "sessions/new"
1112     post auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1113     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1114     follow_redirect!
1115     assert_response :redirect
1116     follow_redirect!
1117     assert_response :success
1118     assert_template "confirm"
1119   end
1120
1121   def test_login_wikipedia_suspended
1122     user = create(:user, :suspended, :auth_provider => "wikipedia", :auth_uid => "1234567890")
1123     OmniAuth.config.add_mock(:wikipedia, :uid => user.auth_uid)
1124
1125     get "/login", :params => { :referer => "/history" }
1126     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
1127     follow_redirect!
1128     assert_response :success
1129     assert_template "sessions/new"
1130     post auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1131     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1132     follow_redirect!
1133     assert_response :redirect
1134     follow_redirect!
1135     assert_response :success
1136     assert_template "sessions/new"
1137     assert_select "span.username", false
1138     assert_select "div.alert.alert-danger", /your account has been suspended/ do
1139       assert_select "a[href='mailto:openstreetmap@example.com']", "support"
1140     end
1141   end
1142
1143   def test_login_wikipedia_blocked
1144     user = create(:user, :auth_provider => "wikipedia", :auth_uid => "1234567890")
1145     create(:user_block, :needs_view, :user => user)
1146     OmniAuth.config.add_mock(:wikipedia, :uid => user.auth_uid)
1147
1148     get "/login", :params => { :referer => "/history" }
1149     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
1150     follow_redirect!
1151     assert_response :success
1152     assert_template "sessions/new"
1153     post auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1154     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1155     follow_redirect!
1156     assert_response :redirect
1157     follow_redirect!
1158     assert_response :success
1159     assert_template "user_blocks/show"
1160     assert_select "span.username", user.display_name
1161   end
1162
1163   def test_login_wikipedia_connection_failed
1164     OmniAuth.config.mock_auth[:wikipedia] = :connection_failed
1165
1166     get "/login", :params => { :referer => "/history" }
1167     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
1168     follow_redirect!
1169     assert_response :success
1170     assert_template "sessions/new"
1171     post auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1172     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1173     follow_redirect!
1174     assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "connection_failed", :origin => "/login?referer=%2Fhistory")
1175     follow_redirect!
1176     assert_response :redirect
1177     follow_redirect!
1178     assert_response :success
1179     assert_template "sessions/new"
1180     assert_select "div.alert.alert-danger", "Connection to authentication provider failed"
1181     assert_select "span.username", false
1182   end
1183
1184   def test_login_wikipedia_invalid_credentials
1185     OmniAuth.config.mock_auth[:wikipedia] = :invalid_credentials
1186
1187     get "/login", :params => { :referer => "/history" }
1188     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
1189     follow_redirect!
1190     assert_response :success
1191     assert_template "sessions/new"
1192     post auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1193     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1194     follow_redirect!
1195     assert_redirected_to auth_failure_path(:strategy => "wikipedia", :message => "invalid_credentials", :origin => "/login?referer=%2Fhistory")
1196     follow_redirect!
1197     assert_response :redirect
1198     follow_redirect!
1199     assert_response :success
1200     assert_template "sessions/new"
1201     assert_select "div.alert.alert-danger", "Invalid authentication credentials"
1202     assert_select "span.username", false
1203   end
1204
1205   def test_login_wikipedia_unknown
1206     OmniAuth.config.add_mock(:wikipedia, :uid => "987654321")
1207
1208     get "/login", :params => { :referer => "/history" }
1209     assert_redirected_to login_path("cookie_test" => "true", "referer" => "/history")
1210     follow_redirect!
1211     assert_response :success
1212     assert_template "sessions/new"
1213     post auth_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1214     assert_redirected_to auth_success_path(:provider => "wikipedia", :origin => "/login?referer=%2Fhistory", :referer => "/history")
1215     follow_redirect!
1216     assert_response :redirect
1217     follow_redirect!
1218     assert_response :success
1219     assert_template "users/new"
1220     assert_select "span.username", false
1221   end
1222
1223   private
1224
1225   def try_password_login(username, password, remember_me = nil)
1226     get "/login"
1227     assert_redirected_to login_path(:cookie_test => true)
1228     follow_redirect!
1229     assert_response :success
1230     assert_template "sessions/new"
1231     assert_select "input#username", 1 do
1232       assert_select "[value]", false
1233     end
1234     assert_select "input#password", 1 do
1235       assert_select "[value=?]", ""
1236     end
1237     assert_select "input#remember_me", 1 do
1238       assert_select "[checked]", false
1239     end
1240
1241     post "/login", :params => { :username => username, :password => "wrong", :remember_me => remember_me, :referer => "/history" }
1242     assert_response :redirect
1243     follow_redirect!
1244     assert_response :success
1245     assert_template "sessions/new"
1246     assert_select "input#username", 1 do
1247       assert_select "[value=?]", username
1248     end
1249     assert_select "input#password", 1 do
1250       assert_select "[value=?]", ""
1251     end
1252     assert_select "input#remember_me", 1 do
1253       assert_select "[checked]", remember_me == "yes"
1254     end
1255
1256     post "/login", :params => { :username => username, :password => password, :remember_me => remember_me, :referer => "/history" }
1257     assert_response :redirect
1258     follow_redirect!
1259     assert_response :success
1260   end
1261 end