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