lib/soaspec/exchange/exchange.rb in soaspec-0.2.29 vs lib/soaspec/exchange/exchange.rb in soaspec-0.2.30

- old
+ new

@@ -1,5 +1,7 @@ +# frozen_string_literal: true + require_relative '../../soaspec' require_relative 'exchange_properties' require_relative 'exchange_extractor' require_relative 'request_builder' require_relative 'exchange_repeater' @@ -17,13 +19,15 @@ 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 + # @return [Integer] How many times to retry for a success attr_accessor :retry_count - # Name used for displaying class + # @return [Integer] Times request was retried before being returned + attr_accessor :times_retried + # @@return [String] 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 @@ -33,15 +37,22 @@ 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 def retry_for_success? @retry_for_success end + # Defined as general rule from ExchangeHandler + # @return [Boolean] Whether exception is an exception that must be retried + def invalid_exception? + !exchange_handler.retry_on_exceptions.find { |e| e == exchange_handler.exception.class }.nil? + end + # Override this in subclass to tie that subclass to an ExchangeHandler # @return [Soaspec::ExchangeHandler] Soaspec::ExchangeHandler used by this exchange def default_handler_used; end # Create new Exchange according to parameters set. A response will be made if called @@ -55,12 +66,12 @@ 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) } + self.retry_count = exchange_handler.retry_exception_limit + exchange_handler.elements.each { |element| methods_for_element(element) } end # @return [Hash] Hash representing what will be sent def request_parameters exchange_handler.request_parameters(@override_parameters) @@ -72,13 +83,14 @@ 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 unless retry_for_success? + return response if !retry_for_success? && !invalid_exception? return response if (200..299).cover? exchange_handler.status_code_for(response) - sleep 0.5 # Time before retrying + sleep exchange_handler.retry_pause_time # Time before retrying + self.times_retried = count break response if count == retry_count end end # Name describing this class when used with `RSpec.describe`