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.
Files changed (183) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +13 -0
  3. data/README.md +97 -0
  4. data/Rakefile +42 -0
  5. data/app/controllers/devise_token_auth/application_controller.rb +100 -0
  6. data/app/controllers/devise_token_auth/concerns/resource_finder.rb +68 -0
  7. data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +199 -0
  8. data/app/controllers/devise_token_auth/confirmations_controller.rb +89 -0
  9. data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +284 -0
  10. data/app/controllers/devise_token_auth/passwords_controller.rb +216 -0
  11. data/app/controllers/devise_token_auth/registrations_controller.rb +205 -0
  12. data/app/controllers/devise_token_auth/sessions_controller.rb +153 -0
  13. data/app/controllers/devise_token_auth/token_validations_controller.rb +31 -0
  14. data/app/controllers/devise_token_auth/unlocks_controller.rb +94 -0
  15. data/app/models/devise_token_auth/concerns/active_record_support.rb +18 -0
  16. data/app/models/devise_token_auth/concerns/confirmable_support.rb +28 -0
  17. data/app/models/devise_token_auth/concerns/mongoid_support.rb +19 -0
  18. data/app/models/devise_token_auth/concerns/tokens_serialization.rb +31 -0
  19. data/app/models/devise_token_auth/concerns/user.rb +282 -0
  20. data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +39 -0
  21. data/app/validators/devise_token_auth_email_validator.rb +31 -0
  22. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  23. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  24. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  25. data/app/views/devise_token_auth/omniauth_external_window.html.erb +38 -0
  26. data/config/locales/da-DK.yml +52 -0
  27. data/config/locales/de.yml +51 -0
  28. data/config/locales/en.yml +60 -0
  29. data/config/locales/es.yml +51 -0
  30. data/config/locales/fa.yml +60 -0
  31. data/config/locales/fr.yml +51 -0
  32. data/config/locales/he.yml +52 -0
  33. data/config/locales/it.yml +48 -0
  34. data/config/locales/ja.yml +60 -0
  35. data/config/locales/ko.yml +51 -0
  36. data/config/locales/nl.yml +32 -0
  37. data/config/locales/pl.yml +51 -0
  38. data/config/locales/pt-BR.yml +48 -0
  39. data/config/locales/pt.yml +51 -0
  40. data/config/locales/ro.yml +48 -0
  41. data/config/locales/ru.yml +52 -0
  42. data/config/locales/sq.yml +48 -0
  43. data/config/locales/sv.yml +52 -0
  44. data/config/locales/uk.yml +61 -0
  45. data/config/locales/vi.yml +52 -0
  46. data/config/locales/zh-CN.yml +48 -0
  47. data/config/locales/zh-HK.yml +50 -0
  48. data/config/locales/zh-TW.yml +50 -0
  49. data/lib/devise_token_auth/blacklist.rb +6 -0
  50. data/lib/devise_token_auth/controllers/helpers.rb +157 -0
  51. data/lib/devise_token_auth/controllers/url_helpers.rb +10 -0
  52. data/lib/devise_token_auth/engine.rb +105 -0
  53. data/lib/devise_token_auth/errors.rb +8 -0
  54. data/lib/devise_token_auth/rails/routes.rb +122 -0
  55. data/lib/devise_token_auth/token_factory.rb +126 -0
  56. data/lib/devise_token_auth/url.rb +44 -0
  57. data/lib/devise_token_auth/version.rb +5 -0
  58. data/lib/devise_token_auth.rb +14 -0
  59. data/lib/generators/devise_token_auth/USAGE +31 -0
  60. data/lib/generators/devise_token_auth/install_generator.rb +91 -0
  61. data/lib/generators/devise_token_auth/install_generator_helpers.rb +98 -0
  62. data/lib/generators/devise_token_auth/install_mongoid_generator.rb +46 -0
  63. data/lib/generators/devise_token_auth/install_views_generator.rb +18 -0
  64. data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +66 -0
  65. data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +49 -0
  66. data/lib/generators/devise_token_auth/templates/user.rb.erb +9 -0
  67. data/lib/generators/devise_token_auth/templates/user_mongoid.rb.erb +56 -0
  68. data/lib/tasks/devise_token_auth_tasks.rake +6 -0
  69. data/test/controllers/custom/custom_confirmations_controller_test.rb +25 -0
  70. data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +33 -0
  71. data/test/controllers/custom/custom_passwords_controller_test.rb +79 -0
  72. data/test/controllers/custom/custom_registrations_controller_test.rb +63 -0
  73. data/test/controllers/custom/custom_sessions_controller_test.rb +39 -0
  74. data/test/controllers/custom/custom_token_validations_controller_test.rb +42 -0
  75. data/test/controllers/demo_group_controller_test.rb +151 -0
  76. data/test/controllers/demo_mang_controller_test.rb +313 -0
  77. data/test/controllers/demo_user_controller_test.rb +658 -0
  78. data/test/controllers/devise_token_auth/confirmations_controller_test.rb +275 -0
  79. data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +438 -0
  80. data/test/controllers/devise_token_auth/passwords_controller_test.rb +893 -0
  81. data/test/controllers/devise_token_auth/registrations_controller_test.rb +920 -0
  82. data/test/controllers/devise_token_auth/sessions_controller_test.rb +605 -0
  83. data/test/controllers/devise_token_auth/token_validations_controller_test.rb +142 -0
  84. data/test/controllers/devise_token_auth/unlocks_controller_test.rb +235 -0
  85. data/test/controllers/overrides/confirmations_controller_test.rb +47 -0
  86. data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +53 -0
  87. data/test/controllers/overrides/passwords_controller_test.rb +64 -0
  88. data/test/controllers/overrides/registrations_controller_test.rb +46 -0
  89. data/test/controllers/overrides/sessions_controller_test.rb +35 -0
  90. data/test/controllers/overrides/token_validations_controller_test.rb +43 -0
  91. data/test/dummy/README.rdoc +28 -0
  92. data/test/dummy/app/active_record/confirmable_user.rb +11 -0
  93. data/test/dummy/app/active_record/lockable_user.rb +7 -0
  94. data/test/dummy/app/active_record/mang.rb +5 -0
  95. data/test/dummy/app/active_record/only_email_user.rb +7 -0
  96. data/test/dummy/app/active_record/scoped_user.rb +9 -0
  97. data/test/dummy/app/active_record/unconfirmable_user.rb +9 -0
  98. data/test/dummy/app/active_record/unregisterable_user.rb +9 -0
  99. data/test/dummy/app/active_record/user.rb +6 -0
  100. data/test/dummy/app/controllers/application_controller.rb +14 -0
  101. data/test/dummy/app/controllers/auth_origin_controller.rb +7 -0
  102. data/test/dummy/app/controllers/custom/confirmations_controller.rb +13 -0
  103. data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +13 -0
  104. data/test/dummy/app/controllers/custom/passwords_controller.rb +39 -0
  105. data/test/dummy/app/controllers/custom/registrations_controller.rb +39 -0
  106. data/test/dummy/app/controllers/custom/sessions_controller.rb +29 -0
  107. data/test/dummy/app/controllers/custom/token_validations_controller.rb +19 -0
  108. data/test/dummy/app/controllers/demo_group_controller.rb +15 -0
  109. data/test/dummy/app/controllers/demo_mang_controller.rb +14 -0
  110. data/test/dummy/app/controllers/demo_user_controller.rb +27 -0
  111. data/test/dummy/app/controllers/overrides/confirmations_controller.rb +29 -0
  112. data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +16 -0
  113. data/test/dummy/app/controllers/overrides/passwords_controller.rb +36 -0
  114. data/test/dummy/app/controllers/overrides/registrations_controller.rb +29 -0
  115. data/test/dummy/app/controllers/overrides/sessions_controller.rb +36 -0
  116. data/test/dummy/app/controllers/overrides/token_validations_controller.rb +23 -0
  117. data/test/dummy/app/helpers/application_helper.rb +1058 -0
  118. data/test/dummy/app/models/concerns/favorite_color.rb +19 -0
  119. data/test/dummy/app/mongoid/confirmable_user.rb +52 -0
  120. data/test/dummy/app/mongoid/lockable_user.rb +38 -0
  121. data/test/dummy/app/mongoid/mang.rb +46 -0
  122. data/test/dummy/app/mongoid/only_email_user.rb +33 -0
  123. data/test/dummy/app/mongoid/scoped_user.rb +50 -0
  124. data/test/dummy/app/mongoid/unconfirmable_user.rb +44 -0
  125. data/test/dummy/app/mongoid/unregisterable_user.rb +47 -0
  126. data/test/dummy/app/mongoid/user.rb +49 -0
  127. data/test/dummy/app/views/layouts/application.html.erb +12 -0
  128. data/test/dummy/config/application.rb +50 -0
  129. data/test/dummy/config/application.yml.bk +0 -0
  130. data/test/dummy/config/boot.rb +11 -0
  131. data/test/dummy/config/environment.rb +7 -0
  132. data/test/dummy/config/environments/development.rb +36 -0
  133. data/test/dummy/config/environments/production.rb +68 -0
  134. data/test/dummy/config/environments/test.rb +58 -0
  135. data/test/dummy/config/initializers/backtrace_silencers.rb +9 -0
  136. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  137. data/test/dummy/config/initializers/devise.rb +290 -0
  138. data/test/dummy/config/initializers/devise_token_auth.rb +55 -0
  139. data/test/dummy/config/initializers/figaro.rb +3 -0
  140. data/test/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  141. data/test/dummy/config/initializers/inflections.rb +18 -0
  142. data/test/dummy/config/initializers/mime_types.rb +6 -0
  143. data/test/dummy/config/initializers/omniauth.rb +11 -0
  144. data/test/dummy/config/initializers/session_store.rb +5 -0
  145. data/test/dummy/config/initializers/wrap_parameters.rb +16 -0
  146. data/test/dummy/config/routes.rb +57 -0
  147. data/test/dummy/config/spring.rb +3 -0
  148. data/test/dummy/config.ru +18 -0
  149. data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +58 -0
  150. data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +57 -0
  151. data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +8 -0
  152. data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +7 -0
  153. data/test/dummy/db/migrate/20141222035835_devise_token_auth_create_only_email_users.rb +55 -0
  154. data/test/dummy/db/migrate/20141222053502_devise_token_auth_create_unregisterable_users.rb +56 -0
  155. data/test/dummy/db/migrate/20150708104536_devise_token_auth_create_unconfirmable_users.rb +56 -0
  156. data/test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb +56 -0
  157. data/test/dummy/db/migrate/20160629184441_devise_token_auth_create_lockable_users.rb +56 -0
  158. data/test/dummy/db/migrate/20190924101113_devise_token_auth_create_confirmable_users.rb +49 -0
  159. data/test/dummy/db/schema.rb +198 -0
  160. data/test/dummy/lib/migration_database_helper.rb +43 -0
  161. data/test/dummy/tmp/generators/app/models/mang.rb +9 -0
  162. data/test/dummy/tmp/generators/app/models/user.rb +9 -0
  163. data/test/dummy/tmp/generators/config/initializers/devise_token_auth.rb +60 -0
  164. data/test/dummy/tmp/generators/config/routes.rb +9 -0
  165. data/test/dummy/tmp/generators/db/migrate/20210305040222_devise_token_auth_create_mangs.rb +49 -0
  166. data/test/dummy/tmp/generators/db/migrate/20210305040222_devise_token_auth_create_users.rb +49 -0
  167. data/test/factories/users.rb +41 -0
  168. data/test/lib/devise_token_auth/blacklist_test.rb +19 -0
  169. data/test/lib/devise_token_auth/rails/custom_routes_test.rb +29 -0
  170. data/test/lib/devise_token_auth/rails/routes_test.rb +87 -0
  171. data/test/lib/devise_token_auth/token_factory_test.rb +191 -0
  172. data/test/lib/devise_token_auth/url_test.rb +26 -0
  173. data/test/lib/generators/devise_token_auth/install_generator_test.rb +217 -0
  174. data/test/lib/generators/devise_token_auth/install_generator_with_namespace_test.rb +222 -0
  175. data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +25 -0
  176. data/test/models/concerns/mongoid_support_test.rb +31 -0
  177. data/test/models/concerns/tokens_serialization_test.rb +104 -0
  178. data/test/models/confirmable_user_test.rb +35 -0
  179. data/test/models/only_email_user_test.rb +29 -0
  180. data/test/models/user_test.rb +224 -0
  181. data/test/support/controllers/routes.rb +43 -0
  182. data/test/test_helper.rb +134 -0
  183. 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
@@ -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