doorkeeper 5.0.0 → 5.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 (241) hide show
  1. checksums.yaml +5 -5
  2. data/.hound.yml +2 -1
  3. data/.rubocop.yml +37 -4
  4. data/.travis.yml +16 -21
  5. data/Appraisals +29 -7
  6. data/Dangerfile +67 -0
  7. data/Gemfile +19 -5
  8. data/NEWS.md +107 -10
  9. data/README.md +75 -470
  10. data/Rakefile +10 -8
  11. data/app/controllers/doorkeeper/application_controller.rb +3 -2
  12. data/app/controllers/doorkeeper/application_metal_controller.rb +4 -13
  13. data/app/controllers/doorkeeper/applications_controller.rb +21 -7
  14. data/app/controllers/doorkeeper/authorizations_controller.rb +3 -3
  15. data/app/controllers/doorkeeper/authorized_applications_controller.rb +2 -0
  16. data/app/controllers/doorkeeper/token_info_controller.rb +4 -2
  17. data/app/controllers/doorkeeper/tokens_controller.rb +13 -11
  18. data/app/helpers/doorkeeper/dashboard_helper.rb +3 -1
  19. data/app/validators/redirect_uri_validator.rb +7 -2
  20. data/app/views/doorkeeper/applications/_form.html.erb +6 -0
  21. data/app/views/doorkeeper/applications/show.html.erb +1 -1
  22. data/app/views/layouts/doorkeeper/admin.html.erb +5 -3
  23. data/bin/console +16 -0
  24. data/config/locales/en.yml +1 -0
  25. data/doorkeeper.gemspec +28 -24
  26. data/gemfiles/rails_5_0.gemfile +9 -4
  27. data/gemfiles/rails_5_1.gemfile +9 -4
  28. data/gemfiles/rails_5_2.gemfile +10 -5
  29. data/gemfiles/rails_6_0.gemfile +17 -0
  30. data/gemfiles/rails_master.gemfile +9 -9
  31. data/lib/doorkeeper/config/option.rb +64 -0
  32. data/lib/doorkeeper/config.rb +197 -76
  33. data/lib/doorkeeper/engine.rb +3 -1
  34. data/lib/doorkeeper/errors.rb +17 -0
  35. data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
  36. data/lib/doorkeeper/grape/helpers.rb +5 -3
  37. data/lib/doorkeeper/helpers/controller.rb +5 -2
  38. data/lib/doorkeeper/models/access_grant_mixin.rb +25 -6
  39. data/lib/doorkeeper/models/access_token_mixin.rb +68 -22
  40. data/lib/doorkeeper/models/application_mixin.rb +45 -1
  41. data/lib/doorkeeper/models/concerns/accessible.rb +2 -0
  42. data/lib/doorkeeper/models/concerns/expirable.rb +6 -2
  43. data/lib/doorkeeper/models/concerns/orderable.rb +2 -0
  44. data/lib/doorkeeper/models/concerns/ownership.rb +3 -6
  45. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  46. data/lib/doorkeeper/models/concerns/revocable.rb +4 -1
  47. data/lib/doorkeeper/models/concerns/scopes.rb +7 -1
  48. data/lib/doorkeeper/models/concerns/secret_storable.rb +108 -0
  49. data/lib/doorkeeper/oauth/authorization/code.rb +4 -2
  50. data/lib/doorkeeper/oauth/authorization/context.rb +2 -0
  51. data/lib/doorkeeper/oauth/authorization/token.rb +14 -7
  52. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +3 -1
  53. data/lib/doorkeeper/oauth/authorization_code_request.rb +8 -4
  54. data/lib/doorkeeper/oauth/base_request.rb +2 -0
  55. data/lib/doorkeeper/oauth/base_response.rb +2 -0
  56. data/lib/doorkeeper/oauth/client/credentials.rb +2 -0
  57. data/lib/doorkeeper/oauth/client.rb +3 -1
  58. data/lib/doorkeeper/oauth/client_credentials/creator.rb +2 -0
  59. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +2 -0
  60. data/lib/doorkeeper/oauth/client_credentials/validation.rb +7 -4
  61. data/lib/doorkeeper/oauth/client_credentials_request.rb +3 -1
  62. data/lib/doorkeeper/oauth/code_request.rb +2 -0
  63. data/lib/doorkeeper/oauth/code_response.rb +4 -2
  64. data/lib/doorkeeper/oauth/error.rb +2 -0
  65. data/lib/doorkeeper/oauth/error_response.rb +20 -6
  66. data/lib/doorkeeper/oauth/forbidden_token_response.rb +10 -3
  67. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +25 -8
  68. data/lib/doorkeeper/oauth/helpers/unique_token.rb +15 -1
  69. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +42 -3
  70. data/lib/doorkeeper/oauth/invalid_token_response.rb +22 -0
  71. data/lib/doorkeeper/oauth/password_access_token_request.rb +9 -2
  72. data/lib/doorkeeper/oauth/pre_authorization.rb +13 -5
  73. data/lib/doorkeeper/oauth/refresh_token_request.rb +15 -4
  74. data/lib/doorkeeper/oauth/scopes.rb +7 -3
  75. data/lib/doorkeeper/oauth/token.rb +4 -2
  76. data/lib/doorkeeper/oauth/token_introspection.rb +76 -8
  77. data/lib/doorkeeper/oauth/token_request.rb +2 -0
  78. data/lib/doorkeeper/oauth/token_response.rb +11 -9
  79. data/lib/doorkeeper/oauth.rb +5 -5
  80. data/lib/doorkeeper/orm/active_record/access_grant.rb +27 -13
  81. data/lib/doorkeeper/orm/active_record/access_token.rb +6 -13
  82. data/lib/doorkeeper/orm/active_record/application.rb +26 -7
  83. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +10 -3
  84. data/lib/doorkeeper/orm/active_record.rb +8 -6
  85. data/lib/doorkeeper/rails/helpers.rb +5 -1
  86. data/lib/doorkeeper/rails/routes/mapper.rb +2 -0
  87. data/lib/doorkeeper/rails/routes/mapping.rb +9 -7
  88. data/lib/doorkeeper/rails/routes.rb +19 -12
  89. data/lib/doorkeeper/rake/db.rake +17 -17
  90. data/lib/doorkeeper/rake.rb +1 -1
  91. data/lib/doorkeeper/request/authorization_code.rb +2 -0
  92. data/lib/doorkeeper/request/client_credentials.rb +2 -0
  93. data/lib/doorkeeper/request/code.rb +2 -0
  94. data/lib/doorkeeper/request/password.rb +2 -0
  95. data/lib/doorkeeper/request/refresh_token.rb +2 -0
  96. data/lib/doorkeeper/request/strategy.rb +2 -0
  97. data/lib/doorkeeper/request/token.rb +2 -0
  98. data/lib/doorkeeper/request.rb +3 -1
  99. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  100. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  101. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  102. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  103. data/lib/doorkeeper/server.rb +2 -0
  104. data/lib/doorkeeper/stale_records_cleaner.rb +20 -0
  105. data/lib/doorkeeper/validations.rb +2 -0
  106. data/lib/doorkeeper/version.rb +4 -2
  107. data/lib/doorkeeper.rb +69 -59
  108. data/lib/generators/doorkeeper/application_owner_generator.rb +10 -9
  109. data/lib/generators/doorkeeper/confidential_applications_generator.rb +10 -9
  110. data/lib/generators/doorkeeper/install_generator.rb +11 -9
  111. data/lib/generators/doorkeeper/migration_generator.rb +9 -9
  112. data/lib/generators/doorkeeper/pkce_generator.rb +10 -9
  113. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +10 -9
  114. data/lib/generators/doorkeeper/templates/initializer.rb +138 -13
  115. data/lib/generators/doorkeeper/templates/migration.rb.erb +17 -10
  116. data/lib/generators/doorkeeper/views_generator.rb +6 -4
  117. data/spec/controllers/application_metal_controller_spec.rb +24 -10
  118. data/spec/controllers/applications_controller_spec.rb +76 -78
  119. data/spec/controllers/authorizations_controller_spec.rb +189 -142
  120. data/spec/controllers/protected_resources_controller_spec.rb +111 -67
  121. data/spec/controllers/token_info_controller_spec.rb +14 -12
  122. data/spec/controllers/tokens_controller_spec.rb +170 -112
  123. data/spec/dummy/Rakefile +3 -1
  124. data/spec/dummy/app/controllers/application_controller.rb +3 -1
  125. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +3 -1
  126. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +4 -2
  127. data/spec/dummy/app/controllers/home_controller.rb +6 -5
  128. data/spec/dummy/app/controllers/metal_controller.rb +2 -0
  129. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +4 -2
  130. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  131. data/spec/dummy/app/models/user.rb +2 -0
  132. data/spec/dummy/config/application.rb +26 -2
  133. data/spec/dummy/config/boot.rb +2 -4
  134. data/spec/dummy/config/environment.rb +1 -1
  135. data/spec/dummy/config/environments/development.rb +2 -0
  136. data/spec/dummy/config/environments/production.rb +2 -0
  137. data/spec/dummy/config/environments/test.rb +4 -2
  138. data/spec/dummy/config/initializers/backtrace_silencers.rb +2 -0
  139. data/spec/dummy/config/initializers/doorkeeper.rb +7 -3
  140. data/spec/dummy/config/initializers/secret_token.rb +3 -1
  141. data/spec/dummy/config/initializers/session_store.rb +3 -1
  142. data/spec/dummy/config/initializers/wrap_parameters.rb +2 -0
  143. data/spec/dummy/config.ru +3 -1
  144. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +20 -13
  145. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +1 -1
  146. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +2 -0
  147. data/spec/dummy/db/schema.rb +1 -1
  148. data/spec/dummy/script/rails +7 -4
  149. data/spec/factories.rb +11 -9
  150. data/spec/generators/application_owner_generator_spec.rb +13 -26
  151. data/spec/generators/confidential_applications_generator_spec.rb +12 -28
  152. data/spec/generators/install_generator_spec.rb +19 -14
  153. data/spec/generators/migration_generator_spec.rb +13 -26
  154. data/spec/generators/pkce_generator_spec.rb +11 -26
  155. data/spec/generators/previous_refresh_token_generator_spec.rb +16 -29
  156. data/spec/generators/templates/routes.rb +2 -1
  157. data/spec/generators/views_generator_spec.rb +14 -12
  158. data/spec/grape/grape_integration_spec.rb +35 -33
  159. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +9 -7
  160. data/spec/lib/config_spec.rb +290 -104
  161. data/spec/lib/doorkeeper_spec.rb +8 -6
  162. data/spec/lib/models/expirable_spec.rb +22 -8
  163. data/spec/lib/models/reusable_spec.rb +40 -0
  164. data/spec/lib/models/revocable_spec.rb +8 -6
  165. data/spec/lib/models/scopes_spec.rb +27 -13
  166. data/spec/lib/models/secret_storable_spec.rb +135 -0
  167. data/spec/lib/oauth/authorization/uri_builder_spec.rb +17 -15
  168. data/spec/lib/oauth/authorization_code_request_spec.rb +43 -17
  169. data/spec/lib/oauth/base_request_spec.rb +24 -12
  170. data/spec/lib/oauth/base_response_spec.rb +3 -1
  171. data/spec/lib/oauth/client/credentials_spec.rb +26 -24
  172. data/spec/lib/oauth/client_credentials/creator_spec.rb +56 -10
  173. data/spec/lib/oauth/client_credentials/issuer_spec.rb +27 -20
  174. data/spec/lib/oauth/client_credentials/validation_spec.rb +21 -15
  175. data/spec/lib/oauth/client_credentials_integration_spec.rb +8 -6
  176. data/spec/lib/oauth/client_credentials_request_spec.rb +27 -21
  177. data/spec/lib/oauth/client_spec.rb +15 -13
  178. data/spec/lib/oauth/code_request_spec.rb +10 -8
  179. data/spec/lib/oauth/code_response_spec.rb +9 -7
  180. data/spec/lib/oauth/error_response_spec.rb +19 -11
  181. data/spec/lib/oauth/error_spec.rb +4 -2
  182. data/spec/lib/oauth/forbidden_token_response_spec.rb +7 -5
  183. data/spec/lib/oauth/helpers/scope_checker_spec.rb +68 -31
  184. data/spec/lib/oauth/helpers/unique_token_spec.rb +8 -6
  185. data/spec/lib/oauth/helpers/uri_checker_spec.rb +124 -93
  186. data/spec/lib/oauth/invalid_token_response_spec.rb +3 -1
  187. data/spec/lib/oauth/password_access_token_request_spec.rb +95 -34
  188. data/spec/lib/oauth/pre_authorization_spec.rb +80 -54
  189. data/spec/lib/oauth/refresh_token_request_spec.rb +46 -39
  190. data/spec/lib/oauth/scopes_spec.rb +63 -61
  191. data/spec/lib/oauth/token_request_spec.rb +80 -25
  192. data/spec/lib/oauth/token_response_spec.rb +40 -38
  193. data/spec/lib/oauth/token_spec.rb +64 -45
  194. data/spec/lib/request/strategy_spec.rb +3 -1
  195. data/spec/lib/secret_storing/base_spec.rb +60 -0
  196. data/spec/lib/secret_storing/bcrypt_spec.rb +49 -0
  197. data/spec/lib/secret_storing/plain_spec.rb +44 -0
  198. data/spec/lib/secret_storing/sha256_hash_spec.rb +48 -0
  199. data/spec/lib/server_spec.rb +20 -18
  200. data/spec/lib/{orm/active_record/stale_records_cleaner_spec.rb → stale_records_cleaner_spec.rb} +28 -18
  201. data/spec/models/doorkeeper/access_grant_spec.rb +80 -15
  202. data/spec/models/doorkeeper/access_token_spec.rb +212 -83
  203. data/spec/models/doorkeeper/application_spec.rb +146 -49
  204. data/spec/requests/applications/applications_request_spec.rb +100 -68
  205. data/spec/requests/applications/authorized_applications_spec.rb +20 -18
  206. data/spec/requests/endpoints/authorization_spec.rb +27 -25
  207. data/spec/requests/endpoints/token_spec.rb +38 -36
  208. data/spec/requests/flows/authorization_code_errors_spec.rb +27 -25
  209. data/spec/requests/flows/authorization_code_spec.rb +260 -158
  210. data/spec/requests/flows/client_credentials_spec.rb +54 -52
  211. data/spec/requests/flows/implicit_grant_errors_spec.rb +11 -9
  212. data/spec/requests/flows/implicit_grant_spec.rb +27 -25
  213. data/spec/requests/flows/password_spec.rb +64 -56
  214. data/spec/requests/flows/refresh_token_spec.rb +91 -32
  215. data/spec/requests/flows/revoke_token_spec.rb +49 -63
  216. data/spec/requests/flows/skip_authorization_spec.rb +23 -21
  217. data/spec/requests/protected_resources/metal_spec.rb +7 -5
  218. data/spec/requests/protected_resources/private_api_spec.rb +37 -35
  219. data/spec/routing/custom_controller_routes_spec.rb +71 -65
  220. data/spec/routing/default_routes_spec.rb +22 -20
  221. data/spec/routing/scoped_routes_spec.rb +20 -18
  222. data/spec/spec_helper.rb +15 -13
  223. data/spec/spec_helper_integration.rb +3 -1
  224. data/spec/support/dependencies/factory_bot.rb +3 -1
  225. data/spec/support/doorkeeper_rspec.rb +5 -2
  226. data/spec/support/helpers/access_token_request_helper.rb +3 -1
  227. data/spec/support/helpers/authorization_request_helper.rb +4 -2
  228. data/spec/support/helpers/config_helper.rb +2 -0
  229. data/spec/support/helpers/model_helper.rb +11 -5
  230. data/spec/support/helpers/request_spec_helper.rb +5 -3
  231. data/spec/support/helpers/url_helper.rb +20 -18
  232. data/spec/support/http_method_shim.rb +4 -9
  233. data/spec/support/orm/active_record.rb +3 -1
  234. data/spec/support/shared/controllers_shared_context.rb +68 -10
  235. data/spec/support/shared/hashing_shared_context.rb +36 -0
  236. data/spec/support/shared/models_shared_examples.rb +12 -10
  237. data/spec/validators/redirect_uri_validator_spec.rb +76 -47
  238. data/spec/version/version_spec.rb +7 -5
  239. metadata +70 -21
  240. data/gemfiles/rails_4_2.gemfile +0 -13
  241. data/spec/dummy/config/initializers/new_framework_defaults.rb +0 -10
