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`