From 9c250cffe14bb49587b0f2b1e0cb5018d2bead5d Mon Sep 17 00:00:00 2001 From: Garima Singh Date: Fri, 12 Aug 2016 08:21:41 +0800 Subject: [PATCH] Extracting out APIMetadata from Formatter --- lib/swagger_rails/rspec/api_metadata.rb | 46 +++++++ lib/swagger_rails/rspec/formatter.rb | 39 +----- spec/swagger_rails/rspec/api_metadata_spec.rb | 125 ++++++++++++++++++ spec/swagger_rails/rspec/formatter_spec.rb | 4 + 4 files changed, 180 insertions(+), 34 deletions(-) create mode 100644 lib/swagger_rails/rspec/api_metadata.rb create mode 100644 spec/swagger_rails/rspec/api_metadata_spec.rb diff --git a/lib/swagger_rails/rspec/api_metadata.rb b/lib/swagger_rails/rspec/api_metadata.rb new file mode 100644 index 0000000..e474975 --- /dev/null +++ b/lib/swagger_rails/rspec/api_metadata.rb @@ -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 \ No newline at end of file diff --git a/lib/swagger_rails/rspec/formatter.rb b/lib/swagger_rails/rspec/formatter.rb index f248967..45f657c 100644 --- a/lib/swagger_rails/rspec/formatter.rb +++ b/lib/swagger_rails/rspec/formatter.rb @@ -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 diff --git a/spec/swagger_rails/rspec/api_metadata_spec.rb b/spec/swagger_rails/rspec/api_metadata_spec.rb new file mode 100644 index 0000000..e7d04be --- /dev/null +++ b/spec/swagger_rails/rspec/api_metadata_spec.rb @@ -0,0 +1,125 @@ +require 'swagger_rails/rspec/api_metadata' +require 'rails_helper' + +RSpec.describe ::SwaggerRails::RSpec::APIMetadata do + + let(:operation_metadata) { { :execution_result => '#', + :block => '#', + :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 => '#', + :block => '#', + :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 => '#', + :block => '#', + :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 => '#', + :block => '#', + :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 => '#', + :block => '#', + :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 \ No newline at end of file diff --git a/spec/swagger_rails/rspec/formatter_spec.rb b/spec/swagger_rails/rspec/formatter_spec.rb index 66e9944..17f9e54 100644 --- a/spec/swagger_rails/rspec/formatter_spec.rb +++ b/spec/swagger_rails/rspec/formatter_spec.rb @@ -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