doorkeeper 5.0.3 → 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 (215) hide show
  1. checksums.yaml +4 -4
  2. data/.hound.yml +2 -1
  3. data/.rubocop.yml +37 -4
  4. data/.travis.yml +11 -21
  5. data/Appraisals +29 -7
  6. data/Dangerfile +5 -2
  7. data/Gemfile +19 -5
  8. data/NEWS.md +81 -21
  9. data/README.md +75 -485
  10. data/Rakefile +10 -8
  11. data/app/controllers/doorkeeper/application_controller.rb +1 -2
  12. data/app/controllers/doorkeeper/application_metal_controller.rb +2 -13
  13. data/app/controllers/doorkeeper/applications_controller.rb +20 -8
  14. data/app/controllers/doorkeeper/authorized_applications_controller.rb +1 -1
  15. data/app/controllers/doorkeeper/token_info_controller.rb +2 -2
  16. data/app/controllers/doorkeeper/tokens_controller.rb +11 -11
  17. data/app/helpers/doorkeeper/dashboard_helper.rb +1 -1
  18. data/app/validators/redirect_uri_validator.rb +5 -2
  19. data/app/views/doorkeeper/applications/_form.html.erb +6 -0
  20. data/app/views/doorkeeper/applications/show.html.erb +1 -1
  21. data/app/views/layouts/doorkeeper/admin.html.erb +5 -3
  22. data/bin/console +16 -0
  23. data/config/locales/en.yml +1 -0
  24. data/doorkeeper.gemspec +24 -21
  25. data/gemfiles/rails_5_0.gemfile +9 -4
  26. data/gemfiles/rails_5_1.gemfile +9 -4
  27. data/gemfiles/rails_5_2.gemfile +10 -5
  28. data/gemfiles/rails_6_0.gemfile +17 -0
  29. data/gemfiles/rails_master.gemfile +9 -9
  30. data/lib/doorkeeper/config/option.rb +64 -0
  31. data/lib/doorkeeper/config.rb +191 -75
  32. data/lib/doorkeeper/engine.rb +1 -1
  33. data/lib/doorkeeper/grape/authorization_decorator.rb +4 -4
  34. data/lib/doorkeeper/grape/helpers.rb +3 -3
  35. data/lib/doorkeeper/helpers/controller.rb +3 -2
  36. data/lib/doorkeeper/models/access_grant_mixin.rb +20 -3
  37. data/lib/doorkeeper/models/access_token_mixin.rb +63 -19
  38. data/lib/doorkeeper/models/application_mixin.rb +43 -1
  39. data/lib/doorkeeper/models/concerns/expirable.rb +4 -2
  40. data/lib/doorkeeper/models/concerns/ownership.rb +1 -6
  41. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  42. data/lib/doorkeeper/models/concerns/revocable.rb +2 -1
  43. data/lib/doorkeeper/models/concerns/scopes.rb +5 -1
  44. data/lib/doorkeeper/models/concerns/secret_storable.rb +108 -0
  45. data/lib/doorkeeper/oauth/authorization/code.rb +2 -2
  46. data/lib/doorkeeper/oauth/authorization/token.rb +12 -7
  47. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +1 -1
  48. data/lib/doorkeeper/oauth/authorization_code_request.rb +6 -4
  49. data/lib/doorkeeper/oauth/client.rb +1 -1
  50. data/lib/doorkeeper/oauth/client_credentials/validation.rb +5 -4
  51. data/lib/doorkeeper/oauth/client_credentials_request.rb +1 -1
  52. data/lib/doorkeeper/oauth/code_response.rb +2 -2
  53. data/lib/doorkeeper/oauth/error_response.rb +10 -6
  54. data/lib/doorkeeper/oauth/forbidden_token_response.rb +1 -1
  55. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +23 -8
  56. data/lib/doorkeeper/oauth/helpers/unique_token.rb +13 -1
  57. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +37 -1
  58. data/lib/doorkeeper/oauth/invalid_token_response.rb +5 -1
  59. data/lib/doorkeeper/oauth/password_access_token_request.rb +7 -2
  60. data/lib/doorkeeper/oauth/pre_authorization.rb +11 -5
  61. data/lib/doorkeeper/oauth/refresh_token_request.rb +5 -2
  62. data/lib/doorkeeper/oauth/scopes.rb +5 -3
  63. data/lib/doorkeeper/oauth/token.rb +2 -2
  64. data/lib/doorkeeper/oauth/token_introspection.rb +74 -8
  65. data/lib/doorkeeper/oauth/token_response.rb +9 -9
  66. data/lib/doorkeeper/oauth.rb +5 -5
  67. data/lib/doorkeeper/orm/active_record/access_grant.rb +27 -13
  68. data/lib/doorkeeper/orm/active_record/access_token.rb +6 -13
  69. data/lib/doorkeeper/orm/active_record/application.rb +21 -57
  70. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +10 -3
  71. data/lib/doorkeeper/orm/active_record.rb +6 -6
  72. data/lib/doorkeeper/rails/helpers.rb +1 -1
  73. data/lib/doorkeeper/rails/routes/mapping.rb +7 -7
  74. data/lib/doorkeeper/rails/routes.rb +11 -11
  75. data/lib/doorkeeper/rake/db.rake +13 -13
  76. data/lib/doorkeeper/rake.rb +1 -1
  77. data/lib/doorkeeper/request.rb +1 -1
  78. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  79. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  80. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  81. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  82. data/lib/doorkeeper/stale_records_cleaner.rb +1 -1
  83. data/lib/doorkeeper/version.rb +3 -3
  84. data/lib/doorkeeper.rb +69 -60
  85. data/lib/generators/doorkeeper/application_owner_generator.rb +10 -9
  86. data/lib/generators/doorkeeper/confidential_applications_generator.rb +10 -9
  87. data/lib/generators/doorkeeper/install_generator.rb +11 -9
  88. data/lib/generators/doorkeeper/migration_generator.rb +9 -9
  89. data/lib/generators/doorkeeper/pkce_generator.rb +10 -9
  90. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +10 -9
  91. data/lib/generators/doorkeeper/templates/initializer.rb +120 -13
  92. data/lib/generators/doorkeeper/templates/migration.rb.erb +15 -7
  93. data/lib/generators/doorkeeper/views_generator.rb +6 -4
  94. data/spec/controllers/application_metal_controller_spec.rb +24 -10
  95. data/spec/controllers/applications_controller_spec.rb +54 -52
  96. data/spec/controllers/authorizations_controller_spec.rb +139 -145
  97. data/spec/controllers/protected_resources_controller_spec.rb +78 -76
  98. data/spec/controllers/token_info_controller_spec.rb +14 -12
  99. data/spec/controllers/tokens_controller_spec.rb +167 -108
  100. data/spec/dummy/Rakefile +3 -1
  101. data/spec/dummy/app/controllers/application_controller.rb +3 -1
  102. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +2 -0
  103. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +4 -2
  104. data/spec/dummy/app/controllers/home_controller.rb +5 -3
  105. data/spec/dummy/app/controllers/metal_controller.rb +2 -0
  106. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +4 -2
  107. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  108. data/spec/dummy/app/models/user.rb +2 -0
  109. data/spec/dummy/config/application.rb +25 -1
  110. data/spec/dummy/config/environments/development.rb +2 -0
  111. data/spec/dummy/config/environments/production.rb +2 -0
  112. data/spec/dummy/config/environments/test.rb +3 -1
  113. data/spec/dummy/config/initializers/backtrace_silencers.rb +2 -0
  114. data/spec/dummy/config/initializers/doorkeeper.rb +5 -2
  115. data/spec/dummy/config/initializers/secret_token.rb +3 -1
  116. data/spec/dummy/config/initializers/session_store.rb +3 -1
  117. data/spec/dummy/config/initializers/wrap_parameters.rb +2 -0
  118. data/spec/dummy/config.ru +3 -1
  119. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +17 -10
  120. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +2 -0
  121. data/spec/dummy/db/schema.rb +1 -1
  122. data/spec/dummy/script/rails +5 -3
  123. data/spec/factories.rb +8 -6
  124. data/spec/generators/application_owner_generator_spec.rb +13 -26
  125. data/spec/generators/confidential_applications_generator_spec.rb +12 -28
  126. data/spec/generators/install_generator_spec.rb +17 -15
  127. data/spec/generators/migration_generator_spec.rb +13 -26
  128. data/spec/generators/pkce_generator_spec.rb +11 -26
  129. data/spec/generators/previous_refresh_token_generator_spec.rb +16 -29
  130. data/spec/generators/templates/routes.rb +2 -0
  131. data/spec/generators/views_generator_spec.rb +14 -12
  132. data/spec/grape/grape_integration_spec.rb +34 -32
  133. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +9 -7
  134. data/spec/lib/config_spec.rb +268 -99
  135. data/spec/lib/doorkeeper_spec.rb +3 -1
  136. data/spec/lib/models/expirable_spec.rb +22 -8
  137. data/spec/lib/models/reusable_spec.rb +40 -0
  138. data/spec/lib/models/revocable_spec.rb +8 -6
  139. data/spec/lib/models/scopes_spec.rb +27 -13
  140. data/spec/lib/models/secret_storable_spec.rb +135 -0
  141. data/spec/lib/oauth/authorization/uri_builder_spec.rb +17 -15
  142. data/spec/lib/oauth/authorization_code_request_spec.rb +34 -11
  143. data/spec/lib/oauth/base_request_spec.rb +20 -8
  144. data/spec/lib/oauth/base_response_spec.rb +3 -1
  145. data/spec/lib/oauth/client/credentials_spec.rb +24 -22
  146. data/spec/lib/oauth/client_credentials/creator_spec.rb +56 -10
  147. data/spec/lib/oauth/client_credentials/issuer_spec.rb +27 -18
  148. data/spec/lib/oauth/client_credentials/validation_spec.rb +20 -15
  149. data/spec/lib/oauth/client_credentials_integration_spec.rb +7 -5
  150. data/spec/lib/oauth/client_credentials_request_spec.rb +27 -21
  151. data/spec/lib/oauth/client_spec.rb +15 -13
  152. data/spec/lib/oauth/code_request_spec.rb +8 -6
  153. data/spec/lib/oauth/code_response_spec.rb +9 -7
  154. data/spec/lib/oauth/error_response_spec.rb +19 -11
  155. data/spec/lib/oauth/error_spec.rb +4 -2
  156. data/spec/lib/oauth/forbidden_token_response_spec.rb +7 -5
  157. data/spec/lib/oauth/helpers/scope_checker_spec.rb +68 -31
  158. data/spec/lib/oauth/helpers/unique_token_spec.rb +8 -6
  159. data/spec/lib/oauth/helpers/uri_checker_spec.rb +115 -95
  160. data/spec/lib/oauth/invalid_token_response_spec.rb +3 -1
  161. data/spec/lib/oauth/password_access_token_request_spec.rb +79 -30
  162. data/spec/lib/oauth/pre_authorization_spec.rb +80 -54
  163. data/spec/lib/oauth/refresh_token_request_spec.rb +36 -33
  164. data/spec/lib/oauth/scopes_spec.rb +63 -61
  165. data/spec/lib/oauth/token_request_spec.rb +79 -24
  166. data/spec/lib/oauth/token_response_spec.rb +40 -38
  167. data/spec/lib/oauth/token_spec.rb +60 -44
  168. data/spec/lib/request/strategy_spec.rb +3 -1
  169. data/spec/lib/secret_storing/base_spec.rb +60 -0
  170. data/spec/lib/secret_storing/bcrypt_spec.rb +49 -0
  171. data/spec/lib/secret_storing/plain_spec.rb +44 -0
  172. data/spec/lib/secret_storing/sha256_hash_spec.rb +48 -0
  173. data/spec/lib/server_spec.rb +16 -14
  174. data/spec/lib/stale_records_cleaner_spec.rb +17 -17
  175. data/spec/models/doorkeeper/access_grant_spec.rb +80 -15
  176. data/spec/models/doorkeeper/access_token_spec.rb +198 -73
  177. data/spec/models/doorkeeper/application_spec.rb +280 -288
  178. data/spec/requests/applications/applications_request_spec.rb +98 -66
  179. data/spec/requests/applications/authorized_applications_spec.rb +20 -18
  180. data/spec/requests/endpoints/authorization_spec.rb +25 -23
  181. data/spec/requests/endpoints/token_spec.rb +38 -36
  182. data/spec/requests/flows/authorization_code_errors_spec.rb +26 -24
  183. data/spec/requests/flows/authorization_code_spec.rb +193 -151
  184. data/spec/requests/flows/client_credentials_spec.rb +54 -52
  185. data/spec/requests/flows/implicit_grant_errors_spec.rb +10 -8
  186. data/spec/requests/flows/implicit_grant_spec.rb +27 -25
  187. data/spec/requests/flows/password_spec.rb +59 -55
  188. data/spec/requests/flows/refresh_token_spec.rb +45 -43
  189. data/spec/requests/flows/revoke_token_spec.rb +40 -54
  190. data/spec/requests/flows/skip_authorization_spec.rb +23 -21
  191. data/spec/requests/protected_resources/metal_spec.rb +7 -5
  192. data/spec/requests/protected_resources/private_api_spec.rb +35 -33
  193. data/spec/routing/custom_controller_routes_spec.rb +71 -65
  194. data/spec/routing/default_routes_spec.rb +22 -20
  195. data/spec/routing/scoped_routes_spec.rb +20 -18
  196. data/spec/spec_helper.rb +15 -13
  197. data/spec/spec_helper_integration.rb +3 -1
  198. data/spec/support/dependencies/factory_bot.rb +3 -1
  199. data/spec/support/doorkeeper_rspec.rb +3 -1
  200. data/spec/support/helpers/access_token_request_helper.rb +3 -1
  201. data/spec/support/helpers/authorization_request_helper.rb +4 -2
  202. data/spec/support/helpers/config_helper.rb +2 -0
  203. data/spec/support/helpers/model_helper.rb +3 -1
  204. data/spec/support/helpers/request_spec_helper.rb +5 -3
  205. data/spec/support/helpers/url_helper.rb +9 -7
  206. data/spec/support/http_method_shim.rb +4 -9
  207. data/spec/support/orm/active_record.rb +3 -1
  208. data/spec/support/shared/controllers_shared_context.rb +18 -16
  209. data/spec/support/shared/hashing_shared_context.rb +36 -0
  210. data/spec/support/shared/models_shared_examples.rb +12 -10
  211. data/spec/validators/redirect_uri_validator_spec.rb +74 -45
  212. data/spec/version/version_spec.rb +7 -5
  213. metadata +60 -26
  214. data/gemfiles/rails_4_2.gemfile +0 -13
  215. data/spec/dummy/config/initializers/new_framework_defaults.rb +0 -8
