module Soaspec::ExchangeExtractor

Methods for extracting aspects of the traffic for a request / response in an exchange from the ExchangeHandler that it's tied to

Public Instance Methods

[](path) click to toggle source

Extract value from path api class @example Extract unique value

@exchange['unique_value_name']

@example Extract value via JSON path

@exchange['$..path.to.element']

@example Extract value via XPath

@exchange['//path/to/element']

@param [Object] path Path to return element for api class E.g - for SOAP this is XPath string. For JSON, this is Hash dig Array @return [String] Value at path

# File lib/soaspec/exchange/exchange_extractor.rb, line 33
def [](path)
  exchange_handler.value_from_path(response, path.to_s)
end
Also aliased as: value_from_path
element?(path) click to toggle source

Using same path syntax as []. Returns true of false depending on whether an element is found @return [Boolean] Whether an element exists at the path

# File lib/soaspec/exchange/exchange_extractor.rb, line 46
def element?(path)
  self[path]
  true
rescue NoElementAtPath
  false
end
format() click to toggle source

@return [Symbol] Type of response. XML, JSON, etc

# File lib/soaspec/exchange/exchange_extractor.rb, line 40
def format
  Interpreter.response_type_for(response)
end
pretty_response_body() click to toggle source

@return [String] Get multiline pretty version of response

# File lib/soaspec/exchange/exchange_extractor.rb, line 77
def pretty_response_body
  case format
  when :json then JSON.pretty_generate to_hash
  when :xml then response.body # TODO: Single line XML make multiline
  else
    response.body
  end
end
request() click to toggle source

Request of API call. Either intended request or actual request @return [Object] Object representing request of API

# File lib/soaspec/exchange/exchange_extractor.rb, line 9
def request
  exchange_handler.request(@response)
end
status_code() click to toggle source

Get status code from api class. This is http response code for Web Api @return [Integer] Status code from api class

# File lib/soaspec/exchange/exchange_extractor.rb, line 15
def status_code
  exchange_handler.status_code_for(response)
end
successful_status_code?() click to toggle source

@return [Boolean] Whether Api success code is successful

# File lib/soaspec/exchange/exchange_extractor.rb, line 20
def successful_status_code?
  (200..299).cover? status_code
end
to_hash() click to toggle source

Return the response equivalent of the response. XML, JSON will be converted to a Hash @example Counting items in a JSON list

# Say there is JSON response {"notes":[{"title":"note1","note":"A note"},{"title":"note2"}]}
hash = @exchange.to_hash
expect(hash['notes'].count).to eq 2
expect(hash['notes'].first['title']).to eq 'note1'

@return [Hash] Hash representing the response of the API

# File lib/soaspec/exchange/exchange_extractor.rb, line 72
def to_hash
  exchange_handler.to_hash(response)
end
value_from_path(path)
Alias for: []
values_from_path(path, attribute: nil) click to toggle source

@example Counting items in a JSON list

# Say there is JSON response {"notes":[{"title":"note1","note":"A note"},{"title":"note2"}]}
titles = @exchange.values_at_path('$..title')
expect(titles.count).to eq 2
expect(titles.first).to eq 'note1'

@param [String] path XPath, JSONPath to extract value @param [String] attribute Attribute to obtain from XML element @return [Array] List of values found at path

# File lib/soaspec/exchange/exchange_extractor.rb, line 61
def values_from_path(path, attribute: nil)
  exchange_handler.values_from_path(response, path, attribute: attribute)
end

Private Instance Methods

methods_for_element(element) click to toggle source

Used to define methods on an exchange based on what's defined by the ExchangeHandler's methods @param [String] element Element to define methods for

# File lib/soaspec/exchange/exchange_extractor.rb, line 90
def methods_for_element(element)
  element_name = element.to_s.split('__custom_path_').last
  define_singleton_method(element_name) do
    exchange_handler.__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