Class: Exchange

Inherits:
Object
  • Object
show all
Extended by:
Soaspec::ExchangeProperties
Includes:
Soaspec::ExchangeExtractor, Soaspec::ExchangeRepeater, Soaspec::RequestBuilder, Soaspec::VariableStorer
Defined in:
lib/soaspec/exchange/exchange.rb

Overview

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’

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Soaspec::ExchangeProperties

default_handler, expect_positive_status

Methods included from Soaspec::VariableStorer

#retrieve, #store

Methods included from Soaspec::ExchangeRepeater

#until

Methods included from Soaspec::RequestBuilder

#[]=, #method=, #method_missing, #respond_to_missing?, #save!, #suburl=

Methods included from Soaspec::ExchangeExtractor

#[], #element?, #request, #status_code, #successful_status_code?, #to_hash, #values_from_path

Constructor Details

#initialize(name = self.class.to_s, override_parameters = {}) ⇒ Exchange

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’

Parameters:

  • name (Symbol, String) (defaults to: self.class.to_s)

    Name shown in RSpec run

  • override_parameters (Hash) (defaults to: {})

    Parameters to override for default params



62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/soaspec/exchange/exchange.rb', line 62

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 = exchange_handler.retry_exception_limit
  exchange_handler.elements.each { |element| methods_for_element(element) }
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Soaspec::RequestBuilder

Instance Attribute Details

#exchange_handlerObject

Instance of ExchangeHandler for which this exchange is made



23
24
25
# File 'lib/soaspec/exchange/exchange.rb', line 23

def exchange_handler
  @exchange_handler
end

#fail_factory=(value) ⇒ Object (writeonly)

Expect Factory to fail upon trying to create



31
32
33
# File 'lib/soaspec/exchange/exchange.rb', line 31

def fail_factory=(value)
  @fail_factory = value
end

#override_parametersObject

Parameters to override for default params



33
34
35
# File 'lib/soaspec/exchange/exchange.rb', line 33

def override_parameters
  @override_parameters
end

#retry_countInteger

Returns How many times to retry for a success.

Returns:

  • (Integer)

    How many times to retry for a success



25
26
27
# File 'lib/soaspec/exchange/exchange.rb', line 25

def retry_count
  @retry_count
end

#test_nameObject

@@return [String] Name used for displaying class



29
30
31
# File 'lib/soaspec/exchange/exchange.rb', line 29

def test_name
  @test_name
end

#times_retriedInteger

Returns Times request was retried before being returned.

Returns:

  • (Integer)

    Times request was retried before being returned



27
28
29
# File 'lib/soaspec/exchange/exchange.rb', line 27

def times_retried
  @times_retried
end

Instance Method Details

#callResponseObject

Returns Currently returning response object. This will change (in 0.3) to be itself to allow easy method chaining.

Returns:

  • (ResponseObject)

    Currently returning response object. This will change (in 0.3) to be itself to allow easy method chaining



122
123
124
125
126
127
128
# File 'lib/soaspec/exchange/exchange.rb', line 122

def call
  if Soaspec.log_warnings
    warn 'This "call" method will be changed to return "Exchange" object in 0.3. ' \
      'Use "response" method if you want the "response" object'
  end
  response
end

#default_handler_usedSoaspec::ExchangeHandler

Override this in subclass to tie that subclass to an ExchangeHandler

Returns:



56
# File 'lib/soaspec/exchange/exchange.rb', line 56

def default_handler_used; end

#invalid_exception?Boolean

Defined as general rule from ExchangeHandler

Returns:

  • (Boolean)

    Whether exception is an exception that must be retried



50
51
52
# File 'lib/soaspec/exchange/exchange.rb', line 50

def invalid_exception?
  !exchange_handler.retry_on_exceptions.find { |e| e == exchange_handler.exception.class }.nil?
end

#make_requestResponse

Make request to handler with parameters defined Will retry until success code reached if retry_for_success? is set

Returns:

  • (Response)

    Response from Api handler



83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/soaspec/exchange/exchange.rb', line 83

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

#request_parametersHash

Returns Hash representing what will be sent.

Returns:

  • (Hash)

    Hash representing what will be sent



76
77
78
# File 'lib/soaspec/exchange/exchange.rb', line 76

def request_parameters
  exchange_handler.request_parameters(@override_parameters)
end

#responseRestClient::Response, Savon::Response

Returns response object from Api. Will make the request if not made and then cache it for later on

Examples:

For SOAP it will be a Savon response

response.body (body of response as Hash)
response.header (head of response as Hash)

For REST it will be a RestClient::Response


Returns:

  • (RestClient::Response, Savon::Response)

    Returns response object from Api. Will make the request if not made and then cache it for later on



110
111
112
113
114
115
116
117
118
# File 'lib/soaspec/exchange/exchange.rb', line 110

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

#retry_for_successObject

Set retry for success variable to true so that request will be retried for retry_count until it’s true



37
38
39
40
# File 'lib/soaspec/exchange/exchange.rb', line 37

def retry_for_success
  @retry_for_success = true
  self
end

#retry_for_success?Bool

This is set on an individual Exchange marking it as one that should be retried

Returns:

  • (Bool)

    Whether to keep making request until success code reached



44
45
46
# File 'lib/soaspec/exchange/exchange.rb', line 44

def retry_for_success?
  @retry_for_success
end

#to_sString

Name describing this class when used with ‘RSpec.describe` This will make the request and store the response

Returns:

  • (String)

    Name given when initializing



100
101
102
# File 'lib/soaspec/exchange/exchange.rb', line 100

def to_s
  test_name
end