@@ -1,12 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper_integration'
3
+ require "spec_helper_integration"
4
4
 
5
5
  describe Doorkeeper::ApplicationMetalController do
6
6
  controller(Doorkeeper::ApplicationMetalController) do
7
7
  def index
8
8
  render json: {}, status: 200
9
9
  end
10
+
11
+ def create
12
+ render json: {}, status: 200
13
+ end
10
14
  end
11
15
 
12
16
  it "lazy run hooks" do
@@ -16,35 +20,45 @@ describe Doorkeeper::ApplicationMetalController do
16
20
  expect(i).to eq 1
17
21
  end
18
22
 
19
- describe 'enforce_content_type' do
23
+ describe "enforce_content_type" do
20
24
  before { allow(Doorkeeper.configuration).to receive(:enforce_content_type).and_return(flag) }
21
25
 
22
- context 'enabled' do
26
+ context "enabled" do
23
27
  let(:flag) { true }
24
28
 
25
- it '200 for the correct media type' do
26
- get :index, params: {}, as: :url_encoded_form
29
+ it "returns a 200 for the requests without body" do
30
+ get :index, params: {}
27
31
  expect(response).to have_http_status 200
28
32
  end
29
33
 
30
- it 'returns a 415 for an incorrect media type' do
31
- get :index, as: :json
34
+ it "returns a 200 for the requests with body and correct media type" do
35
+ post :create, params: {}, as: :url_encoded_form
36
+ expect(response).to have_http_status 200
37
+ end
38
+
39
+ it "returns a 415 for the requests with body and incorrect media type" do
40
+ post :create, params: {}, as: :json
32
41
  expect(response).to have_http_status 415