@@ -1,76 +1,86 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
3
+ require "spec_helper"
4
4
 
5
- describe Doorkeeper::Orm::ActiveRecord::StaleRecordsCleaner do
5
+ describe Doorkeeper::StaleRecordsCleaner do
6
6
  let(:cleaner) { described_class.new(model) }
7
7
  let(:models_by_name) do
8
8
  {
9
9
  access_token: Doorkeeper::AccessToken,
10
- access_grant: Doorkeeper::AccessGrant
10
+ access_grant: Doorkeeper::AccessGrant,
11
11
  }
12
12
  end
13
13
 
14
+ context "when ORM has no cleaner class" do
15
+ it "raises an error" do
16
+ allow_any_instance_of(Doorkeeper::Config).to receive(:orm).and_return("hibernate")
17
+
18
+ expect do
19
+ described_class.for(Doorkeeper::AccessToken)
20
+ end.to raise_error(Doorkeeper::Errors::NoOrmCleaner, /has no cleaner/)
21
+ end
22
+ end
23
+
14
24
  %i[access_token access_grant].each do |model_name|
15
25
  context "(#{model_name})" do
16
26
  let(:model) { models_by_name.fetch(model_name) }
17
27
 
18
- describe '#clean_revoked' do
28
+ describe "#clean_revoked" do
19
29
  subject { cleaner.clean_revoked }
