devise_token_auth 0.1.43 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of devise_token_auth might be problematic. Click here for more details.

Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +40 -894
  3. data/Rakefile +2 -0
  4. data/app/controllers/devise_token_auth/application_controller.rb +6 -0
  5. data/app/controllers/devise_token_auth/concerns/resource_finder.rb +2 -0
  6. data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +9 -14
  7. data/app/controllers/devise_token_auth/confirmations_controller.rb +3 -1
  8. data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +2 -0
  9. data/app/controllers/devise_token_auth/passwords_controller.rb +8 -14
  10. data/app/controllers/devise_token_auth/registrations_controller.rb +26 -21
  11. data/app/controllers/devise_token_auth/sessions_controller.rb +2 -0
  12. data/app/controllers/devise_token_auth/token_validations_controller.rb +2 -0
  13. data/app/controllers/devise_token_auth/unlocks_controller.rb +2 -0
  14. data/app/models/devise_token_auth/concerns/user.rb +41 -16
  15. data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +2 -0
  16. data/app/validators/email_validator.rb +3 -1
  17. data/config/initializers/devise.rb +2 -0
  18. data/config/locales/da-DK.yml +1 -1
  19. data/config/locales/sv.yml +50 -0
  20. data/lib/devise_token_auth.rb +3 -0
  21. data/lib/devise_token_auth/controllers/helpers.rb +2 -0
  22. data/lib/devise_token_auth/controllers/url_helpers.rb +2 -0
  23. data/lib/devise_token_auth/engine.rb +2 -0
  24. data/lib/devise_token_auth/errors.rb +7 -0
  25. data/lib/devise_token_auth/rails/routes.rb +2 -0
  26. data/lib/devise_token_auth/url.rb +2 -0
  27. data/lib/devise_token_auth/version.rb +3 -1
  28. data/lib/generators/devise_token_auth/USAGE +1 -1
  29. data/lib/generators/devise_token_auth/install_generator.rb +7 -5
  30. data/lib/generators/devise_token_auth/install_views_generator.rb +2 -0
  31. data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +2 -0
  32. data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +8 -7
  33. data/lib/generators/devise_token_auth/templates/user.rb +3 -1
  34. data/lib/tasks/devise_token_auth_tasks.rake +2 -0
  35. data/test/controllers/custom/custom_confirmations_controller_test.rb +2 -0
  36. data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +2 -0
  37. data/test/controllers/custom/custom_passwords_controller_test.rb +2 -0
  38. data/test/controllers/custom/custom_registrations_controller_test.rb +11 -0
  39. data/test/controllers/custom/custom_sessions_controller_test.rb +2 -0
  40. data/test/controllers/custom/custom_token_validations_controller_test.rb +2 -0
  41. data/test/controllers/demo_group_controller_test.rb +2 -0
  42. data/test/controllers/demo_mang_controller_test.rb +4 -1
  43. data/test/controllers/demo_user_controller_test.rb +47 -10
  44. data/test/controllers/devise_token_auth/confirmations_controller_test.rb +4 -6
  45. data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +7 -4
  46. data/test/controllers/devise_token_auth/passwords_controller_test.rb +2 -0
  47. data/test/controllers/devise_token_auth/registrations_controller_test.rb +3 -1
  48. data/test/controllers/devise_token_auth/sessions_controller_test.rb +52 -0
  49. data/test/controllers/devise_token_auth/token_validations_controller_test.rb +2 -0
  50. data/test/controllers/devise_token_auth/unlocks_controller_test.rb +2 -0
  51. data/test/controllers/overrides/confirmations_controller_test.rb +2 -0
  52. data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +2 -0
  53. data/test/controllers/overrides/passwords_controller_test.rb +2 -0
  54. data/test/controllers/overrides/registrations_controller_test.rb +31 -27
  55. data/test/controllers/overrides/sessions_controller_test.rb +2 -0
  56. data/test/controllers/overrides/token_validations_controller_test.rb +2 -0
  57. data/test/dummy/app/controllers/application_controller.rb +2 -0
  58. data/test/dummy/app/controllers/auth_origin_controller.rb +2 -0
  59. data/test/dummy/app/controllers/custom/confirmations_controller.rb +2 -0
  60. data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +2 -0
  61. data/test/dummy/app/controllers/custom/passwords_controller.rb +2 -0
  62. data/test/dummy/app/controllers/custom/registrations_controller.rb +2 -1
  63. data/test/dummy/app/controllers/custom/sessions_controller.rb +2 -0
  64. data/test/dummy/app/controllers/custom/token_validations_controller.rb +2 -0
  65. data/test/dummy/app/controllers/demo_group_controller.rb +2 -0
  66. data/test/dummy/app/controllers/demo_mang_controller.rb +2 -0
  67. data/test/dummy/app/controllers/demo_user_controller.rb +2 -0
  68. data/test/dummy/app/controllers/overrides/confirmations_controller.rb +2 -0
  69. data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +2 -0
  70. data/test/dummy/app/controllers/overrides/passwords_controller.rb +2 -0
  71. data/test/dummy/app/controllers/overrides/registrations_controller.rb +2 -0
  72. data/test/dummy/app/controllers/overrides/sessions_controller.rb +2 -0
  73. data/test/dummy/app/controllers/overrides/token_validations_controller.rb +2 -0
  74. data/test/dummy/app/helpers/application_helper.rb +2 -0
  75. data/test/dummy/app/models/evil_user.rb +2 -0
  76. data/test/dummy/app/models/lockable_user.rb +2 -0
  77. data/test/dummy/app/models/mang.rb +2 -0
  78. data/test/dummy/app/models/nice_user.rb +2 -0
  79. data/test/dummy/app/models/only_email_user.rb +2 -0
  80. data/test/dummy/app/models/scoped_user.rb +2 -0
  81. data/test/dummy/app/models/unconfirmable_user.rb +2 -0
  82. data/test/dummy/app/models/unregisterable_user.rb +2 -0
  83. data/test/dummy/app/models/user.rb +2 -0
  84. data/test/dummy/config/application.rb +2 -0
  85. data/test/dummy/config/boot.rb +2 -0
  86. data/test/dummy/config/environment.rb +2 -0
  87. data/test/dummy/config/environments/development.rb +2 -0
  88. data/test/dummy/config/environments/production.rb +2 -0
  89. data/test/dummy/config/environments/test.rb +2 -0
  90. data/test/dummy/config/initializers/assets.rb +2 -0
  91. data/test/dummy/config/initializers/backtrace_silencers.rb +2 -0
  92. data/test/dummy/config/initializers/cookies_serializer.rb +3 -1
  93. data/test/dummy/config/initializers/devise.rb +2 -0
  94. data/test/dummy/config/initializers/devise_token_auth.rb +2 -0
  95. data/test/dummy/config/initializers/figaro.rb +2 -0
  96. data/test/dummy/config/initializers/filter_parameter_logging.rb +2 -0
  97. data/test/dummy/config/initializers/inflections.rb +2 -0
  98. data/test/dummy/config/initializers/mime_types.rb +2 -0
  99. data/test/dummy/config/initializers/omniauth.rb +2 -0
  100. data/test/dummy/config/initializers/session_store.rb +2 -0
  101. data/test/dummy/config/initializers/wrap_parameters.rb +2 -0
  102. data/test/dummy/config/routes.rb +2 -0
  103. data/test/dummy/config/spring.rb +2 -0
  104. data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +2 -0
  105. data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +2 -0
  106. data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +2 -0
  107. data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +2 -0
  108. data/test/dummy/db/migrate/20140928231203_devise_token_auth_create_evil_users.rb +2 -0
  109. data/test/dummy/db/migrate/20141222035835_devise_token_auth_create_only_email_users.rb +2 -0
  110. data/test/dummy/db/migrate/20141222053502_devise_token_auth_create_unregisterable_users.rb +2 -0
  111. data/test/dummy/db/migrate/20150409095712_devise_token_auth_create_nice_users.rb +2 -0
  112. data/test/dummy/db/migrate/20150708104536_devise_token_auth_create_unconfirmable_users.rb +2 -0
  113. data/test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb +2 -0
  114. data/test/dummy/db/migrate/20160629184441_devise_token_auth_create_lockable_users.rb +2 -0
  115. data/test/dummy/lib/migration_database_helper.rb +15 -1
  116. data/test/dummy/tmp/generators/app/models/user.rb +5 -5
  117. data/test/dummy/tmp/generators/config/initializers/devise_token_auth.rb +2 -0
  118. data/test/dummy/tmp/generators/db/migrate/{20171014052631_devise_token_auth_create_users.rb → 20180805205504_devise_token_auth_create_users.rb} +1 -0
  119. data/test/integration/navigation_test.rb +2 -0
  120. data/test/lib/devise_token_auth/url_test.rb +2 -0
  121. data/test/lib/generators/devise_token_auth/install_generator_test.rb +2 -0
  122. data/test/lib/generators/devise_token_auth/install_generator_with_namespace_test.rb +194 -0
  123. data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +2 -0
  124. data/test/models/only_email_user_test.rb +2 -0
  125. data/test/models/user_test.rb +6 -4
  126. data/test/test_helper.rb +30 -14
  127. metadata +23 -5
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "devise"
2
4
  require "devise_token_auth/engine"
