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