33
42
  end
34
43
  end
35
44
 
36
- context 'disabled' do
45
+ context "disabled" do
37
46
  let(:flag) { false }
38
47
 
39
- it 'returns a 200 for the correct media type' do
48
+ it "returns a 200 for the correct media type" do
40
49
  get :index, as: :url_encoded_form
41
50
  expect(response).to have_http_status 200
42
51
  end
43
52
 
44
- it 'returns a 200 for an incorrect media type' do
53
+ it "returns a 200 for an incorrect media type" do
45
54
  get :index, as: :json
46
55
  expect(response).to have_http_status 200
47
56
  end
57
+
58
+ it "returns a 200 for the requests with body and incorrect media type" do
59
+ post :create, params: {}, as: :json
60
+ expect(response).to have_http_status 200
61
+ end
48
62
  end
49
63
  end
50
64
  end
@@ -1,8 +1,10 @@
1
- require 'spec_helper'
1
+ # frozen_string_literal: true
2
+
3
+ require "spec_helper"
2
4
 
3
5
  module Doorkeeper
4
6
  describe ApplicationsController do
5
- context 'JSON API' do
7
+ context "JSON API" do
6
8
  render_views
7
9
 
8
10
  before do
@@ -10,81 +12,81 @@ module Doorkeeper
10
12
  allow(Doorkeeper.configuration).to receive(:authenticate_admin).and_return(->(*) { true })