3
5
  require "devise_token_auth/controllers/helpers"
4
6
  require "devise_token_auth/controllers/url_helpers"
5
7
  require "devise_token_auth/url"
8
+ require "devise_token_auth/errors"
6
9
 
7
10
  module DeviseTokenAuth
8
11
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DeviseTokenAuth
2
4
  module Controllers
3
5
  module Helpers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DeviseTokenAuth
2
4
  module Controllers
3
5
  module UrlHelpers
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'devise_token_auth/rails/routes'
2
4
 
3
5
  module DeviseTokenAuth
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DeviseTokenAuth
4
+ module Errors
5
+ class NoResourceDefinedError < StandardError ; end
6
+ end
7
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActionDispatch::Routing
2
4
  class Mapper
3
5
  def mount_devise_token_auth_for(resource, opts)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DeviseTokenAuth::Url
2
4
 
3
5
  def self.generate(url, params = {})
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DeviseTokenAuth
2
- VERSION = '0.1.43'
4
+ VERSION = '0.2.0'
3
5
  end
@@ -15,7 +15,7 @@ Example:
15
15
 
16
16
  This will create:
17
17
  config/initializers/devise_token_auth.rb
18
- db/migrate/<%= Time.now.utc.strftime("%Y%m%d%H%M%S") %>_create_devise_token_auth_create_users.rb
18
+ db/migrate/<%= Time.zone.now.utc.strftime("%Y%m%d%H%M%S") %>_create_devise_token_auth_create_users.rb
19
19
  app/models/user.rb
