devise_jwt_auth 0.1.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 +99 -0
- data/Rakefile +42 -0
- data/app/controllers/devise_jwt_auth/application_controller.rb +80 -0
- data/app/controllers/devise_jwt_auth/concerns/resource_finder.rb +44 -0
- data/app/controllers/devise_jwt_auth/concerns/set_user_by_jwt_token.rb +111 -0
- data/app/controllers/devise_jwt_auth/confirmations_controller.rb +88 -0
- data/app/controllers/devise_jwt_auth/omniauth_callbacks_controller.rb +291 -0
- data/app/controllers/devise_jwt_auth/passwords_controller.rb +217 -0
- data/app/controllers/devise_jwt_auth/refresh_token_controller.rb +41 -0
- data/app/controllers/devise_jwt_auth/registrations_controller.rb +203 -0
- data/app/controllers/devise_jwt_auth/sessions_controller.rb +131 -0
- data/app/controllers/devise_jwt_auth/unlocks_controller.rb +99 -0
- data/app/models/devise_jwt_auth/concerns/active_record_support.rb +16 -0
- data/app/models/devise_jwt_auth/concerns/confirmable_support.rb +27 -0
- data/app/models/devise_jwt_auth/concerns/mongoid_support.rb +19 -0
- data/app/models/devise_jwt_auth/concerns/tokens_serialization.rb +19 -0
- data/app/models/devise_jwt_auth/concerns/user.rb +117 -0
- data/app/models/devise_jwt_auth/concerns/user_omniauth_callbacks.rb +28 -0
- data/app/validators/devise_jwt_auth_email_validator.rb +23 -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_jwt_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 +57 -0
- data/config/locales/es.yml +51 -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 +48 -0
- data/config/locales/ko.yml +51 -0
- data/config/locales/nl.yml +32 -0
- data/config/locales/pl.yml +50 -0
- data/config/locales/pt-BR.yml +48 -0
- data/config/locales/pt.yml +50 -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_jwt_auth.rb +14 -0
- data/lib/devise_jwt_auth/blacklist.rb +2 -0
- data/lib/devise_jwt_auth/controllers/helpers.rb +161 -0
- data/lib/devise_jwt_auth/controllers/url_helpers.rb +10 -0
- data/lib/devise_jwt_auth/engine.rb +96 -0
- data/lib/devise_jwt_auth/errors.rb +8 -0
- data/lib/devise_jwt_auth/rails/routes.rb +118 -0
- data/lib/devise_jwt_auth/token_factory.rb +51 -0
- data/lib/devise_jwt_auth/url.rb +44 -0
- data/lib/devise_jwt_auth/version.rb +5 -0
- data/lib/generators/devise_jwt_auth/USAGE +31 -0
- data/lib/generators/devise_jwt_auth/install_generator.rb +91 -0
- data/lib/generators/devise_jwt_auth/install_generator_helpers.rb +98 -0
- data/lib/generators/devise_jwt_auth/install_mongoid_generator.rb +46 -0
- data/lib/generators/devise_jwt_auth/install_views_generator.rb +18 -0
- data/lib/generators/devise_jwt_auth/templates/devise_jwt_auth.rb +74 -0
- data/lib/generators/devise_jwt_auth/templates/devise_jwt_auth_create_users.rb.erb +51 -0
- data/lib/generators/devise_jwt_auth/templates/user.rb.erb +9 -0
- data/lib/generators/devise_jwt_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_refresh_token_controller_test.rb +36 -0
- data/test/controllers/custom/custom_registrations_controller_test.rb +59 -0
- data/test/controllers/custom/custom_sessions_controller_test.rb +39 -0
- data/test/controllers/demo_group_controller_test.rb +150 -0
- data/test/controllers/demo_mang_controller_test.rb +286 -0
- data/test/controllers/demo_user_controller_test.rb +650 -0
- data/test/controllers/devise_jwt_auth/confirmations_controller_test.rb +194 -0
- data/test/controllers/devise_jwt_auth/omniauth_callbacks_controller_test.rb +462 -0
- data/test/controllers/devise_jwt_auth/passwords_controller_test.rb +881 -0
- data/test/controllers/devise_jwt_auth/refresh_token_controller_test.rb +84 -0
- data/test/controllers/devise_jwt_auth/registrations_controller_test.rb +944 -0
- data/test/controllers/devise_jwt_auth/sessions_controller_test.rb +510 -0
- data/test/controllers/devise_jwt_auth/unlocks_controller_test.rb +197 -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 +65 -0
- data/test/controllers/overrides/refresh_token_controller_test.rb +37 -0
- data/test/controllers/overrides/registrations_controller_test.rb +47 -0
- data/test/controllers/overrides/sessions_controller_test.rb +35 -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 +18 -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/refresh_token_controller.rb +20 -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/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 +37 -0
- data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +16 -0
- data/test/dummy/app/controllers/overrides/passwords_controller.rb +45 -0
- data/test/dummy/app/controllers/overrides/refresh_token_controller.rb +22 -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/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 +14 -0
- data/test/dummy/config.ru +18 -0
- data/test/dummy/config/application.rb +48 -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 +46 -0
- data/test/dummy/config/environments/production.rb +84 -0
- data/test/dummy/config/environments/test.rb +50 -0
- data/test/dummy/config/initializers/assets.rb +10 -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_jwt_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/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/user.rb +9 -0
- data/test/dummy/tmp/generators/config/initializers/devise_jwt_auth.rb +74 -0
- data/test/dummy/tmp/generators/config/routes.rb +4 -0
- data/test/dummy/tmp/generators/db/migrate/20200206224309_devise_jwt_auth_create_users.rb +51 -0
- data/test/factories/users.rb +41 -0
- data/test/lib/devise_jwt_auth/blacklist_test.rb +11 -0
- data/test/lib/devise_jwt_auth/token_factory_test.rb +115 -0
- data/test/lib/devise_jwt_auth/url_test.rb +26 -0
- data/test/lib/generators/devise_jwt_auth/install_generator_test.rb +219 -0
- data/test/lib/generators/devise_jwt_auth/install_generator_with_namespace_test.rb +224 -0
- data/test/lib/generators/devise_jwt_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 +72 -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 +110 -0
- data/test/support/controllers/routes.rb +43 -0
- data/test/test_helper.rb +91 -0
- metadata +503 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class DeviseJwtAuthCreateUsers < ActiveRecord::Migration[6.0]
|
|
4
|
+
def change
|
|
5
|
+
|
|
6
|
+
create_table(:users) do |t|
|
|
7
|
+
## Required
|
|
8
|
+
t.string :provider, null: false, default: 'email'
|
|
9
|
+
t.string :uid, null: false, default: ''
|
|
10
|
+
|
|
11
|
+
## Database authenticatable
|
|
12
|
+
t.string :encrypted_password, null: false, default: ''
|
|
13
|
+
|
|
14
|
+
## Recoverable
|
|
15
|
+
t.string :reset_password_token
|
|
16
|
+
t.datetime :reset_password_sent_at
|
|
17
|
+
t.boolean :allow_password_change, default: false
|
|
18
|
+
|
|
19
|
+
## Rememberable
|
|
20
|
+
t.datetime :remember_created_at
|
|
21
|
+
|
|
22
|
+
## Confirmable
|
|
23
|
+
t.string :confirmation_token
|
|
24
|
+
t.datetime :confirmed_at
|
|
25
|
+
t.datetime :confirmation_sent_at
|
|
26
|
+
t.string :unconfirmed_email # Only if using reconfirmable
|
|
27
|
+
|
|
28
|
+
## Lockable
|
|
29
|
+
# t.integer :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
|
|
30
|
+
# t.string :unlock_token # Only if unlock strategy is :email or :both
|
|
31
|
+
# t.datetime :locked_at
|
|
32
|
+
|
|
33
|
+
## User Info
|
|
34
|
+
t.string :name
|
|
35
|
+
t.string :nickname
|
|
36
|
+
t.string :image
|
|
37
|
+
t.string :email
|
|
38
|
+
|
|
39
|
+
## Tokens
|
|
40
|
+
t.text :tokens
|
|
41
|
+
|
|
42
|
+
t.timestamps
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
add_index :users, :email, unique: true
|
|
46
|
+
add_index :users, [:uid, :provider], unique: true
|
|
47
|
+
add_index :users, :reset_password_token, unique: true
|
|
48
|
+
add_index :users, :confirmation_token, unique: true
|
|
49
|
+
# add_index :users, :unlock_token, unique: true
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
FactoryBot.define do
|
|
2
|
+
factory :user do
|
|
3
|
+
email { Faker::Internet.unique.safe_email }
|
|
4
|
+
password { Faker::Internet.password }
|
|
5
|
+
provider { 'email' }
|
|
6
|
+
|
|
7
|
+
transient do
|
|
8
|
+
allow_unconfirmed_period { Time.now.utc - Devise.allow_unconfirmed_access_for }
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
trait :with_nickname do
|
|
12
|
+
nickname { Faker::Internet.username }
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
trait :confirmed do
|
|
16
|
+
after(:create) { |user| user.confirm }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# confirmation period is expired
|
|
20
|
+
trait :unconfirmed do
|
|
21
|
+
after(:create) do |user, evaluator|
|
|
22
|
+
user.update_attribute(:confirmation_sent_at, evaluator.allow_unconfirmed_period - 1.day )
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
trait :facebook do
|
|
27
|
+
uid { Faker::Number.number }
|
|
28
|
+
provider { 'facebook' }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
trait :locked do
|
|
32
|
+
after(:create) { |user| user.lock_access! }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
factory :lockable_user, class: 'LockableUser'
|
|
36
|
+
factory :mang_user, class: 'Mang'
|
|
37
|
+
factory :only_email_user, class: 'OnlyEmailUser'
|
|
38
|
+
factory :scoped_user, class: 'ScopedUser'
|
|
39
|
+
factory :confirmable_user, class: 'ConfirmableUser'
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
class DeviseJwtAuth::BlacklistTest < ActiveSupport::TestCase
|
|
6
|
+
describe Devise::Models::Authenticatable::BLACKLIST_FOR_SERIALIZATION do
|
|
7
|
+
test 'should include :tokens' do
|
|
8
|
+
assert Devise::Models::Authenticatable::BLACKLIST_FOR_SERIALIZATION.include?(:tokens)
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
class DeviseJwtAuth::TokenFactoryTest < ActiveSupport::TestCase
|
|
6
|
+
describe 'TokenFactory module' do
|
|
7
|
+
let(:tf) { DeviseJwtAuth::TokenFactory }
|
|
8
|
+
let(:token_regexp) { /^[A-Za-z0-9\-_=]+\.[A-Za-z0-9\-_=]+\.?[A-Za-z0-9\-_.+\/=]*$/ }
|
|
9
|
+
|
|
10
|
+
it 'should be defined' do
|
|
11
|
+
assert_equal(tf.present?, true)
|
|
12
|
+
assert_kind_of(Module, tf)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe 'interface' do
|
|
16
|
+
let(:payload) { { foo: 'test'} }
|
|
17
|
+
let(:future_exp) { (Time.zone.now + 1.hour).to_i }
|
|
18
|
+
let(:past_exp) { (Time.zone.now - 1.hour).to_i }
|
|
19
|
+
|
|
20
|
+
it '::create_refresh_token' do
|
|
21
|
+
assert_respond_to(tf, :create_refresh_token)
|
|
22
|
+
token = tf.create_refresh_token(payload)
|
|
23
|
+
assert_match(token_regexp, token)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it '::create_access_token' do
|
|
27
|
+
assert_respond_to(tf, :create_access_token)
|
|
28
|
+
token = tf.create_access_token(payload)
|
|
29
|
+
assert_match(token_regexp, token)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe '::decode_refresh_token' do
|
|
33
|
+
let(:valid_key) { DeviseJwtAuth.refresh_token_encryption_key }
|
|
34
|
+
|
|
35
|
+
it 'decodes payload' do
|
|
36
|
+
assert_respond_to(tf, :decode_refresh_token)
|
|
37
|
+
token = tf.create_refresh_token(payload)
|
|
38
|
+
result = tf.decode_refresh_token(token)
|
|
39
|
+
assert result['foo']
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it 'validates expiry' do
|
|
43
|
+
token = tf.create_refresh_token(payload.merge(exp: future_exp))
|
|
44
|
+
result = tf.decode_refresh_token(token)
|
|
45
|
+
assert result['exp'] == future_exp
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it 'invalidates expired token' do
|
|
49
|
+
token = tf.create_refresh_token(payload.merge(exp: past_exp))
|
|
50
|
+
result = tf.decode_refresh_token(token)
|
|
51
|
+
assert_nil result['exp']
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it 'invalidates bogus token' do
|
|
55
|
+
result = tf.decode_refresh_token('bogus token')
|
|
56
|
+
assert_empty result
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it 'invalidates nil token' do
|
|
60
|
+
result = tf.decode_refresh_token(nil)
|
|
61
|
+
assert_empty result
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
it 'invalidates token created with incorrect key' do
|
|
65
|
+
token = tf.create_refresh_token(payload)
|
|
66
|
+
DeviseJwtAuth.refresh_token_encryption_key = 'invalid key'
|
|
67
|
+
result = tf.decode_refresh_token(token)
|
|
68
|
+
assert_empty result
|
|
69
|
+
DeviseJwtAuth.refresh_token_encryption_key = valid_key
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
describe '::decode_access_token' do
|
|
74
|
+
let(:valid_key) { DeviseJwtAuth.access_token_encryption_key }
|
|
75
|
+
|
|
76
|
+
it 'decodes payload' do
|
|
77
|
+
assert_respond_to(tf, :decode_access_token)
|
|
78
|
+
token = tf.create_access_token(payload)
|
|
79
|
+
result = tf.decode_access_token(token)
|
|
80
|
+
assert result['foo']
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
it 'validates expiry' do
|
|
84
|
+
token = tf.create_access_token(payload.merge(exp: future_exp))
|
|
85
|
+
result = tf.decode_access_token(token)
|
|
86
|
+
assert result['exp'] == future_exp
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it 'invalidates expired token' do
|
|
90
|
+
token = tf.create_access_token(payload.merge(exp: past_exp))
|
|
91
|
+
result = tf.decode_access_token(token)
|
|
92
|
+
assert_nil result['exp']
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it 'invalidates bogus token' do
|
|
96
|
+
result = tf.decode_access_token('bogus token')
|
|
97
|
+
assert_empty result
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
it 'invalidates nil token' do
|
|
101
|
+
result = tf.decode_access_token(nil)
|
|
102
|
+
assert_empty result
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it 'invalidates token created with incorrect key' do
|
|
106
|
+
token = tf.create_access_token(payload)
|
|
107
|
+
DeviseJwtAuth.access_token_encryption_key = 'invalid key'
|
|
108
|
+
result = tf.decode_access_token(token)
|
|
109
|
+
assert_empty result
|
|
110
|
+
DeviseJwtAuth.access_token_encryption_key = valid_key
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
class DeviseJwtAuth::UrlTest < ActiveSupport::TestCase
|
|
6
|
+
describe 'DeviseJwtAuth::Url#generate' do
|
|
7
|
+
test 'URI fragment should appear at the end of URL with repeat of query params' do
|
|
8
|
+
params = { client_id: 123 }
|
|
9
|
+
url = 'http://example.com#fragment'
|
|
10
|
+
assert_equal DeviseJwtAuth::Url.send(:generate, url, params), 'http://example.com?client_id=123#fragment?client_id=123'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe 'with existing query params' do
|
|
14
|
+
test 'should preserve existing query params' do
|
|
15
|
+
url = 'http://example.com?a=1'
|
|
16
|
+
assert_equal DeviseJwtAuth::Url.send(:generate, url), 'http://example.com?a=1'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
test 'should marge existing query params with new ones' do
|
|
20
|
+
params = { client_id: 123 }
|
|
21
|
+
url = 'http://example.com?a=1'
|
|
22
|
+
assert_equal DeviseJwtAuth::Url.send(:generate, url, params), 'http://example.com?a=1&client_id=123'
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
require 'fileutils'
|
|
5
|
+
require 'generators/devise_jwt_auth/install_generator' if DEVISE_JWT_AUTH_ORM == :active_record
|
|
6
|
+
require 'generators/devise_jwt_auth/install_mongoid_generator' if DEVISE_JWT_AUTH_ORM == :mongoid
|
|
7
|
+
|
|
8
|
+
module DeviseJwtAuth
|
|
9
|
+
class InstallGeneratorTest < Rails::Generators::TestCase
|
|
10
|
+
tests InstallGenerator if DEVISE_JWT_AUTH_ORM == :active_record
|
|
11
|
+
tests InstallMongoidGenerator if DEVISE_JWT_AUTH_ORM == :mongoid
|
|
12
|
+
destination Rails.root.join('tmp/generators')
|
|
13
|
+
|
|
14
|
+
describe 'default values, clean install' do
|
|
15
|
+
setup :prepare_destination
|
|
16
|
+
|
|
17
|
+
before do
|
|
18
|
+
run_generator
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
test 'user model is created, concern is included' do
|
|
22
|
+
assert_file 'app/models/user.rb' do |model|
|
|
23
|
+
assert_match(/include DeviseJwtAuth::Concerns::User/, model)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
test 'initializer is created' do
|
|
28
|
+
assert_file 'config/initializers/devise_jwt_auth.rb'
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
test 'subsequent runs raise no errors' do
|
|
32
|
+
run_generator
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
if DEVISE_JWT_AUTH_ORM == :active_record
|
|
36
|
+
test 'migration is created' do
|
|
37
|
+
assert_migration 'db/migrate/devise_jwt_auth_create_users.rb'
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
test 'migration file contains rails version' do
|
|
41
|
+
if Rails::VERSION::MAJOR >= 5
|
|
42
|
+
assert_migration 'db/migrate/devise_jwt_auth_create_users.rb', /#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}/
|
|
43
|
+
else
|
|
44
|
+
assert_migration 'db/migrate/devise_jwt_auth_create_users.rb'
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
=begin
|
|
49
|
+
test 'add primary key type with rails 5 when specified in rails generator' do
|
|
50
|
+
run_generator %w[--primary_key_type=uuid --force]
|
|
51
|
+
if Rails::VERSION::MAJOR >= 5
|
|
52
|
+
assert_migration 'db/migrate/devise_jwt_auth_create_users.rb', /create_table\(:users, id: :uuid\) do/
|
|
53
|
+
else
|
|
54
|
+
assert_migration 'db/migrate/devise_jwt_auth_create_users.rb', /create_table\(:users\) do/
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
=end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
describe 'existing user model' do
|
|
62
|
+
setup :prepare_destination
|
|
63
|
+
|
|
64
|
+
before do
|
|
65
|
+
@dir = File.join(destination_root, 'app', 'models')
|
|
66
|
+
|
|
67
|
+
@fname = File.join(@dir, 'user.rb')
|
|
68
|
+
|
|
69
|
+
# make dir if not exists
|
|
70
|
+
FileUtils.mkdir_p(@dir)
|
|
71
|
+
|
|
72
|
+
case DEVISE_JWT_AUTH_ORM
|
|
73
|
+
when :active_record
|
|
74
|
+
# account for rails version 5
|
|
75
|
+
active_record_needle = (Rails::VERSION::MAJOR == 5) ? 'ApplicationRecord' : 'ActiveRecord::Base'
|
|
76
|
+
|
|
77
|
+
@f = File.open(@fname, 'w') do |f|
|
|
78
|
+
f.write <<-RUBY
|
|
79
|
+
class User < #{active_record_needle}
|
|
80
|
+
|
|
81
|
+
def whatever
|
|
82
|
+
puts 'whatever'
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
RUBY
|
|
86
|
+
end
|
|
87
|
+
when :mongoid
|
|
88
|
+
@f = File.open(@fname, 'w') do |f|
|
|
89
|
+
f.write <<-'RUBY'
|
|
90
|
+
class User
|
|
91
|
+
|
|
92
|
+
def whatever
|
|
93
|
+
puts 'whatever'
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
RUBY
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
run_generator
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
test 'user concern is injected into existing model' do
|
|
104
|
+
assert_file 'app/models/user.rb' do |model|
|
|
105
|
+
assert_match(/include DeviseJwtAuth::Concerns::User/, model)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
test 'subsequent runs do not modify file' do
|
|
110
|
+
run_generator
|
|
111
|
+
assert_file 'app/models/user.rb' do |model|
|
|
112
|
+
matches = model.scan(/include DeviseJwtAuth::Concerns::User/m).size
|
|
113
|
+
assert_equal 1, matches
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
describe 'routes' do
|
|
119
|
+
setup :prepare_destination
|
|
120
|
+
|
|
121
|
+
before do
|
|
122
|
+
@dir = File.join(destination_root, 'config')
|
|
123
|
+
|
|
124
|
+
@fname = File.join(@dir, 'routes.rb')
|
|
125
|
+
|
|
126
|
+
# make dir if not exists
|
|
127
|
+
FileUtils.mkdir_p(@dir)
|
|
128
|
+
|
|
129
|
+
@f = File.open(@fname, 'w') do |f|
|
|
130
|
+
f.write <<-RUBY
|
|
131
|
+
Rails.application.routes.draw do
|
|
132
|
+
patch '/chong', to: 'bong#index'
|
|
133
|
+
end
|
|
134
|
+
RUBY
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
run_generator
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
test 'route method is appended to routes file' do
|
|
141
|
+
assert_file 'config/routes.rb' do |routes|
|
|
142
|
+
assert_match(/mount_devise_jwt_auth_for 'User', at: 'auth'/, routes)
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
test 'subsequent runs do not modify file' do
|
|
147
|
+
run_generator
|
|
148
|
+
assert_file 'config/routes.rb' do |routes|
|
|
149
|
+
matches = routes.scan(/mount_devise_jwt_auth_for 'User', at: 'auth'/m).size
|
|
150
|
+
assert_equal 1, matches
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
describe 'subsequent models' do
|
|
155
|
+
before do
|
|
156
|
+
run_generator %w[Mang mangs]
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
test 'route method is appended to routes file' do
|
|
160
|
+
assert_file 'config/routes.rb' do |routes|
|
|
161
|
+
assert_match(/mount_devise_jwt_auth_for 'Mang', at: 'mangs'/, routes)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
test 'devise_for block is appended to routes file' do
|
|
166
|
+
assert_file 'config/routes.rb' do |routes|
|
|
167
|
+
assert_match(/as :mang do/, routes)
|
|
168
|
+
assert_match(/# Define routes for Mang within this block./, routes)
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
if DEVISE_JWT_AUTH_ORM == :active_record
|
|
173
|
+
test 'migration is created' do
|
|
174
|
+
assert_migration 'db/migrate/devise_jwt_auth_create_mangs.rb'
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
179
|
+
|
|
180
|
+
describe 'application controller' do
|
|
181
|
+
setup :prepare_destination
|
|
182
|
+
|
|
183
|
+
before do
|
|
184
|
+
@dir = File.join(destination_root, 'app', 'controllers')
|
|
185
|
+
|
|
186
|
+
@fname = File.join(@dir, 'application_controller.rb')
|
|
187
|
+
|
|
188
|
+
# make dir if not exists
|
|
189
|
+
FileUtils.mkdir_p(@dir)
|
|
190
|
+
|
|
191
|
+
@f = File.open(@fname, 'w') do |f|
|
|
192
|
+
f.write <<-RUBY
|
|
193
|
+
class ApplicationController < ActionController::Base
|
|
194
|
+
def whatever
|
|
195
|
+
'whatever'
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
RUBY
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
run_generator
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
test 'controller concern is appended to application controller' do
|
|
205
|
+
assert_file 'app/controllers/application_controller.rb' do |controller|
|
|
206
|
+
assert_match(/include DeviseJwtAuth::Concerns::SetUserByToken/, controller)
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
test 'subsequent runs do not modify file' do
|
|
211
|
+
run_generator
|
|
212
|
+
assert_file 'app/controllers/application_controller.rb' do |controller|
|
|
213
|
+
matches = controller.scan(/include DeviseJwtAuth::Concerns::SetUserByToken/m).size
|
|
214
|
+
assert_equal 1, matches
|
|
215
|
+
end
|
|
216
|
+
end
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
end
|