soaspec 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- 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
|