20
20
 
21
21
  If 'app/models/user.rb' already exists, the following line will be inserted
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DeviseTokenAuth
2
4
  class InstallGenerator < Rails::Generators::Base
3
5
  include Rails::Generators::Migration
@@ -12,12 +14,12 @@ module DeviseTokenAuth
12
14
  end
13
15
 
14
16
  def copy_migrations
15
- if self.class.migration_exists?("db/migrate", "devise_token_auth_create_#{ user_class.underscore }")
16
- say_status("skipped", "Migration 'devise_token_auth_create_#{ user_class.underscore }' already exists")
17
+ if self.class.migration_exists?("db/migrate", "devise_token_auth_create_#{ user_class.pluralize.gsub("::","").underscore }")
18
+ say_status("skipped", "Migration 'devise_token_auth_create_#{ user_class.pluralize.gsub("::","").underscore }' already exists")
17
19
  else
18
20
  migration_template(
19
21
  "devise_token_auth_create_users.rb.erb",
20
- "db/migrate/devise_token_auth_create_#{ user_class.pluralize.underscore }.rb"
22
+ "db/migrate/devise_token_auth_create_#{ user_class.pluralize.gsub("::","").underscore }.rb"
21
23
  )
22
24
  end
23
25
  end
@@ -29,7 +31,7 @@ module DeviseTokenAuth
29
31
  else
30
32
  inclusion = "include DeviseTokenAuth::Concerns::User"
31
33
  unless parse_file_for_line(fname, inclusion)
32
-
34
+
33
35
  active_record_needle = (Rails::VERSION::MAJOR == 5) ? 'ApplicationRecord' : 'ActiveRecord::Base'
34
36
  inject_into_file fname, after: "class #{user_class} < #{active_record_needle}\n" do <<-'RUBY'
35
37
  # Include default devise modules.
@@ -101,7 +103,7 @@ module DeviseTokenAuth
101
103
  private
102
104
 
103
105
  def self.next_migration_number(path)
