class RSpecApib::TransactionValidator

Attributes

content_type[RW]
parser[RW]
path[RW]
request_method[RW]
validate_request_schema[RW]
validate_response_schema[RW]

Public Class Methods

new(path:, request_method:, content_type:, validate_request_schema: :always, validate_response_schema: :always, parser: RSpecApib.config.default_parser) click to toggle source

validate_request_schema can be :always, :never, :when_defined

# File lib/rspec_apib/transaction_validator.rb, line 5
def initialize(path:, request_method:, content_type:, validate_request_schema: :always, validate_response_schema: :always, parser: RSpecApib.config.default_parser)
  self.path = path
  self.request_method = request_method
  self.content_type = content_type
  self.parser = parser
  self.validate_request_schema = validate_request_schema
  self.validate_response_schema = validate_response_schema
end

Public Instance Methods

validate(request:, response:, error_messages:, options: {}) click to toggle source
# File lib/rspec_apib/transaction_validator.rb, line 14
def validate(request:, response:, error_messages:, options: {})
  results = matched_transactions(request, response, options)
  if results.empty?
    error_messages << "No candidates for #{request.inspect} with response #{response.inspect}"
    return false
  end

  return true if results.flatten.find {|r| r[:request_errors].empty? && r[:response_errors].empty?}
  report_error_messages(results, error_messages)
  false
end

Private Instance Methods

matched_transactions(request, response, options) click to toggle source
# File lib/rspec_apib/transaction_validator.rb, line 35
def matched_transactions(request, response, options)
  candidates = transaction_candidates(request: request, response: response, options: options)
  candidates.map do |candidate|
    candidate.validate_schema(request, response, validate_request_schema: validate_request_schema, validate_response_schema: validate_response_schema)
  end
end
report_error_messages(results, error_messages) click to toggle source
# File lib/rspec_apib/transaction_validator.rb, line 28
def report_error_messages(results, error_messages)
  results.each do |result|
    error_messages << "The request validation failed - reasons #{result[:request_errors].join("\n")}" unless result[:request_errors].empty?
    error_messages << "The response validation failed - reasons #{result[:response_errors].join("\n")}" unless result[:response_errors].empty?
  end
end
transaction_candidates(request:, response:, options: {}) click to toggle source
# File lib/rspec_apib/transaction_validator.rb, line 42
def transaction_candidates(request:, response:, options: {})
  transactions = parser.http_transactions.select do |t|
    t.potential_match?(path: path, request_method: request_method, content_type: content_type)
  end
  transactions.select { |t| t.matches?(request, response, options: options) }
end