11
13
  end
12
14
 
13
- it 'creates an application' do
15
+ it "creates an application" do
14
16
  expect do
15
17
  post :create, params: {
16
18
  doorkeeper_application: {
17
- name: 'Example',
18
- redirect_uri: 'https://example.com'
19
- }, format: :json
19
+ name: "Example",
20
+ redirect_uri: "https://example.com",
21
+ }, format: :json,
20
22
  }
21
23
  end.to(change { Doorkeeper::Application.count })
22
24
 
23
25
  expect(response).to be_successful
24
26
 
25
- expect(json_response).to include('id', 'name', 'uid', 'secret', 'redirect_uri', 'scopes')
27
+ expect(json_response).to include("id", "name", "uid", "secret", "redirect_uri", "scopes")
26
28
 
27
- expect(json_response['name']).to eq('Example')
28
- expect(json_response['redirect_uri']).to eq('https://example.com')
29
+ expect(json_response["name"]).to eq("Example")
30
+ expect(json_response["redirect_uri"]).to eq("https://example.com")
29
31
  end
30
32
 
31
- it 'returns validation errors on wrong create params' do
33
+ it "returns validation errors on wrong create params" do
32
34
  expect do
33
35
  post :create, params: {
34
36
  doorkeeper_application: {
35
- name: 'Example'
36
- }, format: :json
37
+ name: "Example",
38
+ }, format: :json,
37
39
  }