104
- Time.now.utc.strftime("%Y%m%d%H%M%S")
106
+ Time.zone.now.utc.strftime("%Y%m%d%H%M%S")
105
107
  end
106
108
 
107
109
  def insert_after_line(filename, line, str)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module DeviseTokenAuth
2
4
  class InstallViewsGenerator < Rails::Generators::Base
3
5
  source_root File.expand_path('../../../../app/views/devise/mailer', __FILE__)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  DeviseTokenAuth.setup do |config|
2
4
  # By default the authorization headers will change after each request. The
3
5
  # client is responsible for keeping track of the changing tokens. Change
@@ -1,6 +1,7 @@
1
- class DeviseTokenAuthCreate<%= user_class.pluralize %> < ActiveRecord::Migration<%= "[#{Rails::VERSION::STRING[0..2]}]" if Rails::VERSION::MAJOR > 4 %>
1
+ class DeviseTokenAuthCreate<%= user_class.pluralize.gsub("::","") %> < ActiveRecord::Migration<%= "[#{Rails::VERSION::STRING[0..2]}]" if Rails::VERSION::MAJOR > 4 %>
2
2
  def change
3
- create_table(:<%= user_class.pluralize.underscore %>) do |t|
3
+ <% table_name = @user_class.pluralize.gsub("::","").underscore %>
4
+ create_table(:<%= table_name %>) do |t|
4
5
  ## Required
5
6
  t.string :provider, :null => false, :default => "email"
6
7
  t.string :uid, :null => false, :default => ""
@@ -46,10 +47,10 @@ class DeviseTokenAuthCreate<%= user_class.pluralize %> < ActiveRecord::Migration
46
47
  t.timestamps
47
48
  end
48
49
 
49
- add_index :<%= user_class.pluralize.underscore %>, :email, unique: true
50
- add_index :<%= user_class.pluralize.underscore %>, [:uid, :provider], unique: true
51
- add_index :<%= user_class.pluralize.underscore %>, :reset_password_token, unique: true
52
- add_index :<%= user_class.pluralize.underscore %>, :confirmation_token, unique: true
53
- # add_index :<%= user_class.pluralize.underscore %>, :unlock_token, unique: true
50
+ add_index :<%= table_name %>, :email, unique: true
51
+ add_index :<%= table_name %>, [:uid, :provider], unique: true
52
+ add_index :<%= table_name %>, :reset_password_token, unique: true
53
+ add_index :<%= table_name %>, :confirmation_token, unique: true
54
+ # add_index :<%= table_name %>, :unlock_token, unique: true
54
55
  end
55
56
  end
@@ -1,4 +1,6 @@
1
- class <%= user_class.capitalize %> < ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ class <%= user_class %> < ActiveRecord::Base
2
4
  # Include default devise modules. Others available are:
3
5
  # :confirmable, :lockable, :timeoutable and :omniauthable
4
6
  devise :database_authenticatable, :registerable,
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # desc "Explaining what the task does"
2
4
  # task :devise_token_auth do
3
5
  # # Task goes here
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class Custom::ConfirmationsControllerTest < ActionController::TestCase
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class Custom::OmniauthCallbacksControllerTest < ActionDispatch::IntegrationTest
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class Custom::PasswordsControllerTest < ActionController::TestCase
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class Custom::RegistrationsControllerTest < ActionDispatch::IntegrationTest
@@ -50,5 +52,14 @@ class Custom::RegistrationsControllerTest < ActionDispatch::IntegrationTest
50
52
  assert @controller.destroy_block_called?,
51
53
  'destroy failed to yield resource to provided block'
52
54
  end
55
+
56
+ describe 'when overriding #build_resource' do
57
+ test 'it fails' do
58
+ Custom::RegistrationsController.any_instance.stubs(:build_resource).returns(nil)
59
+ assert_raises DeviseTokenAuth::Errors::NoResourceDefinedError do
60
+ post '/nice_user_auth', params: @create_params
61
+ end
62
+ end
63
+ end
53
64
  end
54
65
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class Custom::SessionsControllerTest < ActionController::TestCase
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class Custom::TokenValidationsControllerTest < ActionDispatch::IntegrationTest
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  # was the web request successful?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  # was the web request successful?
@@ -214,7 +216,7 @@ class DemoMangControllerTest < ActionDispatch::IntegrationTest
214
216
  end
215
217
 
216
218
  it 'should not return auth headers for second (batched) requests' do
