soaspec 0.0.8 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ChangeLog +7 -0
- data/Gemfile.lock +1 -1
- data/README.md +8 -5
- data/lib/soaspec/basic_soap_handler.rb +33 -25
- data/lib/soaspec/exchange.rb +5 -0
- data/lib/soaspec/matchers.rb +11 -3
- data/lib/soaspec/shared_examples.rb +9 -6
- data/lib/soaspec/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 648bba6578889b06fd5b8c3a1871e2dff381eb5e
|
4
|
+
data.tar.gz: 8b508b96c93f1928a222c3c7a4980d23438aae12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b76fcbd53b8be2780a0dc64af8cf59a04ac07b1e68c91ffdb9814aeea3e4cbdc442510ef88a88991d1c914b011a567d4b260b8a07e22c52e95e419f57d9e3616
|
7
|
+
data.tar.gz: 18e2478c0df3c22b3c247fb2ffe974987bb5a1e14979c67ce049d056889d6cab944945a486069906774fc30ce32798d3a64d3f71afb5cfa0a1303d4d0ea6f819
|
data/ChangeLog
CHANGED
@@ -1,3 +1,10 @@
|
|
1
|
+
Version 0.0.9 / 2018-1-20
|
2
|
+
* Refactoring
|
3
|
+
* class_options -> savon_options - More specific
|
4
|
+
* default_operation -> operation - Not default anymore so better not in name
|
5
|
+
* Enhancements
|
6
|
+
* Made mandatory_xpath_values method to add to 'success sceanarios' shared example
|
7
|
+
|
1
8
|
Version 0.0.8 / 2018-1-19
|
2
9
|
* Enhancements
|
3
10
|
* Added root_attributes method to add attribute to the root class
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -22,18 +22,21 @@ Or install it yourself as:
|
|
22
22
|
## Todo
|
23
23
|
|
24
24
|
Handle REST
|
25
|
-
Give examples and
|
26
|
-
Potentially have in built use of vcr and http_stub gems
|
25
|
+
Give examples and convenience methods for building classes for each SOAP or REST operation
|
26
|
+
Potentially have in built use of 'vcr' and 'http_stub' gems
|
27
27
|
|
28
28
|
## Usage
|
29
29
|
|
30
|
-
|
30
|
+
* SOAP - this uses Savon behind the scenes. Some defaults are overridden. Please see 'basic_soap_handler.rb'-'default_options' method
|
31
|
+
for such defaults. When describing an API override this in 'savon_options' method
|
31
32
|
|
32
|
-
|
33
|
-
that class. See get_weather_web_service class in spec/soaspec/soap folder for example.
|
33
|
+
See specs for example of usage. This will be added to later.
|
34
34
|
|
35
35
|
### Recommended
|
36
36
|
|
37
|
+
It is recommended that a class be created representing a Web Service Operation or REST call. Then tests refer back to
|
38
|
+
that class. See 'weather_web_service.rb' class in spec/soaspec/soap folder for example.
|
39
|
+
|
37
40
|
If you find having a large backtrace on errors or RSpec shared examples such as 'success scenarios' this can shorten the
|
38
41
|
backtrace.
|
39
42
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
|
1
2
|
require 'yaml'
|
2
3
|
require_relative 'common'
|
3
4
|
require_relative 'tester'
|
@@ -11,7 +12,7 @@ module Soaspec
|
|
11
12
|
# Namespaces used in XML body
|
12
13
|
attr_accessor :namespaces
|
13
14
|
# SOAP Operation to use by default
|
14
|
-
attr_accessor :
|
15
|
+
attr_accessor :operation
|
15
16
|
|
16
17
|
# Options to log xml request and response
|
17
18
|
def logging_options
|
@@ -23,18 +24,27 @@ module Soaspec
|
|
23
24
|
}
|
24
25
|
end
|
25
26
|
|
26
|
-
# Default Savon options
|
27
|
+
# Default Savon options. See http://savonrb.com/version2/globals.html for details
|
28
|
+
# @return [Hash] Default Savon options for all BasicSoapHandler
|
27
29
|
def default_options
|
28
30
|
{
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
31
|
+
ssl_verify_mode: :none, # Easier for testing. Not so secure
|
32
|
+
follow_redirects: true, # Necessary for many API calls
|
33
|
+
soap_version: 2, # use SOAP 1.2. You will get 415 error if this is incorrect
|
34
|
+
raise_errors: false # HTTP errors not cause failure as often negative test scenarios expect not 200 response
|
35
|
+
# Things could go wrong if not set properly
|
36
|
+
# env_namespace: :soap, # Change environment namespace
|
37
|
+
# namespace_identifier: :tst, # Change namespace element
|
38
|
+
# element_form_default: :qualified # Populate each element with namespace
|
39
|
+
# namespace: 'http://Extended_namespace.xsd' change root namespace
|
40
|
+
# basic_auth: 'user', 'password'
|
33
41
|
}
|
34
42
|
end
|
35
43
|
|
36
|
-
# Add values to here when extending this class
|
37
|
-
|
44
|
+
# Add values to here when extending this class to have default Savon options.
|
45
|
+
# See http://savonrb.com/version2/globals.html for details
|
46
|
+
# @return [Hash] Savon options adding to & overriding defaults
|
47
|
+
def savon_options
|
38
48
|
{
|
39
49
|
}
|
40
50
|
end
|
@@ -44,24 +54,13 @@ module Soaspec
|
|
44
54
|
def initialize(name, specific_options = {})
|
45
55
|
super
|
46
56
|
options = default_options.merge logging_options
|
47
|
-
options.merge!
|
57
|
+
options.merge! savon_options
|
48
58
|
options.merge!(specific_options)
|
49
59
|
@client = Savon.client(options)
|
50
60
|
self.namespaces = {}
|
51
61
|
@name = name
|
52
62
|
end
|
53
63
|
|
54
|
-
# Sends a call to the API (is being made obsolete)
|
55
|
-
# @param [Hash] options Dictionary of key value pairs specifying what API call to make
|
56
|
-
# @return [SavonResponse] Savon response from which areas (header, body, etc) of the SOAP response can be accessed
|
57
|
-
# def call(options)
|
58
|
-
# test_values = options[:overide_values]['request'] || {} # Empty hash if no specific request values are set
|
59
|
-
# options[:operation] ||= self.default_operation
|
60
|
-
# # Erb parses template file, executing Ruby code in `<% %>` blocks to work out final request
|
61
|
-
# render_body = ERB.new(options[:template]).result(binding)
|
62
|
-
# @client.call(options[:operation], xml: render_body ) # Call the SOAP operation with the request XML provided
|
63
|
-
# end
|
64
|
-
|
65
64
|
def name(name)
|
66
65
|
@test_values = {}
|
67
66
|
@test_name = name
|
@@ -81,14 +80,14 @@ module Soaspec
|
|
81
80
|
test_values = test_values.transform_keys_to_symbols # Either string or symbol
|
82
81
|
request_body = File.read('template/' + template_name + '.xml')
|
83
82
|
render_body = ERB.new(request_body).result(binding)
|
84
|
-
@client.call(
|
83
|
+
@client.call(operation, xml: render_body) # Call the SOAP operation with the request XML provided
|
85
84
|
elsif @request_option == :hash
|
86
|
-
@client.call(
|
85
|
+
@client.call(operation, message: @default_hash.merge(test_values), attributes: root_attributes)
|
87
86
|
end
|
88
87
|
end
|
89
88
|
|
90
89
|
def to_s
|
91
|
-
Soaspec::Environment.api_handler = self
|
90
|
+
Soaspec::Environment.api_handler = self # Sets this variable globally. This is used in 'Exchange' class
|
92
91
|
@name
|
93
92
|
end
|
94
93
|
|
@@ -106,11 +105,20 @@ module Soaspec
|
|
106
105
|
end
|
107
106
|
|
108
107
|
# Override this to specify elements that must be present in the response
|
109
|
-
#
|
108
|
+
# Will be used in 'success_scenarios' shared examples
|
109
|
+
# @return [Array] Array of symbols specifying element names
|
110
110
|
def mandatory_elements
|
111
|
-
|
111
|
+
[]
|
112
|
+
end
|
113
|
+
|
114
|
+
# Override this to specify xpath results that must be present in the response
|
115
|
+
# Will be used in 'success_scenarios' shared examples
|
116
|
+
# @return [Hash] Hash of 'xpath' => 'expected value' pairs
|
117
|
+
def mandatory_xpath_values
|
118
|
+
{}
|
112
119
|
end
|
113
120
|
|
121
|
+
# Attributes set at the root XML element of SOAP request
|
114
122
|
def root_attributes
|
115
123
|
nil
|
116
124
|
end
|
data/lib/soaspec/exchange.rb
CHANGED
@@ -35,6 +35,11 @@ class Exchange
|
|
35
35
|
@api_class.mandatory_elements
|
36
36
|
end
|
37
37
|
|
38
|
+
# Elements a shared 'success scenario' is expected to have
|
39
|
+
def mandatory_xpath_values
|
40
|
+
@api_class.mandatory_xpath_values
|
41
|
+
end
|
42
|
+
|
38
43
|
# Returns Savon response
|
39
44
|
# response.body (body of response as Hash)
|
40
45
|
# response.header (head of response as Hash)
|
data/lib/soaspec/matchers.rb
CHANGED
@@ -1,6 +1,13 @@
|
|
1
1
|
|
2
2
|
require_relative 'hash_methods'
|
3
3
|
|
4
|
+
def xpath_for(param)
|
5
|
+
# TODO: look a using Savon's xpath rather than converting to Nokogiri
|
6
|
+
result = param[:exchange].xml_doc.at_xpath(param[:xpath], Soaspec::Environment.api_handler.namespaces)
|
7
|
+
raise 'No value at Xpath' unless result
|
8
|
+
result
|
9
|
+
end
|
10
|
+
|
4
11
|
RSpec::Matchers.define :contain_value do |expected|
|
5
12
|
match do |actual|
|
6
13
|
expect(actual.response.body.include_value?(expected)).to be true
|
@@ -21,14 +28,15 @@ RSpec::Matchers.define :contain_key do |expected|
|
|
21
28
|
end
|
22
29
|
end
|
23
30
|
|
24
|
-
RSpec::Matchers.define :have_element_at_xpath do |
|
31
|
+
RSpec::Matchers.define :have_element_at_xpath do |xpath|
|
25
32
|
match do |exchange|
|
26
|
-
expect(exchange
|
33
|
+
expect(xpath_for(exchange: exchange, xpath: xpath).content).not_to be_empty
|
27
34
|
end
|
28
35
|
end
|
29
36
|
|
30
37
|
RSpec::Matchers.define :have_xpath_value do |expected_hash|
|
31
38
|
match do |exchange|
|
32
|
-
|
39
|
+
expected_hash = Hash[*expected_hash.flatten] if expected_hash.is_a?(Array) # For some reason Array was occuring
|
40
|
+
expect(xpath_for(exchange: exchange, xpath: expected_hash.keys.first).content).to eq expected_hash.values.first
|
33
41
|
end
|
34
42
|
end
|
@@ -4,13 +4,16 @@ shared_examples_for 'success scenario' do
|
|
4
4
|
it 'has status code of 200' do
|
5
5
|
expect(described_class.status_code).to eq 200
|
6
6
|
end
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
expect(described_class).to contain_key mandatory_element
|
12
|
-
end
|
7
|
+
context 'has expected mandatory elements' do
|
8
|
+
described_class.mandatory_elements.each do |mandatory_element|
|
9
|
+
it mandatory_element do
|
10
|
+
expect(described_class).to contain_key mandatory_element
|
13
11
|
end
|
14
12
|
end
|
15
13
|
end
|
14
|
+
context 'has expected xpath values' do
|
15
|
+
described_class.mandatory_xpath_values.each do |xpath_pair|
|
16
|
+
it { is_expected.to have_xpath_value xpath_pair }
|
17
|
+
end
|
18
|
+
end
|
16
19
|
end
|
data/lib/soaspec/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: soaspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SamuelGarrattIQA
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-01-
|
11
|
+
date: 2018-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|