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.
Files changed (179) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +13 -0
  3. data/README.md +99 -0
  4. data/Rakefile +42 -0
  5. data/app/controllers/devise_jwt_auth/application_controller.rb +80 -0
  6. data/app/controllers/devise_jwt_auth/concerns/resource_finder.rb +44 -0
  7. data/app/controllers/devise_jwt_auth/concerns/set_user_by_jwt_token.rb +111 -0
  8. data/app/controllers/devise_jwt_auth/confirmations_controller.rb +88 -0
  9. data/app/controllers/devise_jwt_auth/omniauth_callbacks_controller.rb +291 -0
  10. data/app/controllers/devise_jwt_auth/passwords_controller.rb +217 -0
  11. data/app/controllers/devise_jwt_auth/refresh_token_controller.rb +41 -0
  12. data/app/controllers/devise_jwt_auth/registrations_controller.rb +203 -0
  13. data/app/controllers/devise_jwt_auth/sessions_controller.rb +131 -0
  14. data/app/controllers/devise_jwt_auth/unlocks_controller.rb +99 -0
  15. data/app/models/devise_jwt_auth/concerns/active_record_support.rb +16 -0
  16. data/app/models/devise_jwt_auth/concerns/confirmable_support.rb +27 -0
  17. data/app/models/devise_jwt_auth/concerns/mongoid_support.rb +19 -0
  18. data/app/models/devise_jwt_auth/concerns/tokens_serialization.rb +19 -0
  19. data/app/models/devise_jwt_auth/concerns/user.rb +117 -0
  20. data/app/models/devise_jwt_auth/concerns/user_omniauth_callbacks.rb +28 -0
  21. data/app/validators/devise_jwt_auth_email_validator.rb +23 -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_jwt_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 +57 -0
  29. data/config/locales/es.yml +51 -0
  30. data/config/locales/fr.yml +51 -0
  31. data/config/locales/he.yml +52 -0
  32. data/config/locales/it.yml +48 -0
  33. data/config/locales/ja.yml +48 -0
  34. data/config/locales/ko.yml +51 -0
  35. data/config/locales/nl.yml +32 -0
  36. data/config/locales/pl.yml +50 -0
  37. data/config/locales/pt-BR.yml +48 -0
  38. data/config/locales/pt.yml +50 -0
  39. data/config/locales/ro.yml +48 -0
  40. data/config/locales/ru.yml +52 -0
  41. data/config/locales/sq.yml +48 -0
  42. data/config/locales/sv.yml +52 -0
  43. data/config/locales/uk.yml +61 -0
  44. data/config/locales/vi.yml +52 -0
  45. data/config/locales/zh-CN.yml +48 -0
  46. data/config/locales/zh-HK.yml +50 -0
  47. data/config/locales/zh-TW.yml +50 -0
  48. data/lib/devise_jwt_auth.rb +14 -0
  49. data/lib/devise_jwt_auth/blacklist.rb +2 -0
  50. data/lib/devise_jwt_auth/controllers/helpers.rb +161 -0
  51. data/lib/devise_jwt_auth/controllers/url_helpers.rb +10 -0
  52. data/lib/devise_jwt_auth/engine.rb +96 -0
  53. data/lib/devise_jwt_auth/errors.rb +8 -0
  54. data/lib/devise_jwt_auth/rails/routes.rb +118 -0
  55. data/lib/devise_jwt_auth/token_factory.rb +51 -0
  56. data/lib/devise_jwt_auth/url.rb +44 -0
  57. data/lib/devise_jwt_auth/version.rb +5 -0
  58. data/lib/generators/devise_jwt_auth/USAGE +31 -0
  59. data/lib/generators/devise_jwt_auth/install_generator.rb +91 -0
  60. data/lib/generators/devise_jwt_auth/install_generator_helpers.rb +98 -0
  61. data/lib/generators/devise_jwt_auth/install_mongoid_generator.rb +46 -0
  62. data/lib/generators/devise_jwt_auth/install_views_generator.rb +18 -0
  63. data/lib/generators/devise_jwt_auth/templates/devise_jwt_auth.rb +74 -0
  64. data/lib/generators/devise_jwt_auth/templates/devise_jwt_auth_create_users.rb.erb +51 -0
  65. data/lib/generators/devise_jwt_auth/templates/user.rb.erb +9 -0
  66. data/lib/generators/devise_jwt_auth/templates/user_mongoid.rb.erb +56 -0
  67. data/lib/tasks/devise_token_auth_tasks.rake +6 -0
  68. data/test/controllers/custom/custom_confirmations_controller_test.rb +25 -0
  69. data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +33 -0
  70. data/test/controllers/custom/custom_passwords_controller_test.rb +79 -0
  71. data/test/controllers/custom/custom_refresh_token_controller_test.rb +36 -0
  72. data/test/controllers/custom/custom_registrations_controller_test.rb +59 -0
  73. data/test/controllers/custom/custom_sessions_controller_test.rb +39 -0
  74. data/test/controllers/demo_group_controller_test.rb +150 -0
  75. data/test/controllers/demo_mang_controller_test.rb +286 -0
  76. data/test/controllers/demo_user_controller_test.rb +650 -0
  77. data/test/controllers/devise_jwt_auth/confirmations_controller_test.rb +194 -0
  78. data/test/controllers/devise_jwt_auth/omniauth_callbacks_controller_test.rb +462 -0
  79. data/test/controllers/devise_jwt_auth/passwords_controller_test.rb +881 -0
  80. data/test/controllers/devise_jwt_auth/refresh_token_controller_test.rb +84 -0
  81. data/test/controllers/devise_jwt_auth/registrations_controller_test.rb +944 -0
  82. data/test/controllers/devise_jwt_auth/sessions_controller_test.rb +510 -0
  83. data/test/controllers/devise_jwt_auth/unlocks_controller_test.rb +197 -0
  84. data/test/controllers/overrides/confirmations_controller_test.rb +47 -0
  85. data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +53 -0
  86. data/test/controllers/overrides/passwords_controller_test.rb +65 -0
  87. data/test/controllers/overrides/refresh_token_controller_test.rb +37 -0
  88. data/test/controllers/overrides/registrations_controller_test.rb +47 -0
  89. data/test/controllers/overrides/sessions_controller_test.rb +35 -0
  90. data/test/dummy/README.rdoc +28 -0
  91. data/test/dummy/app/active_record/confirmable_user.rb +11 -0
  92. data/test/dummy/app/active_record/lockable_user.rb +7 -0
  93. data/test/dummy/app/active_record/mang.rb +5 -0
  94. data/test/dummy/app/active_record/only_email_user.rb +7 -0
  95. data/test/dummy/app/active_record/scoped_user.rb +9 -0
  96. data/test/dummy/app/active_record/unconfirmable_user.rb +9 -0
  97. data/test/dummy/app/active_record/unregisterable_user.rb +9 -0
  98. data/test/dummy/app/active_record/user.rb +6 -0
  99. data/test/dummy/app/controllers/application_controller.rb +18 -0
  100. data/test/dummy/app/controllers/auth_origin_controller.rb +7 -0
  101. data/test/dummy/app/controllers/custom/confirmations_controller.rb +13 -0
  102. data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +13 -0
  103. data/test/dummy/app/controllers/custom/passwords_controller.rb +39 -0
  104. data/test/dummy/app/controllers/custom/refresh_token_controller.rb +20 -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/demo_group_controller.rb +15 -0
  108. data/test/dummy/app/controllers/demo_mang_controller.rb +14 -0
  109. data/test/dummy/app/controllers/demo_user_controller.rb +27 -0
  110. data/test/dummy/app/controllers/overrides/confirmations_controller.rb +37 -0
  111. data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +16 -0
  112. data/test/dummy/app/controllers/overrides/passwords_controller.rb +45 -0
  113. data/test/dummy/app/controllers/overrides/refresh_token_controller.rb +22 -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/helpers/application_helper.rb +1058 -0
  117. data/test/dummy/app/models/concerns/favorite_color.rb +19 -0
  118. data/test/dummy/app/mongoid/confirmable_user.rb +52 -0
  119. data/test/dummy/app/mongoid/lockable_user.rb +38 -0
  120. data/test/dummy/app/mongoid/mang.rb +46 -0
  121. data/test/dummy/app/mongoid/only_email_user.rb +33 -0
  122. data/test/dummy/app/mongoid/scoped_user.rb +50 -0
  123. data/test/dummy/app/mongoid/unconfirmable_user.rb +44 -0
  124. data/test/dummy/app/mongoid/unregisterable_user.rb +47 -0
  125. data/test/dummy/app/mongoid/user.rb +49 -0
  126. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  127. data/test/dummy/config.ru +18 -0
  128. data/test/dummy/config/application.rb +48 -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 +46 -0
  133. data/test/dummy/config/environments/production.rb +84 -0
  134. data/test/dummy/config/environments/test.rb +50 -0
  135. data/test/dummy/config/initializers/assets.rb +10 -0
  136. data/test/dummy/config/initializers/backtrace_silencers.rb +9 -0
  137. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  138. data/test/dummy/config/initializers/devise.rb +290 -0
  139. data/test/dummy/config/initializers/devise_jwt_auth.rb +55 -0
  140. data/test/dummy/config/initializers/figaro.rb +3 -0
  141. data/test/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  142. data/test/dummy/config/initializers/inflections.rb +18 -0
  143. data/test/dummy/config/initializers/mime_types.rb +6 -0
  144. data/test/dummy/config/initializers/omniauth.rb +11 -0
  145. data/test/dummy/config/initializers/session_store.rb +5 -0
  146. data/test/dummy/config/initializers/wrap_parameters.rb +16 -0
  147. data/test/dummy/config/routes.rb +57 -0
  148. data/test/dummy/config/spring.rb +3 -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/user.rb +9 -0
  162. data/test/dummy/tmp/generators/config/initializers/devise_jwt_auth.rb +74 -0
  163. data/test/dummy/tmp/generators/config/routes.rb +4 -0
  164. data/test/dummy/tmp/generators/db/migrate/20200206224309_devise_jwt_auth_create_users.rb +51 -0
  165. data/test/factories/users.rb +41 -0
  166. data/test/lib/devise_jwt_auth/blacklist_test.rb +11 -0
  167. data/test/lib/devise_jwt_auth/token_factory_test.rb +115 -0
  168. data/test/lib/devise_jwt_auth/url_test.rb +26 -0
  169. data/test/lib/generators/devise_jwt_auth/install_generator_test.rb +219 -0
  170. data/test/lib/generators/devise_jwt_auth/install_generator_with_namespace_test.rb +224 -0
  171. data/test/lib/generators/devise_jwt_auth/install_views_generator_test.rb +25 -0
  172. data/test/models/concerns/mongoid_support_test.rb +31 -0
  173. data/test/models/concerns/tokens_serialization_test.rb +72 -0
  174. data/test/models/confirmable_user_test.rb +35 -0
  175. data/test/models/only_email_user_test.rb +29 -0
  176. data/test/models/user_test.rb +110 -0
  177. data/test/support/controllers/routes.rb +43 -0
  178. data/test/test_helper.rb +91 -0
  179. metadata +503 -0
@@ -0,0 +1,4 @@
1
+ Rails.application.routes.draw do
2
+ mount_devise_jwt_auth_for 'User', at: 'auth'
3
+ patch '/chong', to: 'bong#index'
4
+ end
@@ -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