217
- assert_equal ' ', @second_access_token
219
+ refute @second_access_token
218
220
  end
219
221
  end
220
222
 
@@ -282,3 +284,4 @@ class DemoMangControllerTest < ActionDispatch::IntegrationTest
282
284
  end
283
285
  end
284
286
  end
287
+
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  # was the web request successful?
@@ -215,7 +217,7 @@ class DemoUserControllerTest < ActionDispatch::IntegrationTest
215
217
  end
216
218
 
217
219
  it 'should not return auth headers for second (batched) requests' do
218
- assert_equal ' ', @second_access_token
220
+ refute @second_access_token
219
221
  end
220
222
  end
221
223
 
@@ -407,6 +409,50 @@ class DemoUserControllerTest < ActionDispatch::IntegrationTest
407
409
  DeviseTokenAuth.headers_names[:'access-token'] = 'access-token'
408
410
  end
409
411
  end
412
+
413
+ describe 'maximum concurrent devices per user' do
414
+ before do
415
+ # Set the max_number_of_devices to a lower number
416
+ # to expedite tests! (Default is 10)
417
+ DeviseTokenAuth.max_number_of_devices = 5
418
+ end
419
+
420
+ it 'should limit the maximum number of concurrent devices' do
421
+ # increment the number of devices until the maximum is exceeded
422
+ 1.upto(DeviseTokenAuth.max_number_of_devices + 1).each do |n|
423
+
424
+ assert_equal(
425
+ [n, DeviseTokenAuth.max_number_of_devices].min,
426
+ @resource.reload.tokens.length
427
+ )
428
+
429
+ # Add a new device (and token) ahead of the next iteration
430
+ @resource.create_new_auth_token
431
+
432
+ end
433
+ end
434
+
435
+ it 'should drop the oldest token when the maximum number of devices is exceeded' do
436
+ # create the maximum number of tokens
437
+ 1.upto(DeviseTokenAuth.max_number_of_devices).each do
438
+ @resource.create_new_auth_token
439
+ end
440
+
441
+ # get the oldest token client_id
442
+ oldest_client_id, = @resource.reload.tokens.min_by do |cid, v|
443
+ v[:expiry] || v["expiry"]
444
+ end # => [ 'CLIENT_ID', {token: ...} ]
445
+
446
+ # create another token, thereby dropping the oldest token
447
+ @resource.create_new_auth_token
448
+
449
+ assert_not_includes @resource.reload.tokens.keys, oldest_client_id
450
+ end
451
+
452
+ after do
453
+ DeviseTokenAuth.max_number_of_devices = 10
454
+ end
455
+ end
410
456
  end
411
457
 
412
458
  describe 'bypass_sign_in' do
@@ -503,17 +549,8 @@ class DemoUserControllerTest < ActionDispatch::IntegrationTest
503
549
  refute_equal @resource, @controller.current_mang
504
550
  end
505
551
 
506
- it 'should increase the number of tokens by a factor of 2 up to 11' do
507
- @first_token = @resource.tokens.keys.first
508
552
 
509
- DeviseTokenAuth.max_number_of_devices = 11
510
- (1..10).each do |n|
511
- assert_equal [11, 2 * n].min, @resource.reload.tokens.keys.length
512
- get '/demo/members_only', params: {}, headers: nil
513
- end
514
553
 
515
- assert_not_includes @resource.reload.tokens.keys, @first_token
516
- end
517
554
  end
518
555
 
519
556
  it 'should return success status' do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  # was the web request successful?
@@ -55,18 +57,14 @@ class DeviseTokenAuth::ConfirmationsControllerTest < ActionController::TestCase
55
57
  test 'the sign_in_count should be 1' do
56
58
  assert @resource.sign_in_count == 1
57
59
  end
60
+
58
61
  test 'User shoud have the signed in info filled' do
59
62
  assert @resource.current_sign_in_at?
60
63
  end
64
+
61
65
  test 'User shoud have the Last checkin filled' do
62
66
  assert @resource.last_sign_in_at?
63
67
  end
64
-
65
- test 'user already confirmed' do
66
- assert @resource.sign_in_count > 0 do
67
- assert expiry == (Time.now + Time.now + 1.second).to_i
68
- end
69
- end
70
68
  end
71
69
 
72
70
  describe 'failure' do
