Skip to content

Commit 894dcfa

Browse files
committed
Adding support for examples and tests
1 parent acebef6 commit 894dcfa

File tree

4 files changed

+138
-11
lines changed

4 files changed

+138
-11
lines changed

rswag-specs/lib/rswag/specs/example_group_helpers.rb

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,14 +52,14 @@ def parameter(attributes)
5252
end
5353

5454

55-
def request_body_example(name:, summary:, value:, mime:)
55+
def request_body_example(value:, summary: nil, name: nil)
5656
if metadata.key?(:operation)
57-
metadata[:operation][:request_examples] ||= {}
58-
metadata[:operation][:request_examples][mime] ||= {}
59-
metadata[:operation][:request_examples][mime][name] = {
60-
value: value,
61-
summary: summary,
62-
}
57+
metadata[:operation][:request_examples] ||= []
58+
example = { value: value }
59+
example[:summary] = summary if summary
60+
# We need the examples to have a unique name for a set of examples, so just make the name the length if one isn't provided.
61+
example[:name] = name || metadata[:operation][:request_examples].length()
62+
metadata[:operation][:request_examples] << example
6363
end
6464
end
6565

rswag-specs/lib/rswag/specs/swagger_formatter.rb

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,17 @@ def stop(_notification = nil)
5959
mime_list = value.dig(:consumes)
6060
if value && schema_param && mime_list
6161
value[:requestBody] = { content: {} } unless value.dig(:requestBody, :content)
62+
examples = value.dig(:request_examples)
6263
mime_list.each do |mime|
63-
6464
value[:requestBody][:content][mime] = { schema: schema_param[:schema] }
65-
examples = value.dig(:request_examples, mime)
6665
if examples
67-
value[:requestBody][:content][mime][:examples] = examples
66+
value[:requestBody][:content][mime][:examples] ||= {}
67+
examples.map do |example|
68+
value[:requestBody][:content][mime][:examples][example[:name]] = {
69+
summary: example[:summary] || value[:summary],
70+
value: example[:value]
71+
}
72+
end
6873
end
6974
end
7075
end

rswag-specs/spec/rswag/specs/example_group_helpers_spec.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,38 @@ module Specs
136136
end
137137
end
138138

139+
describe '#request_body_example(value:, summary: nil, name: nil)' do
140+
context "when adding one example" do
141+
before { subject.request_body_example(value: value)}
142+
let(:api_metadata) { { operation: {} } }
143+
let(:value) { { field: 'A', another_field: 'B' } }
144+
145+
it "assigns the example to the metadata" do
146+
expect(api_metadata[:operation][:request_examples].length()).to eq(1)
147+
expect(api_metadata[:operation][:request_examples][0]).to eq({ value: value, name: 0 })
148+
end
149+
end
150+
151+
context "when adding multiple examples with additional information" do
152+
before {
153+
subject.request_body_example(value: example_one)
154+
subject.request_body_example(value: example_two, name: example_two_name, summary: example_two_summary)
155+
}
156+
let(:api_metadata) { { operation: {} } }
157+
let(:example_one) { { field: 'A', another_field: 'B' } }
158+
let(:example_two) { { field: 'B', another_field: 'C' } }
159+
let(:example_two_name) { 'example_two' }
160+
let(:example_two_summary) { 'An example description' }
161+
162+
it "assigns all examples to the metadata" do
163+
expect(api_metadata[:operation][:request_examples].length()).to eq(2)
164+
expect(api_metadata[:operation][:request_examples][0]).to eq({ value: example_one, name: 0 })
165+
expect(api_metadata[:operation][:request_examples][1]).to eq({ value: example_two, name: example_two_name, summary: example_two_summary })
166+
end
167+
end
168+
end
169+
170+
139171
describe '#examples(example)' do
140172
let(:json_example) do
141173
{

rswag-specs/spec/rswag/specs/swagger_formatter_spec.rb

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,17 @@ module Specs
2121
allow(config).to receive(:get_swagger_doc).and_return(swagger_doc)
2222
subject.example_group_finished(notification)
2323
end
24+
let(:request_examples) { nil }
2425
let(:notification) { OpenStruct.new(group: OpenStruct.new(metadata: api_metadata)) }
2526
let(:api_response) { { code: '201', description: 'blog created', headers: { type: :string }, schema: { '$ref' => '#/definitions/blog' } } }
2627
let(:api_metadata) do
28+
operation = { verb: :post, summary: 'Creates a blog', parameters: [{ type: :string }] }
29+
if request_examples
30+
operation[:request_examples] = request_examples
31+
end
2732
{
2833
path_item: { template: '/blogs', parameters: [{ type: :string }] },
29-
operation: { verb: :post, summary: 'Creates a blog', parameters: [{ type: :string }] },
34+
operation: operation,
3035
response: api_response,
3136
document: document
3237
}
@@ -396,6 +401,91 @@ module Specs
396401
after do
397402
FileUtils.rm_r(swagger_root) if File.exist?(swagger_root)
398403
end
404+
405+
406+
context 'with request examples' do
407+
let(:doc_2) do
408+
{
409+
paths: {
410+
'/path/' => {
411+
post: {
412+
summary: 'Retrieve Nested Paths',
413+
tags: ['nested Paths'],
414+
produces: ['application/json'],
415+
consumes: ['application/json'],
416+
parameters: [{
417+
in: :body,
418+
schema: {
419+
'$ref': '#/components/schemas/BlogPost'
420+
}
421+
},{
422+
in: :headers
423+
}],
424+
request_examples: [
425+
{
426+
name: 'basic',
427+
value: {
428+
some_field: 'Foo'
429+
},
430+
summary: 'An example'
431+
},
432+
{
433+
name: 'another_basic',
434+
value: {
435+
some_field: 'Bar'
436+
}
437+
}
438+
],
439+
}
440+
}
441+
},
442+
components: {
443+
schemas: {
444+
'BlogPost' => {
445+
type: 'object',
446+
properties: {
447+
some_field: {
448+
type: 'string',
449+
description: 'description'
450+
}
451+
}
452+
}
453+
}
454+
}
455+
}
456+
end
457+
458+
it 'removes remaining request_examples' do
459+
expect(doc_2[:paths]['/path/'][:post].keys).to eql([:summary, :tags, :parameters, :requestBody])
460+
end
461+
462+
it 'creates requestBody examples' do
463+
expect(doc_2[:paths]['/path/'][:post][:parameters]).to eql([{ in: :headers }])
464+
expect(doc_2[:paths]['/path/'][:post][:requestBody]).to eql(content: {
465+
'application/json' => {
466+
schema: { '$ref': '#/components/schemas/BlogPost' },
467+
examples: {
468+
'basic' => {
469+
value: {
470+
some_field: 'Foo'
471+
},
472+
summary: 'An example'
473+
},
474+
'another_basic' => {
475+
value: {
476+
some_field: 'Bar'
477+
},
478+
summary: 'Retrieve Nested Paths'
479+
}
480+
}
481+
}
482+
})
483+
end
484+
end
485+
486+
after do
487+
FileUtils.rm_r(swagger_root) if File.exist?(swagger_root)
488+
end
399489
end
400490
end
401491
end

0 commit comments

Comments
 (0)