38
40
  end.not_to(change { Doorkeeper::Application.count })
39
41
 
40
42
  expect(response).to have_http_status(422)
41
43
 
42
- expect(json_response).to include('errors')
44
+ expect(json_response).to include("errors")
43
45
  end
44
46
 
45
- it 'returns application info' do
46
- application = FactoryBot.create(:application, name: 'Change me')
47
+ it "returns application info" do
48
+ application = FactoryBot.create(:application, name: "Change me")
47
49
 
48
50
  get :show, params: { id: application.id, format: :json }
49
51
 
50
52
  expect(response).to be_successful
51
53
 
52
- expect(json_response).to include('id', 'name', 'uid', 'secret', 'redirect_uri', 'scopes')
54
+ expect(json_response).to include("id", "name", "uid", "secret", "redirect_uri", "scopes")
53
55
  end
54
56
 
55
- it 'updates application' do
56
- application = FactoryBot.create(:application, name: 'Change me')
57
+ it "updates application" do
58
+ application = FactoryBot.create(:application, name: "Change me")
57
59
 
58
60
  put :update, params: {
59
61
  id: application.id,
60
62
  doorkeeper_application: {
61
- name: 'Example App',
62
- redirect_uri: 'https://example.com'
63
- }, format: :json
63
+ name: "Example App",
64
+ redirect_uri: "https://example.com",
65
+ }, format: :json,
64
66
  }
65
67
 
66
- expect(application.reload.name).to eq 'Example App'
68
+ expect(application.reload.name).to eq "Example App"
67
69
 
68
- expect(json_response).to include('id', 'name', 'uid', 'secret', 'redirect_uri', 'scopes')
70
+ expect(json_response).to include("id", "name", "uid", "secret", "redirect_uri", "scopes")
69
71
  end
70
72
 
71
- it 'returns validation errors on wrong update params' do
72
- application = FactoryBot.create(:application, name: 'Change me')
73
+ it "returns validation errors on wrong update params" do
74
+ application = FactoryBot.create(:application, name: "Change me")
73
75
 
