soaspec 0.0.25 → 0.0.26
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ChangeLog +4 -0
- data/Gemfile.lock +1 -1
- data/lib/soaspec/accessors.rb +23 -0
- data/lib/soaspec/basic_soap_handler.rb +21 -20
- data/lib/soaspec/exchange.rb +0 -10
- data/lib/soaspec/rest_handler.rb +27 -24
- data/lib/soaspec/soaspec_shared_examples.rb +16 -2
- data/lib/soaspec/tester.rb +24 -0
- data/lib/soaspec/version.rb +1 -1
- data/lib/soaspec.rb +1 -1
- data/test.rb +28 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f1a29b66931af96e20a87509ba9a1bf8e962c9de
|
4
|
+
data.tar.gz: 382f40037e5b95d6042ae733e2521f59ee27d8b0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d120628f376d440e1975c42dc1f9197db934b8117296dac4b365ccdf49353bc2e9b79dc4f1968d8d0945a7bdacfd50767dd8519cb38398346c36421de2d639b8
|
7
|
+
data.tar.gz: 4e146610d9e218227cca8a8625b577f660184fe5d09edcd6d67e24eefbdd78bf18d233bb4cdd32c5e83f7835a46d787fbd54b7ac0a5fdb40ef909517f171fe07
|
data/ChangeLog
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
Version 0.0.26 / 2018-3-5
|
2
|
+
* Refactorings
|
3
|
+
* Using methods to define mandatory_elements, mandatory_xpath_values, root_attributes, base_url. Please see specs. This is shorter to type and clearer
|
4
|
+
|
1
5
|
Version 0.0.25 / 2018-2-25
|
2
6
|
* Enhancements
|
3
7
|
* Updated rest_handler to convert JSON and XML into Hash and use it in 'contain_value'. This still needs work.
|
data/Gemfile.lock
CHANGED
@@ -0,0 +1,23 @@
|
|
1
|
+
module Soaspec
|
2
|
+
# Describes methods test handlers use to easily set attributes
|
3
|
+
# Some are included in 'success scenarios' and to configure the request sent
|
4
|
+
module Accessors
|
5
|
+
|
6
|
+
# Defines expected_mandatory_elements method used in 'success_scenarios' shared examples
|
7
|
+
# to indicate certain elements must be present
|
8
|
+
# @param [Array] elements Array of symbols specifying expected element names for 'success_scearios' in snakecase
|
9
|
+
def mandatory_elements(elements)
|
10
|
+
define_method('expected_mandatory_elements') do
|
11
|
+
elements
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def mandatory_xpath_values(xpath_value_pairs)
|
16
|
+
raise ArgumentError('Hash of {xpath => expected values} expected ') unless xpath_value_pairs.is_a? Hash
|
17
|
+
define_method('expected_mandatory_xpath_values') do
|
18
|
+
xpath_value_pairs
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
@@ -2,15 +2,35 @@
|
|
2
2
|
require_relative 'tester'
|
3
3
|
require_relative 'hash_methods'
|
4
4
|
require_relative 'xpath_not_found'
|
5
|
+
require_relative 'accessors'
|
5
6
|
|
6
7
|
module Soaspec
|
8
|
+
|
9
|
+
# Accessors specific to SOAP handler
|
10
|
+
module SoapAccessors
|
11
|
+
|
12
|
+
def root_attributes(attributes)
|
13
|
+
define_method('request_root_attributes') do
|
14
|
+
attributes
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
7
19
|
# Wraps around Savon client defining default values dependent on the soap request
|
8
20
|
class BasicSoapHandler < Tester
|
21
|
+
extend Soaspec::Accessors
|
22
|
+
extend Soaspec::SoapAccessors
|
23
|
+
|
9
24
|
# Savon client used to make SOAP calls
|
10
25
|
attr_accessor :client
|
11
26
|
# SOAP Operation to use by default
|
12
27
|
attr_accessor :operation
|
13
28
|
|
29
|
+
# Attributes set at the root XML element of SOAP request
|
30
|
+
def request_root_attributes
|
31
|
+
nil
|
32
|
+
end
|
33
|
+
|
14
34
|
# Options to log xml request and response
|
15
35
|
def logging_options
|
16
36
|
{
|
@@ -77,7 +97,7 @@ module Soaspec
|
|
77
97
|
render_body = ERB.new(request_body).result(binding)
|
78
98
|
@client.call(operation, xml: render_body) # Call the SOAP operation with the request XML provided
|
79
99
|
elsif @request_option == :hash
|
80
|
-
@client.call(operation, message: @default_hash.merge(test_values), attributes:
|
100
|
+
@client.call(operation, message: @default_hash.merge(test_values), attributes: request_root_attributes)
|
81
101
|
end
|
82
102
|
end
|
83
103
|
|
@@ -90,29 +110,10 @@ module Soaspec
|
|
90
110
|
response.http.code
|
91
111
|
end
|
92
112
|
|
93
|
-
# Override this to specify elements that must be present in the response
|
94
|
-
# Will be used in 'success_scenarios' shared examples
|
95
|
-
# @return [Array] Array of symbols specifying element names
|
96
|
-
def mandatory_elements
|
97
|
-
[]
|
98
|
-
end
|
99
|
-
|
100
|
-
# Override this to specify xpath results that must be present in the response
|
101
|
-
# Will be used in 'success_scenarios' shared examples
|
102
|
-
# @return [Hash] Hash of 'xpath' => 'expected value' pairs
|
103
|
-
def mandatory_xpath_values
|
104
|
-
{}
|
105
|
-
end
|
106
|
-
|
107
113
|
def include_in_body?(response, expected)
|
108
114
|
response.to_xml.to_s.include? expected
|
109
115
|
end
|
110
116
|
|
111
|
-
# Attributes set at the root XML element of SOAP request
|
112
|
-
def root_attributes
|
113
|
-
nil
|
114
|
-
end
|
115
|
-
|
116
117
|
# Returns the value at the provided xpath
|
117
118
|
def xpath_value_for(param)
|
118
119
|
result =
|
data/lib/soaspec/exchange.rb
CHANGED
@@ -25,16 +25,6 @@ class Exchange
|
|
25
25
|
@test_name
|
26
26
|
end
|
27
27
|
|
28
|
-
# Elements a shared 'success scenario' is expected to have
|
29
|
-
def mandatory_elements
|
30
|
-
@api_class.mandatory_elements
|
31
|
-
end
|
32
|
-
|
33
|
-
# Elements a shared 'success scenario' is expected to have
|
34
|
-
def mandatory_xpath_values
|
35
|
-
@api_class.mandatory_xpath_values
|
36
|
-
end
|
37
|
-
|
38
28
|
# Returns response object from Api
|
39
29
|
# For example for SOAP it will be a Savon response
|
40
30
|
# response.body (body of response as Hash)
|
data/lib/soaspec/rest_handler.rb
CHANGED
@@ -2,40 +2,41 @@
|
|
2
2
|
require_relative 'tester'
|
3
3
|
require_relative 'hash_methods'
|
4
4
|
require_relative 'xpath_not_found'
|
5
|
+
require_relative 'accessors'
|
5
6
|
require 'json'
|
6
7
|
require 'nori'
|
7
8
|
|
8
9
|
module Soaspec
|
10
|
+
|
11
|
+
# Accessors specific to REST handler
|
12
|
+
module RestAccessors
|
13
|
+
|
14
|
+
# Defines method 'base_url_value' containing base URL used in REST requests
|
15
|
+
# @param [String] url Base Url to use in REST requests. Suburl is appended to this
|
16
|
+
def base_url(url)
|
17
|
+
define_method('base_url_value') do
|
18
|
+
url
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
9
23
|
# Wraps around Savon client defining default values dependent on the soap request
|
10
24
|
class RestHandler < Tester
|
25
|
+
extend Soaspec::RestAccessors
|
26
|
+
extend Soaspec::Accessors
|
27
|
+
|
11
28
|
# Savon client used to make SOAP calls
|
12
29
|
attr_accessor :client
|
13
30
|
# SOAP Operation to use by default
|
14
31
|
attr_accessor :operation
|
15
32
|
|
16
|
-
#
|
17
|
-
def
|
18
|
-
|
19
|
-
# See request and response. (Put this in traffic file)
|
20
|
-
}
|
21
|
-
end
|
22
|
-
|
23
|
-
# Default Savon options. See https://github.com/rest-client/rest-client for details
|
24
|
-
# @return [Hash] Default Savon options for all BasicSoapHandler
|
25
|
-
def default_options
|
26
|
-
{
|
27
|
-
# method: :get
|
28
|
-
# headers: { content_type: 'text/plain' }
|
29
|
-
}
|
30
|
-
end
|
31
|
-
|
32
|
-
# Override in class
|
33
|
-
def base_url
|
34
|
-
''
|
33
|
+
# Set through following method. Base URL in REST requests.
|
34
|
+
def base_url_value
|
35
|
+
nil
|
35
36
|
end
|
36
37
|
|
37
38
|
# Add values to here when extending this class to have default REST options.
|
38
|
-
# See rest client resource for details
|
39
|
+
# See rest client resource at https://github.com/rest-client/rest-client for details
|
39
40
|
# @return [Hash] Options adding to & overriding defaults
|
40
41
|
def rest_resource_options
|
41
42
|
{
|
@@ -45,10 +46,10 @@ module Soaspec
|
|
45
46
|
# Setup object to handle communicating with a particular SOAP WSDL
|
46
47
|
# @param [Hash] specific_options Options defining SOAP request. WSDL, authentication
|
47
48
|
def initialize(name, specific_options = {})
|
48
|
-
|
49
|
-
options
|
49
|
+
raise "Base URL not set! Please set in class with 'base_url' method" unless base_url_value
|
50
|
+
options = rest_resource_options
|
50
51
|
options.merge!(specific_options)
|
51
|
-
@resource = RestClient::Resource.new(
|
52
|
+
@resource = RestClient::Resource.new(base_url_value, options) # @resource[url_extension].get
|
52
53
|
super
|
53
54
|
end
|
54
55
|
|
@@ -92,6 +93,8 @@ module Soaspec
|
|
92
93
|
end
|
93
94
|
|
94
95
|
# Convert XML or JSON response into a Hash
|
96
|
+
# @param [String] response Response as a String (either in XML or JSON)
|
97
|
+
# @return [Hash]
|
95
98
|
def extract_hash(response)
|
96
99
|
raise "Empty Body. Can't assert on it" if response.body.empty?
|
97
100
|
type = case response.body[0]
|
@@ -107,7 +110,7 @@ module Soaspec
|
|
107
110
|
when :json
|
108
111
|
JSON.parse(response.body).transform_keys_to_symbols
|
109
112
|
when :xml
|
110
|
-
parser = Nori.new(:
|
113
|
+
parser = Nori.new(convert_tags_to: lambda { |tag| tag.snakecase.to_sym })
|
111
114
|
parser.parse(response.body)
|
112
115
|
else
|
113
116
|
raise "Neither XML nor JSON detected. It is #{type}. Don't know how to parse It is #{response.body}"
|
@@ -5,13 +5,27 @@ shared_examples_for 'success scenario' do
|
|
5
5
|
expect(described_class.status_code).to eq 200
|
6
6
|
end
|
7
7
|
context 'has expected mandatory elements' do
|
8
|
-
described_class.
|
8
|
+
described_class.api_class.expected_mandatory_elements.each do |mandatory_element|
|
9
9
|
it mandatory_element do
|
10
10
|
expect(described_class).to contain_key mandatory_element
|
11
11
|
end
|
12
12
|
end
|
13
|
+
# TODO: Remove this. Handle depracated method temporariliy
|
14
|
+
described_class.api_class.mandatory_elements.each do |mandatory_element|
|
15
|
+
puts "Overriding 'mandatory_elements' deprecated. Use new 'expected_mandatory_elements' instead of overriding this method"
|
16
|
+
it mandatory_element do
|
17
|
+
expect(described_class).to contain_key mandatory_element
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
described_class.api_class.expected_mandatory_xpath_values.each do |xpath, value|
|
22
|
+
it "has xpath '#{xpath}' equal to '#{value}'" do
|
23
|
+
expect(described_class).to have_xpath_value(xpath => value)
|
24
|
+
end
|
13
25
|
end
|
14
|
-
|
26
|
+
# TODO: Remove deprecated method
|
27
|
+
described_class.api_class.mandatory_xpath_values.each do |xpath, value|
|
28
|
+
puts "Overriding 'mandatory_elements' deprecated. Use new 'expected_mandatory_elements' instead of overriding this method"
|
15
29
|
it "has xpath '#{xpath}' equal to '#{value}'" do
|
16
30
|
expect(described_class).to have_xpath_value(xpath => value)
|
17
31
|
end
|
data/lib/soaspec/tester.rb
CHANGED
@@ -27,5 +27,29 @@ module Soaspec
|
|
27
27
|
@template_name = name
|
28
28
|
end
|
29
29
|
|
30
|
+
# Will be used in 'success_scenarios' shared examples.
|
31
|
+
# Set though 'mandatory_elements' method
|
32
|
+
# @return [Array] Array of symbols specifying element names
|
33
|
+
def expected_mandatory_elements
|
34
|
+
[]
|
35
|
+
end
|
36
|
+
|
37
|
+
# Use this to set 'expected_mandatory_elements' see 'accessors'
|
38
|
+
def mandatory_elements
|
39
|
+
[]
|
40
|
+
end
|
41
|
+
|
42
|
+
# Override this to specify xpath results that must be present in the response
|
43
|
+
# Will be used in 'success_scenarios' shared examples
|
44
|
+
# @return [Hash] Hash of 'xpath' => 'expected value' pairs
|
45
|
+
def expected_mandatory_xpath_values
|
46
|
+
{}
|
47
|
+
end
|
48
|
+
|
49
|
+
# Use this to set 'expected_mandatory_xpath_values' see 'accessors'
|
50
|
+
def mandatory_xpath_values
|
51
|
+
[]
|
52
|
+
end
|
53
|
+
|
30
54
|
end
|
31
55
|
end
|
data/lib/soaspec/version.rb
CHANGED
data/lib/soaspec.rb
CHANGED
data/test.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
module TestM
|
3
|
+
def do_something(text)
|
4
|
+
define_method('hi') do
|
5
|
+
puts 'hi' + text
|
6
|
+
end
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class BaseTest
|
11
|
+
extend TestM
|
12
|
+
end
|
13
|
+
|
14
|
+
class Tester < BaseTest
|
15
|
+
|
16
|
+
do_something('sam')
|
17
|
+
end
|
18
|
+
|
19
|
+
class Tes < BaseTest
|
20
|
+
do_something 'dsfd'
|
21
|
+
end
|
22
|
+
|
23
|
+
test = Tester.new
|
24
|
+
|
25
|
+
coll = Tes.new
|
26
|
+
|
27
|
+
test.hi
|
28
|
+
coll.hi
|
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.26
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SamuelGarrattIQA
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-03-
|
11
|
+
date: 2018-03-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -151,6 +151,7 @@ files:
|
|
151
151
|
- exe/soaspec-init
|
152
152
|
- exe/xml_to_yaml_file
|
153
153
|
- lib/soaspec.rb
|
154
|
+
- lib/soaspec/accessors.rb
|
154
155
|
- lib/soaspec/basic_soap_handler.rb
|
155
156
|
- lib/soaspec/exchange.rb
|
156
157
|
- lib/soaspec/exe_helpers.rb
|
@@ -164,6 +165,7 @@ files:
|
|
164
165
|
- lib/soaspec/xpath_not_found.rb
|
165
166
|
- soaspec.gemspec
|
166
167
|
- template/soap_template.xml
|
168
|
+
- test.rb
|
167
169
|
- test.wsdl
|
168
170
|
- test.xml
|
169
171
|
- test_rest.rb
|