class Exchange
This represents a request / response pair Essentially, params in the exchange that are set are related to the request What is returned is related to the response
It is tied to an ExchangeHandler that needs to be defined either globally before it's created or in 'default_handler_used'
Attributes
@return [ExchangeHandler] Instance of ExchangeHandler for which this exchange is made
@return [Boolean] Expect Factory to fail upon trying to create
@return [Hash] Parameters to override for default params defined in ExchangeHandler
These are the parameters specific to the Exchange and will override, append to what's defined in the ExchangeHandler
@return [Integer] How many times to retry for a success
@return [String] Name used for displaying class
@return [Integer] Times request was retried before being returned
Public Class Methods
Create new Exchange
according to parameters set. A response will be made if called explicitly with 'response' method or through other methods that use it like 'status_code' @param [Symbol, String] name Name shown in RSpec run @param [Hash] override_parameters
Parameters to override for default params (set through ExchangeHandler or Exchange
class)
These are the parameters that would be specific for a test
# File lib/soaspec/exchange/exchange.rb, line 65 def initialize(name = self.class.to_s, override_parameters = {}) if name.is_a? Hash # Name not provided override_parameters = name name = nil end self.test_name ||= name.to_s @override_parameters = override_parameters # As a last resort this uses the global parameter. The handler should be set straight before an exchange is made to use this @exchange_handler ||= default_handler_used || Soaspec.api_handler @fail_factory = nil @retry_for_success = false self.retry_count = exchange_handler.retry_exception_limit exchange_handler.elements.each { |element| methods_for_element(element) } end
Public Instance Methods
@return [ResponseObject] Currently returning response object. This will change (in 0.3) to be itself to
allow easy method chaining
# File lib/soaspec/exchange/exchange.rb, line 127 def call response self end
Override this in subclass to tie that subclass to an ExchangeHandler @return [Soaspec::ExchangeHandler] Soaspec::ExchangeHandler
used by this exchange
# File lib/soaspec/exchange/exchange.rb, line 58 def default_handler_used; end
Defined as general rule from ExchangeHandler @return [Boolean] Whether exception is an exception that must be retried
# File lib/soaspec/exchange/exchange.rb, line 52 def invalid_exception? !exchange_handler.retry_on_exceptions.find { |e| e == exchange_handler.exception.class }.nil? end
Make request to handler with parameters defined Will retry until success code reached if retry_for_success
? is set @return [Response] Response from Api handler
# File lib/soaspec/exchange/exchange.rb, line 88 def make_request Soaspec::SpecLogger.info 'Example ' + test_name request_params = @override_parameters (0..retry_count).each do |count| response = exchange_handler.make_request(request_params) return response if !retry_for_success? && !invalid_exception? return response if (200..299).cover? exchange_handler.status_code_for(response) sleep exchange_handler.retry_pause_time # Time before retrying self.times_retried = count break response if count == retry_count end end
@return [Hash] Hash
representing what will be sent
# File lib/soaspec/exchange/exchange.rb, line 81 def request_parameters exchange_handler.request_parameters(@override_parameters) end
@return [RestClient::Response,Savon::Response] Returns response object from Api.
Will make the request if not made and then cache it for later on
@example For SOAP it will be a Savon response
response.body (body of response as Hash) response.header (head of response as Hash)
@example For REST it will be a RestClient::Response
# File lib/soaspec/exchange/exchange.rb, line 115 def response require 'forwardable' Soaspec.last_exchange = self @response ||= make_request @response.define_singleton_method(:exchange) { Soaspec.last_exchange } unless @response.respond_to?(:exchange) @response.extend Forwardable @response.delegate %i[value_from_path values_from_path] => :exchange @response end
Set retry for success variable to true so that request will be retried for retry_count
until it's true
# File lib/soaspec/exchange/exchange.rb, line 39 def retry_for_success @retry_for_success = true self end
This is set on an individual Exchange
marking it as one that should be retried @return [Bool] Whether to keep making request until success code reached
# File lib/soaspec/exchange/exchange.rb, line 46 def retry_for_success? @retry_for_success end
Name describing this class when used with `RSpec.describe` This will make the request and store the response @return [String] Name given when initializing
# File lib/soaspec/exchange/exchange.rb, line 105 def to_s test_name end