Sha256: 905fc1658b67a265bfecaa14f1ba99d4d769a5a889efbcc9d24823e823a47566

Contents?: true

Size: 1.27 KB

Versions: 1

Compression:

Stored size: 1.27 KB

Contents

require 'active_support/core_ext/hash/slice'
require 'json-schema'
require 'rswag/specs/extended_schema'

module Rswag
  module Specs
    class ResponseValidator

      def initialize(api_metadata, global_metadata)
        @api_metadata = api_metadata
        @global_metadata = global_metadata
      end

      def validate!(response)
        validate_code!(response.code)
        validate_body!(response.body)
      end

      private

      def validate_code!(code)
        if code.to_s != @api_metadata[:response][:code].to_s
          raise UnexpectedResponse, "Expected response code '#{code}' to match '#{@api_metadata[:response][:code]}'"
        end
      end

      def validate_body!(body)
        response_schema = @api_metadata[:response][:schema]
        return if response_schema.nil?

        begin
          validation_schema = response_schema
            .merge('$schema' => 'http://tempuri.org/rswag/specs/extended_schema')
            .merge(@global_metadata.slice(:definitions))
          JSON::Validator.validate!(validation_schema, body)
        rescue JSON::Schema::ValidationError => ex
          raise UnexpectedResponse, "Expected response body to match schema: #{ex.message}" 
        end
      end
    end

    class UnexpectedResponse < StandardError; end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rswag-specs-1.0.3 lib/rswag/specs/response_validator.rb