doorkeeper-mongodb 5.3.0 → 5.5.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 (192) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/Rakefile +18 -4
  4. data/lib/doorkeeper/orm/mongoid9/access_grant.rb +26 -0
  5. data/lib/doorkeeper/orm/mongoid9/access_token.rb +38 -0
  6. data/lib/doorkeeper/orm/mongoid9/application.rb +43 -0
  7. data/lib/doorkeeper/orm/mongoid9/stale_records_cleaner.rb +11 -0
  8. data/lib/doorkeeper/orm/mongoid9.rb +50 -0
  9. data/lib/doorkeeper-mongodb/mixins/mongoid/access_grant_mixin.rb +6 -2
  10. data/lib/doorkeeper-mongodb/mixins/mongoid/access_token_mixin.rb +46 -6
  11. data/lib/doorkeeper-mongodb/mixins/mongoid/application_mixin.rb +2 -2
  12. data/lib/doorkeeper-mongodb/version.rb +1 -1
  13. data/lib/doorkeeper-mongodb.rb +1 -0
  14. data/spec/dummy/app/assets/config/manifest.js +0 -0
  15. data/spec/dummy/app/controllers/application_controller.rb +0 -0
  16. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -0
  17. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -0
  18. data/spec/dummy/app/controllers/home_controller.rb +0 -0
  19. data/spec/dummy/app/controllers/metal_controller.rb +0 -0
  20. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -0
  21. data/spec/dummy/app/helpers/application_helper.rb +0 -0
  22. data/spec/dummy/app/views/home/index.html.erb +0 -0
  23. data/spec/dummy/app/views/layouts/application.html.erb +0 -0
  24. data/spec/dummy/config/application.rb +0 -0
  25. data/spec/dummy/config/boot.rb +0 -0
  26. data/spec/dummy/config/database.yml +0 -0
  27. data/spec/dummy/config/environment.rb +0 -0
  28. data/spec/dummy/config/environments/development.rb +0 -0
  29. data/spec/dummy/config/environments/production.rb +0 -0
  30. data/spec/dummy/config/environments/test.rb +0 -0
  31. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -0
  32. data/spec/dummy/config/initializers/doorkeeper.rb +7 -2
  33. data/spec/dummy/config/initializers/secret_token.rb +0 -0
  34. data/spec/dummy/config/initializers/session_store.rb +0 -0
  35. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -0
  36. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -0
  37. data/spec/dummy/config/mongoid8.yml +19 -0
  38. data/spec/dummy/config/mongoid9.yml +19 -0
  39. data/spec/dummy/config/routes.rb +0 -0
  40. data/spec/dummy/config.ru +1 -1
  41. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -0
  42. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -0
  43. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -0
  44. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -0
  45. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -0
  46. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +0 -0
  47. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +0 -0
  48. data/spec/dummy/db/migrate/20230205064514_add_custom_attributes.rb +8 -0
  49. data/spec/dummy/db/schema.rb +3 -1
  50. data/spec/dummy/log/test.log +39440 -0
  51. data/spec/dummy/public/404.html +0 -0
  52. data/spec/dummy/public/422.html +0 -0
  53. data/spec/dummy/public/500.html +0 -0
  54. data/spec/dummy/public/favicon.ico +0 -0
  55. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/2L/2LdlR-88TqZc8vSU7Z58xiNpCGRZj0CIlOxSN4Vx2i4.cache +1 -0
  56. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{Pn/PnXU_mkG2fLZFm9BwiZ03BZdBTjKuInP-cRXjHS7yJo.cache → 2r/2r0L9eNOmETsg4Tm1IgBdw3J4ahcko41NpILRXu19_A.cache} +0 -0
  57. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/5y/5ywocFQgpSY36nyF_xDKPExhDRo-eqeiqfDvQee1K9k.cache +2 -0
  58. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{Qs/QsVgO6vM5Yn9oeYTYlrqtyVnK6sdVDWDa083N7zpfHw.cache → 8r/8rW0CpDDUJZ7xvg86t6jZ6WmyvaVZ0uTPEPRjghFIKo.cache} +0 -0
  59. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{PA/PAH_jI20wRw12tngeJ-V619c30avNLDu5U9Z-9Pc5SQ.cache → Cs/CsfBL8Dls9-jhjFsNYt4DZxu5LWChDMB-xXKjsEFSsU.cache} +0 -0
  60. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{8D/8DJG7JfPvShfLLyeSom6NZ_TcQc6QH27tJ7prEWZPfI.cache → Cv/Cv9WXE_0OqtPUZBXfTWaE8uKx9oFIzqO18ZkwVaBLSg.cache} +0 -0
  61. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Mf/MfB2-0nbsmC548XBSLftafi6BZ9nAquBA-6eu7mAmdE.cache +2 -0
  62. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/N2/N2cUP-Um_nQ5ZTCQr_H0bKIjOSIyV7Ry5sT6-DB9e4A.cache +1 -0
  63. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{FJ/FJlQpfMtpRbrM5P8A7d2FAelFKwo6GrVs2xks8z5GKU.cache → Ot/OtNAnT3d-csAKBtJ8UBLOSwUDyfmOdCWpS08RaSCGsQ.cache} +0 -0
  64. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/P3/P33RwiTMGEu2wZySBEUmf5U7hnfBhdL49wzdUWXYNRs.cache +1 -0
  65. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/RZ/RZAL9gIt4aD731Ikf7UZZNPSZXzhPqtDskLB7nQcWH4.cache +1 -0
  66. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/SQ/SQVJeYO2bM0qgQiOaeVBjYo3SWQZmvixa3tXUjsmuUs.cache +0 -0
  67. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{Ma/MaK3K1AoZZ4xM5fOOifhROd73hfZJpP4yGbkGdoYtEk.cache → V2/V2JApVhUSYhvWnNVIbpe58U4xheVkpi0gCStqjDN6-A.cache} +0 -0
  68. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{Lk/LklIq5hrBAPESXVUpFMwQ9L-1qTj90sPVi6U19_Xi-Q.cache → VA/VADOUaZFukufOb44ts4KoyQZumPcVJET0bi9RvC7c-o.cache} +1 -1
  69. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Vz/VzdPLfWn16XbpHNJdkDMamAf3QutM29cvvPkDNyy5nE.cache +1 -0
  70. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/W9/W9QfraySVwoRt-SgGOIS0e-iP8R1qP_URwXZw1l6M5E.cache +0 -0
  71. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Wy/Wyiw07ngOzgV6RPis_Lo2hhSRkwo2YSqKTEDAF0crhA.cache +0 -0
  72. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Z6/Z6rAtdVt3OXS26vLVCtdO3vmMlttI3ajdpbC2FHk7iQ.cache +0 -0
  73. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/b6/b6QRH6ZdCc0e6bUWu4qni_kZmptaMgWciO8Jl9q6_p8.cache +0 -0
  74. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{Pm/PmheG0PGFqDws1qgFOxOyIL-gpMof3Ar9eSRKVLYuik.cache → fP/fPihom3hnc1rQQxpviTvZPRJB_IghWYWP3dDcsGrcLk.cache} +0 -0
  75. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/gD/gDU38plXvosMgFK47_PBI9xGVsmsE2tShWEZzxiek3k.cache +1 -0
  76. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/gR/gRqL5_jaFW7eA3d2frJmOzw_vFLuvfhwMhotAlsO8J4.cache +2 -0
  77. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/jC/jCTZ1jAldKBn4OTANBBmCKzxLrDgok1ur4meoTqlDNg.cache +0 -0
  78. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{yN/yNOFGOsnHmxXNMkuEAWuL1u3jlmdvrdeoTx6DDJ1in8.cache → jc/jcB8w1gBT7JP10DW4OOvvYpW1ZFeMyedngmMy3QbRLQ.cache} +0 -0
  79. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/jg/jgxXkkkXf1NPOPrpNdEJzhDt-2xHGzd_-mLkIHWrOr4.cache +2 -0
  80. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/nx/nxzZnvk5YyBhTUloQSZZ5zRuaqlsLiHy_AbOzQ3d788.cache +0 -0
  81. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/wr/wrlf8nUW2yftpcIA97qImyECR8f8o3OiOdHLdfkmw8c.cache +1 -0
  82. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/{qT/qTQIQsmS0Wbbg2JxNn9rxdI5qVOTg5SfyQdaTvr9vLo.cache → xd/xdD4KJ55W3jy5PIrwT0UnDp1toKpUfgrjJBgB4WaPIc.cache} +0 -0
  83. data/spec/support/doorkeeper_rspec.rb +0 -0
  84. data/spec/support/orm/mongoid.rb +18 -2
  85. data/spec/support/orm/mongoid8.rb +6 -0
  86. data/spec/support/orm/mongoid9.rb +6 -0
  87. data/spec/support/render_with_matcher.rb +26 -0
  88. metadata +126 -241
  89. data/spec/controllers/application_metal_controller_spec.rb +0 -64
  90. data/spec/controllers/applications_controller_spec.rb +0 -270
  91. data/spec/controllers/authorizations_controller_spec.rb +0 -744
  92. data/spec/controllers/protected_resources_controller_spec.rb +0 -361
  93. data/spec/controllers/token_info_controller_spec.rb +0 -50
  94. data/spec/controllers/tokens_controller_spec.rb +0 -542
  95. data/spec/doorkeeper/redirect_uri_validator_spec.rb +0 -183
  96. data/spec/doorkeeper/server_spec.rb +0 -50
  97. data/spec/doorkeeper/stale_records_cleaner_spec.rb +0 -103
  98. data/spec/doorkeeper/version_spec.rb +0 -17
  99. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/-o/-ofn45zIfO5vx4VD6m6NXesLf6da5usA-Sbw2SVju3o.cache +0 -2
  100. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/0_/0_ouGcG_o_1zmVmBe-tdQYk594LBwVa1bumjrKtdfEw.cache +0 -0
  101. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/2X/2XMMcHbyTSRqh1GkV0xzyIETNtt-zgN6iniziShaKmQ.cache +0 -2
  102. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/4Q/4QQw-pMQ98JIj3xdcFhGBQdysdGPY9rWffRqWMmyjew.cache +0 -1
  103. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/7H/7HjRsym0tTpXFCVhWt6kteMs_-CozKVbr9s5syHm8es.cache +0 -1
  104. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/8B/8BxJyv22HPFHu1se_l2J8qW1N9NzZ16UOWOy1YMSgs4.cache +0 -1
  105. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/9x/9xjtGv-yKjj62x9uFwBZg8pTSh9ERPAgANwNo9uwIaA.cache +0 -1
  106. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Bt/BtXO7f0PZ8DNt3TMLYM-zY7LkbWa_KgyB0v1V98M1CQ.cache +0 -1
  107. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/E0/E02f1Q2tutWumMulGCFNfqQNjvEP_hMAK_5E83eWepI.cache +0 -0
  108. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/EZ/EZGpd6pUEJZxO6uT2yIS4Fpn5KX7VDgC9VB3AaemF5Q.cache +0 -2
  109. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/L8/L8mOWakJlWKr6MU85rj0V7yGFfNyIR6vE6YXtqArPGw.cache +0 -1
  110. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/MB/MBWRxa9S470ee8suxVKp0jYgv6K6FQOqKGV0kPGQNMs.cache +0 -1
  111. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Ph/Ph7RtH_NvG2I8XpTa8mA8SBQXZDzBPVIh4CH6g7OXJ0.cache +0 -2
  112. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/So/So59ksdx2dw-_A3-zFZ6Palr7fROjm7_0JDZb04temw.cache +0 -0
  113. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/Wt/WtXL_iDofLeTH_v0Yf3PM421r9b1V0g-VBvMPeu9KA0.cache +0 -0
  114. data/spec/dummy/tmp/cache/assets/sprockets/v4.0.0/dX/dX6FDdUIy8yBCOoaoXcjf71rX9N_bpiXGJ4Urt32NTk.cache +0 -0
  115. data/spec/factories.rb +0 -30
  116. data/spec/grape/grape_integration_spec.rb +0 -137
  117. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -26
  118. data/spec/lib/config_spec.rb +0 -824
  119. data/spec/lib/doorkeeper_spec.rb +0 -27
  120. data/spec/lib/models/expirable_spec.rb +0 -61
  121. data/spec/lib/models/reusable_spec.rb +0 -40
  122. data/spec/lib/models/revocable_spec.rb +0 -55
  123. data/spec/lib/models/scopes_spec.rb +0 -61
  124. data/spec/lib/models/secret_storable_spec.rb +0 -136
  125. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -35
  126. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -180
  127. data/spec/lib/oauth/base_request_spec.rb +0 -210
  128. data/spec/lib/oauth/base_response_spec.rb +0 -45
  129. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  130. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -135
  131. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -110
  132. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -92
  133. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  134. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -105
  135. data/spec/lib/oauth/client_spec.rb +0 -38
  136. data/spec/lib/oauth/code_request_spec.rb +0 -46
  137. data/spec/lib/oauth/code_response_spec.rb +0 -36
  138. data/spec/lib/oauth/error_response_spec.rb +0 -65
  139. data/spec/lib/oauth/error_spec.rb +0 -21
  140. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -20
  141. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -110
  142. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -21
  143. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -262
  144. data/spec/lib/oauth/invalid_request_response_spec.rb +0 -73
  145. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -53
  146. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -202
  147. data/spec/lib/oauth/pre_authorization_spec.rb +0 -230
  148. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -166
  149. data/spec/lib/oauth/scopes_spec.rb +0 -146
  150. data/spec/lib/oauth/token_request_spec.rb +0 -164
  151. data/spec/lib/oauth/token_response_spec.rb +0 -84
  152. data/spec/lib/oauth/token_spec.rb +0 -156
  153. data/spec/lib/option_spec.rb +0 -51
  154. data/spec/lib/request/strategy_spec.rb +0 -51
  155. data/spec/lib/secret_storing/base_spec.rb +0 -61
  156. data/spec/lib/secret_storing/bcrypt_spec.rb +0 -50
  157. data/spec/lib/secret_storing/plain_spec.rb +0 -45
  158. data/spec/lib/secret_storing/sha256_hash_spec.rb +0 -49
  159. data/spec/models/doorkeeper/access_grant_spec.rb +0 -173
  160. data/spec/models/doorkeeper/access_token_spec.rb +0 -644
  161. data/spec/models/doorkeeper/application_spec.rb +0 -499
  162. data/spec/requests/applications/applications_request_spec.rb +0 -257
  163. data/spec/requests/applications/authorized_applications_spec.rb +0 -32
  164. data/spec/requests/endpoints/authorization_spec.rb +0 -91
  165. data/spec/requests/endpoints/token_spec.rb +0 -85
  166. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -86
  167. data/spec/requests/flows/authorization_code_spec.rb +0 -559
  168. data/spec/requests/flows/client_credentials_spec.rb +0 -219
  169. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -46
  170. data/spec/requests/flows/implicit_grant_spec.rb +0 -91
  171. data/spec/requests/flows/password_spec.rb +0 -356
  172. data/spec/requests/flows/refresh_token_spec.rb +0 -255
  173. data/spec/requests/flows/revoke_token_spec.rb +0 -196
  174. data/spec/requests/flows/skip_authorization_spec.rb +0 -66
  175. data/spec/requests/protected_resources/metal_spec.rb +0 -16
  176. data/spec/requests/protected_resources/private_api_spec.rb +0 -83
  177. data/spec/routing/custom_controller_routes_spec.rb +0 -133
  178. data/spec/routing/default_routes_spec.rb +0 -41
  179. data/spec/routing/scoped_routes_spec.rb +0 -47
  180. data/spec/spec_helper.rb +0 -54
  181. data/spec/spec_helper_integration.rb +0 -4
  182. data/spec/support/dependencies/factory_bot.rb +0 -4
  183. data/spec/support/helpers/access_token_request_helper.rb +0 -14
  184. data/spec/support/helpers/authorization_request_helper.rb +0 -43
  185. data/spec/support/helpers/config_helper.rb +0 -11
  186. data/spec/support/helpers/model_helper.rb +0 -78
  187. data/spec/support/helpers/request_spec_helper.rb +0 -98
  188. data/spec/support/helpers/url_helper.rb +0 -62
  189. data/spec/support/orm/active_record.rb +0 -5
  190. data/spec/support/shared/controllers_shared_context.rb +0 -100
  191. data/spec/support/shared/hashing_shared_context.rb +0 -40
  192. data/spec/support/shared/models_shared_examples.rb +0 -56
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module AuthorizationRequestHelper
4
- def resource_owner_is_authenticated(resource_owner = nil)
5
- resource_owner ||= User.create!(name: "Joe", password: "sekret")
6
- Doorkeeper.config.instance_variable_set(:@authenticate_resource_owner, proc { resource_owner })
7
- end
8
-
9
- def resource_owner_is_not_authenticated
10
- Doorkeeper.config.instance_variable_set(:@authenticate_resource_owner, proc { redirect_to("/sign_in") })
11
- end
12
-
13
- def default_scopes_exist(*scopes)
14
- Doorkeeper.config.instance_variable_set(:@default_scopes, Doorkeeper::OAuth::Scopes.from_array(scopes))
15
- end
16
-
17
- def optional_scopes_exist(*scopes)
18
- Doorkeeper.config.instance_variable_set(:@optional_scopes, Doorkeeper::OAuth::Scopes.from_array(scopes))
19
- end
20
-
21
- def client_should_be_authorized(client)
22
- expect(client.access_grants.size).to eq(1)
23
- end
24
-
25
- def client_should_not_be_authorized(client)
26
- expect(client.size).to eq(0)
27
- end
28
-
29
- def i_should_be_on_client_callback(client)
30
- expect(client.redirect_uri).to eq("#{current_uri.scheme}://#{current_uri.host}#{current_uri.path}")
31
- end
32
-
33
- def allowing_forgery_protection(&_block)
34
- original_value = ActionController::Base.allow_forgery_protection
35
- ActionController::Base.allow_forgery_protection = true
36
-
37
- yield
38
- ensure
39
- ActionController::Base.allow_forgery_protection = original_value
40
- end
41
- end
42
-
43
- RSpec.configuration.send :include, AuthorizationRequestHelper
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ConfigHelper
4
- def config_is_set(setting, value = nil, &block)
5
- setting_ivar = "@#{setting}"
6
- value = block_given? ? block : value
7
- Doorkeeper.config.instance_variable_set(setting_ivar, value)
8
- end
9
- end
10
-
11
- RSpec.configuration.send :include, ConfigHelper
@@ -1,78 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module ModelHelper
4
- def client_exists(client_attributes = {})
5
- @client = FactoryBot.create(:application, client_attributes)
6
- end
7
-
8
- def create_resource_owner
9
- @resource_owner = User.create!(name: "Joe", password: "sekret")
10
- end
11
-
12
- def authorization_code_exists(options = {})
13
- @authorization = FactoryBot.create(:access_grant, options)
14
- end
15
-
16
- def access_token_exists(options = {})
17
- @access_token = FactoryBot.create(:access_token, options)
18
- end
19
-
20
- def access_grant_should_exist_for(client, resource_owner)
21
- grant = Doorkeeper::AccessGrant.first
22
-
23
- expect(grant.application).to have_attributes(id: client.id)
24
- .and(be_instance_of(Doorkeeper::Application))
25
-
26
- expect(grant.resource_owner_id).to eq(resource_owner.id)
27
- end
28
-
29
- def access_token_should_exist_for(client, resource_owner)
30
- token = Doorkeeper::AccessToken.first
31
-
32
- expect(token.application).to have_attributes(id: client.id)
33
- .and(be_instance_of(Doorkeeper::Application))
34
-
35
- expect(token.resource_owner_id).to eq(resource_owner.id)
36
- end
37
-
38
- def access_grant_should_not_exist
39
- expect(Doorkeeper::AccessGrant.all).to be_empty
40
- end
41
-
42
- def access_token_should_not_exist
43
- expect(Doorkeeper::AccessToken.all).to be_empty
44
- end
45
-
46
- def access_grant_should_have_scopes(*args)
47
- grant = Doorkeeper::AccessGrant.first
48
- expect(grant.scopes).to eq(Doorkeeper::OAuth::Scopes.from_array(args))
49
- end
50
-
51
- def access_token_should_have_scopes(*args)
52
- grant = Doorkeeper::AccessToken.last
53
- expect(grant.scopes).to eq(Doorkeeper::OAuth::Scopes.from_array(args))
54
- end
55
-
56
- def uniqueness_error
57
- case DOORKEEPER_ORM
58
- when :active_record
59
- ActiveRecord::RecordNotUnique
60
- when :sequel
61
- error_classes = [Sequel::UniqueConstraintViolation, Sequel::ValidationFailed]
62
- proc { |error| expect(error.class).to be_in(error_classes) }
63
- when :mongo_mapper
64
- error_classes = [MongoMapper::DocumentNotValid, Mongo::OperationFailure]
65
- proc { |error| expect(error.class).to be_in(error_classes) }
66
- when /mongoid/
67
- error_classes = [Mongoid::Errors::Validations]
68
- error_classes << Moped::Errors::OperationFailure if defined?(::Moped) # Mongoid 4
69
- error_classes << Mongo::Error::OperationFailure if defined?(::Mongo) # Mongoid 5
70
-
71
- proc { |error| expect(error.class).to be_in(error_classes) }
72
- else
73
- raise "'#{DOORKEEPER_ORM}' ORM is not supported!"
74
- end
75
- end
76
- end
77
-
78
- RSpec.configuration.send :include, ModelHelper
@@ -1,98 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RequestSpecHelper
4
- def i_am_logged_in
5
- allow(Doorkeeper.configuration).to receive(:authenticate_admin).and_return(->(*) {})
6
- end
7
-
8
- def i_should_see(content)
9
- expect(page).to have_content(content)
10
- end
11
-
12
- def i_should_not_see(content)
13
- expect(page).to have_no_content(content)
14
- end
15
-
16
- def i_should_be_on(path)
17
- expect(page).to have_current_path(path, ignore_query: true)
18
- end
19
-
20
- def url_should_have_param(param, value)
21
- expect(current_params[param]).to eq(value)
22
- end
23
-
24
- def url_should_not_have_param(param)
25
- expect(current_params).not_to have_key(param)
26
- end
27
-
28
- def current_params
29
- Rack::Utils.parse_query(current_uri.query)
30
- end
31
-
32
- def current_uri
33
- URI.parse(page.current_url)
34
- end
35
-
36
- def request_response
37
- respond_to?(:response) ? response : page.driver.response
38
- end
39
-
40
- def json_response
41
- JSON.parse(request_response.body)
42
- end
43
-
44
- def should_have_header(header, value)
45
- expect(headers[header]).to eq(value)
46
- end
47
-
48
- def should_have_status(status)
49
- expect(page.driver.response.status).to eq(status)
50
- end
51
-
52
- def with_access_token_header(token)
53
- with_header "Authorization", "Bearer #{token}"
54
- end
55
-
56
- def with_header(header, value)
57
- page.driver.header(header, value)
58
- end
59
-
60
- def basic_auth_header_for_client(client)
61
- ActionController::HttpAuthentication::Basic.encode_credentials client.uid, client.secret
62
- end
63
-
64
- def sign_in
65
- visit "/"
66
- click_on "Sign in"
67
- end
68
-
69
- def create_access_token(authorization_code, client, code_verifier = nil)
70
- page.driver.post token_endpoint_url(code: authorization_code, client: client, code_verifier: code_verifier)
71
- end
72
-
73
- def i_should_see_translated_error_message(key)
74
- i_should_see translated_error_message(key)
75
- end
76
-
77
- def i_should_not_see_translated_error_message(key)
78
- i_should_not_see translated_error_message(key)
79
- end
80
-
81
- def translated_error_message(key)
82
- I18n.translate(key, scope: %i[doorkeeper errors messages])
83
- end
84
-
85
- def i_should_see_translated_invalid_request_error_message(key, value)
86
- i_should_see translated_invalid_request_error_message(key, value)
87
- end
88
-
89
- def translated_invalid_request_error_message(key, value)
90
- I18n.translate key, scope: %i[doorkeeper errors messages invalid_request], value: value
91
- end
92
-
93
- def response_status_should_be(status)
94
- expect(request_response.status.to_i).to eq(status)
95
- end
96
- end
97
-
98
- RSpec.configuration.send :include, RequestSpecHelper
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module UrlHelper
4
- def token_endpoint_url(options = {})
5
- parameters = {
6
- code: options[:code],
7
- client_id: options[:client_id] || options[:client].try(:uid),
8
- client_secret: options[:client_secret] || options[:client].try(:secret),
9
- redirect_uri: options[:redirect_uri] || options[:client].try(:redirect_uri),
10
- grant_type: options[:grant_type] || "authorization_code",
11
- code_verifier: options[:code_verifier],
12
- code_challenge_method: options[:code_challenge_method],
13
- }.reject { |_, v| v.blank? }
14
- "/oauth/token?#{build_query(parameters)}"
15
- end
16
-
17
- def password_token_endpoint_url(options = {})
18
- parameters = {
19
- code: options[:code],
20
- client_id: options[:client_id] || options[:client].try(:uid),
21
- client_secret: options[:client_secret] || options[:client].try(:secret),
22
- username: options[:resource_owner_username] || options[:resource_owner].try(:name),
23
- password: options[:resource_owner_password] || options[:resource_owner].try(:password),
24
- scope: options[:scope],
25
- grant_type: "password",
26
- }.reject { |_, v| v.blank? }
27
- "/oauth/token?#{build_query(parameters)}"
28
- end
29
-
30
- def authorization_endpoint_url(options = {})
31
- parameters = {
32
- client_id: options[:client_id] || options[:client].try(:uid),
33
- redirect_uri: options[:redirect_uri] || options[:client].try(:redirect_uri),
34
- response_type: options[:response_type] || "code",
35
- scope: options[:scope],
36
- state: options[:state],
37
- code_challenge: options[:code_challenge],
38
- code_challenge_method: options[:code_challenge_method],
39
- }.reject { |_, v| v.blank? }
40
- "/oauth/authorize?#{build_query(parameters)}"
41
- end
42
-
43
- def refresh_token_endpoint_url(options = {})
44
- parameters = {
45
- refresh_token: options[:refresh_token],
46
- client_id: options[:client_id] || options[:client].try(:uid),
47
- client_secret: options[:client_secret] || options[:client].try(:secret),
48
- grant_type: options[:grant_type] || "refresh_token",
49
- }.reject { |_, v| v.blank? }
50
- "/oauth/token?#{build_query(parameters)}"
51
- end
52
-
53
- def revocation_token_endpoint_url
54
- "/oauth/revoke"
55
- end
56
-
57
- def build_query(hash)
58
- Rack::Utils.build_query(hash)
59
- end
60
- end
61
-
62
- RSpec.configuration.send :include, UrlHelper
@@ -1,5 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # load schema to in memory sqlite
4
- ActiveRecord::Migration.verbose = false
5
- load Rails.root + "db/schema.rb"
@@ -1,100 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- shared_context "valid token", token: :valid do
4
- let(:token_string) { "1A2B3C4D" }
5
-
6
- let :token do
7
- double(
8
- Doorkeeper::AccessToken,
9
- accessible?: true, includes_scope?: true, acceptable?: true,
10
- previous_refresh_token: "", revoke_previous_refresh_token!: true,
11
- )
12
- end
13
-
14
- before do
15
- allow(
16
- Doorkeeper::AccessToken,
17
- ).to receive(:by_token).with(token_string).and_return(token)
18
- end
19
- end
20
-
21
- shared_context "invalid token", token: :invalid do
22
- let(:token_string) { "1A2B3C4D" }
23
-
24
- let :token do
25
- double(
26
- Doorkeeper::AccessToken,
27
- accessible?: false, revoked?: false, expired?: false,
28
- includes_scope?: false, acceptable?: false,
29
- previous_refresh_token: "", revoke_previous_refresh_token!: true,
30
- )
31
- end
32
-
33
- before do
34
- allow(
35
- Doorkeeper::AccessToken,
36
- ).to receive(:by_token).with(token_string).and_return(token)
37
- end
38
- end
39
-
40
- shared_context "expired token", token: :expired do
41
- let :token_string do
42
- "1A2B3C4DEXP"
43
- end
44
-
45
- let :token do
46
- double(
47
- Doorkeeper::AccessToken,
48
- accessible?: false, revoked?: false, expired?: true,
49
- includes_scope?: false, acceptable?: false,
50
- previous_refresh_token: "", revoke_previous_refresh_token!: true,
51
- )
52
- end
53
-
54
- before do
55
- allow(
56
- Doorkeeper::AccessToken,
57
- ).to receive(:by_token).with(token_string).and_return(token)
58
- end
59
- end
60
-
61
- shared_context "revoked token", token: :revoked do
62
- let :token_string do
63
- "1A2B3C4DREV"
64
- end
65
-
66
- let :token do
67
- double(
68
- Doorkeeper::AccessToken,
69
- accessible?: false, revoked?: true, expired?: false,
70
- includes_scope?: false, acceptable?: false,
71
- previous_refresh_token: "", revoke_previous_refresh_token!: true,
72
- )
73
- end
74
-
75
- before do
76
- allow(
77
- Doorkeeper::AccessToken,
78
- ).to receive(:by_token).with(token_string).and_return(token)
79
- end
80
- end
81
-
82
- shared_context "forbidden token", token: :forbidden do
83
- let :token_string do
84
- "1A2B3C4DFORB"
85
- end
86
-
87
- let :token do
88
- double(
89
- Doorkeeper::AccessToken,
90
- accessible?: true, includes_scope?: true, acceptable?: false,
91
- previous_refresh_token: "", revoke_previous_refresh_token!: true,
92
- )
93
- end
94
-
95
- before do
96
- allow(
97
- Doorkeeper::AccessToken,
98
- ).to receive(:by_token).with(token_string).and_return(token)
99
- end
100
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- shared_context "with token hashing enabled" do
4
- let(:hashed_or_plain_token_func) do
5
- Doorkeeper::SecretStoring::Sha256Hash.method(:transform_secret)
6
- end
7
-
8
- before do
9
- Doorkeeper.configure do
10
- orm DOORKEEPER_ORM
11
- hash_token_secrets
12
- end
13
- end
14
- end
15
-
16
- shared_context "with token hashing and fallback lookup enabled" do
17
- let(:hashed_or_plain_token_func) do
18
- Doorkeeper::SecretStoring::Sha256Hash.method(:transform_secret)
19
- end
20
-
21
- before do
22
- Doorkeeper.configure do
23
- orm DOORKEEPER_ORM
24
- hash_token_secrets fallback: :plain
25
- end
26
- end
27
- end
28
-
29
- shared_context "with application hashing enabled" do
30
- let(:hashed_or_plain_token_func) do
31
- Doorkeeper::SecretStoring::Sha256Hash.method(:transform_secret)
32
- end
33
-
34
- before do
35
- Doorkeeper.configure do
36
- orm DOORKEEPER_ORM
37
- hash_application_secrets
38
- end
39
- end
40
- end
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- shared_examples "an accessible token" do
4
- describe "#accessible?" do
5
- it "is accessible if token is not expired" do
6
- allow(subject).to receive(:expired?).and_return(false)
7
- expect(subject).to be_accessible
8
- end
9
-
10
- it "is not accessible if token is expired" do
11
- allow(subject).to receive(:expired?).and_return(true)
12
- expect(subject).not_to be_accessible
13
- end
14
- end
15
- end
16
-
17
- shared_examples "a revocable token" do
18
- describe "#accessible?" do
19
- before { subject.save! }
20
-
21
- it "is accessible if token is not revoked" do
22
- expect(subject).to be_accessible
23
- end
24
-
25
- it "is not accessible if token is revoked" do
26
- subject.revoke
27
- expect(subject).not_to be_accessible
28
- end
29
- end
30
- end
31
-
32
- shared_examples "a unique token" do
33
- describe "#token" do
34
- let(:owner) { FactoryBot.create(:resource_owner) }
35
-
36
- it "is generated before validation" do
37
- expect { subject.valid? }.to change(subject, :token).from(nil)
38
- end
39
-
40
- it "is not valid if token exists" do
41
- token1 = FactoryBot.create factory_name, resource_owner_id: owner.id, resource_owner_type: owner.class.name
42
- token2 = FactoryBot.create factory_name, resource_owner_id: owner.id, resource_owner_type: owner.class.name
43
- token2.token = token1.token
44
- expect(token2).not_to be_valid
45
- end
46
-
47
- it "expects database to throw an error when tokens are the same" do
48
- token1 = FactoryBot.create factory_name, resource_owner_id: owner.id, resource_owner_type: owner.class.name
49
- token2 = FactoryBot.create factory_name, resource_owner_id: owner.id, resource_owner_type: owner.class.name
50
- token2.token = token1.token
51
- expect do
52
- token2.save!(validate: false)
53
- end.to raise_error(uniqueness_error)
54
- end
55
- end
56
- end