20
30
 
21
- context 'with revoked record' do
31
+ context "with revoked record" do
22
32
  before do
23
33
  FactoryBot.create model_name, revoked_at: Time.current - 1.minute
24
34
  end
25
35
 
26
- it 'removes the record' do
36
+ it "removes the record" do
27
37
  expect { subject }.to change { model.count }.to(0)
28
38
  end
29
39
  end
30
40
 
31
- context 'with record revoked in the future' do
41
+ context "with record revoked in the future" do
32
42
  before do
33
43
  FactoryBot.create model_name, revoked_at: Time.current + 1.minute
34
44
  end
35
45
 
36
- it 'keeps the record' do
37
- expect { subject }.not_to change { model.count }
46
+ it "keeps the record" do
47
+ expect { subject }.not_to(change { model.count })
38
48
  end
39
49
  end
40
50
 
41
- context 'with unrevoked record' do
51
+ context "with unrevoked record" do
42
52
  before do
43
53
  FactoryBot.create model_name, revoked_at: nil
44
54
  end
45
55
 
46
- it 'keeps the record' do
47
- expect { subject }.not_to change { model.count }
56
+ it "keeps the record" do
57
+ expect { subject }.not_to(change { model.count })
48
58
  end
49
59
  end
50
60
  end
51
61
 
