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