Skip to content

Commit 9159489

Browse files
committed
feat: inherit openapi metadata from parent blocks to child blocks
Allow openapi metadata specified in parent describe/context blocks to be inherited by child it blocks, eliminating the need to specify metadata on every individual test case.
1 parent 80c5b58 commit 9159489

File tree

10 files changed

+31
-10
lines changed

10 files changed

+31
-10
lines changed

lib/rspec/openapi/extractors/rails.rb

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def request_attributes(request, example)
1616

1717
raise "No route matched for #{fixed_request.request_method} #{fixed_request.path_info}" if route.nil?
1818

19-
metadata = example.metadata[:openapi] || {}
19+
metadata = merge_openapi_metadata(example.metadata)
2020
summary = metadata[:summary] || RSpec::OpenAPI.summary_builder.call(example)
2121
tags = metadata[:tags] || RSpec::OpenAPI.tags_builder.call(example)
2222
formats = metadata[:formats] || RSpec::OpenAPI.formats_builder.curry.call(example)
@@ -55,6 +55,27 @@ def request_response(context)
5555
[context.request, context.response]
5656
end
5757

58+
private
59+
60+
def merge_openapi_metadata(metadata)
61+
collect_openapi_metadata(metadata).reduce({}, &:merge)
62+
end
63+
64+
# メタデータ階層からOpenAPIメタデータを収集
65+
def collect_openapi_metadata(metadata)
66+
[].tap do |result|
67+
current = metadata
68+
69+
while current
70+
[current[:example_group], current].each do |meta|
71+
result.unshift(meta[:openapi]) if meta&.dig(:openapi)
72+
end
73+
74+
current = current[:parent_example_group]
75+
end
76+
end
77+
end
78+
5879
# @param [ActionDispatch::Request] request
5980
def find_rails_route(request, app: Rails.application, path_prefix: '')
6081
app.routes.router.recognize(request) do |route, _parameters|

spec/apps/hanami/doc/openapi.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@
496496
},
497497
"/tables": {
498498
"get": {
499-
"summary": "index",
499+
"summary": "Get a list of tables",
500500
"tags": [
501501
"Table"
502502
],

spec/apps/hanami/doc/openapi.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@ paths:
306306
message: not found
307307
"/tables":
308308
get:
309-
summary: index
309+
summary: Get a list of tables
310310
tags:
311311
- Table
312312
parameters:

spec/apps/rails/doc/openapi.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,7 @@
539539
},
540540
"/tables": {
541541
"get": {
542-
"summary": "index",
542+
"summary": "Get a list of tables",
543543
"tags": [
544544
"Table"
545545
],

spec/apps/rails/doc/openapi.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,7 @@ paths:
333333
message: not found
334334
"/tables":
335335
get:
336-
summary: index
336+
summary: 'Get a list of tables'
337337
tags:
338338
- Table
339339
parameters:

spec/apps/roda/doc/openapi.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"paths": {
1111
"/roda": {
1212
"post": {
13-
"summary": "POST /roda",
13+
"summary": "Create roda resource",
1414
"requestBody": {
1515
"content": {
1616
"application/json": {

spec/apps/roda/doc/openapi.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ servers: []
77
paths:
88
"/roda":
99
post:
10-
summary: POST /roda
10+
summary: Create roda resource
1111
requestBody:
1212
content:
1313
application/json:

spec/requests/hanami_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
end
5151

5252
RSpec.describe 'Tables', type: :request do
53-
describe '#index' do
53+
describe '#index', openapi: { summary: 'Get a list of tables' } do
5454
context 'returns a list of tables' do
5555
it 'with flat query parameters' do
5656
get '/tables', { page: '1', per: '10' }, { 'AUTHORIZATION' => 'k0kubun', 'X_AUTHORIZATION_TOKEN' => 'token' }

spec/requests/rails_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
}
3939

4040
RSpec.describe 'Tables', type: :request do
41-
describe '#index' do
41+
describe '#index', openapi: { summary: 'Get a list of tables' } do
4242
context it 'returns a list of tables' do
4343
it 'with flat query parameters' do
4444
get '/tables', params: { page: '1', per: '10' },

spec/requests/roda_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
RodaApp
2323
end
2424

25-
describe '/roda' do
25+
describe '/roda', openapi: { summary: 'Create roda resource' } do
2626
context 'when id is given' do
2727
it 'returns 200' do
2828
post '/roda', { id: 1 }.to_json, 'CONTENT_TYPE' => 'application/json'

0 commit comments

Comments
 (0)