52
- describe '#clean_expired' do
62
+ describe "#clean_expired" do
53
63
  subject { cleaner.clean_expired(ttl) }
54
64
  let(:ttl) { 500 }
55
65
  let(:expiry_border) { ttl.seconds.ago }
56
66
 
57
- context 'with record that is expired' do
67
+ context "with record that is expired" do
58
68
  before do
59
69
  FactoryBot.create model_name, created_at: expiry_border - 1.minute
60
70
  end
61
71
 
62
- it 'removes the record' do
72
+ it "removes the record" do
63
73
  expect { subject }.to change { model.count }.to(0)
64
74
  end
65
75
  end
66
76
 
67
- context 'with record that is not expired' do
77
+ context "with record that is not expired" do
68
78
  before do
69
79
  FactoryBot.create model_name, created_at: expiry_border + 1.minute
70
80
  end
71
81
 
72
- it 'keeps the record' do
73
- expect { subject }.not_to change { model.count }
82
+ it "keeps the record" do
83
+ expect { subject }.not_to(change { model.count })
74
84
  end
75
85
  end
76
86
  end
@@ -1,50 +1,115 @@
1
- require 'spec_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
2
4
 
3
5
  describe Doorkeeper::AccessGrant do
4
- subject { FactoryBot.build(:access_grant) }
6
+ let(:client) { FactoryBot.build_stubbed(:application) }
7
+ let(:clazz) { Doorkeeper::AccessGrant }
8
+
9
+ subject { FactoryBot.build(:access_grant, application: client) }
5
10
 
