class Rswag3::Specs::ResponseValidator

Public Class Methods

new(config = ::Rswag3::Specs.config) click to toggle source
# File lib/rswag3/specs/response_validator.rb, line 10
def initialize(config = ::Rswag3::Specs.config)
  @config = config
end

Public Instance Methods

validate!(metadata, response) click to toggle source
# File lib/rswag3/specs/response_validator.rb, line 14
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

validate_body!(metadata, swagger_doc, body) click to toggle source
# File lib/rswag3/specs/response_validator.rb, line 40
def validate_body!(metadata, swagger_doc, body)
  response_schema = metadata[:response][:schema]
  return if response_schema.nil?

  validation_schema = response_schema
    .merge('$schema' => 'http://tempuri.org/rswag/specs/extended_schema')
    .merge(swagger_doc.slice(:definitions))
  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/rswag3/specs/response_validator.rb, line 24
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/rswag3/specs/response_validator.rb, line 33
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