soaspec 0.0.9 → 0.0.10
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 +6 -1
- data/Gemfile +2 -1
- data/Gemfile.lock +6 -1
- data/lib/soaspec.rb +1 -1
- data/lib/soaspec/basic_soap_handler.rb +11 -8
- data/lib/soaspec/exchange.rb +11 -9
- data/lib/soaspec/hash_methods.rb +21 -0
- data/lib/soaspec/matchers.rb +3 -10
- data/lib/soaspec/shared_examples.rb +3 -3
- data/lib/soaspec/tester.rb +0 -1
- data/lib/soaspec/version.rb +1 -1
- data/soaspec.gemspec +2 -1
- metadata +17 -4
- data/lib/soaspec/common.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9fa5a1248a62fb5ce03d9b24d914dfa98c978e28
|
4
|
+
data.tar.gz: 601743d42c8399edb5a34e82c9569a35b7f7522e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a3237657f1be3b97ecd7de2fe1f093fe7d024cf18b0d4f8e51879595b5aa7218270fd83eca07da23f2bf354c92625263c89ece87f7fd5664c59099593c4e06e1
|
7
|
+
data.tar.gz: a8d4aab8cbf8825512e197915655277e64033c453d346b5bca10c2ea7623a668282a481f47caf4c666e52d5890e852af50cf42c6eddd9819c8159bb93afe9f61
|
data/ChangeLog
CHANGED
@@ -1,9 +1,14 @@
|
|
1
|
+
Version 0.0.10 / 2018-1-21
|
2
|
+
* Enhancements
|
3
|
+
* Added [] method to perform xpath assertion
|
4
|
+
* Using Savon xpath. No need to explicitly provide namespace for xpath
|
5
|
+
|
1
6
|
Version 0.0.9 / 2018-1-20
|
2
7
|
* Refactoring
|
3
8
|
* class_options -> savon_options - More specific
|
4
9
|
* default_operation -> operation - Not default anymore so better not in name
|
5
10
|
* Enhancements
|
6
|
-
* Made mandatory_xpath_values method to add to 'success
|
11
|
+
* Made mandatory_xpath_values method to add to 'success scenarios' shared example
|
7
12
|
|
8
13
|
Version 0.0.8 / 2018-1-19
|
9
14
|
* Enhancements
|
data/Gemfile
CHANGED
@@ -4,10 +4,11 @@ git_source(:gitlab) { |repo_name| "https://gitlab.com/samuel-garratt/soaspec" }
|
|
4
4
|
|
5
5
|
# Specify your gem's dependencies in soaspec.gemspec
|
6
6
|
gemspec
|
7
|
-
gem 'rspec'
|
8
7
|
gem 'rest-client'
|
9
8
|
gem 'savon'
|
10
9
|
gem 'require_all'
|
11
10
|
gem 'nokogiri'
|
12
11
|
gem 'rake', '12.2.1'
|
12
|
+
gem 'rspec'
|
13
|
+
gem 'rspec-its'
|
13
14
|
gem 'rspec_junit_formatter'
|
data/Gemfile.lock
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
soaspec (0.0.
|
4
|
+
soaspec (0.0.10)
|
5
5
|
rest-client (>= 2.0)
|
6
6
|
rspec (~> 3.0)
|
7
|
+
rspec-its (>= 1.2.0)
|
7
8
|
savon (>= 2)
|
8
9
|
|
9
10
|
GEM
|
@@ -55,6 +56,9 @@ GEM
|
|
55
56
|
rspec-expectations (3.7.0)
|
56
57
|
diff-lcs (>= 1.2.0, < 2.0)
|
57
58
|
rspec-support (~> 3.7.0)
|
59
|
+
rspec-its (1.2.0)
|
60
|
+
rspec-core (>= 3.0.0)
|
61
|
+
rspec-expectations (>= 3.0.0)
|
58
62
|
rspec-mocks (3.7.0)
|
59
63
|
diff-lcs (>= 1.2.0, < 2.0)
|
60
64
|
rspec-support (~> 3.7.0)
|
@@ -89,6 +93,7 @@ DEPENDENCIES
|
|
89
93
|
require_all
|
90
94
|
rest-client
|
91
95
|
rspec
|
96
|
+
rspec-its
|
92
97
|
rspec_junit_formatter
|
93
98
|
savon
|
94
99
|
soaspec!
|
data/lib/soaspec.rb
CHANGED
@@ -2,12 +2,12 @@ require 'rest-client' # REST
|
|
2
2
|
require 'erb' # Embedded ruby
|
3
3
|
require 'yaml' # Reading yaml
|
4
4
|
require 'rspec' # Testing framework
|
5
|
+
require 'rspec/its'
|
5
6
|
require 'savon' # SOAP
|
6
7
|
require 'nokogiri' # XPath
|
7
8
|
require 'date'
|
8
9
|
|
9
10
|
require 'soaspec/version'
|
10
|
-
require 'soaspec/common'
|
11
11
|
require 'soaspec/basic_soap_handler'
|
12
12
|
require 'soaspec/tester'
|
13
13
|
require 'soaspec/exchange'
|
@@ -1,6 +1,5 @@
|
|
1
1
|
|
2
2
|
require 'yaml'
|
3
|
-
require_relative 'common'
|
4
3
|
require_relative 'tester'
|
5
4
|
require_relative 'hash_methods'
|
6
5
|
|
@@ -9,8 +8,6 @@ module Soaspec
|
|
9
8
|
class BasicSoapHandler < Tester
|
10
9
|
# Savon client used to make SOAP calls
|
11
10
|
attr_accessor :client
|
12
|
-
# Namespaces used in XML body
|
13
|
-
attr_accessor :namespaces
|
14
11
|
# SOAP Operation to use by default
|
15
12
|
attr_accessor :operation
|
16
13
|
|
@@ -57,7 +54,6 @@ module Soaspec
|
|
57
54
|
options.merge! savon_options
|
58
55
|
options.merge!(specific_options)
|
59
56
|
@client = Savon.client(options)
|
60
|
-
self.namespaces = {}
|
61
57
|
@name = name
|
62
58
|
end
|
63
59
|
|
@@ -91,10 +87,6 @@ module Soaspec
|
|
91
87
|
@name
|
92
88
|
end
|
93
89
|
|
94
|
-
def include?(value)
|
95
|
-
@xml_response.include? value
|
96
|
-
end
|
97
|
-
|
98
90
|
def default_hash=(hash)
|
99
91
|
@request_option = :hash
|
100
92
|
@default_hash = hash
|
@@ -123,5 +115,16 @@ module Soaspec
|
|
123
115
|
nil
|
124
116
|
end
|
125
117
|
|
118
|
+
def xpath_value_for(param)
|
119
|
+
result = param[:exchange].response.xpath(param[:xpath]).first
|
120
|
+
raise 'No value at Xpath' unless result
|
121
|
+
result.inner_text
|
122
|
+
end
|
123
|
+
|
124
|
+
def value_from_path(exchange, path)
|
125
|
+
path = '//' + path if path[0] != '/'
|
126
|
+
xpath_value_for(exchange: exchange, xpath: path)
|
127
|
+
end
|
128
|
+
|
126
129
|
end
|
127
130
|
end
|
data/lib/soaspec/exchange.rb
CHANGED
@@ -3,10 +3,6 @@ require_relative '../soaspec'
|
|
3
3
|
# This represents a request / response pair
|
4
4
|
class Exchange
|
5
5
|
|
6
|
-
attr_reader :xml_response
|
7
|
-
|
8
|
-
attr_reader :xml_doc
|
9
|
-
|
10
6
|
def initialize(name, override_parameters = {})
|
11
7
|
@test_name = name.to_s
|
12
8
|
@api_class = Soaspec::Environment.api_handler
|
@@ -23,10 +19,6 @@ class Exchange
|
|
23
19
|
# @return [String] Name given when initializing
|
24
20
|
def to_s
|
25
21
|
@response = make_request
|
26
|
-
if @api_class.class < Soaspec::BasicSoapHandler
|
27
|
-
@xml_response = @response.to_xml
|
28
|
-
@xml_doc = @response.doc
|
29
|
-
end
|
30
22
|
@test_name
|
31
23
|
end
|
32
24
|
|
@@ -40,15 +32,25 @@ class Exchange
|
|
40
32
|
@api_class.mandatory_xpath_values
|
41
33
|
end
|
42
34
|
|
43
|
-
# Returns
|
35
|
+
# Returns response object from Api
|
36
|
+
# For example for SOAP it will be a Savon response
|
44
37
|
# response.body (body of response as Hash)
|
45
38
|
# response.header (head of response as Hash)
|
46
39
|
def response
|
47
40
|
@response
|
48
41
|
end
|
49
42
|
|
43
|
+
# Get status code from api class. This is http response for Web Api
|
44
|
+
# @return [Integer] Status code from api class
|
50
45
|
def status_code
|
51
46
|
@api_class.status_code_for(@response)
|
52
47
|
end
|
53
48
|
|
49
|
+
# Extract value from path api class
|
50
|
+
# @param [String] path Path to return element for api class E.g - for SOAP this is XPath
|
51
|
+
# @return [String] Value at path
|
52
|
+
def [](path)
|
53
|
+
@api_class.value_from_path(self, path)
|
54
|
+
end
|
55
|
+
|
54
56
|
end
|
data/lib/soaspec/hash_methods.rb
CHANGED
@@ -47,4 +47,25 @@ class Hash
|
|
47
47
|
result != []
|
48
48
|
end
|
49
49
|
|
50
|
+
# Loop through each item within a key within a Hash if the key exists
|
51
|
+
# @param [Key] Key within hash to iterate through
|
52
|
+
def each_if_not_null(key)
|
53
|
+
case key.class.to_s
|
54
|
+
when 'String'
|
55
|
+
if self[key]
|
56
|
+
self[key].each do |list_item|
|
57
|
+
yield(list_item)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
when 'Array'
|
61
|
+
if self[key[0]]
|
62
|
+
if self[key[0]][key[1]]
|
63
|
+
self[key[0]][key[1]].each do |list_item|
|
64
|
+
yield(list_item)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
50
71
|
end
|
data/lib/soaspec/matchers.rb
CHANGED
@@ -1,13 +1,6 @@
|
|
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
|
-
|
11
4
|
RSpec::Matchers.define :contain_value do |expected|
|
12
5
|
match do |actual|
|
13
6
|
expect(actual.response.body.include_value?(expected)).to be true
|
@@ -30,13 +23,13 @@ end
|
|
30
23
|
|
31
24
|
RSpec::Matchers.define :have_element_at_xpath do |xpath|
|
32
25
|
match do |exchange|
|
33
|
-
expect(
|
26
|
+
expect(exchange[xpath]).not_to be_empty
|
34
27
|
end
|
35
28
|
end
|
36
29
|
|
37
30
|
RSpec::Matchers.define :have_xpath_value do |expected_hash|
|
38
31
|
match do |exchange|
|
39
|
-
expected_hash = Hash[*expected_hash.flatten] if expected_hash.is_a?(Array)
|
40
|
-
expect(
|
32
|
+
expected_hash = Hash[*expected_hash.flatten] if expected_hash.is_a?(Array) # For some reason Array was occuring
|
33
|
+
expect(exchange[expected_hash.keys.first]).to eq expected_hash.values.first
|
41
34
|
end
|
42
35
|
end
|
@@ -11,9 +11,9 @@ shared_examples_for 'success scenario' do
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
described_class.mandatory_xpath_values.each do |xpath, value|
|
15
|
+
it "has xpath '#{xpath}' equal to '#{value}'" do
|
16
|
+
expect(described_class).to have_xpath_value(xpath => value)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
data/lib/soaspec/tester.rb
CHANGED
data/lib/soaspec/version.rb
CHANGED
data/soaspec.gemspec
CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
11
11
|
|
12
12
|
spec.summary = %q{Helps to create RSpec specs for SOAP or REST apis }
|
13
13
|
spec.description = %q{Helps to create RSpec specs for SOAP or REST apis. Easily represent multiple requests with
|
14
|
-
the same
|
14
|
+
the same configuration }
|
15
15
|
spec.homepage = 'https://gitlab.com/samuel-garratt/soaspec'
|
16
16
|
spec.license = 'MIT'
|
17
17
|
|
@@ -27,6 +27,7 @@ the same }
|
|
27
27
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
28
28
|
spec.add_dependency 'rest-client', '>= 2.0' # REST
|
29
29
|
spec.add_dependency 'rspec', '~> 3.0' # This framework is designed to work with RSpec
|
30
|
+
spec.add_dependency 'rspec-its', '>= 1.2.0'
|
30
31
|
spec.add_dependency 'savon', '>= 2' # SOAP
|
31
32
|
|
32
33
|
end
|
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.10
|
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-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,6 +80,20 @@ dependencies:
|
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '3.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec-its
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.2.0
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.2.0
|
83
97
|
- !ruby/object:Gem::Dependency
|
84
98
|
name: savon
|
85
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -95,7 +109,7 @@ dependencies:
|
|
95
109
|
- !ruby/object:Gem::Version
|
96
110
|
version: '2'
|
97
111
|
description: "Helps to create RSpec specs for SOAP or REST apis. Easily represent
|
98
|
-
multiple requests with\nthe same
|
112
|
+
multiple requests with\nthe same configuration "
|
99
113
|
email:
|
100
114
|
- samuel.garratt@integrationqa.com
|
101
115
|
executables:
|
@@ -118,7 +132,6 @@ files:
|
|
118
132
|
- exe/soaspec-init
|
119
133
|
- lib/soaspec.rb
|
120
134
|
- lib/soaspec/basic_soap_handler.rb
|
121
|
-
- lib/soaspec/common.rb
|
122
135
|
- lib/soaspec/exchange.rb
|
123
136
|
- lib/soaspec/hash_methods.rb
|
124
137
|
- lib/soaspec/matchers.rb
|
data/lib/soaspec/common.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
class Hash
|
2
|
-
|
3
|
-
# Loop through each item within a key within a Hash if the key exists
|
4
|
-
# @param [Key] Key within hash to iterate through
|
5
|
-
def each_if_not_null(key)
|
6
|
-
case key.class.to_s
|
7
|
-
when 'String'
|
8
|
-
if self[key]
|
9
|
-
self[key].each do |list_item|
|
10
|
-
yield(list_item)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
when 'Array'
|
14
|
-
if self[key[0]]
|
15
|
-
if self[key[0]][key[1]]
|
16
|
-
self[key[0]][key[1]].each do |list_item|
|
17
|
-
yield(list_item)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
end
|