Class: Exchange

Inherits:
Object
  • Object
show all
Defined in:
lib/soaspec/exchange.rb

Overview

This represents a request / response pair

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

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

Returns a new instance of Exchange.

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



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/soaspec/exchange.rb', line 27

def initialize(name = self.class.to_s, override_parameters = {})
  self.test_name ||= name.to_s
  @api_class ||= Soaspec.api_handler # This uses the global parameter. The handler should be set straight before an exchange is made
  @override_parameters = override_parameters
  @retry_for_success = false
  self.retry_count = 3
  @api_class.elements.each do |element|
    element_name = element.to_s.split('__custom_path_').last
    define_singleton_method(element_name) do
      @api_class.__send__(element, response) # Forward the call onto handler to retrieve the element for the response
    end
    define_singleton_method("#{element_name}?") do
      begin
        __send__ element_name
        true
      rescue NoElementAtPath
        false
      end
    end
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_name, *args, &block) ⇒ Object

Implement undefined setter with []= for FactoryBot to use without needing to define params to set

Parameters:

  • method_name (Object)
  • args (Object)
  • block (Object)


152
153
154
155
156
157
158
159
160
161
162
163
164
# File 'lib/soaspec/exchange.rb', line 152

def method_missing(method_name, *args, &block)
  if method_name[-1] == '=' # A setter method
    if args.first.class < Exchange # This would be prerequisite exchange
      define_singleton_method(method_name[0..-2]) do
        args.first
      end
    else
      self[method_name[0..-2]] = args.first
    end
  else
    super
  end
end

Instance Attribute Details

#api_classObject

Class of Api Handler for which this exchange is made



7
8
9
# File 'lib/soaspec/exchange.rb', line 7

def api_class
  @api_class
end

#retry_countObject

How many times to retry for a success



9
10
11
# File 'lib/soaspec/exchange.rb', line 9

def retry_count
  @retry_count
end

#test_nameObject

Name used for displaying class



11
12
13
# File 'lib/soaspec/exchange.rb', line 11

def test_name
  @test_name
end

Instance Method Details

#[](path) ⇒ String

Extract value from path api class

Parameters:

  • path (Object)

    Path to return element for api class E.g - for SOAP this is XPath string. For JSON, this is Hash dig Array

Returns:

  • (String)

    Value at path



136
137
138
# File 'lib/soaspec/exchange.rb', line 136

def [](path)
  @api_class.value_from_path(response, path.to_s)
end

#[]=(key, value) ⇒ Object

Set a parameter request in the request body. Can be used to build a request over several steps (e.g Cucumber) Will be used with FactoryBot



143
144
145
146
# File 'lib/soaspec/exchange.rb', line 143

def []=(key, value)
  @override_parameters[:body] ||= {}
  @override_parameters[:body][key] = value
end

#dummy_requestBoolean

Dummy request used to make a request without verifying it and ignoring WSDL errors

Returns:

  • (Boolean)

    Always returns true. Unless of course an unexpected exception occurs



116
117
118
119
120
121
122
123
# File 'lib/soaspec/exchange.rb', line 116

def dummy_request
  make_request
  true
rescue Savon::HTTPError
  puts 'Resolver error'
  # This seems to occur first time IP address asks for WSDL
  true
end

#element?(path) ⇒ Boolean

Returns Whether an element exists at the path.

Returns:

  • (Boolean)

    Whether an element exists at the path



126
127
128
129
130
131
# File 'lib/soaspec/exchange.rb', line 126

def element?(path)
  [path]
  true
rescue NoElementAtPath
  false
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



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

def make_request
  Soaspec::SpecLogger.add_to 'Example ' + test_name
  request_params = @override_parameters
  retry_count.times do
    response = @api_class.make_request(request_params)
    return response unless retry_for_success?
    return response if (200..299).cover? @api_class.status_code_for(response)
    response
  end
end

#method=(method) ⇒ Object

Specify HTTP method to use. Default is :post

Parameters:

  • method (Symbol)

    HTTP method. E.g, :get, :patch



57
58
59
# File 'lib/soaspec/exchange.rb', line 57

def method=(method)
  @override_parameters[:method] = method
end

#respond_to_missing?(method_name, *args) ⇒ Boolean

Used for setters that are not defined

Returns:

  • (Boolean)


167
168
169
# File 'lib/soaspec/exchange.rb', line 167

def respond_to_missing?(method_name, *args)
  method_name[-1] == '=' || super
end

#responseObject Also known as: call

Returns response object from Api. Will make the request if not made and then cache it for later on For example for SOAP it will be a Savon response response.body (body of response as Hash) response.header (head of response as Hash)



102
103
104
# File 'lib/soaspec/exchange.rb', line 102

def response
  @response ||= make_request
end

#retrieve(name) ⇒ Object

Retrieve the stored value from the Api Handler

Parameters:

  • name (String, Symbol)

    Name of value to retrieve

Returns:

  • (Object)

    value from the Api Handler stored previously



85
86
87
88
89
# File 'lib/soaspec/exchange.rb', line 85

def retrieve(name)
  method = '__stored_val__' + name.to_s
  raise ArgumentError('Value not stored at ') unless api_class.respond_to? method
  @api_class.send(method)
end

#retry_for_successObject

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



15
16
17
18
# File 'lib/soaspec/exchange.rb', line 15

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



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

def retry_for_success?
  @retry_for_success
end

#save!Self

Makes request, caching the response and returning self Used by FactoryBot

Returns:

  • (Self)


174
175
176
177
# File 'lib/soaspec/exchange.rb', line 174

def save!
  call
  self
end

#status_codeInteger

Get status code from api class. This is http response for Web Api

Returns:

  • (Integer)

    Status code from api class



110
111
112
# File 'lib/soaspec/exchange.rb', line 110

def status_code
  @api_class.status_code_for(response)
end

#store(name, value) ⇒ Object

Stores a value in the api handler that can be accessed by the provided name

Parameters:

  • name (Symbol)

    Name of method to use to access this value within handler

  • value (String)

    Path to value to store



78
79
80
# File 'lib/soaspec/exchange.rb', line 78

def store(name, value)
  @api_class.store(name, self[value])
end

#suburl=(url) ⇒ Object

Specify a url to add onto the base_url of the ExchangeHandler used

Parameters:

  • url (String)

    Url to add onto the base_url of the ExchangeHandler used



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

def suburl=(url)
  @override_parameters[:suburl] = url
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



94
95
96
# File 'lib/soaspec/exchange.rb', line 94

def to_s
  test_name
end