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, #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



51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/soaspec/exchange/exchange.rb', line 51

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

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



21
22
23
# File 'lib/soaspec/exchange/exchange.rb', line 21

def exchange_handler
  @exchange_handler
end

#fail_factory=(value) ⇒ Object (writeonly)

Expect Factory to fail upon trying to create



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

def fail_factory=(value)
  @fail_factory = value
end

#override_parametersObject

Parameters to override for default params



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

def override_parameters
  @override_parameters
end

#retry_countObject

How many times to retry for a success



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

def retry_count
  @retry_count
end

#test_nameObject

Name used for displaying class



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

def test_name
  @test_name
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



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

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:



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

def default_handler_used; 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



72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/soaspec/exchange/exchange.rb', line 72

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 (200..299).cover? exchange_handler.status_code_for(response)

    sleep 0.5 # Time before retrying
    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



65
66
67
# File 'lib/soaspec/exchange/exchange.rb', line 65

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



98
99
100
101
102
103
104
105
106
# File 'lib/soaspec/exchange/exchange.rb', line 98

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



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

def retry_for_success
  @retry_for_success = true
  self
end

#retry_for_success?Bool

Returns Whether to keep making request until success code reached.

Returns:

  • (Bool)

    Whether to keep making request until success code reached



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

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



88
89
90
# File 'lib/soaspec/exchange/exchange.rb', line 88

def to_s
  test_name
end