From 9414ca16b690179eba8e15bbe35119a86586b9a0 Mon Sep 17 00:00:00 2001 From: Greg Myers Date: Sat, 21 Mar 2020 22:34:13 +0000 Subject: [PATCH] add upgrade parameters refs to openapi3 --- .../lib/rswag/specs/request_factory.rb | 36 ++++++++++++++- .../lib/rswag/specs/response_validator.rb | 2 +- .../lib/rswag/specs/swagger_formatter.rb | 2 +- .../spec/rswag/specs/request_factory_spec.rb | 45 ++++++++++++++++--- 4 files changed, 74 insertions(+), 11 deletions(-) diff --git a/rswag-specs/lib/rswag/specs/request_factory.rb b/rswag-specs/lib/rswag/specs/request_factory.rb index 93bd901..23f74a1 100644 --- a/rswag-specs/lib/rswag/specs/request_factory.rb +++ b/rswag-specs/lib/rswag/specs/request_factory.rb @@ -3,6 +3,7 @@ require 'active_support/core_ext/hash/slice' require 'active_support/core_ext/hash/conversions' require 'json' +require 'byebug' module Rswag module Specs @@ -54,12 +55,39 @@ module Rswag end def resolve_parameter(ref, swagger_doc) - key = ref.sub('#/parameters/', '').to_sym - definitions = swagger_doc[:parameters] + key = key_version(ref, swagger_doc) + definitions = definition_version(swagger_doc) + raise "Referenced parameter '#{ref}' must be defined" unless definitions && definitions[key] definitions[key] end + def key_version(ref, swagger_doc) + if doc_version(swagger_doc).start_with?('2') + ref.sub('#/parameters/', '').to_sym + else # Openapi3 + if ref.start_with?('#/parameters/') + ActiveSupport::Deprecation.warn('Rswag::Specs: WARNING: #/parameters/ refs are replaced in OpenAPI3! Rename to #/components/parameters/') + ref.sub('#/parameters/', '').to_sym + else + ref.sub('#/components/parameters/', '').to_sym + end + end + end + + def definition_version(swagger_doc) + if doc_version(swagger_doc).start_with?('2') + swagger_doc[:parameters] + else # Openapi3 + if swagger_doc.has_key?(:parameters) + swagger_doc[:parameters] + else + components = swagger_doc[:components] || {} + components[:parameters] + end + end + end + def add_verb(request, metadata) request[:verb] = metadata[:operation][:verb] end @@ -167,6 +195,10 @@ module Rswag # source_body_param ||= body_param[:param_value] # source_body_param ? source_body_param.to_json : nil # end + + def doc_version(doc) + doc[:openapi] || doc[:swagger] || '3' + end end end end diff --git a/rswag-specs/lib/rswag/specs/response_validator.rb b/rswag-specs/lib/rswag/specs/response_validator.rb index ccba97c..2254758 100644 --- a/rswag-specs/lib/rswag/specs/response_validator.rb +++ b/rswag-specs/lib/rswag/specs/response_validator.rb @@ -66,7 +66,7 @@ module Rswag # end def definitions_or_component_schemas(swagger_doc, version) - if version.starts_with?('2') + if version.start_with?('2') swagger_doc.slice(:definitions) else # Openapi3 if swagger_doc.has_key?(:definitions) diff --git a/rswag-specs/lib/rswag/specs/swagger_formatter.rb b/rswag-specs/lib/rswag/specs/swagger_formatter.rb index a11a69c..1c8fba3 100644 --- a/rswag-specs/lib/rswag/specs/swagger_formatter.rb +++ b/rswag-specs/lib/rswag/specs/swagger_formatter.rb @@ -34,7 +34,7 @@ module Rswag swagger_doc = @config.get_swagger_doc(metadata[:swagger_doc]) - if doc_version(swagger_doc).starts_with?('3') + if !doc_version(swagger_doc).start_with?('2') upgrade_request_type!(metadata) end diff --git a/rswag-specs/spec/rswag/specs/request_factory_spec.rb b/rswag-specs/spec/rswag/specs/request_factory_spec.rb index b5b6425..ad96f52 100644 --- a/rswag-specs/spec/rswag/specs/request_factory_spec.rb +++ b/rswag-specs/spec/rswag/specs/request_factory_spec.rb @@ -12,7 +12,7 @@ module Rswag allow(config).to receive(:get_swagger_doc).and_return(swagger_doc) end let(:config) { double('config') } - let(:swagger_doc) { {} } + let(:swagger_doc) { { swagger: '2.0' } } let(:example) { double('example') } let(:metadata) do { @@ -314,14 +314,45 @@ module Rswag end context 'referenced parameters' do - before do - swagger_doc[:parameters] = { q1: { name: 'q1', in: :query, type: :string } } - metadata[:operation][:parameters] = [ { '$ref' => '#/parameters/q1' } ] - allow(example).to receive(:q1).and_return('foo') + context 'swagger 2.0' do + before do + swagger_doc[:parameters] = { q1: { name: 'q1', in: :query, type: :string } } + metadata[:operation][:parameters] = [ { '$ref' => '#/parameters/q1' } ] + allow(example).to receive(:q1).and_return('foo') + end + + it 'uses the referenced metadata to build the request' do + expect(request[:path]).to eq('/blogs?q1=foo') + end end - it 'uses the referenced metadata to build the request' do - expect(request[:path]).to eq('/blogs?q1=foo') + context 'openapi 3.0.1' do + let(:swagger_doc) { { openapi: '3.0.1' } } + before do + swagger_doc[:components] = { parameters: { q1: { name: 'q1', in: :query, type: :string } } } + metadata[:operation][:parameters] = [ { '$ref' => '#/components/parameters/q1' } ] + allow(example).to receive(:q1).and_return('foo') + end + + it 'uses the referenced metadata to build the request' do + expect(request[:path]).to eq('/blogs?q1=foo') + end + end + + context 'openapi 3.0.1 upgrade notice' do + let(:swagger_doc) { { openapi: '3.0.1' } } + before do + allow(ActiveSupport::Deprecation).to receive(:warn) + swagger_doc[:parameters] = { q1: { name: 'q1', in: :query, type: :string } } + metadata[:operation][:parameters] = [ { '$ref' => '#/parameters/q1' } ] + allow(example).to receive(:q1).and_return('foo') + end + + it 'warns the user to upgrade' do + expect(request[:path]).to eq('/blogs?q1=foo') + expect(ActiveSupport::Deprecation).to have_received(:warn) + .with('Rswag::Specs: WARNING: #/parameters/ refs are replaced in OpenAPI3! Rename to #/components/parameters/') + end end end