devise_token_auth_multi_email 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +13 -0
- data/README.md +97 -0
- data/Rakefile +42 -0
- data/app/controllers/devise_token_auth/application_controller.rb +100 -0
- data/app/controllers/devise_token_auth/concerns/resource_finder.rb +68 -0
- data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +199 -0
- data/app/controllers/devise_token_auth/confirmations_controller.rb +89 -0
- data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +284 -0
- data/app/controllers/devise_token_auth/passwords_controller.rb +216 -0
- data/app/controllers/devise_token_auth/registrations_controller.rb +205 -0
- data/app/controllers/devise_token_auth/sessions_controller.rb +153 -0
- data/app/controllers/devise_token_auth/token_validations_controller.rb +31 -0
- data/app/controllers/devise_token_auth/unlocks_controller.rb +94 -0
- data/app/models/devise_token_auth/concerns/active_record_support.rb +18 -0
- data/app/models/devise_token_auth/concerns/confirmable_support.rb +28 -0
- data/app/models/devise_token_auth/concerns/mongoid_support.rb +19 -0
- data/app/models/devise_token_auth/concerns/tokens_serialization.rb +31 -0
- data/app/models/devise_token_auth/concerns/user.rb +282 -0
- data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +39 -0
- data/app/validators/devise_token_auth_email_validator.rb +31 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise_token_auth/omniauth_external_window.html.erb +38 -0
- data/config/locales/da-DK.yml +52 -0
- data/config/locales/de.yml +51 -0
- data/config/locales/en.yml +60 -0
- data/config/locales/es.yml +51 -0
- data/config/locales/fa.yml +60 -0
- data/config/locales/fr.yml +51 -0
- data/config/locales/he.yml +52 -0
- data/config/locales/it.yml +48 -0
- data/config/locales/ja.yml +60 -0
- data/config/locales/ko.yml +51 -0
- data/config/locales/nl.yml +32 -0
- data/config/locales/pl.yml +51 -0
- data/config/locales/pt-BR.yml +48 -0
- data/config/locales/pt.yml +51 -0
- data/config/locales/ro.yml +48 -0
- data/config/locales/ru.yml +52 -0
- data/config/locales/sq.yml +48 -0
- data/config/locales/sv.yml +52 -0
- data/config/locales/uk.yml +61 -0
- data/config/locales/vi.yml +52 -0
- data/config/locales/zh-CN.yml +48 -0
- data/config/locales/zh-HK.yml +50 -0
- data/config/locales/zh-TW.yml +50 -0
- data/lib/devise_token_auth/blacklist.rb +6 -0
- data/lib/devise_token_auth/controllers/helpers.rb +157 -0
- data/lib/devise_token_auth/controllers/url_helpers.rb +10 -0
- data/lib/devise_token_auth/engine.rb +105 -0
- data/lib/devise_token_auth/errors.rb +8 -0
- data/lib/devise_token_auth/rails/routes.rb +122 -0
- data/lib/devise_token_auth/token_factory.rb +126 -0
- data/lib/devise_token_auth/url.rb +44 -0
- data/lib/devise_token_auth/version.rb +5 -0
- data/lib/devise_token_auth.rb +14 -0
- data/lib/generators/devise_token_auth/USAGE +31 -0
- data/lib/generators/devise_token_auth/install_generator.rb +91 -0
- data/lib/generators/devise_token_auth/install_generator_helpers.rb +98 -0
- data/lib/generators/devise_token_auth/install_mongoid_generator.rb +46 -0
- data/lib/generators/devise_token_auth/install_views_generator.rb +18 -0
- data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +66 -0
- data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +49 -0
- data/lib/generators/devise_token_auth/templates/user.rb.erb +9 -0
- data/lib/generators/devise_token_auth/templates/user_mongoid.rb.erb +56 -0
- data/lib/tasks/devise_token_auth_tasks.rake +6 -0
- data/test/controllers/custom/custom_confirmations_controller_test.rb +25 -0
- data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +33 -0
- data/test/controllers/custom/custom_passwords_controller_test.rb +79 -0
- data/test/controllers/custom/custom_registrations_controller_test.rb +63 -0
- data/test/controllers/custom/custom_sessions_controller_test.rb +39 -0
- data/test/controllers/custom/custom_token_validations_controller_test.rb +42 -0
- data/test/controllers/demo_group_controller_test.rb +151 -0
- data/test/controllers/demo_mang_controller_test.rb +313 -0
- data/test/controllers/demo_user_controller_test.rb +658 -0
- data/test/controllers/devise_token_auth/confirmations_controller_test.rb +275 -0
- data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +438 -0
- data/test/controllers/devise_token_auth/passwords_controller_test.rb +893 -0
- data/test/controllers/devise_token_auth/registrations_controller_test.rb +920 -0
- data/test/controllers/devise_token_auth/sessions_controller_test.rb +605 -0
- data/test/controllers/devise_token_auth/token_validations_controller_test.rb +142 -0
- data/test/controllers/devise_token_auth/unlocks_controller_test.rb +235 -0
- data/test/controllers/overrides/confirmations_controller_test.rb +47 -0
- data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +53 -0
- data/test/controllers/overrides/passwords_controller_test.rb +64 -0
- data/test/controllers/overrides/registrations_controller_test.rb +46 -0
- data/test/controllers/overrides/sessions_controller_test.rb +35 -0
- data/test/controllers/overrides/token_validations_controller_test.rb +43 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/app/active_record/confirmable_user.rb +11 -0
- data/test/dummy/app/active_record/lockable_user.rb +7 -0
- data/test/dummy/app/active_record/mang.rb +5 -0
- data/test/dummy/app/active_record/only_email_user.rb +7 -0
- data/test/dummy/app/active_record/scoped_user.rb +9 -0
- data/test/dummy/app/active_record/unconfirmable_user.rb +9 -0
- data/test/dummy/app/active_record/unregisterable_user.rb +9 -0
- data/test/dummy/app/active_record/user.rb +6 -0
- data/test/dummy/app/controllers/application_controller.rb +14 -0
- data/test/dummy/app/controllers/auth_origin_controller.rb +7 -0
- data/test/dummy/app/controllers/custom/confirmations_controller.rb +13 -0
- data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +13 -0
- data/test/dummy/app/controllers/custom/passwords_controller.rb +39 -0
- data/test/dummy/app/controllers/custom/registrations_controller.rb +39 -0
- data/test/dummy/app/controllers/custom/sessions_controller.rb +29 -0
- data/test/dummy/app/controllers/custom/token_validations_controller.rb +19 -0
- data/test/dummy/app/controllers/demo_group_controller.rb +15 -0
- data/test/dummy/app/controllers/demo_mang_controller.rb +14 -0
- data/test/dummy/app/controllers/demo_user_controller.rb +27 -0
- data/test/dummy/app/controllers/overrides/confirmations_controller.rb +29 -0
- data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +16 -0
- data/test/dummy/app/controllers/overrides/passwords_controller.rb +36 -0
- data/test/dummy/app/controllers/overrides/registrations_controller.rb +29 -0
- data/test/dummy/app/controllers/overrides/sessions_controller.rb +36 -0
- data/test/dummy/app/controllers/overrides/token_validations_controller.rb +23 -0
- data/test/dummy/app/helpers/application_helper.rb +1058 -0
- data/test/dummy/app/models/concerns/favorite_color.rb +19 -0
- data/test/dummy/app/mongoid/confirmable_user.rb +52 -0
- data/test/dummy/app/mongoid/lockable_user.rb +38 -0
- data/test/dummy/app/mongoid/mang.rb +46 -0
- data/test/dummy/app/mongoid/only_email_user.rb +33 -0
- data/test/dummy/app/mongoid/scoped_user.rb +50 -0
- data/test/dummy/app/mongoid/unconfirmable_user.rb +44 -0
- data/test/dummy/app/mongoid/unregisterable_user.rb +47 -0
- data/test/dummy/app/mongoid/user.rb +49 -0
- data/test/dummy/app/views/layouts/application.html.erb +12 -0
- data/test/dummy/config/application.rb +50 -0
- data/test/dummy/config/application.yml.bk +0 -0
- data/test/dummy/config/boot.rb +11 -0
- data/test/dummy/config/environment.rb +7 -0
- data/test/dummy/config/environments/development.rb +36 -0
- data/test/dummy/config/environments/production.rb +68 -0
- data/test/dummy/config/environments/test.rb +58 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +9 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/test/dummy/config/initializers/devise.rb +290 -0
- data/test/dummy/config/initializers/devise_token_auth.rb +55 -0
- data/test/dummy/config/initializers/figaro.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +6 -0
- data/test/dummy/config/initializers/inflections.rb +18 -0
- data/test/dummy/config/initializers/mime_types.rb +6 -0
- data/test/dummy/config/initializers/omniauth.rb +11 -0
- data/test/dummy/config/initializers/session_store.rb +5 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +16 -0
- data/test/dummy/config/routes.rb +57 -0
- data/test/dummy/config/spring.rb +3 -0
- data/test/dummy/config.ru +18 -0
- data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +58 -0
- data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +57 -0
- data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +8 -0
- data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +7 -0
- data/test/dummy/db/migrate/20141222035835_devise_token_auth_create_only_email_users.rb +55 -0
- data/test/dummy/db/migrate/20141222053502_devise_token_auth_create_unregisterable_users.rb +56 -0
- data/test/dummy/db/migrate/20150708104536_devise_token_auth_create_unconfirmable_users.rb +56 -0
- data/test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb +56 -0
- data/test/dummy/db/migrate/20160629184441_devise_token_auth_create_lockable_users.rb +56 -0
- data/test/dummy/db/migrate/20190924101113_devise_token_auth_create_confirmable_users.rb +49 -0
- data/test/dummy/db/schema.rb +198 -0
- data/test/dummy/lib/migration_database_helper.rb +43 -0
- data/test/dummy/tmp/generators/app/models/mang.rb +9 -0
- data/test/dummy/tmp/generators/app/models/user.rb +9 -0
- data/test/dummy/tmp/generators/config/initializers/devise_token_auth.rb +60 -0
- data/test/dummy/tmp/generators/config/routes.rb +9 -0
- data/test/dummy/tmp/generators/db/migrate/20210305040222_devise_token_auth_create_mangs.rb +49 -0
- data/test/dummy/tmp/generators/db/migrate/20210305040222_devise_token_auth_create_users.rb +49 -0
- data/test/factories/users.rb +41 -0
- data/test/lib/devise_token_auth/blacklist_test.rb +19 -0
- data/test/lib/devise_token_auth/rails/custom_routes_test.rb +29 -0
- data/test/lib/devise_token_auth/rails/routes_test.rb +87 -0
- data/test/lib/devise_token_auth/token_factory_test.rb +191 -0
- data/test/lib/devise_token_auth/url_test.rb +26 -0
- data/test/lib/generators/devise_token_auth/install_generator_test.rb +217 -0
- data/test/lib/generators/devise_token_auth/install_generator_with_namespace_test.rb +222 -0
- data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +25 -0
- data/test/models/concerns/mongoid_support_test.rb +31 -0
- data/test/models/concerns/tokens_serialization_test.rb +104 -0
- data/test/models/confirmable_user_test.rb +35 -0
- data/test/models/only_email_user_test.rb +29 -0
- data/test/models/user_test.rb +224 -0
- data/test/support/controllers/routes.rb +43 -0
- data/test/test_helper.rb +134 -0
- metadata +502 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
class UserTest < ActiveSupport::TestCase
|
|
6
|
+
describe User do
|
|
7
|
+
describe 'serialization' do
|
|
8
|
+
test 'hash should not include sensitive info' do
|
|
9
|
+
@resource = build(:user)
|
|
10
|
+
refute @resource.as_json[:tokens]
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe 'creation' do
|
|
15
|
+
test 'save fails if uid is missing' do
|
|
16
|
+
@resource = User.new
|
|
17
|
+
@resource.uid = nil
|
|
18
|
+
@resource.save
|
|
19
|
+
|
|
20
|
+
assert @resource.errors.messages[:uid]
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
describe 'email registration' do
|
|
25
|
+
test 'model should not save if email is blank' do
|
|
26
|
+
@resource = build(:user, email: nil)
|
|
27
|
+
|
|
28
|
+
refute @resource.save
|
|
29
|
+
assert @resource.errors.messages[:email] == [I18n.t('errors.messages.blank')]
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
test 'model should not save if email is not an email' do
|
|
33
|
+
@resource = build(:user, email: '@example.com')
|
|
34
|
+
|
|
35
|
+
refute @resource.save
|
|
36
|
+
assert @resource.errors.messages[:email] == [I18n.t('errors.messages.not_email')]
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe 'email uniqueness' do
|
|
41
|
+
test 'model should not save if email is taken' do
|
|
42
|
+
user_attributes = attributes_for(:user)
|
|
43
|
+
create(:user, user_attributes)
|
|
44
|
+
@resource = build(:user, user_attributes)
|
|
45
|
+
|
|
46
|
+
refute @resource.save
|
|
47
|
+
assert @resource.errors.messages[:email].first.include? 'taken'
|
|
48
|
+
assert @resource.errors.messages[:email].none? { |e| e =~ /translation missing/ }
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe 'oauth2 authentication' do
|
|
53
|
+
test 'model should save even if email is blank' do
|
|
54
|
+
@resource = build(:user, :facebook, email: nil)
|
|
55
|
+
|
|
56
|
+
assert @resource.save
|
|
57
|
+
assert @resource.errors.messages[:email].blank?
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
describe 'token expiry' do
|
|
62
|
+
before do
|
|
63
|
+
@resource = create(:user, :confirmed)
|
|
64
|
+
|
|
65
|
+
@auth_headers = @resource.create_new_auth_token
|
|
66
|
+
|
|
67
|
+
@token = @auth_headers['access-token']
|
|
68
|
+
@client_id = @auth_headers['client']
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
test 'should properly indicate whether token is current' do
|
|
72
|
+
assert @resource.token_is_current?(@token, @client_id)
|
|
73
|
+
# we want to update the expiry without forcing a cleanup (see below)
|
|
74
|
+
@resource.tokens[@client_id]['expiry'] = Time.zone.now.to_i - 10.seconds
|
|
75
|
+
refute @resource.token_is_current?(@token, @client_id)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
describe 'previous token' do
|
|
80
|
+
before do
|
|
81
|
+
@resource = create(:user, :confirmed)
|
|
82
|
+
|
|
83
|
+
@auth_headers1 = @resource.create_new_auth_token
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
test 'should properly indicate whether previous token is current' do
|
|
87
|
+
assert @resource.token_is_current?(@auth_headers1['access-token'], @auth_headers1['client'])
|
|
88
|
+
# create another token, emulating a new request
|
|
89
|
+
@auth_headers2 = @resource.create_new_auth_token
|
|
90
|
+
|
|
91
|
+
# should work for previous token
|
|
92
|
+
assert @resource.token_is_current?(@auth_headers1['access-token'], @auth_headers1['client'])
|
|
93
|
+
# should work for latest token as well
|
|
94
|
+
assert @resource.token_is_current?(@auth_headers2['access-token'], @auth_headers2['client'])
|
|
95
|
+
|
|
96
|
+
# after using latest token, previous token should not work
|
|
97
|
+
assert @resource.token_is_current?(@auth_headers1['access-token'], @auth_headers1['client'])
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
describe 'expired tokens are destroyed on save' do
|
|
102
|
+
before do
|
|
103
|
+
@resource = create(:user, :confirmed)
|
|
104
|
+
|
|
105
|
+
@old_auth_headers = @resource.create_new_auth_token
|
|
106
|
+
@new_auth_headers = @resource.create_new_auth_token
|
|
107
|
+
expire_token(@resource, @old_auth_headers['client'])
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
test 'expired token was removed' do
|
|
111
|
+
refute @resource.tokens[@old_auth_headers[:client]]
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
test 'current token was not removed' do
|
|
115
|
+
assert @resource.tokens[@new_auth_headers['client']]
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
describe 'nil tokens are handled properly' do
|
|
120
|
+
before do
|
|
121
|
+
@resource = create(:user, :confirmed)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
test 'tokens can be set to nil' do
|
|
125
|
+
@resource.tokens = nil
|
|
126
|
+
assert @resource.save
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
describe 'clean_old_tokens' do
|
|
132
|
+
before do
|
|
133
|
+
@resource = create(:user, :confirmed)
|
|
134
|
+
@token_lifespan = DeviseTokenAuth.token_lifespan
|
|
135
|
+
@max_client_count = DeviseTokenAuth.max_number_of_devices
|
|
136
|
+
DeviseTokenAuth.max_number_of_devices = 2
|
|
137
|
+
DeviseTokenAuth.token_lifespan = 1.week
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
after do
|
|
141
|
+
DeviseTokenAuth.token_lifespan = @token_lifespan
|
|
142
|
+
DeviseTokenAuth.max_number_of_devices = @max_client_count
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
test 'removes tokens with expiry beyond the maximum lifespan' do
|
|
146
|
+
# Create tokens with different expiry times
|
|
147
|
+
current_time = Time.now.to_i
|
|
148
|
+
|
|
149
|
+
max_lifespan = current_time + DeviseTokenAuth.token_lifespan.to_i
|
|
150
|
+
|
|
151
|
+
# Valid token within lifespan
|
|
152
|
+
@resource.tokens['valid_client'] = {
|
|
153
|
+
'token' => 'valid_token',
|
|
154
|
+
'expiry' => current_time + 1.day.to_i
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
# Token exactly at max lifespan (should be kept)
|
|
158
|
+
@resource.tokens['edge_client'] = {
|
|
159
|
+
'token' => 'edge_token',
|
|
160
|
+
'expiry' => max_lifespan
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
# Token beyond max lifespan (should be removed)
|
|
164
|
+
@resource.tokens['expired_client'] = {
|
|
165
|
+
'token' => 'expired_token',
|
|
166
|
+
'expiry' => max_lifespan + 1.day.to_i
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
# Call the method under test
|
|
170
|
+
@resource.send(:clean_old_tokens)
|
|
171
|
+
|
|
172
|
+
# Assert that tokens beyond lifespan were removed
|
|
173
|
+
assert @resource.tokens.key?('valid_client'), 'Valid token should be kept'
|
|
174
|
+
assert @resource.tokens.key?('edge_client'), 'Edge case token at max lifespan should be kept'
|
|
175
|
+
refute @resource.tokens.key?('expired_client'), 'Token beyond max lifespan should be removed'
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
test 'handles token lifespan reduction when creating token' do
|
|
179
|
+
# Setup: Create the maximum allowed number of tokens with a longer lifespan
|
|
180
|
+
DeviseTokenAuth.token_lifespan = 2.weeks
|
|
181
|
+
DeviseTokenAuth.max_number_of_devices = 3
|
|
182
|
+
|
|
183
|
+
# Create tokens at different times but all within the initial long lifespan
|
|
184
|
+
@resource.tokens = {}
|
|
185
|
+
@resource.tokens['client_1'] = {
|
|
186
|
+
'token' => 'token_1',
|
|
187
|
+
'expiry' => Time.now.to_i + 12.days.to_i
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
@resource.tokens['client_2'] = {
|
|
191
|
+
'token' => 'token_2',
|
|
192
|
+
'expiry' => Time.now.to_i + 10.days.to_i
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
@resource.tokens['client_3'] = {
|
|
196
|
+
'token' => 'token_3',
|
|
197
|
+
'expiry' => Time.now.to_i + 5.days.to_i
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
# We've reached the maximum number of devices/tokens
|
|
201
|
+
assert_equal 3, @resource.tokens.length
|
|
202
|
+
|
|
203
|
+
# Now reduce token lifespan - simulating a config change
|
|
204
|
+
DeviseTokenAuth.token_lifespan = 1.week
|
|
205
|
+
|
|
206
|
+
# Create a new token which should trigger clean_old_tokens
|
|
207
|
+
new_auth_headers = @resource.create_new_auth_token
|
|
208
|
+
new_client = new_auth_headers['client']
|
|
209
|
+
|
|
210
|
+
# The new token should exist
|
|
211
|
+
assert @resource.tokens.key?(new_client), 'New token should exist'
|
|
212
|
+
|
|
213
|
+
# Tokens exceeding the new reduced lifespan should be removed
|
|
214
|
+
refute @resource.tokens.key?('client_1'), 'Token with expiry > new lifespan should be removed'
|
|
215
|
+
refute @resource.tokens.key?('client_2'), 'Token with expiry > new lifespan should be removed'
|
|
216
|
+
|
|
217
|
+
# Token within new lifespan should be kept
|
|
218
|
+
assert @resource.tokens.key?('client_3'), 'Token within new reduced lifespan should be kept'
|
|
219
|
+
|
|
220
|
+
# We should have exactly 2 tokens: the new one and client_3
|
|
221
|
+
assert_equal 2, @resource.tokens.length
|
|
222
|
+
end
|
|
223
|
+
end
|
|
224
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
class Module
|
|
2
|
+
include Minitest::Spec::DSL
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
module ControllerRoutesAfterBlock
|
|
6
|
+
after do
|
|
7
|
+
Rails.application.reload_routes!
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
module CustomControllersRoutes
|
|
12
|
+
include ControllerRoutesAfterBlock
|
|
13
|
+
|
|
14
|
+
before do
|
|
15
|
+
Rails.application.routes.draw do
|
|
16
|
+
mount_devise_token_auth_for 'User', at: 'nice_user_auth', controllers: {
|
|
17
|
+
registrations: 'custom/registrations',
|
|
18
|
+
confirmations: 'custom/confirmations',
|
|
19
|
+
passwords: 'custom/passwords',
|
|
20
|
+
sessions: 'custom/sessions',
|
|
21
|
+
token_validations: 'custom/token_validations',
|
|
22
|
+
omniauth_callbacks: 'custom/omniauth_callbacks'
|
|
23
|
+
}
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
module OverridesControllersRoutes
|
|
29
|
+
include ControllerRoutesAfterBlock
|
|
30
|
+
|
|
31
|
+
before do
|
|
32
|
+
Rails.application.routes.draw do
|
|
33
|
+
mount_devise_token_auth_for 'User', at: 'evil_user_auth', controllers: {
|
|
34
|
+
confirmations: 'overrides/confirmations',
|
|
35
|
+
passwords: 'overrides/passwords',
|
|
36
|
+
omniauth_callbacks: 'overrides/omniauth_callbacks',
|
|
37
|
+
registrations: 'overrides/registrations',
|
|
38
|
+
sessions: 'overrides/sessions',
|
|
39
|
+
token_validations: 'overrides/token_validations'
|
|
40
|
+
}
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
data/test/test_helper.rb
ADDED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'simplecov'
|
|
4
|
+
SimpleCov.formatter = SimpleCov::Formatter::HTMLFormatter
|
|
5
|
+
SimpleCov.start 'rails' do
|
|
6
|
+
add_filter ['.bundle', 'test', 'config']
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
ENV['RAILS_ENV'] = 'test'
|
|
10
|
+
DEVISE_TOKEN_AUTH_ORM = (ENV['DEVISE_TOKEN_AUTH_ORM'] || :active_record).to_sym
|
|
11
|
+
|
|
12
|
+
puts "\n==> DeviseTokenAuth.orm = #{DEVISE_TOKEN_AUTH_ORM.inspect}"
|
|
13
|
+
|
|
14
|
+
require File.expand_path('dummy/config/environment', __dir__)
|
|
15
|
+
require 'active_support/testing/autorun'
|
|
16
|
+
require 'minitest/rails'
|
|
17
|
+
require 'mocha/minitest'
|
|
18
|
+
if DEVISE_TOKEN_AUTH_ORM == :active_record
|
|
19
|
+
require 'database_cleaner'
|
|
20
|
+
else
|
|
21
|
+
require 'database_cleaner/mongoid'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
FactoryBot.definition_file_paths = [File.expand_path('factories', __dir__)]
|
|
25
|
+
FactoryBot.find_definitions
|
|
26
|
+
|
|
27
|
+
Dir[File.join(__dir__, 'support/**', '*.rb')].each { |file| require file }
|
|
28
|
+
|
|
29
|
+
# I hate the default reporter. Use ProgressReporter instead.
|
|
30
|
+
Minitest::Reporters.use! Minitest::Reporters::ProgressReporter.new
|
|
31
|
+
|
|
32
|
+
class ActionDispatch::IntegrationTest
|
|
33
|
+
def follow_all_redirects!
|
|
34
|
+
follow_redirect! while response.status.to_s =~ /^3\d{2}/
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
class ActiveSupport::TestCase
|
|
39
|
+
include FactoryBot::Syntax::Methods
|
|
40
|
+
|
|
41
|
+
ActiveRecord::Migration.check_pending! if DEVISE_TOKEN_AUTH_ORM == :active_record
|
|
42
|
+
|
|
43
|
+
strategies = { active_record: :transaction,
|
|
44
|
+
mongoid: :deletion }
|
|
45
|
+
DatabaseCleaner.strategy = strategies[DEVISE_TOKEN_AUTH_ORM]
|
|
46
|
+
setup { DatabaseCleaner.start }
|
|
47
|
+
teardown { DatabaseCleaner.clean }
|
|
48
|
+
|
|
49
|
+
# Add more helper methods to be used by all tests here...
|
|
50
|
+
|
|
51
|
+
# Execute the block setting the given values and restoring old values after
|
|
52
|
+
# the block is executed.
|
|
53
|
+
# shamelessly copied from devise test_helper.
|
|
54
|
+
def swap(object, new_values)
|
|
55
|
+
old_values = {}
|
|
56
|
+
new_values.each do |key, value|
|
|
57
|
+
old_values[key] = object.send key
|
|
58
|
+
object.send :"#{key}=", value
|
|
59
|
+
end
|
|
60
|
+
clear_cached_variables(new_values)
|
|
61
|
+
yield
|
|
62
|
+
ensure
|
|
63
|
+
clear_cached_variables(new_values)
|
|
64
|
+
old_values.each do |key, value|
|
|
65
|
+
object.send :"#{key}=", value
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# shamelessly copied from devise test_helper.
|
|
70
|
+
def clear_cached_variables(options)
|
|
71
|
+
if options.key?(:case_insensitive_keys) || options.key?(:strip_whitespace_keys)
|
|
72
|
+
Devise.mappings.each do |_, mapping|
|
|
73
|
+
mapping.to.instance_variable_set(:@devise_parameter_filter, nil)
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def age_token(user, client_id)
|
|
79
|
+
if user.tokens[client_id]
|
|
80
|
+
user.tokens[client_id]['updated_at'] = (Time.zone.now - (DeviseTokenAuth.batch_request_buffer_throttle + 10.seconds))
|
|
81
|
+
user.save!
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def expire_token(user, client_id)
|
|
86
|
+
if user.tokens[client_id]
|
|
87
|
+
user.tokens[client_id]['expiry'] = (Time.zone.now - (DeviseTokenAuth.token_lifespan.to_f + 10.seconds)).to_i
|
|
88
|
+
user.save!
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# Suppress OmniAuth logger output
|
|
93
|
+
def silence_omniauth
|
|
94
|
+
previous_logger = OmniAuth.config.logger
|
|
95
|
+
OmniAuth.config.logger = Logger.new('/dev/null')
|
|
96
|
+
yield
|
|
97
|
+
ensure
|
|
98
|
+
OmniAuth.config.logger = previous_logger
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
class ActionController::TestCase
|
|
103
|
+
include Devise::Test::ControllerHelpers
|
|
104
|
+
|
|
105
|
+
setup do
|
|
106
|
+
@routes = Dummy::Application.routes
|
|
107
|
+
@request.env['devise.mapping'] = Devise.mappings[:user]
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# TODO: remove it when support for Rails < 5 has been dropped
|
|
112
|
+
module Rails
|
|
113
|
+
module Controller
|
|
114
|
+
module Testing
|
|
115
|
+
module Integration
|
|
116
|
+
%w[get post patch put head delete get_via_redirect post_via_redirect].each do |method|
|
|
117
|
+
define_method(method) do |path_or_action, **args|
|
|
118
|
+
if Rails::VERSION::MAJOR >= 5
|
|
119
|
+
super path_or_action, **args
|
|
120
|
+
else
|
|
121
|
+
super path_or_action, args[:params], args[:headers]
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
module ActionController
|
|
131
|
+
class TestCase
|
|
132
|
+
include Rails::Controller::Testing::Integration
|
|
133
|
+
end
|
|
134
|
+
end
|