6
11
  it { expect(subject).to be_valid }
7
12
 
8
- it_behaves_like 'an accessible token'
9
- it_behaves_like 'a revocable token'
10
- it_behaves_like 'a unique token' do
13
+ it_behaves_like "an accessible token"
14
+ it_behaves_like "a revocable token"
15
+ it_behaves_like "a unique token" do
11
16
  let(:factory_name) { :access_grant }
12
17
  end
13
18
 
14
- describe 'validations' do
15
- it 'is invalid without resource_owner_id' do
19
+ context "with hashing enabled" do
20
+ let(:grant) { FactoryBot.create :access_grant }
21
+ include_context "with token hashing enabled"
22
+
23
+ it "holds a volatile plaintext token when created" do
24
+ expect(grant.plaintext_token).to be_a(String)
25
+ expect(grant.token)
26
+ .to eq(hashed_or_plain_token_func.call(grant.plaintext_token))
27
+
28
+ # Finder method only finds the hashed token
29
+ loaded = clazz.find_by(token: grant.token)
30
+ expect(loaded).to eq(grant)
31
+ expect(loaded.plaintext_token).to be_nil
32
+ expect(loaded.token).to eq(grant.token)
33
+ end
34
+
35
+ it "does not find_by plain text tokens" do
36
+ expect(clazz.find_by(token: grant.plaintext_token)).to be_nil
37
+ end
38
+
39
+ describe "with having a plain text token" do
40
+ let(:plain_text_token) { "plain text token" }
41
+
42
+ before do
43
+ # Assume we have a plain text token from before activating the option
44
+ grant.update_column(:token, plain_text_token)
45
+ end
46
+
47
+ context "without fallback lookup" do
48
+ it "does not provide lookups with either through by_token" do
49
+ expect(clazz.by_token(plain_text_token)).to eq(nil)
50
+ expect(clazz.by_token(grant.token)).to eq(nil)
51
+
52
+ # And it does not touch the token
53
+ grant.reload
54
+ expect(grant.token).to eq(plain_text_token)
55
+ end
56
+ end
57
+
58
+ context "with fallback lookup" do
59
+ include_context "with token hashing and fallback lookup enabled"
60
+
61
+ it "upgrades a plain token when falling back to it" do
62
+ # Side-effect: This will automatically upgrade the token
63
+ expect(clazz).to receive(:upgrade_fallback_value).and_call_original
64
+ expect(clazz.by_token(plain_text_token)).to eq(grant)
65
+
66
+ # Will find subsequently by hashing the token
67
+ expect(clazz.by_token(plain_text_token)).to eq(grant)
68
+
69
+ # And it modifies the token value
70
+ grant.reload
71
+ expect(grant.token).not_to eq(plain_text_token)
72
+ expect(clazz.find_by(token: plain_text_token)).to eq(nil)
73
+ expect(clazz.find_by(token: grant.token)).not_to be_nil
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ describe "validations" do
80
+ it "is invalid without resource_owner_id" do
16
81
  subject.resource_owner_id = nil
