soaspec 0.2.8 → 0.2.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitlab-ci.yml +0 -17
- data/ChangeLog +6 -0
- data/Gemfile +2 -2
- data/README.md +42 -9
- data/Rakefile +1 -1
- data/exe/soaspec +9 -14
- data/exe/xml_to_yaml_file +3 -3
- data/images/basic_demo.gif +0 -0
- data/lib/soaspec.rb +9 -19
- data/lib/soaspec/core_ext/hash.rb +10 -12
- data/lib/soaspec/cucumber/generic_steps.rb +1 -1
- data/lib/soaspec/exchange.rb +4 -1
- data/lib/soaspec/exchange_handlers/exchange_handler.rb +5 -4
- data/lib/soaspec/exchange_handlers/handler_accessors.rb +7 -3
- data/lib/soaspec/exchange_handlers/response_extractor.rb +55 -0
- data/lib/soaspec/exchange_handlers/rest_exchanger_factory.rb +1 -1
- data/lib/soaspec/exchange_handlers/rest_handler.rb +16 -43
- data/lib/soaspec/exchange_handlers/rest_methods.rb +1 -2
- data/lib/soaspec/exchange_handlers/rest_parameters.rb +6 -2
- data/lib/soaspec/exchange_handlers/rest_parameters_defaults.rb +1 -1
- data/lib/soaspec/exchange_handlers/soap_handler.rb +6 -10
- data/lib/soaspec/exchange_properties.rb +1 -2
- data/lib/soaspec/exe_helpers.rb +7 -9
- data/lib/soaspec/indifferent_hash.rb +1 -1
- data/lib/soaspec/interpreter.rb +1 -3
- data/lib/soaspec/matchers.rb +1 -2
- data/lib/soaspec/o_auth2.rb +2 -1
- data/lib/soaspec/spec_logger.rb +54 -12
- data/lib/soaspec/template_reader.rb +2 -1
- data/lib/soaspec/test_server/get_bank.rb +5 -5
- data/lib/soaspec/test_server/id_manager.rb +1 -3
- data/lib/soaspec/test_server/invoices.rb +0 -1
- data/lib/soaspec/test_server/puppy_service.rb +0 -1
- data/lib/soaspec/test_server/test_attribute.rb +0 -1
- data/lib/soaspec/version.rb +2 -2
- data/lib/soaspec/virtual_server.rb +1 -1
- data/lib/soaspec/wait.rb +1 -1
- data/lib/soaspec/wsdl_generator.rb +11 -3
- data/soaspec.gemspec +7 -2
- data/test_wsdl.rb +4 -7
- metadata +54 -10
data/lib/soaspec/spec_logger.rb
CHANGED
@@ -1,39 +1,72 @@
|
|
1
|
-
|
2
1
|
require 'logger'
|
3
2
|
require 'fileutils'
|
3
|
+
require 'colorize'
|
4
4
|
|
5
5
|
module Soaspec
|
6
|
-
|
7
6
|
# Handles logs of API requests and responses
|
8
7
|
class SpecLogger
|
9
|
-
|
8
|
+
# Folder to put API traffic logs
|
9
|
+
@traffic_folder = 'logs'
|
10
|
+
# Whether to output api traffic to terminal
|
11
|
+
@output_to_terminal = false
|
12
|
+
# Whether to output API traffic to log file
|
13
|
+
@output_to_file = true
|
14
|
+
# Time test run. Will only be calculated once once called
|
15
|
+
@time_test_run = Time.now.strftime('%Y-%m-%d_%H_%M_%S')
|
10
16
|
|
11
17
|
class << self
|
12
18
|
# Folder to put API traffic logs
|
13
19
|
attr_accessor :traffic_folder
|
20
|
+
# Readers for log parameters
|
21
|
+
attr_reader :output_to_terminal, :output_to_file, :time_test_run
|
22
|
+
|
23
|
+
# Whether to log all API traffic
|
24
|
+
def log_api_traffic=(set)
|
25
|
+
@log_api_traffic = set
|
26
|
+
RestClient.log = nil unless set
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Boolean] Whether to log all API traffic
|
30
|
+
def log_api_traffic?
|
31
|
+
@log_api_traffic.nil? ? true : @log_api_traffic
|
32
|
+
end
|
33
|
+
|
34
|
+
# @param [Symbol, Boolean] value # Whether to output API traffic to log file
|
35
|
+
def output_to_file=(value)
|
36
|
+
@output_to_file = value
|
37
|
+
RestClient.log = Soaspec::SpecLogger.create
|
38
|
+
end
|
39
|
+
|
40
|
+
# @param [Symbol, Boolean] value # Whether to output API traffic to STDOUT
|
41
|
+
def output_to_terminal=(value)
|
42
|
+
@output_to_terminal = value
|
43
|
+
RestClient.log = Soaspec::SpecLogger.create
|
44
|
+
end
|
14
45
|
|
15
46
|
# @return [String] Traffic file to create logs at
|
16
47
|
def traffic_file
|
17
|
-
filename = "traffic_#{
|
48
|
+
filename = "traffic_#{time_test_run}.log"
|
18
49
|
File.join(traffic_folder, filename)
|
19
50
|
end
|
20
51
|
|
21
52
|
# Create new log file if necessary and setup logging level
|
22
53
|
# @return [Logger] Logger class to record API traffic
|
23
54
|
def create
|
24
|
-
|
25
|
-
FileUtils.mkdir_p traffic_folder
|
26
|
-
FileUtils.touch traffic_file
|
27
|
-
end
|
55
|
+
create_log_file
|
28
56
|
@logger = Logger.new(traffic_file) # Where request and responses of APIs are stored
|
29
|
-
@logger.
|
57
|
+
@logger.formatter = proc do |severity, datetime, _progname, msg|
|
58
|
+
message = "SpecLog, [#{datetime.strftime('%Y-%m-%d_%H:%M:%S')}] #{severity} -- : #{msg}\n"
|
59
|
+
print message.colorize(:light_blue) if @output_to_terminal
|
60
|
+
message
|
61
|
+
end
|
30
62
|
@logger
|
31
63
|
end
|
32
64
|
|
33
65
|
# Log a message using Soaspec logger
|
34
66
|
# @param [String] message The message to add to the logger
|
35
67
|
def info(message)
|
36
|
-
return unless
|
68
|
+
return unless log_api_traffic?
|
69
|
+
|
37
70
|
if message.respond_to? :each
|
38
71
|
message.each do |message_item|
|
39
72
|
@logger.info(message_item)
|
@@ -42,7 +75,16 @@ module Soaspec
|
|
42
75
|
@logger.info(message)
|
43
76
|
end
|
44
77
|
end
|
45
|
-
end
|
46
78
|
|
79
|
+
private
|
80
|
+
|
81
|
+
# Create folder and file to store logs
|
82
|
+
def create_log_file
|
83
|
+
return if File.exist?(traffic_file)
|
84
|
+
|
85
|
+
FileUtils.mkdir_p traffic_folder
|
86
|
+
FileUtils.touch traffic_file
|
87
|
+
end
|
88
|
+
end
|
47
89
|
end
|
48
|
-
end
|
90
|
+
end
|
@@ -1,13 +1,11 @@
|
|
1
|
-
|
2
1
|
require 'erb'
|
3
2
|
|
4
3
|
module Soaspec
|
5
4
|
module TestServer
|
6
5
|
# Representing a GetBank SOAP service
|
7
6
|
class GetBank
|
8
|
-
|
9
7
|
class << self
|
10
|
-
|
8
|
+
# @return [String] WSDL of mock web service
|
11
9
|
def test_wsdl
|
12
10
|
ERB.new(File.read(File.join(File.dirname(__FILE__), 'bank.wsdl'))).result(binding)
|
13
11
|
end
|
@@ -142,20 +140,22 @@ module Soaspec
|
|
142
140
|
@title = 'Deutsche Bank'
|
143
141
|
soap_action = request.env['HTTP_SOAPACTION']
|
144
142
|
return 500, 'Not valid SOAP' unless soap_action
|
143
|
+
|
145
144
|
request_body = request.body
|
146
145
|
doc = Nokogiri::XML(request_body)
|
147
146
|
soap_action = soap_action.strip # Used in ERB
|
148
147
|
blz_element = doc.at_xpath('//tns:blz')
|
149
148
|
return 500, error_response_template unless blz_element
|
149
|
+
|
150
150
|
@bank_name = blz_element.inner_text
|
151
151
|
@bank_id = @bank_name.to_i
|
152
152
|
return 500, ERB.new(bank_not_found).result(binding) if @bank_id.zero?
|
153
|
+
|
153
154
|
@title = 'DAB Bank' if @bank_id == 500
|
154
155
|
@multiple_ort = (@bank_id == 20)
|
155
156
|
ERB.new(success_response_template).result(binding)
|
156
157
|
end
|
157
|
-
|
158
158
|
end
|
159
159
|
end
|
160
160
|
end
|
161
|
-
end
|
161
|
+
end
|
@@ -5,7 +5,6 @@ module Soaspec
|
|
5
5
|
class IdManager
|
6
6
|
@developed = false
|
7
7
|
class << self
|
8
|
-
|
9
8
|
attr_accessor :developed
|
10
9
|
|
11
10
|
# @return Result depending on num, id and whether '@developed' is set
|
@@ -25,8 +24,7 @@ module Soaspec
|
|
25
24
|
'true'
|
26
25
|
end
|
27
26
|
end
|
28
|
-
|
29
27
|
end
|
30
28
|
end
|
31
29
|
end
|
32
|
-
end
|
30
|
+
end
|
data/lib/soaspec/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module Soaspec
|
2
|
-
VERSION = '0.2.
|
3
|
-
end
|
2
|
+
VERSION = '0.2.9'.freeze
|
3
|
+
end
|
data/lib/soaspec/wait.rb
CHANGED
@@ -1,14 +1,15 @@
|
|
1
|
-
|
2
1
|
module Soaspec
|
3
2
|
module WsdlGenerator
|
4
3
|
# Attempt to calculate values of enumeration by looking up type in Schema
|
5
4
|
def try_enum_for(type)
|
6
5
|
raise "'@wsdl_schemas' must be defined" if @wsdl_schemas.nil?
|
6
|
+
|
7
7
|
custom_type = @wsdl_schemas.xpath("//*[@name='#{type}']")
|
8
8
|
if enumeration? custom_type
|
9
9
|
prefix = custom_type.first.namespace.prefix
|
10
10
|
enumerations = custom_type.xpath("//#{prefix}:enumeration")
|
11
11
|
return 'Custom Type' if enumerations.empty?
|
12
|
+
|
12
13
|
@enums_values = []
|
13
14
|
enumerations.each { |enum_value| @enums_values << "'#{enum_value['value']}'" }
|
14
15
|
"~randomize [#{@enums_values.join(', ')}]"
|
@@ -21,6 +22,7 @@ module Soaspec
|
|
21
22
|
# @return [Boolean] Whether WSDL type is an enumeration
|
22
23
|
def enumeration?(type)
|
23
24
|
return false unless type.first
|
25
|
+
|
24
26
|
!type.xpath("*/#{type.first.namespace.prefix}:enumeration").empty?
|
25
27
|
end
|
26
28
|
|
@@ -62,14 +64,17 @@ module Soaspec
|
|
62
64
|
# @return [Nokogiri::XML::NodeSet] List of the root elements in the SOAP body
|
63
65
|
def root_elements_for(op_details)
|
64
66
|
raise "'@wsdl_schemas' must be defined" if @wsdl_schemas.nil?
|
67
|
+
|
65
68
|
root_element = @wsdl_schemas.at_xpath("//*[@name='#{op_details[:input]}']")
|
66
69
|
raise 'Operation has no input defined' if root_element.nil?
|
70
|
+
|
67
71
|
schema_namespace = root_element.namespace.prefix
|
68
72
|
root_type = root_element['type']
|
69
73
|
if root_type
|
70
74
|
@wsdl_schemas.xpath("//*[@name='#{root_type.split(':').last}']//#{schema_namespace}:element")
|
71
75
|
else
|
72
76
|
return [] unless complex_type? root_element # Empty Array if there are no root elements
|
77
|
+
|
73
78
|
complex_type = root_element.children.find { |c| c.name == 'complexType' }
|
74
79
|
sequence = complex_type.children.find { |c| c.name == 'sequence' }
|
75
80
|
sequence.xpath("#{schema_namespace}:element")
|
@@ -80,6 +85,7 @@ module Soaspec
|
|
80
85
|
def document_type_for(element, depth = 1)
|
81
86
|
# raise "Too far deep for #{element}" unless depth < 6
|
82
87
|
return unless depth < 6
|
88
|
+
|
83
89
|
if complex_type? element
|
84
90
|
complex_type = element.children.find { |c| c.name == 'complexType' }
|
85
91
|
sequence = complex_type.children.find { |c| c.name == 'sequence' }
|
@@ -88,9 +94,10 @@ module Soaspec
|
|
88
94
|
end
|
89
95
|
else
|
90
96
|
return "No type seen for #{element}, #{element.class}" unless element['type']
|
97
|
+
|
91
98
|
name = element['name']
|
92
99
|
type = value_after_namespace(element['type'])
|
93
|
-
@use_camel_case = true
|
100
|
+
@use_camel_case = true unless /[[:upper:]]/.match(name[0]).nil?
|
94
101
|
spaces = ' ' * depth
|
95
102
|
@content += "#{spaces}#{name.snakecase}: #{fill_in_field_from_type(type)} # #{type} \n"
|
96
103
|
end
|
@@ -100,6 +107,7 @@ module Soaspec
|
|
100
107
|
# @param [Nokogiri::XML::NodeSet] list List
|
101
108
|
def wsdl_to_yaml_for(list)
|
102
109
|
raise "'@content' string must be set" if @content.nil?
|
110
|
+
|
103
111
|
list.each do |element|
|
104
112
|
document_type_for element
|
105
113
|
end
|
@@ -142,4 +150,4 @@ User Password:
|
|
142
150
|
puts
|
143
151
|
end
|
144
152
|
end
|
145
|
-
end
|
153
|
+
end
|
data/soaspec.gemspec
CHANGED
@@ -21,16 +21,19 @@ the same configuration. Examples designed for RSpec and Cucumber."
|
|
21
21
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
22
|
spec.require_paths = ['lib']
|
23
23
|
|
24
|
-
spec.add_development_dependency 'bundler'
|
24
|
+
spec.add_development_dependency 'bundler'
|
25
25
|
spec.add_development_dependency 'cucumber'
|
26
26
|
spec.add_development_dependency 'data_magic'
|
27
27
|
spec.add_development_dependency 'factory_bot'
|
28
|
+
spec.add_development_dependency 'rack'
|
29
|
+
spec.add_development_dependency 'rack-test'
|
28
30
|
spec.add_development_dependency 'rake', '~> 12.0'
|
29
31
|
spec.add_development_dependency 'require_all', '1.5.0'
|
30
32
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
31
33
|
spec.add_development_dependency 'simplecov'
|
32
34
|
spec.add_development_dependency 'yard-cucumber'
|
33
35
|
spec.add_dependency 'activesupport'
|
36
|
+
spec.add_dependency 'colorize'
|
34
37
|
spec.add_dependency 'faker'
|
35
38
|
spec.add_dependency 'hashie'
|
36
39
|
spec.add_dependency 'jsonpath'
|
@@ -39,7 +42,9 @@ the same configuration. Examples designed for RSpec and Cucumber."
|
|
39
42
|
spec.add_dependency 'rspec', '~> 3.0' # This framework is designed to work with RSpec
|
40
43
|
spec.add_dependency 'rspec-its'
|
41
44
|
spec.add_dependency 'savon', '>= 2' # SOAP
|
42
|
-
|
45
|
+
# https://github.com/sinatra/sinatra/issues/1514 in 2.0.5 version of Sinatra breaks '?wsdl' a param with no
|
46
|
+
# Only affects Ruby < 2.4
|
47
|
+
spec.add_dependency 'sinatra', '2.0.4'
|
43
48
|
spec.add_dependency 'sinatra-basic-auth'
|
44
49
|
spec.add_dependency 'sinatra-docdsl'
|
45
50
|
spec.add_dependency 'thor'
|
data/test_wsdl.rb
CHANGED
@@ -1,15 +1,12 @@
|
|
1
|
-
|
2
1
|
require 'wasabi'
|
3
2
|
require 'savon'
|
4
3
|
|
5
|
-
|
6
|
-
#document = Savon.client(wsdl: '
|
7
|
-
#document =
|
8
|
-
#document = Wasabi.document File.read('test.wsdl')
|
4
|
+
# document = Savon.client(wsdl: 'test.wsdl').wsdl
|
5
|
+
# document = Savon.client(wsdl: 'http://www.webservicex.com/globalweather.asmx?wsdl').wsdl
|
6
|
+
# document = Wasabi.document File.read('test.wsdl')
|
9
7
|
document = Wasabi.document 'http://www.webservicex.net/ConvertTemperature.asmx?WSDL'
|
10
8
|
parser = document.parser
|
11
9
|
|
12
|
-
|
13
10
|
# TEST SCHEMA
|
14
11
|
#
|
15
12
|
# parser.schemas.each do |schema|
|
@@ -41,4 +38,4 @@ if custom_type.first
|
|
41
38
|
enumerations.each do |enum_value|
|
42
39
|
puts enum_value['value']
|
43
40
|
end
|
44
|
-
end
|
41
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: soaspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- SamuelGarrattIQA
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-01-
|
11
|
+
date: 2019-01-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '0'
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: cucumber
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +66,34 @@ dependencies:
|
|
66
66
|
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rack
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rack-test
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: rake
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +178,20 @@ dependencies:
|
|
150
178
|
- - ">="
|
151
179
|
- !ruby/object:Gem::Version
|
152
180
|
version: '0'
|
181
|
+
- !ruby/object:Gem::Dependency
|
182
|
+
name: colorize
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
184
|
+
requirements:
|
185
|
+
- - ">="
|
186
|
+
- !ruby/object:Gem::Version
|
187
|
+
version: '0'
|
188
|
+
type: :runtime
|
189
|
+
prerelease: false
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
191
|
+
requirements:
|
192
|
+
- - ">="
|
193
|
+
- !ruby/object:Gem::Version
|
194
|
+
version: '0'
|
153
195
|
- !ruby/object:Gem::Dependency
|
154
196
|
name: faker
|
155
197
|
requirement: !ruby/object:Gem::Requirement
|
@@ -266,16 +308,16 @@ dependencies:
|
|
266
308
|
name: sinatra
|
267
309
|
requirement: !ruby/object:Gem::Requirement
|
268
310
|
requirements:
|
269
|
-
- -
|
311
|
+
- - '='
|
270
312
|
- !ruby/object:Gem::Version
|
271
|
-
version:
|
313
|
+
version: 2.0.4
|
272
314
|
type: :runtime
|
273
315
|
prerelease: false
|
274
316
|
version_requirements: !ruby/object:Gem::Requirement
|
275
317
|
requirements:
|
276
|
-
- -
|
318
|
+
- - '='
|
277
319
|
- !ruby/object:Gem::Version
|
278
|
-
version:
|
320
|
+
version: 2.0.4
|
279
321
|
- !ruby/object:Gem::Dependency
|
280
322
|
name: sinatra-basic-auth
|
281
323
|
requirement: !ruby/object:Gem::Requirement
|
@@ -356,12 +398,14 @@ files:
|
|
356
398
|
- Todo.md
|
357
399
|
- exe/soaspec
|
358
400
|
- exe/xml_to_yaml_file
|
401
|
+
- images/basic_demo.gif
|
359
402
|
- lib/soaspec.rb
|
360
403
|
- lib/soaspec/core_ext/hash.rb
|
361
404
|
- lib/soaspec/cucumber/generic_steps.rb
|
362
405
|
- lib/soaspec/exchange.rb
|
363
406
|
- lib/soaspec/exchange_handlers/exchange_handler.rb
|
364
407
|
- lib/soaspec/exchange_handlers/handler_accessors.rb
|
408
|
+
- lib/soaspec/exchange_handlers/response_extractor.rb
|
365
409
|
- lib/soaspec/exchange_handlers/rest_exchanger_factory.rb
|
366
410
|
- lib/soaspec/exchange_handlers/rest_handler.rb
|
367
411
|
- lib/soaspec/exchange_handlers/rest_methods.rb
|