74
76
  put :update, params: {
75
77
  id: application.id,
76
78
  doorkeeper_application: {
77
- name: 'Example App',
78
- redirect_uri: 'localhost:3000'
79
- }, format: :json
79
+ name: "Example App",
80
+ redirect_uri: "localhost:3000",
81
+ }, format: :json,
80
82
  }
81
83
 
82
84
  expect(response).to have_http_status(422)
83
85
 
84
- expect(json_response).to include('errors')
86
+ expect(json_response).to include("errors")
85
87
  end
86
88
 
87
- it 'destroys an application' do
89
+ it "destroys an application" do
88
90
  application = FactoryBot.create(:application)
89
91
 
90
92
  delete :destroy, params: { id: application.id, format: :json }
@@ -94,38 +96,38 @@ module Doorkeeper
94
96
  end
95
97
  end
96
98
 
97
- context 'when admin is not authenticated' do
99
+ context "when admin is not authenticated" do
98
100
  before do
99
101
  allow(Doorkeeper.configuration).to receive(:authenticate_admin).and_return(proc do
100
102
  redirect_to main_app.root_url
101
103
  end)
102
104
  end
103
105
 
104
- it 'redirects as set in Doorkeeper.authenticate_admin' do
106
+ it "redirects as set in Doorkeeper.authenticate_admin" do
105
107
  get :index
106
108
  expect(response).to redirect_to(controller.main_app.root_url)
107
109
  end
108
110
 
109
- it 'does not create application' do
111
+ it "does not create application" do
110
112
  expect do
111
113
  post :create, params: {
112
114
  doorkeeper_application: {
113
- name: 'Example',
114
- redirect_uri: 'https://example.com'
115
- }
115
+ name: "Example",
116
+ redirect_uri: "https://example.com",
117
+ },
116
118
  }
117
119
  end.not_to(change { Doorkeeper::Application.count })
118
120
  end
119
121
  end
120
122
 
121
- context 'when admin is authenticated' do
123
+ context "when admin is authenticated" do
122
124
  render_views
123
125
 
124
126
  before do
125
127
  allow(Doorkeeper.configuration).to receive(:authenticate_admin).and_return(->(*) { true })
126
128
  end
127
129
 
128
- it 'sorts applications by created_at' do
130
+ it "sorts applications by created_at" do
129
131
  first_application = FactoryBot.create(:application)
130
132
  second_application = FactoryBot.create(:application)
131
133
  expect(Doorkeeper::Application).to receive(:ordered_by).and_call_original
@@ -136,42 +138,42 @@ module Doorkeeper
136
138
  expect(response.body).to have_selector("tbody tr:last-child#application_#{second_application.id}")
137
139
  end
138
140
 
139
- it 'creates application' do
141
+ it "creates application" do
140
142
  expect do
141
143
  post :create, params: {
142
144
  doorkeeper_application: {
143
- name: 'Example',
144
- redirect_uri: 'https://example.com'
145
- }
145
+ name: "Example",
146
+ redirect_uri: "https://example.com",
147
+ },
146
148
  }
147
149
  end.to change { Doorkeeper::Application.count }.by(1)
148
150
 
149
151
  expect(response).to be_redirect
150
152
  end
151
153
 
152
- it 'does not allow mass assignment of uid or secret' do
154
+ it "does not allow mass assignment of uid or secret" do
153
155
  application = FactoryBot.create(:application)
154
156
  put :update, params: {
155
157
  id: application.id,
156
158
  doorkeeper_application: {
157
- uid: '1A2B3C4D',
158
- secret: '1A2B3C4D'
159
- }
159
+ uid: "1A2B3C4D",
160
+ secret: "1A2B3C4D",
161
+ },
160
162
  }
161
163
 
162
- expect(application.reload.uid).not_to eq '1A2B3C4D'
164
+ expect(application.reload.uid).not_to eq "1A2B3C4D"
163
165
  end
164
166
 
165
- it 'updates application' do
167
+ it "updates application" do
166
168
  application = FactoryBot.create(:application)
167
169
  put :update, params: {
168
170
  id: application.id, doorkeeper_application: {
169
- name: 'Example',
170
- redirect_uri: 'https://example.com'
171
- }
171
+ name: "Example",
172
+ redirect_uri: "https://example.com",
173
+ },
172
174
  }
173
175
 
174
- expect(application.reload.name).to eq 'Example'
176
+ expect(application.reload.name).to eq "Example"
175
177
  end
176
178
  end
177
179
  end