lib/soaspec/basic_soap_handler.rb in soaspec-0.0.19 vs lib/soaspec/basic_soap_handler.rb in soaspec-0.0.20

- old
+ new

@@ -1,123 +1,133 @@ - -require_relative 'tester' -require_relative 'hash_methods' - -module Soaspec - # Wraps around Savon client defining default values dependent on the soap request - class BasicSoapHandler < Tester - # Savon client used to make SOAP calls - attr_accessor :client - # SOAP Operation to use by default - attr_accessor :operation - - # Options to log xml request and response - def logging_options - { - log: true, # See request and response. (Put this in traffic file) - log_level: :debug, - logger: Soaspec::SpecLogger.create, - pretty_print_xml: true # Prints XML pretty - } - end - - # Default Savon options. See http://savonrb.com/version2/globals.html for details - # @return [Hash] Default Savon options for all BasicSoapHandler - def default_options - { - ssl_verify_mode: :none, # Easier for testing. Not so secure - follow_redirects: true, # Necessary for many API calls - soap_version: 2, # use SOAP 1.2. You will get 415 error if this is incorrect - raise_errors: false # HTTP errors not cause failure as often negative test scenarios expect not 200 response - # Things could go wrong if not set properly - # env_namespace: :soap, # Change environment namespace - # namespace_identifier: :tst, # Change namespace element - # element_form_default: :qualified # Populate each element with namespace - # namespace: 'http://Extended_namespace.xsd' change root namespace - # basic_auth: 'user', 'password' - } - end - - # Add values to here when extending this class to have default Savon options. - # See http://savonrb.com/version2/globals.html for details - # @return [Hash] Savon options adding to & overriding defaults - def savon_options - { - } - end - - # Setup object to handle communicating with a particular SOAP WSDL - # @param [Hash] specific_options Options defining SOAP request. WSDL, authentication, see http://savonrb.com/version2/globals.html for list of options - def initialize(name, specific_options = {}) - options = default_options.merge logging_options - options.merge! savon_options - options.merge!(specific_options) - @client = Savon.client(options) - super - end - - def name(name) - @test_values = {} - @test_name = name - self - end - - def override(request_parameters) - @test_values = request_parameters - self - end - - # Used in together with Exchange request that passes such override parameters - def make_request(override_parameters) - test_values = override_parameters # Used in Erb - # Erb parses template file, executing Ruby code in `<% %>` blocks to work out final request - test_values = test_values.transform_keys_to_symbols if Soaspec::Environment.always_use_keys? - if @request_option == :template - request_body = File.read('template/' + template_name + '.xml') - render_body = ERB.new(request_body).result(binding) - @client.call(operation, xml: render_body) # Call the SOAP operation with the request XML provided - elsif @request_option == :hash - @client.call(operation, message: @default_hash.merge(test_values), attributes: root_attributes) - end - end - - def default_hash=(hash) - @request_option = :hash - @default_hash = Soaspec::Environment.always_use_keys? ? hash.transform_keys_to_symbols : hash - end - - def status_code_for(response) - response.http.code - end - - # Override this to specify elements that must be present in the response - # Will be used in 'success_scenarios' shared examples - # @return [Array] Array of symbols specifying element names - def mandatory_elements - [] - end - - # Override this to specify xpath results that must be present in the response - # Will be used in 'success_scenarios' shared examples - # @return [Hash] Hash of 'xpath' => 'expected value' pairs - def mandatory_xpath_values - {} - end - - # Attributes set at the root XML element of SOAP request - def root_attributes - nil - end - - def xpath_value_for(param) - result = param[:exchange].response.xpath(param[:xpath]).first - raise 'No value at Xpath' unless result - result.inner_text - end - - def value_from_path(exchange, path) - path = '//' + path if path[0] != '/' - xpath_value_for(exchange: exchange, xpath: path) - end - - end + +require_relative 'tester' +require_relative 'hash_methods' +require_relative 'xpath_not_found' + +module Soaspec + # Wraps around Savon client defining default values dependent on the soap request + class BasicSoapHandler < Tester + # Savon client used to make SOAP calls + attr_accessor :client + # SOAP Operation to use by default + attr_accessor :operation + + # Options to log xml request and response + def logging_options + { + log: true, # See request and response. (Put this in traffic file) + log_level: :debug, + logger: Soaspec::SpecLogger.create, + pretty_print_xml: true # Prints XML pretty + } + end + + # Default Savon options. See http://savonrb.com/version2/globals.html for details + # @return [Hash] Default Savon options for all BasicSoapHandler + def default_options + { + ssl_verify_mode: :none, # Easier for testing. Not so secure + follow_redirects: true, # Necessary for many API calls + soap_version: 2, # use SOAP 1.2. You will get 415 error if this is incorrect + raise_errors: false # HTTP errors not cause failure as often negative test scenarios expect not 200 response + # Things could go wrong if not set properly + # env_namespace: :soap, # Change environment namespace + # namespace_identifier: :tst, # Change namespace element + # element_form_default: :qualified # Populate each element with namespace + # namespace: 'http://Extended_namespace.xsd' change root namespace + # basic_auth: 'user', 'password' + } + end + + # Add values to here when extending this class to have default Savon options. + # See http://savonrb.com/version2/globals.html for details + # @return [Hash] Savon options adding to & overriding defaults + def savon_options + { + } + end + + # Setup object to handle communicating with a particular SOAP WSDL + # @param [Hash] specific_options Options defining SOAP request. WSDL, authentication, see http://savonrb.com/version2/globals.html for list of options + def initialize(name, specific_options = {}) + options = default_options.merge logging_options + options.merge! savon_options + options.merge!(specific_options) + @client = Savon.client(options) + super + end + + def name(name) + @test_values = {} + @test_name = name + self + end + + def override(request_parameters) + @test_values = request_parameters + self + end + + # Used in together with Exchange request that passes such override parameters + def make_request(override_parameters) + test_values = override_parameters # Used in Erb + # Erb parses template file, executing Ruby code in `<% %>` blocks to work out final request + test_values = test_values.transform_keys_to_symbols if Soaspec::Environment.always_use_keys? + if @request_option == :template + request_body = File.read('template/' + template_name + '.xml') + render_body = ERB.new(request_body).result(binding) + @client.call(operation, xml: render_body) # Call the SOAP operation with the request XML provided + elsif @request_option == :hash + @client.call(operation, message: @default_hash.merge(test_values), attributes: root_attributes) + end + end + + def default_hash=(hash) + @request_option = :hash + @default_hash = Soaspec::Environment.always_use_keys? ? hash.transform_keys_to_symbols : hash + end + + def status_code_for(response) + response.http.code + end + + # Override this to specify elements that must be present in the response + # Will be used in 'success_scenarios' shared examples + # @return [Array] Array of symbols specifying element names + def mandatory_elements + [] + end + + # Override this to specify xpath results that must be present in the response + # Will be used in 'success_scenarios' shared examples + # @return [Hash] Hash of 'xpath' => 'expected value' pairs + def mandatory_xpath_values + {} + end + + # Attributes set at the root XML element of SOAP request + def root_attributes + nil + end + + # Returns the value at the provided xpath + def xpath_value_for(param) + result = + if Soaspec::Environment.strip_namespaces? && !param[:xpath].include?(':') + temp_doc = param[:exchange].response.doc + temp_doc.remove_namespaces! + temp_doc.xpath(param[:xpath]).first + else + puts 'no strip' + param[:xpath] + param[:exchange].response.xpath(param[:xpath]).first + end + raise NoElementAtXpath, "No value at Xpath '#{param[:xpath]}'" unless result + result.inner_text + end + + def value_from_path(exchange, path) + path = '//' + path if path[0] != '/' + xpath_value_for(exchange: exchange, xpath: path) + end + + end end \ No newline at end of file