require_relative '../../soaspec' require_relative 'exchange_properties' require_relative 'exchange_extractor' require_relative 'request_builder' require_relative 'exchange_repeater' require_relative 'variable_storer' # 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 class Exchange extend Soaspec::ExchangeProperties include Soaspec::ExchangeExtractor include Soaspec::RequestBuilder include Soaspec::ExchangeRepeater include Soaspec::VariableStorer # Instance of ExchangeHandler for which this exchange is made attr_accessor :exchange_handler # How many times to retry for a success attr_accessor :retry_count # Name used for displaying class attr_accessor :test_name # Expect Factory to fail upon trying to create attr_writer :fail_factory # Parameters to override for default params attr_accessor :override_parameters # Set retry for success variable to true so that request will be retried # for retry_count until it's true def retry_for_success @retry_for_success = true self end # @return [Bool] Whether to keep making request until success code reached def retry_for_success? @retry_for_success end # @return [Boolean] Soaspec::ExchangeHandler used by this exchange def default_handler_used nil end # 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 def initialize(name = self.class.to_s, override_parameters = {}) self.test_name ||= name.to_s # 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 raise '@exchange_handler not set. Set either with `Soaspec.api_handler = Handler.new` or within the exchange' unless @exchange_handler @fail_factory = nil @override_parameters = override_parameters @retry_for_success = false self.retry_count = 3 @exchange_handler.elements.each { |element| methods_for_element(element) } 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 def make_request Soaspec::SpecLogger.info 'Example ' + test_name request_params = @override_parameters (1..retry_count).each do |count| response = exchange_handler.make_request(request_params) return response unless retry_for_success? return response if (200..299).cover? exchange_handler.status_code_for(response) sleep 0.5 break response if count == retry_count end 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 def to_s test_name end # 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 def response Soaspec.last_exchange = self @response ||= make_request @response.define_singleton_method(:exchange) { Soaspec.last_exchange } unless @response.respond_to?(:exchange) @response end alias call response end