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,605 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
# was the web request successful?
|
|
6
|
+
# was the user redirected to the right page?
|
|
7
|
+
# was the user successfully authenticated?
|
|
8
|
+
# was the correct object stored in the response?
|
|
9
|
+
# was the appropriate message delivered in the json payload?
|
|
10
|
+
|
|
11
|
+
class DeviseTokenAuth::SessionsControllerTest < ActionController::TestCase
|
|
12
|
+
describe DeviseTokenAuth::SessionsController do
|
|
13
|
+
describe 'Confirmed user' do
|
|
14
|
+
before do
|
|
15
|
+
@existing_user = create(:user, :with_nickname, :confirmed)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe 'success' do
|
|
19
|
+
before do
|
|
20
|
+
@user_session_params = {
|
|
21
|
+
email: @existing_user.email,
|
|
22
|
+
password: @existing_user.password
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
post :create, params: @user_session_params
|
|
26
|
+
|
|
27
|
+
@resource = assigns(:resource)
|
|
28
|
+
@data = JSON.parse(response.body)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
test 'request should succeed' do
|
|
32
|
+
assert_equal 200, response.status
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
test 'request should return user data' do
|
|
36
|
+
assert_equal @existing_user.email, @data['data']['email']
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe 'using auth cookie' do
|
|
40
|
+
before do
|
|
41
|
+
DeviseTokenAuth.cookie_enabled = true
|
|
42
|
+
post :create, params: @user_session_params
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
test 'request should return auth cookie' do
|
|
46
|
+
assert response.cookies[DeviseTokenAuth.cookie_name]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
test 'request should not include bearer token' do
|
|
50
|
+
assert_nil response.headers["Authorization"]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
after do
|
|
54
|
+
DeviseTokenAuth.cookie_enabled = false
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
describe "with multiple clients and headers don't change in each request" do
|
|
59
|
+
before do
|
|
60
|
+
# Set the max_number_of_devices to a lower number
|
|
61
|
+
# to expedite tests! (Default is 10)
|
|
62
|
+
DeviseTokenAuth.max_number_of_devices = 2
|
|
63
|
+
DeviseTokenAuth.change_headers_on_each_request = false
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
test 'should limit the maximum number of concurrent devices' do
|
|
67
|
+
# increment the number of devices until the maximum is exceeded
|
|
68
|
+
1.upto(DeviseTokenAuth.max_number_of_devices + 1).each do |n|
|
|
69
|
+
initial_tokens = @existing_user.reload.tokens
|
|
70
|
+
|
|
71
|
+
assert_equal(
|
|
72
|
+
[n, DeviseTokenAuth.max_number_of_devices].min,
|
|
73
|
+
@existing_user.reload.tokens.length
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
# Already have the max number of devices
|
|
77
|
+
post :create, params: @user_session_params
|
|
78
|
+
|
|
79
|
+
# A session for a new device maintains the max number of concurrent devices
|
|
80
|
+
refute_equal initial_tokens, @existing_user.reload.tokens
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
test 'should drop old tokens when max number of devices is exceeded' do
|
|
85
|
+
1.upto(DeviseTokenAuth.max_number_of_devices).each do |n|
|
|
86
|
+
post :create, params: @user_session_params
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
oldest_token, _ = @existing_user.reload.tokens \
|
|
90
|
+
.min_by { |cid, v| v[:expiry] || v['expiry'] }
|
|
91
|
+
|
|
92
|
+
post :create, params: @user_session_params
|
|
93
|
+
|
|
94
|
+
assert_not_includes @existing_user.reload.tokens.keys, oldest_token
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
after do
|
|
98
|
+
DeviseTokenAuth.max_number_of_devices = 10
|
|
99
|
+
DeviseTokenAuth.change_headers_on_each_request = true
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
describe 'get sign_in is not supported' do
|
|
105
|
+
before do
|
|
106
|
+
get :new,
|
|
107
|
+
params: { nickname: @existing_user.nickname,
|
|
108
|
+
password: @existing_user.password }
|
|
109
|
+
@data = JSON.parse(response.body)
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
test 'user is notified that they should use post sign_in to authenticate' do
|
|
113
|
+
assert_equal 405, response.status
|
|
114
|
+
end
|
|
115
|
+
test 'response should contain errors' do
|
|
116
|
+
assert @data['errors']
|
|
117
|
+
assert_equal @data['errors'], [I18n.t('devise_token_auth.sessions.not_supported')]
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
describe 'header sign_in is supported' do
|
|
122
|
+
before do
|
|
123
|
+
request.headers.merge!(
|
|
124
|
+
'email' => @existing_user.email,
|
|
125
|
+
'password' => @existing_user.password
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
head :create
|
|
129
|
+
@data = JSON.parse(response.body)
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
test 'user can sign in using header request' do
|
|
133
|
+
assert_equal 200, response.status
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
describe 'alt auth keys' do
|
|
138
|
+
before do
|
|
139
|
+
post :create,
|
|
140
|
+
params: { nickname: @existing_user.nickname,
|
|
141
|
+
password: @existing_user.password }
|
|
142
|
+
@data = JSON.parse(response.body)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
test 'user can sign in using nickname' do
|
|
146
|
+
assert_equal 200, response.status
|
|
147
|
+
assert_equal @existing_user.email, @data['data']['email']
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
describe 'authed user sign out' do
|
|
152
|
+
before do
|
|
153
|
+
def @controller.reset_session_called
|
|
154
|
+
@reset_session_called == true
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def @controller.reset_session
|
|
158
|
+
@reset_session_called = true
|
|
159
|
+
end
|
|
160
|
+
@auth_headers = @existing_user.create_new_auth_token
|
|
161
|
+
request.headers.merge!(@auth_headers)
|
|
162
|
+
delete :destroy, format: :json
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
test 'user is successfully logged out' do
|
|
166
|
+
assert_equal 200, response.status
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
test 'token was destroyed' do
|
|
170
|
+
@existing_user.reload
|
|
171
|
+
refute @existing_user.tokens[@auth_headers['client']]
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
test 'session was destroyed' do
|
|
175
|
+
assert_equal true, @controller.reset_session_called
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
describe 'using auth cookie' do
|
|
179
|
+
before do
|
|
180
|
+
DeviseTokenAuth.cookie_enabled = true
|
|
181
|
+
@auth_token = @existing_user.create_new_auth_token
|
|
182
|
+
@controller.send(:cookies)[DeviseTokenAuth.cookie_name] = { value: @auth_token.to_json }
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
test 'auth cookie was destroyed' do
|
|
186
|
+
assert_equal @auth_token.to_json, @controller.send(:cookies)[DeviseTokenAuth.cookie_name] # sanity check
|
|
187
|
+
delete :destroy, format: :json
|
|
188
|
+
assert_nil @controller.send(:cookies)[DeviseTokenAuth.cookie_name]
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
after do
|
|
192
|
+
DeviseTokenAuth.cookie_enabled = false
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
describe 'unauthed user sign out' do
|
|
198
|
+
before do
|
|
199
|
+
@auth_headers = @existing_user.create_new_auth_token
|
|
200
|
+
delete :destroy, format: :json
|
|
201
|
+
@data = JSON.parse(response.body)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
test 'unauthed request returns 404' do
|
|
205
|
+
assert_equal 404, response.status
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
test 'response should contain errors' do
|
|
209
|
+
assert @data['errors']
|
|
210
|
+
assert_equal @data['errors'],
|
|
211
|
+
[I18n.t('devise_token_auth.sessions.user_not_found')]
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
describe 'failure' do
|
|
216
|
+
before do
|
|
217
|
+
post :create,
|
|
218
|
+
params: { email: @existing_user.email,
|
|
219
|
+
password: 'bogus' }
|
|
220
|
+
|
|
221
|
+
@resource = assigns(:resource)
|
|
222
|
+
@data = JSON.parse(response.body)
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
test 'request should fail' do
|
|
226
|
+
assert_equal 401, response.status
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
test 'response should contain errors' do
|
|
230
|
+
assert @data['errors']
|
|
231
|
+
assert_equal @data['errors'],
|
|
232
|
+
[I18n.t('devise_token_auth.sessions.bad_credentials')]
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
describe 'failure with bad password when change_headers_on_each_request false' do
|
|
237
|
+
before do
|
|
238
|
+
DeviseTokenAuth.change_headers_on_each_request = false
|
|
239
|
+
|
|
240
|
+
# accessing current_user calls through set_user_by_token,
|
|
241
|
+
# which initializes client_id
|
|
242
|
+
@controller.current_user
|
|
243
|
+
|
|
244
|
+
post :create,
|
|
245
|
+
params: { email: @existing_user.email,
|
|
246
|
+
password: 'bogus' }
|
|
247
|
+
|
|
248
|
+
@resource = assigns(:resource)
|
|
249
|
+
@data = JSON.parse(response.body)
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
test 'request should fail' do
|
|
253
|
+
assert_equal 401, response.status
|
|
254
|
+
end
|
|
255
|
+
|
|
256
|
+
test 'response should contain errors' do
|
|
257
|
+
assert @data['errors']
|
|
258
|
+
assert_equal @data['errors'], [I18n.t('devise_token_auth.sessions.bad_credentials')]
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
after do
|
|
262
|
+
DeviseTokenAuth.change_headers_on_each_request = true
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
describe 'case-insensitive email' do
|
|
267
|
+
before do
|
|
268
|
+
@resource_class = User
|
|
269
|
+
@request_params = {
|
|
270
|
+
email: @existing_user.email.upcase,
|
|
271
|
+
password: @existing_user.password
|
|
272
|
+
}
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
test 'request should succeed if configured' do
|
|
276
|
+
@resource_class.case_insensitive_keys = [:email]
|
|
277
|
+
post :create, params: @request_params
|
|
278
|
+
assert_equal 200, response.status
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
test 'request should fail if not configured' do
|
|
282
|
+
@resource_class.case_insensitive_keys = []
|
|
283
|
+
post :create, params: @request_params
|
|
284
|
+
assert_equal 401, response.status
|
|
285
|
+
end
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
describe 'stripping whitespace on email' do
|
|
289
|
+
before do
|
|
290
|
+
@resource_class = User
|
|
291
|
+
@request_params = {
|
|
292
|
+
# adding whitespace before and after email
|
|
293
|
+
email: " #{@existing_user.email} ",
|
|
294
|
+
password: @existing_user.password
|
|
295
|
+
}
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
test 'request should succeed if configured' do
|
|
299
|
+
@resource_class.strip_whitespace_keys = [:email]
|
|
300
|
+
post :create, params: @request_params
|
|
301
|
+
assert_equal 200, response.status
|
|
302
|
+
end
|
|
303
|
+
|
|
304
|
+
test 'request should fail if not configured' do
|
|
305
|
+
@resource_class.strip_whitespace_keys = []
|
|
306
|
+
post :create, params: @request_params
|
|
307
|
+
assert_equal 401, response.status
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
describe 'Unconfirmed user' do
|
|
313
|
+
describe 'Without paranoid mode' do
|
|
314
|
+
before do
|
|
315
|
+
@unconfirmed_user = create(:user)
|
|
316
|
+
post :create, params: { email: @unconfirmed_user.email,
|
|
317
|
+
password: @unconfirmed_user.password }
|
|
318
|
+
@resource = assigns(:resource)
|
|
319
|
+
@data = JSON.parse(response.body)
|
|
320
|
+
end
|
|
321
|
+
|
|
322
|
+
test 'request should fail' do
|
|
323
|
+
assert_equal 401, response.status
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
test 'response should contain errors' do
|
|
327
|
+
assert @data['errors']
|
|
328
|
+
assert_equal @data['errors'],
|
|
329
|
+
[I18n.t('devise_token_auth.sessions.not_confirmed',
|
|
330
|
+
email: @unconfirmed_user.email)]
|
|
331
|
+
end
|
|
332
|
+
end
|
|
333
|
+
|
|
334
|
+
describe 'With paranoid mode' do
|
|
335
|
+
before do
|
|
336
|
+
@unconfirmed_user = create(:user)
|
|
337
|
+
swap Devise, paranoid: true do
|
|
338
|
+
post :create, params: { email: @unconfirmed_user.email,
|
|
339
|
+
password: @unconfirmed_user.password }
|
|
340
|
+
end
|
|
341
|
+
@resource = assigns(:resource)
|
|
342
|
+
@data = JSON.parse(response.body)
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
test 'request should fail' do
|
|
346
|
+
assert_equal 401, response.status
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
test 'response should contain errors that do not leak the existence of the account' do
|
|
350
|
+
assert @data['errors']
|
|
351
|
+
assert_equal @data['errors'],
|
|
352
|
+
[I18n.t('devise_token_auth.sessions.bad_credentials')]
|
|
353
|
+
end
|
|
354
|
+
end
|
|
355
|
+
end
|
|
356
|
+
|
|
357
|
+
describe 'Unconfirmed user with allowed unconfirmed access' do
|
|
358
|
+
before do
|
|
359
|
+
@original_duration = Devise.allow_unconfirmed_access_for
|
|
360
|
+
Devise.allow_unconfirmed_access_for = 3.days
|
|
361
|
+
@recent_unconfirmed_user = create(:user)
|
|
362
|
+
post :create,
|
|
363
|
+
params: { email: @recent_unconfirmed_user.email,
|
|
364
|
+
password: @recent_unconfirmed_user.password }
|
|
365
|
+
@resource = assigns(:resource)
|
|
366
|
+
@data = JSON.parse(response.body)
|
|
367
|
+
end
|
|
368
|
+
|
|
369
|
+
after do
|
|
370
|
+
Devise.allow_unconfirmed_access_for = @original_duration
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
test 'request should succeed' do
|
|
374
|
+
assert_equal 200, response.status
|
|
375
|
+
end
|
|
376
|
+
|
|
377
|
+
test 'request should return user data' do
|
|
378
|
+
assert_equal @recent_unconfirmed_user.email, @data['data']['email']
|
|
379
|
+
end
|
|
380
|
+
end
|
|
381
|
+
|
|
382
|
+
describe 'Unconfirmed user with expired unconfirmed access' do
|
|
383
|
+
before do
|
|
384
|
+
@unconfirmed_user = create(:user, :unconfirmed)
|
|
385
|
+
post :create,
|
|
386
|
+
params: { email: @unconfirmed_user.email,
|
|
387
|
+
password: @unconfirmed_user.password }
|
|
388
|
+
@resource = assigns(:resource)
|
|
389
|
+
@data = JSON.parse(response.body)
|
|
390
|
+
end
|
|
391
|
+
|
|
392
|
+
test 'request should fail' do
|
|
393
|
+
assert_equal 401, response.status
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
test 'response should contain errors' do
|
|
397
|
+
assert @data['errors']
|
|
398
|
+
end
|
|
399
|
+
end
|
|
400
|
+
|
|
401
|
+
describe 'Non-existing user' do
|
|
402
|
+
describe 'Without paranoid mode' do
|
|
403
|
+
before do
|
|
404
|
+
post :create,
|
|
405
|
+
params: { email: -> { Faker::Internet.email },
|
|
406
|
+
password: -> { Faker::Number.number(10) } }
|
|
407
|
+
@resource = assigns(:resource)
|
|
408
|
+
@data = JSON.parse(response.body)
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
test 'request should fail' do
|
|
412
|
+
assert_equal 401, response.status
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
test 'response should contain errors' do
|
|
416
|
+
assert @data['errors']
|
|
417
|
+
end
|
|
418
|
+
end
|
|
419
|
+
|
|
420
|
+
describe 'With paranoid mode' do
|
|
421
|
+
before do
|
|
422
|
+
mock_hash = '$2a$04$MUWADkfA6MHXDdWHoep6QOvX1o0Y56pNqt3NMWQ9zCRwKSp1HZJba'
|
|
423
|
+
@bcrypt_mock = Minitest::Mock.new
|
|
424
|
+
@bcrypt_mock.expect(:call, mock_hash, [Object, String])
|
|
425
|
+
|
|
426
|
+
swap Devise, paranoid: true do
|
|
427
|
+
BCrypt::Engine.stub :hash_secret, @bcrypt_mock do
|
|
428
|
+
post :create,
|
|
429
|
+
params: { email: -> { Faker::Internet.email },
|
|
430
|
+
password: -> { Faker::Number.number(10) } }
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
end
|
|
434
|
+
|
|
435
|
+
test 'password should be hashed' do
|
|
436
|
+
@bcrypt_mock.verify
|
|
437
|
+
end
|
|
438
|
+
end
|
|
439
|
+
end
|
|
440
|
+
|
|
441
|
+
describe 'Alternate user class' do
|
|
442
|
+
setup do
|
|
443
|
+
@request.env['devise.mapping'] = Devise.mappings[:mang]
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
teardown do
|
|
447
|
+
@request.env['devise.mapping'] = Devise.mappings[:user]
|
|
448
|
+
end
|
|
449
|
+
|
|
450
|
+
before do
|
|
451
|
+
@existing_user = create(:mang_user, :confirmed)
|
|
452
|
+
|
|
453
|
+
post :create,
|
|
454
|
+
params: { email: @existing_user.email,
|
|
455
|
+
password: @existing_user.password }
|
|
456
|
+
|
|
457
|
+
@resource = assigns(:resource)
|
|
458
|
+
@data = JSON.parse(response.body)
|
|
459
|
+
end
|
|
460
|
+
|
|
461
|
+
test 'request should succeed' do
|
|
462
|
+
assert_equal 200, response.status
|
|
463
|
+
end
|
|
464
|
+
|
|
465
|
+
test 'request should return user data' do
|
|
466
|
+
assert_equal @existing_user.email, @data['data']['email']
|
|
467
|
+
end
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
describe 'User with only :database_authenticatable and :registerable included' do
|
|
471
|
+
setup do
|
|
472
|
+
@request.env['devise.mapping'] = Devise.mappings[:only_email_user]
|
|
473
|
+
end
|
|
474
|
+
|
|
475
|
+
teardown do
|
|
476
|
+
@request.env['devise.mapping'] = Devise.mappings[:user]
|
|
477
|
+
end
|
|
478
|
+
|
|
479
|
+
before do
|
|
480
|
+
@existing_user = create(:only_email_user)
|
|
481
|
+
|
|
482
|
+
post :create,
|
|
483
|
+
params: { email: @existing_user.email,
|
|
484
|
+
password: @existing_user.password }
|
|
485
|
+
|
|
486
|
+
@resource = assigns(:resource)
|
|
487
|
+
@data = JSON.parse(response.body)
|
|
488
|
+
end
|
|
489
|
+
|
|
490
|
+
test 'user should be able to sign in without confirmation' do
|
|
491
|
+
assert 200, response.status
|
|
492
|
+
refute OnlyEmailUser.method_defined?(:confirmed_at)
|
|
493
|
+
end
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
describe 'Lockable User' do
|
|
497
|
+
setup do
|
|
498
|
+
@request.env['devise.mapping'] = Devise.mappings[:lockable_user]
|
|
499
|
+
end
|
|
500
|
+
|
|
501
|
+
teardown do
|
|
502
|
+
@request.env['devise.mapping'] = Devise.mappings[:user]
|
|
503
|
+
end
|
|
504
|
+
|
|
505
|
+
before do
|
|
506
|
+
@original_lock_strategy = Devise.lock_strategy
|
|
507
|
+
@original_unlock_strategy = Devise.unlock_strategy
|
|
508
|
+
@original_maximum_attempts = Devise.maximum_attempts
|
|
509
|
+
Devise.lock_strategy = :failed_attempts
|
|
510
|
+
Devise.unlock_strategy = :email
|
|
511
|
+
Devise.maximum_attempts = 5
|
|
512
|
+
end
|
|
513
|
+
|
|
514
|
+
after do
|
|
515
|
+
Devise.lock_strategy = @original_lock_strategy
|
|
516
|
+
Devise.maximum_attempts = @original_maximum_attempts
|
|
517
|
+
Devise.unlock_strategy = @original_unlock_strategy
|
|
518
|
+
end
|
|
519
|
+
|
|
520
|
+
describe 'locked user' do
|
|
521
|
+
describe 'Without paranoid mode' do
|
|
522
|
+
before do
|
|
523
|
+
@locked_user = create(:lockable_user, :locked)
|
|
524
|
+
post :create,
|
|
525
|
+
params: { email: @locked_user.email,
|
|
526
|
+
password: @locked_user.password }
|
|
527
|
+
@data = JSON.parse(response.body)
|
|
528
|
+
end
|
|
529
|
+
|
|
530
|
+
test 'request should fail' do
|
|
531
|
+
assert_equal 401, response.status
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
test 'response should contain errors' do
|
|
535
|
+
assert @data['errors']
|
|
536
|
+
assert_equal @data['errors'], [I18n.t('devise.mailer.unlock_instructions.account_lock_msg')]
|
|
537
|
+
end
|
|
538
|
+
end
|
|
539
|
+
|
|
540
|
+
describe 'With paranoid mode' do
|
|
541
|
+
before do
|
|
542
|
+
@locked_user = create(:lockable_user, :locked)
|
|
543
|
+
swap Devise, paranoid: true do
|
|
544
|
+
post :create,
|
|
545
|
+
params: { email: @locked_user.email,
|
|
546
|
+
password: @locked_user.password }
|
|
547
|
+
end
|
|
548
|
+
@data = JSON.parse(response.body)
|
|
549
|
+
end
|
|
550
|
+
|
|
551
|
+
test 'request should fail' do
|
|
552
|
+
assert_equal 401, response.status
|
|
553
|
+
end
|
|
554
|
+
|
|
555
|
+
test 'response should contain errors that do not leak the existence of the account' do
|
|
556
|
+
assert @data['errors']
|
|
557
|
+
assert_equal @data['errors'], [I18n.t('devise_token_auth.sessions.bad_credentials')]
|
|
558
|
+
end
|
|
559
|
+
end
|
|
560
|
+
end
|
|
561
|
+
|
|
562
|
+
describe 'unlocked user with bad password' do
|
|
563
|
+
before do
|
|
564
|
+
@unlocked_user = create(:lockable_user)
|
|
565
|
+
post :create,
|
|
566
|
+
params: { email: @unlocked_user.email,
|
|
567
|
+
password: 'bad-password' }
|
|
568
|
+
@data = JSON.parse(response.body)
|
|
569
|
+
end
|
|
570
|
+
|
|
571
|
+
test 'request should fail' do
|
|
572
|
+
assert_equal 401, response.status
|
|
573
|
+
end
|
|
574
|
+
|
|
575
|
+
test 'should increase failed_attempts' do
|
|
576
|
+
assert_equal 1, @unlocked_user.reload.failed_attempts
|
|
577
|
+
end
|
|
578
|
+
|
|
579
|
+
test 'response should contain errors' do
|
|
580
|
+
assert @data['errors']
|
|
581
|
+
assert_equal @data['errors'], [I18n.t('devise_token_auth.sessions.bad_credentials')]
|
|
582
|
+
end
|
|
583
|
+
|
|
584
|
+
describe 'after maximum_attempts should block the user' do
|
|
585
|
+
before do
|
|
586
|
+
4.times do
|
|
587
|
+
post :create,
|
|
588
|
+
params: { email: @unlocked_user.email,
|
|
589
|
+
password: 'bad-password' }
|
|
590
|
+
end
|
|
591
|
+
@data = JSON.parse(response.body)
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
test 'should increase failed_attempts' do
|
|
595
|
+
assert_equal 5, @unlocked_user.reload.failed_attempts
|
|
596
|
+
end
|
|
597
|
+
|
|
598
|
+
test 'should block the user' do
|
|
599
|
+
assert_equal true, @unlocked_user.reload.access_locked?
|
|
600
|
+
end
|
|
601
|
+
end
|
|
602
|
+
end
|
|
603
|
+
end
|
|
604
|
+
end
|
|
605
|
+
end
|