@@ -1,6 +1,6 @@
1
- require 'test_helper'
2
- require 'mocha/test_unit'
1
+ # frozen_string_literal: true
3
2
 
3
+ require 'test_helper'
4
4
  # was the web request successful?
5
5
  # was the user redirected to the right page?
6
6
  # was the user successfully authenticated?
@@ -57,7 +57,7 @@ class OmniauthTest < ActionDispatch::IntegrationTest
57
57
  expiry = controller.auth_params[:expiry]
58
58
 
59
59
  # the expiry should have been set
60
- assert_equal expiry, @resource.tokens[client_id]['expiry']
60
+ assert_equal expiry, @resource.tokens[client_id]['expiry'] || @resource.tokens[client_id][:expiry]
61
61
 
62
62
  # the token sent down to the client should now be valid
63
63
  assert @resource.valid_token?(token, client_id)
@@ -70,7 +70,10 @@ class OmniauthTest < ActionDispatch::IntegrationTest
70
70
  end
71
71
 
72
72
  test 'sign_in was called' do
73
- User.any_instance.expects(:sign_in)
73
+ DeviseTokenAuth::OmniauthCallbacksController.any_instance\
74
+ .expects(:sign_in).with(
75
+ :user, instance_of(User), has_entries(store: false, bypass: false)
76
+ )
74
77
  get_success
75
78
  end
76
79
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  # was the web request successful?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  # was the web request successful?
@@ -177,7 +179,7 @@ class DeviseTokenAuth::RegistrationsControllerTest < ActionDispatch::Integration
177
179
  @resource = assigns(:resource)
178
180
  @data = JSON.parse(response.body)
179
181
  @mail = ActionMailer::Base.deliveries.last
180
- @sent_redirect_url = URI.decode(@mail.body.match(/redirect_url=([^&]*)(&|\")/)[1])
182
+ @sent_redirect_url = CGI.unescape(@mail.body.match(/redirect_url=([^&]*)(&|\")/)[1])
181
183
  end
182
184
 
183
185
  teardown do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  # was the web request successful?
@@ -72,6 +74,56 @@ class DeviseTokenAuth::SessionsControllerTest < ActionController::TestCase
72
74
  assert_equal '0.0.0.0', @new_last_sign_in_ip
73
75
  end
74
76
  end
77
+
78
+ describe "with multiple clients and headers don't change in each request" do
79
+ before do
80
+ # Set the max_number_of_devices to a lower number
81
+ # to expedite tests! (Default is 10)
82
+ DeviseTokenAuth.max_number_of_devices = 2
83
+ DeviseTokenAuth.change_headers_on_each_request = false
84
+
85
+ @user_session_params = {
86
+ email: @existing_user.email,
87
+ password: 'secret123'
88
+ }
89
+ end
90
+
91
+ test 'should limit the maximum number of concurrent devices' do
92
+ # increment the number of devices until the maximum is exceeded
93
+ 1.upto(DeviseTokenAuth.max_number_of_devices + 1).each do |n|
94
+ initial_tokens = @existing_user.reload.tokens
95
+
96
+ assert_equal(
97
+ [n, DeviseTokenAuth.max_number_of_devices].min,
98
+ @existing_user.reload.tokens.length
99
+ )
100
+
101
+ # Already have the max number of devices
102
+ post :create, params: @user_session_params
103
+
104
+ # A session for a new device maintains the max number of concurrent devices
105
+ refute_equal initial_tokens, @existing_user.reload.tokens
106
+ end
107
+ end
108
+
109
+ test 'should drop old tokens when max number of devices is exceeded' do
110
+ 1.upto(DeviseTokenAuth.max_number_of_devices).each do |n|
111
+ post :create, params: @user_session_params
112
+ end
113
+
114
+ oldest_token, _ = @existing_user.reload.tokens \
115
+ .min_by { |cid, v| v[:expiry] || v["expiry"] }
116
+
117
+ post :create, params: @user_session_params
118
+
119
+ assert_not_includes @existing_user.reload.tokens.keys, oldest_token
120
+ end
121
+
122
+ after do
123
+ DeviseTokenAuth.max_number_of_devices = 10
124
+ DeviseTokenAuth.change_headers_on_each_request = true
125
+ end
126
+ end
75
127
  end
76
128
 
77
129
  describe 'get sign_in is not supported' do