Skip to content

Commit 9ebc5bd

Browse files
committed
Refactor tests for old token removal when max clients are exceeded.
1 parent 76fca0e commit 9ebc5bd

File tree

2 files changed

+83
-22
lines changed

2 files changed

+83
-22
lines changed

test/controllers/demo_user_controller_test.rb

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,53 @@ class DemoUserControllerTest < ActionDispatch::IntegrationTest
407407
DeviseTokenAuth.headers_names[:'access-token'] = 'access-token'
408408
end
409409
end
410+
411+
describe 'maximum concurrent devices per user' do
412+
before do
413+
# Set the max_number_of_devices to a lower number
414+
# to expedite tests! (Default is 10)
415+
DeviseTokenAuth.max_number_of_devices = 5
416+
417+
# @max_devices = DeviseTokenAuth.max_number_of_devices
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+
# initial_tokens = @resource.reload.tokens
424+
425+
assert_equal(
426+
[n, DeviseTokenAuth.max_number_of_devices].min,
427+
@resource.reload.tokens.length
428+
)
429+
430+
# Add a new device (and token) ahead of the next iteration
431+
@resource.create_new_auth_token
432+
433+
# refute_equal initial_tokens, @resource.reload.tokens
434+
end
435+
end
436+
437+
it 'should drop the oldest token when the maximum number of devices is exceeded' do
438+
# create the maximum number of tokens
439+
1.upto(DeviseTokenAuth.max_number_of_devices).each do
440+
@resource.create_new_auth_token
441+
end
442+
443+
# get the oldest token
444+
oldest_token, _ = @resource.reload.tokens \
445+
.min_by { |cid, v| v[:expiry] || v["expiry"] }
446+
447+
# create another token, thereby dropping the oldest token
448+
@resource.create_new_auth_token
449+
450+
assert_not_includes @resource.reload.tokens.keys, oldest_token
451+
end
452+
453+
after do
454+
DeviseTokenAuth.max_number_of_devices = 10
455+
end
456+
end
410457
end
411458

412459
describe 'bypass_sign_in' do
@@ -503,17 +550,8 @@ class DemoUserControllerTest < ActionDispatch::IntegrationTest
503550
refute_equal @resource, @controller.current_mang
504551
end
505552

506-
it 'should increase the number of tokens by a factor of 2 up to 11' do
507-
@first_token = @resource.tokens.keys.first
508553

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
514554

515-
assert_not_includes @resource.reload.tokens.keys, @first_token
516-
end
517555
end
518556

519557
it 'should return success status' do

test/controllers/devise_token_auth/sessions_controller_test.rb

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -75,23 +75,46 @@ class DeviseTokenAuth::SessionsControllerTest < ActionController::TestCase
7575

7676
describe "with multiple clients and headers don't change in each request" do
7777
before do
78-
DeviseTokenAuth.max_number_of_devices = 1
78+
# Set the max_number_of_devices to a lower number
79+
# to expedite tests! (Default is 10)
80+
DeviseTokenAuth.max_number_of_devices = 2
7981
DeviseTokenAuth.change_headers_on_each_request = false
80-
@tokens = []
81-
(1..3).each do |n|
82-
post :create,
83-
params: {
84-
email: @existing_user.email,
85-
password: 'secret123'
86-
}
87-
@tokens << @existing_user.reload.tokens
82+
83+
@user_session_params = {
84+
email: @existing_user.email,
85+
password: 'secret123'
86+
}
87+
end
88+
89+
test 'should limit the maximum number of concurrent devices' do
90+
# increment the number of devices until the maximum is exceeded
91+
1.upto(DeviseTokenAuth.max_number_of_devices + 1).each do |n|
92+
initial_tokens = @existing_user.reload.tokens
93+
94+
assert_equal(
95+
[n, DeviseTokenAuth.max_number_of_devices].min,
96+
@existing_user.reload.tokens.length
97+
)
98+
99+
# Already have the max number of devices
100+
post :create, params: @user_session_params
101+
102+
# A session for a new device maintains the max number of concurrent devices
103+
refute_equal initial_tokens, @existing_user.reload.tokens
88104
end
89105
end
90106

91-
test 'should delete old tokens' do
92-
current_tokens = @existing_user.reload.tokens
93-
assert_equal 1, current_tokens.count
94-
assert_equal @tokens.pop.keys.first, current_tokens.keys.first
107+
test 'should drop old tokens when max number of devices is exceeded' do
108+
1.upto(DeviseTokenAuth.max_number_of_devices).each do |n|
109+
post :create, params: @user_session_params
110+
end
111+
112+
oldest_token, _ = @existing_user.reload.tokens \
113+
.min_by { |cid, v| v[:expiry] || v["expiry"] }
114+
115+
post :create, params: @user_session_params
116+
117+
assert_not_includes @existing_user.reload.tokens.keys, oldest_token
95118
end
96119

97120
after do

0 commit comments

Comments
 (0)