JustinFeng/fakeit

View on GitHub
lib/fakeit/validation/validator.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Fakeit
  module Validation
    class Validator
      def initialize(operation) = @operation = operation

      def validate(body: {}, params: {}, headers: {})
        options = OpenAPIParser::SchemaValidator::Options.new(coerce_value: true)

        validate_body(body) unless request_content_types.empty?
        @operation.validate_path_params(options)
        @operation.validate_request_parameter(params, headers, options)
      rescue StandardError => e
        raise ValidationError, e.message
      end

      private

      def validate_body(body)
        if request_content_types.include?(body[:media_type])
          @operation.validate_request_body(body[:media_type], body[:data]) if can_validate?(body[:media_type])
        else
          raise ValidationError, 'Invalid request content type' if body[:media_type]
          raise ValidationError, 'Request body is required' if request_body.required
        end
      end

      def can_validate?(media_type) = media_type =~ %r{^application/.*json} || media_type == 'multipart/form-data'

      def request_content_types = request_body&.content&.keys.to_a

      def request_body = @operation.operation_object.request_body
    end
  end
end