17
82
  expect(subject).not_to be_valid
18
83
  end
19
84
 
20
- it 'is invalid without application_id' do
85
+ it "is invalid without application_id" do
21
86
  subject.application_id = nil
22
87
  expect(subject).not_to be_valid
23
88
  end
24
89
 
25
- it 'is invalid without token' do
90
+ it "is invalid without token" do
26
91
  subject.save
27
92
  subject.token = nil
28
93
  expect(subject).not_to be_valid
29
94
  end
30
95
 
31
- it 'is invalid without expires_in' do
96
+ it "is invalid without expires_in" do
32
97
  subject.expires_in = nil
33
98
  expect(subject).not_to be_valid
34
99
  end
35
100
  end
36
101
 
37
- describe '.revoke_all_for' do
102
+ describe ".revoke_all_for" do
38
103
  let(:resource_owner) { double(id: 100) }
39
104
  let(:application) { FactoryBot.create :application }
40
105
  let(:default_attributes) do
41
106
  {
42
107
  application: application,
43
- resource_owner_id: resource_owner.id
108
+ resource_owner_id: resource_owner.id,
44
109
  }
45
110
  end
46
111
 
47
- it 'revokes all tokens for given application and resource owner' do
112
+ it "revokes all tokens for given application and resource owner" do
48
113
  FactoryBot.create :access_grant, default_attributes
49
114
 
50
115
  described_class.revoke_all_for(application.id, resource_owner)
@@ -54,7 +119,7 @@ describe Doorkeeper::AccessGrant do
54
119
  end
55
120
  end
56
121
 
57
- it 'matches application' do
122
+ it "matches application" do
58
123
  access_grant_for_different_app = FactoryBot.create(
59
124
  :access_grant,
60
125
  default_attributes.merge(application: FactoryBot.create(:application))
@@ -65,7 +130,7 @@ describe Doorkeeper::AccessGrant do
65
130
  expect(access_grant_for_different_app.reload).not_to be_revoked
66
131
  end
67
132
 
68
- it 'matches resource owner' do
133
+ it "matches resource owner" do
69
134
  access_grant_for_different_owner = FactoryBot.create(
70
135
  :access_grant,
71
136
  default_attributes.merge(resource_owner_id: 90)