class OpenApi::Rswag::Specs::ResponseValidator

Public Class Methods

new(config = ::OpenApi::Rswag::Specs.config) click to toggle source
# File lib/open_api/rswag/specs/response_validator.rb, line 12
def initialize(config = ::OpenApi::Rswag::Specs.config)
  @config = config
end

Public Instance Methods

validate!(metadata, response) click to toggle source
# File lib/open_api/rswag/specs/response_validator.rb, line 16
def validate!(metadata, response)
  swagger_doc = @config.get_swagger_doc(metadata[:swagger_doc])

  validate_code!(metadata, response)
  validate_headers!(metadata, response.headers)
  validate_body!(metadata, swagger_doc, response.body)
end

Private Instance Methods

extract_schemas(metadata) click to toggle source
# File lib/open_api/rswag/specs/response_validator.rb, line 57
def extract_schemas(metadata)
  metadata[:operation] = {produces: []} if metadata[:operation].nil?
  produces = Array(metadata[:operation][:produces])

  producer_content = produces.first || 'application/json'
  response_content = metadata[:response][:content] || {producer_content => {}}
  response_content[producer_content]
end
validate_body!(metadata, swagger_doc, body) click to toggle source
# File lib/open_api/rswag/specs/response_validator.rb, line 42
def validate_body!(metadata, swagger_doc, body)
  test_schemas = extract_schemas(metadata)
  return if test_schemas.nil? || test_schemas.empty?

  components = swagger_doc[:components] || {}
  components_schemas = { components: { schemas: components[:schemas] } }

  validation_schema = test_schemas[:schema] # response_schema
                          .merge('$schema' => 'http://tempuri.org/rswag/specs/extended_schema')
                          .merge(components_schemas)
  
  errors = JSON::Validator.fully_validate(validation_schema, body)
  raise UnexpectedResponse, "Expected response body to match schema: #{errors[0]}" if errors.any?
end
validate_code!(metadata, response) click to toggle source
# File lib/open_api/rswag/specs/response_validator.rb, line 26
def validate_code!(metadata, response)
  expected = metadata[:response][:code].to_s
  if response.code != expected
    raise UnexpectedResponse,
          "Expected response code '#{response.code}' to match '#{expected}'\n" \
        "Response body: #{response.body}"
  end
end
validate_headers!(metadata, headers) click to toggle source
# File lib/open_api/rswag/specs/response_validator.rb, line 35
def validate_headers!(metadata, headers)
  expected = (metadata[:response][:headers] || {}).keys
  expected.each do |name|
    raise UnexpectedResponse, "Expected response header #{name} to be present" if headers[name.to_s].nil?
  end
end