mirror of
https://github.com/ditkrg/rswag.git
synced 2026-01-22 22:06:43 +00:00
Extracting out APIMetadata from Formatter
This commit is contained in:
parent
4c533caf68
commit
9c250cffe1
46
lib/swagger_rails/rspec/api_metadata.rb
Normal file
46
lib/swagger_rails/rspec/api_metadata.rb
Normal file
@ -0,0 +1,46 @@
|
||||
module SwaggerRails::RSpec
|
||||
class APIMetadata
|
||||
|
||||
def initialize metadata
|
||||
@metadata = metadata
|
||||
end
|
||||
|
||||
def response_example?
|
||||
@metadata.has_key?(:response_code)
|
||||
end
|
||||
|
||||
def swagger_doc
|
||||
@metadata[:swagger_doc]
|
||||
end
|
||||
|
||||
def swagger_data
|
||||
{
|
||||
paths: {
|
||||
@metadata[:path_template] => {
|
||||
@metadata[:http_verb] => operation_metadata
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
|
||||
def operation_metadata
|
||||
{
|
||||
tags: [find_root_of(@metadata)[:description]],
|
||||
summary: @metadata[:summary],
|
||||
description: @metadata[:operation_description],
|
||||
consumes: @metadata[:consumes],
|
||||
produces: @metadata[:produces],
|
||||
parameters: @metadata[:parameters],
|
||||
responses: { @metadata[:response_code] => @metadata[:response] }
|
||||
}
|
||||
end
|
||||
|
||||
def find_root_of(node)
|
||||
parent = node[:parent_example_group]
|
||||
parent.nil? ? node : find_root_of(parent)
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -1,5 +1,6 @@
|
||||
require 'rspec/core/formatters'
|
||||
require 'swagger_helper'
|
||||
require 'swagger_rails/rspec/api_metadata'
|
||||
|
||||
module SwaggerRails
|
||||
module RSpec
|
||||
@ -17,12 +18,11 @@ module SwaggerRails
|
||||
end
|
||||
|
||||
def example_group_finished(notification)
|
||||
metadata = notification.group.metadata
|
||||
return unless metadata.has_key?(:response_code)
|
||||
metadata = APIMetadata.new(notification.group.metadata)
|
||||
return unless metadata.response_example?
|
||||
|
||||
swagger_doc = @swagger_docs[metadata[:swagger_doc]] || @swagger_docs.values.first
|
||||
swagger_data = swagger_data_from(metadata)
|
||||
swagger_doc.deep_merge!(swagger_data)
|
||||
swagger_doc = @swagger_docs[metadata.swagger_doc] || @swagger_docs.values.first
|
||||
swagger_doc.deep_merge!(metadata.swagger_data)
|
||||
end
|
||||
|
||||
def stop(notification)
|
||||
@ -36,35 +36,6 @@ module SwaggerRails
|
||||
|
||||
@output.puts 'Swagger Doc generated'
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def swagger_data_from(metadata)
|
||||
{
|
||||
paths: {
|
||||
metadata[:path_template] => {
|
||||
metadata[:http_verb] => operation_from(metadata)
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def operation_from(metadata)
|
||||
{
|
||||
tags: [ find_root_of(metadata)[:description] ] ,
|
||||
summary: metadata[:summary],
|
||||
description: metadata[:operation_description],
|
||||
consumes: metadata[:consumes],
|
||||
produces: metadata[:produces],
|
||||
parameters: metadata[:parameters],
|
||||
responses: { metadata[:response_code] => metadata[:response] }
|
||||
}
|
||||
end
|
||||
|
||||
def find_root_of(metadata)
|
||||
parent = metadata[:parent_example_group]
|
||||
parent.nil? ? metadata : find_root_of(parent)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
125
spec/swagger_rails/rspec/api_metadata_spec.rb
Normal file
125
spec/swagger_rails/rspec/api_metadata_spec.rb
Normal file
@ -0,0 +1,125 @@
|
||||
require 'swagger_rails/rspec/api_metadata'
|
||||
require 'rails_helper'
|
||||
|
||||
RSpec.describe ::SwaggerRails::RSpec::APIMetadata do
|
||||
|
||||
let(:operation_metadata) { { :execution_result => '#<RSpec::Core::Example::ExecutionResult>',
|
||||
:block => '#<Proc>',
|
||||
:description_args => ['(OK) Site up and running'],
|
||||
:description => '(OK) Site up and running',
|
||||
:full_description => 'Ping API /ping post (OK) Site up and running',
|
||||
:described_class => :post,
|
||||
:file_path => './spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:line_number => 15,
|
||||
:location => './spec/swagger_rails/rspec/formatter_spec.rb:15',
|
||||
:absolute_file_path => '/Users/someuser/work/swagger_rails/spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:rerun_file_path => './spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:scoped_id => '4:1:1:1',
|
||||
:swagger_doc => 'v1_api.json' } }
|
||||
|
||||
let(:response_metadata) { { :execution_result => '#<RSpec::Core::Example::ExecutionResult>',
|
||||
:block => '#<Proc>',
|
||||
:description_args => ['(OK) Site up and running'],
|
||||
:description => '(OK) Site up and running',
|
||||
:full_description => 'Ping API /ping post (OK) Site up and running',
|
||||
:described_class => :post,
|
||||
:file_path => './spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:line_number => 15,
|
||||
:location => './spec/swagger_rails/rspec/formatter_spec.rb:15',
|
||||
:absolute_file_path => '/Users/someuser/work/swagger_rails/spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:rerun_file_path => './spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:scoped_id => '4:1:1:1',
|
||||
:swagger_doc => 'v1_api.json',
|
||||
:parent_example_group => {
|
||||
:execution_result => '#<RSpec::Core::Example::ExecutionResult>',
|
||||
:block => '#<Proc>',
|
||||
:description_args => [:post],
|
||||
:description => 'post',
|
||||
:full_description => 'Ping API /ping post',
|
||||
:described_class => :post,
|
||||
:file_path => './spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:line_number => 11,
|
||||
:location => './spec/swagger_rails/rspec/formatter_spec.rb:11',
|
||||
:absolute_file_path => '/Users/someuser/work/swagger_rails/spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:rerun_file_path => './spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:scoped_id => '4:1:1',
|
||||
:swagger_doc => 'v1_api.json',
|
||||
:parent_example_group => {
|
||||
:execution_result => '#<RSpec::Core::Example::ExecutionResult>',
|
||||
:block => '#<Proc>',
|
||||
:description_args => ['/ping'],
|
||||
:description => '/ping',
|
||||
:full_description => 'Ping API /ping',
|
||||
:described_class => nil,
|
||||
:file_path => './spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:line_number => 10,
|
||||
:location => './spec/swagger_rails/rspec/formatter_spec.rb:10',
|
||||
:absolute_file_path => '/Users/someuser/work/swagger_rails/spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:rerun_file_path => './spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:scoped_id => '4:1',
|
||||
:swagger_doc => 'v1_api.json',
|
||||
:parent_example_group => {
|
||||
:execution_result => '#<RSpec::Core::Example::ExecutionResult>',
|
||||
:block => '#<Proc>',
|
||||
:description_args => ['Ping API'],
|
||||
:description => 'Ping API',
|
||||
:full_description => 'Ping API',
|
||||
:described_class => nil,
|
||||
:file_path => './spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:line_number => 9,
|
||||
:location => './spec/swagger_rails/rspec/formatter_spec.rb:9',
|
||||
:absolute_file_path => '/Users/someuser/work/swagger_rails/spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:rerun_file_path => './spec/swagger_rails/rspec/formatter_spec.rb',
|
||||
:scoped_id => '4',
|
||||
:swagger_doc => 'v1_api.json' },
|
||||
:path_template => '/ping' },
|
||||
:path_template => '/ping',
|
||||
:http_verb => :post,
|
||||
:summary => 'checks if site is alive',
|
||||
:parameters => [],
|
||||
:consumes => ['application/json'],
|
||||
:produces => ['application/json'],
|
||||
:operation_description => 'A very long description' },
|
||||
:path_template => '/ping',
|
||||
:http_verb => :post,
|
||||
:summary => 'checks if site is alive',
|
||||
:parameters => [],
|
||||
:consumes => ['application/json'],
|
||||
:produces => ['application/json'],
|
||||
:operation_description => 'A very long description',
|
||||
:response_code => '200',
|
||||
:response => { :description => '(OK) Site up and running' } }
|
||||
}
|
||||
|
||||
describe '#response_example?' do
|
||||
it 'should return false if response_code not found' do
|
||||
request_metadata = SwaggerRails::RSpec::APIMetadata.new(operation_metadata)
|
||||
expect(request_metadata).to_not be_response_example
|
||||
end
|
||||
|
||||
it 'should return true if response_code found' do
|
||||
request_metadata = SwaggerRails::RSpec::APIMetadata.new(response_metadata)
|
||||
expect(request_metadata).to be_response_example
|
||||
end
|
||||
end
|
||||
|
||||
describe '#swagger_doc' do
|
||||
it 'should return the swagger_doc in the metadata' do
|
||||
request_metadata = SwaggerRails::RSpec::APIMetadata.new(response_metadata)
|
||||
expect(request_metadata.swagger_doc).to eq('v1_api.json')
|
||||
end
|
||||
end
|
||||
|
||||
describe '#swagger_data' do
|
||||
it 'should return swagger specific metadata' do
|
||||
request_metadata = SwaggerRails::RSpec::APIMetadata.new(response_metadata)
|
||||
expect(request_metadata.swagger_data).to eq({ :paths => { '/ping' => { :post => { :tags => ['Ping API'],
|
||||
:summary => 'checks if site is alive',
|
||||
:description => 'A very long description',
|
||||
:consumes => ['application/json'],
|
||||
:produces => ['application/json'],
|
||||
:parameters => [],
|
||||
:responses => { '200' => { :description => '(OK) Site up and running' } } } } } })
|
||||
end
|
||||
end
|
||||
end
|
||||
@ -91,6 +91,10 @@ RSpec.describe ::SwaggerRails::RSpec::Formatter do
|
||||
run_group_and_send_stop_notification(group)
|
||||
end
|
||||
|
||||
it 'should print "Swagger Doc generated"' do
|
||||
expect(formatter_output.string).to eq("Generating Swagger Docs ...\nSwagger Doc generated\n")
|
||||
end
|
||||
|
||||
it 'should write to swagger doc inside swagger root directory' do
|
||||
file_path = File.join(swagger_root, swagger_doc)
|
||||
file_context= nil
|
||||
|
||||
Loading…
Reference in New Issue
Block a user