soaspec 0.2.33 → 0.3.1
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/.gitignore +15 -15
- data/.gitlab-ci.yml +62 -62
- data/.rspec +3 -3
- data/.rubocop.yml +2 -2
- data/CODE_OF_CONDUCT.md +74 -74
- data/ChangeLog +643 -632
- data/Dockerfile +7 -7
- data/Gemfile +8 -8
- data/LICENSE.txt +21 -21
- data/README.md +253 -231
- data/Rakefile +52 -52
- data/Todo.md +16 -16
- data/exe/soaspec +140 -138
- data/exe/xml_to_yaml_file +43 -43
- data/lib/soaspec.rb +118 -106
- data/lib/soaspec/baseline.rb +82 -22
- data/lib/soaspec/core_ext/hash.rb +44 -44
- data/lib/soaspec/cucumber/generic_steps.rb +94 -94
- data/lib/soaspec/demo.rb +6 -6
- data/lib/soaspec/errors.rb +24 -24
- data/lib/soaspec/exchange/exchange.rb +131 -129
- data/lib/soaspec/exchange/exchange_extractor.rb +105 -90
- data/lib/soaspec/exchange/exchange_properties.rb +28 -28
- data/lib/soaspec/exchange/exchange_repeater.rb +21 -21
- data/lib/soaspec/exchange/request_builder.rb +108 -70
- data/lib/soaspec/exchange/variable_storer.rb +24 -24
- data/lib/soaspec/exchange_handlers/exchange_handler.rb +98 -98
- data/lib/soaspec/exchange_handlers/exchange_handler_defaults.rb +61 -61
- data/lib/soaspec/exchange_handlers/handler_accessors.rb +132 -132
- data/lib/soaspec/exchange_handlers/request/rest_request.rb +77 -59
- data/lib/soaspec/exchange_handlers/request/soap_request.rb +41 -41
- data/lib/soaspec/exchange_handlers/response_extractor.rb +84 -84
- data/lib/soaspec/exchange_handlers/rest_exchanger_factory.rb +111 -111
- data/lib/soaspec/exchange_handlers/rest_handler.rb +307 -307
- data/lib/soaspec/exchange_handlers/rest_methods.rb +65 -65
- data/lib/soaspec/exchange_handlers/rest_parameters.rb +112 -112
- data/lib/soaspec/exchange_handlers/rest_parameters_defaults.rb +42 -42
- data/lib/soaspec/exchange_handlers/soap_handler.rb +241 -241
- data/lib/soaspec/exe_helpers.rb +94 -94
- data/lib/soaspec/generate_server.rb +48 -48
- data/lib/soaspec/generator/.rspec.erb +5 -5
- data/lib/soaspec/generator/.travis.yml.erb +5 -5
- data/lib/soaspec/generator/Gemfile.erb +8 -8
- data/lib/soaspec/generator/README.md.erb +29 -29
- data/lib/soaspec/generator/Rakefile.erb +20 -19
- data/lib/soaspec/generator/config/data/default.yml.erb +2 -2
- data/lib/soaspec/generator/css/bootstrap.css +6833 -6833
- data/lib/soaspec/generator/features/support/env.rb.erb +3 -3
- data/lib/soaspec/generator/generate_exchange.html.erb +47 -47
- data/lib/soaspec/generator/lib/blz_service.rb.erb +26 -26
- data/lib/soaspec/generator/lib/dynamic_class_content.rb.erb +12 -12
- data/lib/soaspec/generator/lib/new_rest_service.rb.erb +56 -56
- data/lib/soaspec/generator/lib/new_soap_service.rb.erb +29 -29
- data/lib/soaspec/generator/lib/package_service.rb.erb +2 -2
- data/lib/soaspec/generator/lib/shared_example.rb.erb +8 -8
- data/lib/soaspec/generator/spec/dynamic_soap_spec.rb.erb +12 -12
- data/lib/soaspec/generator/spec/rest_spec.rb.erb +9 -9
- data/lib/soaspec/generator/spec/soap_spec.rb.erb +51 -51
- data/lib/soaspec/generator/spec/spec_helper.rb.erb +23 -23
- data/lib/soaspec/generator/template/soap_template.xml +6 -6
- data/lib/soaspec/indifferent_hash.rb +9 -9
- data/lib/soaspec/interpreter.rb +70 -70
- data/lib/soaspec/matchers.rb +136 -140
- data/lib/soaspec/o_auth2.rb +142 -142
- data/lib/soaspec/soaspec_shared_examples.rb +26 -26
- data/lib/soaspec/spec_logger.rb +143 -143
- data/lib/soaspec/template_reader.rb +30 -30
- data/lib/soaspec/test_server/bank.wsdl +90 -90
- data/lib/soaspec/test_server/get_bank.rb +166 -166
- data/lib/soaspec/test_server/id_manager.rb +41 -41
- data/lib/soaspec/test_server/invoices.rb +29 -29
- data/lib/soaspec/test_server/namespace.xml +14 -14
- data/lib/soaspec/test_server/note.xml +5 -5
- data/lib/soaspec/test_server/puppy_service.rb +21 -21
- data/lib/soaspec/test_server/test_attribute.rb +14 -14
- data/lib/soaspec/test_server/test_namespace.rb +14 -14
- data/lib/soaspec/version.rb +6 -6
- data/lib/soaspec/virtual_server.rb +193 -190
- data/lib/soaspec/wait.rb +43 -43
- data/lib/soaspec/wsdl_generator.rb +215 -215
- data/soaspec.gemspec +58 -58
- data/test.wsdl +116 -116
- data/test.xml +10 -10
- data/test_wsdl.rb +43 -43
- metadata +3 -3
@@ -1,41 +1,41 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Soaspec
|
4
|
-
module TestServer
|
5
|
-
# Handles returning ids dependent on a number of factors
|
6
|
-
# Made to demonstrate creating testing a list of ids where a few return false
|
7
|
-
# when not developed and checking each value in the list can find the false value
|
8
|
-
class IdManager
|
9
|
-
# @return [Boolean] Whether to simulate a fully developed state where everything is done
|
10
|
-
@developed = false
|
11
|
-
class << self
|
12
|
-
attr_accessor :developed
|
13
|
-
|
14
|
-
# Once developed is set, everything will return true. A 'false' value represents something
|
15
|
-
# not developed
|
16
|
-
# @param [String] num Number representing tester or test number
|
17
|
-
# @param [String] id Id used in test
|
18
|
-
# @return Result depending on num, id and whether '@developed' is set
|
19
|
-
def result_for(num, id)
|
20
|
-
result = undeveloped_id(num, id) unless @developed
|
21
|
-
result || 'true'
|
22
|
-
end
|
23
|
-
|
24
|
-
# Idea is that this will return false for a particular id for different test numbers
|
25
|
-
# @param [String] num Number representing tester or test number
|
26
|
-
# @param [String] id Id used in test
|
27
|
-
# @return [String] true of false depending on num and id
|
28
|
-
def undeveloped_id(num, id)
|
29
|
-
case num
|
30
|
-
when '1', '4', '10' then 'false' if id == '40'
|
31
|
-
when '3', '11', '9' then 'false' if id == '74'
|
32
|
-
when '2', '6', '8' then 'false' if id == '80'
|
33
|
-
when '7', '5', '12' then 'false' if id == '64'
|
34
|
-
else
|
35
|
-
'true'
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Soaspec
|
4
|
+
module TestServer
|
5
|
+
# Handles returning ids dependent on a number of factors
|
6
|
+
# Made to demonstrate creating testing a list of ids where a few return false
|
7
|
+
# when not developed and checking each value in the list can find the false value
|
8
|
+
class IdManager
|
9
|
+
# @return [Boolean] Whether to simulate a fully developed state where everything is done
|
10
|
+
@developed = false
|
11
|
+
class << self
|
12
|
+
attr_accessor :developed
|
13
|
+
|
14
|
+
# Once developed is set, everything will return true. A 'false' value represents something
|
15
|
+
# not developed
|
16
|
+
# @param [String] num Number representing tester or test number
|
17
|
+
# @param [String] id Id used in test
|
18
|
+
# @return Result depending on num, id and whether '@developed' is set
|
19
|
+
def result_for(num, id)
|
20
|
+
result = undeveloped_id(num, id) unless @developed
|
21
|
+
result || 'true'
|
22
|
+
end
|
23
|
+
|
24
|
+
# Idea is that this will return false for a particular id for different test numbers
|
25
|
+
# @param [String] num Number representing tester or test number
|
26
|
+
# @param [String] id Id used in test
|
27
|
+
# @return [String] true of false depending on num and id
|
28
|
+
def undeveloped_id(num, id)
|
29
|
+
case num
|
30
|
+
when '1', '4', '10' then 'false' if id == '40'
|
31
|
+
when '3', '11', '9' then 'false' if id == '74'
|
32
|
+
when '2', '6', '8' then 'false' if id == '80'
|
33
|
+
when '7', '5', '12' then 'false' if id == '64'
|
34
|
+
else
|
35
|
+
'true'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -1,29 +1,29 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Soaspec
|
4
|
-
module TestServer
|
5
|
-
# Used to simulate requests requiring oauth authentication
|
6
|
-
class Invoices
|
7
|
-
@user_used = nil
|
8
|
-
|
9
|
-
class << self
|
10
|
-
attr_accessor :user_used
|
11
|
-
|
12
|
-
def oauth_headers
|
13
|
-
{
|
14
|
-
'Content-Type' => 'application/json;charset=UTF-8'
|
15
|
-
}
|
16
|
-
end
|
17
|
-
|
18
|
-
def oauth_body
|
19
|
-
{
|
20
|
-
access_token: 'TEST_TOKENiIsImtpZCI6IlRFU1QifQ.AAAABBBBRfaWQiOiJhYWQ5MjY3SIMULATE_LARGE_TOKEN3MmM5OGQ5NGE2YTU5YSIsImV4cCI6MTUyNzU3MTY4Mywic2NvcGUiOltdfQ.3OmCdW7fLZMUST_BE_ABLE_TO_HANDLEgAGaJB0lFYyhaw',
|
21
|
-
token_type: 'Bearer',
|
22
|
-
expires_in: '86399',
|
23
|
-
instance_url: %w[http://this_is_my_instance http://this_is_second_instance].sample
|
24
|
-
}
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Soaspec
|
4
|
+
module TestServer
|
5
|
+
# Used to simulate requests requiring oauth authentication
|
6
|
+
class Invoices
|
7
|
+
@user_used = nil
|
8
|
+
|
9
|
+
class << self
|
10
|
+
attr_accessor :user_used
|
11
|
+
|
12
|
+
def oauth_headers
|
13
|
+
{
|
14
|
+
'Content-Type' => 'application/json;charset=UTF-8'
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
def oauth_body
|
19
|
+
{
|
20
|
+
access_token: 'TEST_TOKENiIsImtpZCI6IlRFU1QifQ.AAAABBBBRfaWQiOiJhYWQ5MjY3SIMULATE_LARGE_TOKEN3MmM5OGQ5NGE2YTU5YSIsImV4cCI6MTUyNzU3MTY4Mywic2NvcGUiOltdfQ.3OmCdW7fLZMUST_BE_ABLE_TO_HANDLEgAGaJB0lFYyhaw',
|
21
|
+
token_type: 'Bearer',
|
22
|
+
expires_in: '86399',
|
23
|
+
instance_url: %w[http://this_is_my_instance http://this_is_second_instance].sample
|
24
|
+
}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,15 +1,15 @@
|
|
1
|
-
<root>
|
2
|
-
<h:table xmlns:h="http://www.w3.org/TR/html4/">
|
3
|
-
<h:tr>
|
4
|
-
<h:td>Apples</h:td>
|
5
|
-
<h:td>Bananas</h:td>
|
6
|
-
</h:tr>
|
7
|
-
</h:table>
|
8
|
-
|
9
|
-
<f:table xmlns:f="https://www.w3schools.com/furniture">
|
10
|
-
<f:td>Wood</f:td>
|
11
|
-
<f:name>African Coffee Table</f:name>
|
12
|
-
<f:width>80</f:width>
|
13
|
-
<f:length>120</f:length>
|
14
|
-
</f:table>
|
1
|
+
<root>
|
2
|
+
<h:table xmlns:h="http://www.w3.org/TR/html4/">
|
3
|
+
<h:tr>
|
4
|
+
<h:td>Apples</h:td>
|
5
|
+
<h:td>Bananas</h:td>
|
6
|
+
</h:tr>
|
7
|
+
</h:table>
|
8
|
+
|
9
|
+
<f:table xmlns:f="https://www.w3schools.com/furniture">
|
10
|
+
<f:td>Wood</f:td>
|
11
|
+
<f:name>African Coffee Table</f:name>
|
12
|
+
<f:width>80</f:width>
|
13
|
+
<f:length>120</f:length>
|
14
|
+
</f:table>
|
15
15
|
</root>
|
@@ -1,6 +1,6 @@
|
|
1
|
-
<note date="2008-01-10">
|
2
|
-
<to>Tove</to>
|
3
|
-
<from>Jani</from>
|
4
|
-
<comment_line>First comment</comment_line>
|
5
|
-
<comment_line>Second comment</comment_line>
|
1
|
+
<note date="2008-01-10">
|
2
|
+
<to>Tove</to>
|
3
|
+
<from>Jani</from>
|
4
|
+
<comment_line>First comment</comment_line>
|
5
|
+
<comment_line>Second comment</comment_line>
|
6
6
|
</note>
|
@@ -1,21 +1,21 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Soaspec
|
4
|
-
module TestServer
|
5
|
-
# Simulates ordering a new puppy. Used for testing REST storing, retrieving and updating data
|
6
|
-
class PuppyService
|
7
|
-
@data = {}
|
8
|
-
@current_id = 1
|
9
|
-
class << self
|
10
|
-
attr_accessor :data
|
11
|
-
|
12
|
-
def new_id
|
13
|
-
@data[@current_id] = {}
|
14
|
-
@data[@current_id][:Id] = @current_id
|
15
|
-
@current_id += 1
|
16
|
-
@current_id - 1
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Soaspec
|
4
|
+
module TestServer
|
5
|
+
# Simulates ordering a new puppy. Used for testing REST storing, retrieving and updating data
|
6
|
+
class PuppyService
|
7
|
+
@data = {}
|
8
|
+
@current_id = 1
|
9
|
+
class << self
|
10
|
+
attr_accessor :data
|
11
|
+
|
12
|
+
def new_id
|
13
|
+
@data[@current_id] = {}
|
14
|
+
@data[@current_id][:Id] = @current_id
|
15
|
+
@current_id += 1
|
16
|
+
@current_id - 1
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -1,14 +1,14 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Soaspec
|
4
|
-
module TestServer
|
5
|
-
# Helps tests attribute methods
|
6
|
-
class TestAttribute
|
7
|
-
class << self
|
8
|
-
def note
|
9
|
-
File.read(File.join(File.dirname(__FILE__), 'note.xml'))
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Soaspec
|
4
|
+
module TestServer
|
5
|
+
# Helps tests attribute methods
|
6
|
+
class TestAttribute
|
7
|
+
class << self
|
8
|
+
def note
|
9
|
+
File.read(File.join(File.dirname(__FILE__), 'note.xml'))
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -1,14 +1,14 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Soaspec
|
4
|
-
module TestServer
|
5
|
-
# Helps tests attribute methods
|
6
|
-
class TestNamespace
|
7
|
-
class << self
|
8
|
-
def food
|
9
|
-
File.read(File.join(File.dirname(__FILE__), 'namespace.xml'))
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Soaspec
|
4
|
+
module TestServer
|
5
|
+
# Helps tests attribute methods
|
6
|
+
class TestNamespace
|
7
|
+
class << self
|
8
|
+
def food
|
9
|
+
File.read(File.join(File.dirname(__FILE__), 'namespace.xml'))
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/soaspec/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Soaspec
|
4
|
-
# @return [String] Version of the gem
|
5
|
-
VERSION = '0.
|
6
|
-
end
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Soaspec
|
4
|
+
# @return [String] Version of the gem
|
5
|
+
VERSION = '0.3.1'
|
6
|
+
end
|
@@ -1,190 +1,193 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require 'soaspec'
|
4
|
-
require 'sinatra'
|
5
|
-
require 'sinatra/basic_auth'
|
6
|
-
require 'docdsl'
|
7
|
-
require 'nokogiri'
|
8
|
-
require 'erb'
|
9
|
-
require 'json'
|
10
|
-
require 'faker'
|
11
|
-
require 'soaspec/test_server/get_bank'
|
12
|
-
require 'soaspec/test_server/test_attribute'
|
13
|
-
require 'soaspec/test_server/puppy_service'
|
14
|
-
require 'soaspec/test_server/invoices'
|
15
|
-
require 'soaspec/test_server/test_namespace'
|
16
|
-
require 'soaspec/test_server/id_manager'
|
17
|
-
|
18
|
-
module Soaspec
|
19
|
-
# Used to run virtual web service on localhost. This makes tests more reliable and faster
|
20
|
-
# First argument overrides the default port
|
21
|
-
class VirtualServer < Sinatra::Application
|
22
|
-
set :bind, '0.0.0.0'
|
23
|
-
set :port, (ENV['port'] || 4999).to_i
|
24
|
-
|
25
|
-
register Sinatra::DocDsl
|
26
|
-
|
27
|
-
page do
|
28
|
-
title 'Soaspec Virtual Services'
|
29
|
-
header 'Perform efficient API testing with Ruby'
|
30
|
-
introduction 'This has some simple virtual services aimed at helping you with testing your Ruby API code.'
|
31
|
-
end
|
32
|
-
|
33
|
-
documentation 'Nothing under /. Go look at /docs' do
|
34
|
-
response 'redirects to the documentation page'
|
35
|
-
status 302
|
36
|
-
end
|
37
|
-
get '/' do
|
38
|
-
redirect '/docs'
|
39
|
-
end
|
40
|
-
|
41
|
-
doc_endpoint '/docs'
|
42
|
-
|
43
|
-
documentation 'Simulate server error' do
|
44
|
-
status 500
|
45
|
-
end
|
46
|
-
get '/server_error' do
|
47
|
-
[500, {}, 'Internal Server Error']
|
48
|
-
end
|
49
|
-
|
50
|
-
documentation 'Used to verify extract from text response' do
|
51
|
-
response 'Plain text with a pattern to match in it'
|
52
|
-
end
|
53
|
-
get '/text_response' do
|
54
|
-
'This is some text. In here it says ID=12345 to indicate value to obtain'
|
55
|
-
end
|
56
|
-
|
57
|
-
documentation 'Used to demonstrate a multi layered path' do
|
58
|
-
response 'Simple xml'
|
59
|
-
end
|
60
|
-
get '/this/is/a/long/path' do
|
61
|
-
'<long><path>Text from drilling down to a long path</path></long>'
|
62
|
-
end
|
63
|
-
|
64
|
-
documentation 'Used to demonstrate response that could be baselined' do
|
65
|
-
response 'JSON varying according to request params'
|
66
|
-
end
|
67
|
-
get '/baseline
|
68
|
-
JSON.
|
69
|
-
end
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
end
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
end
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
'
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
end
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
end
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
'Secret
|
136
|
-
end
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
JSON.
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
{"price":
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'soaspec'
|
4
|
+
require 'sinatra'
|
5
|
+
require 'sinatra/basic_auth'
|
6
|
+
require 'docdsl'
|
7
|
+
require 'nokogiri'
|
8
|
+
require 'erb'
|
9
|
+
require 'json'
|
10
|
+
require 'faker'
|
11
|
+
require 'soaspec/test_server/get_bank'
|
12
|
+
require 'soaspec/test_server/test_attribute'
|
13
|
+
require 'soaspec/test_server/puppy_service'
|
14
|
+
require 'soaspec/test_server/invoices'
|
15
|
+
require 'soaspec/test_server/test_namespace'
|
16
|
+
require 'soaspec/test_server/id_manager'
|
17
|
+
|
18
|
+
module Soaspec
|
19
|
+
# Used to run virtual web service on localhost. This makes tests more reliable and faster
|
20
|
+
# First argument overrides the default port
|
21
|
+
class VirtualServer < Sinatra::Application
|
22
|
+
set :bind, '0.0.0.0'
|
23
|
+
set :port, (ENV['port'] || 4999).to_i
|
24
|
+
|
25
|
+
register Sinatra::DocDsl
|
26
|
+
|
27
|
+
page do
|
28
|
+
title 'Soaspec Virtual Services'
|
29
|
+
header 'Perform efficient API testing with Ruby'
|
30
|
+
introduction 'This has some simple virtual services aimed at helping you with testing your Ruby API code.'
|
31
|
+
end
|
32
|
+
|
33
|
+
documentation 'Nothing under /. Go look at /docs' do
|
34
|
+
response 'redirects to the documentation page'
|
35
|
+
status 302
|
36
|
+
end
|
37
|
+
get '/' do
|
38
|
+
redirect '/docs'
|
39
|
+
end
|
40
|
+
|
41
|
+
doc_endpoint '/docs'
|
42
|
+
|
43
|
+
documentation 'Simulate server error' do
|
44
|
+
status 500
|
45
|
+
end
|
46
|
+
get '/server_error' do
|
47
|
+
[500, {}, 'Internal Server Error']
|
48
|
+
end
|
49
|
+
|
50
|
+
documentation 'Used to verify extract from text response' do
|
51
|
+
response 'Plain text with a pattern to match in it'
|
52
|
+
end
|
53
|
+
get '/text_response' do
|
54
|
+
'This is some text. In here it says ID=12345 to indicate value to obtain'
|
55
|
+
end
|
56
|
+
|
57
|
+
documentation 'Used to demonstrate a multi layered path' do
|
58
|
+
response 'Simple xml'
|
59
|
+
end
|
60
|
+
get '/this/is/a/long/path' do
|
61
|
+
'<long><path>Text from drilling down to a long path</path></long>'
|
62
|
+
end
|
63
|
+
|
64
|
+
documentation 'Used to demonstrate response that could be baselined' do
|
65
|
+
response 'JSON varying according to request params'
|
66
|
+
end
|
67
|
+
get '/baseline' do
|
68
|
+
JSON.pretty_generate(success: true, params: 'Empty')
|
69
|
+
end
|
70
|
+
get '/baseline/:sub1/:sub2' do
|
71
|
+
JSON.generate(success: true, params: params)
|
72
|
+
end
|
73
|
+
|
74
|
+
documentation 'Used to test attributes' do
|
75
|
+
response 'A simple Note XML with a date attribute'
|
76
|
+
end
|
77
|
+
get '/test_attribute' do
|
78
|
+
Soaspec::TestServer::TestAttribute.note
|
79
|
+
end
|
80
|
+
|
81
|
+
documentation 'Used to test namespaces' do
|
82
|
+
response 'XML with 2 namespaces and same elements inside it'
|
83
|
+
end
|
84
|
+
get '/namespace' do
|
85
|
+
Soaspec::TestServer::TestNamespace.food
|
86
|
+
end
|
87
|
+
|
88
|
+
documentation 'Used for showing a simple difference in value depending on the id used' do
|
89
|
+
param :num, 'Number of tester'
|
90
|
+
param :id, 'Test parameter'
|
91
|
+
response 'JSON with success or true or false and the id sent
|
92
|
+
Idea is for tester to find the id that causes a failure (the fake "defect")
|
93
|
+
'
|
94
|
+
end
|
95
|
+
get '/packages/:num/:id' do |num, id|
|
96
|
+
JSON.generate(success: Soaspec::TestServer::IdManager.result_for(num, id), id: id)
|
97
|
+
end
|
98
|
+
|
99
|
+
documentation 'Sets status as developed'
|
100
|
+
post '/packages/developed' do
|
101
|
+
Soaspec::TestServer::IdManager.developed = request.body.include?('true')
|
102
|
+
Soaspec::TestServer::IdManager.developed.to_s
|
103
|
+
end
|
104
|
+
|
105
|
+
# Used for simple testing of posing
|
106
|
+
documentation 'Simply sends the response body back'
|
107
|
+
post '/echoer' do
|
108
|
+
request.body
|
109
|
+
end
|
110
|
+
|
111
|
+
documentation "Simulate retrieving an ouath token Passed to '/invoices'"
|
112
|
+
post '/as/token.oauth2' do
|
113
|
+
Soaspec::TestServer::Invoices.user_used = request.env['rack.request.form_hash']['username']
|
114
|
+
[200, Soaspec::TestServer::Invoices.oauth_headers, JSON.generate(Soaspec::TestServer::Invoices.oauth_body)]
|
115
|
+
end
|
116
|
+
|
117
|
+
documentation 'Replies with HTTP authorization and user set in /as/token.oauth2'
|
118
|
+
get '/invoice/:id' do |id|
|
119
|
+
JSON.generate(customer_id: id, oauth: request.env['HTTP_AUTHORIZATION'], user: Soaspec::TestServer::Invoices.user_used)
|
120
|
+
end
|
121
|
+
|
122
|
+
documentation 'This is returned when a query for the WSDL is made' do
|
123
|
+
response 'WSDL containing SCHEMA information'
|
124
|
+
end
|
125
|
+
get '/BLZService' do
|
126
|
+
[200, { 'Content-Type' => 'text/xml' }, Soaspec::TestServer::GetBank.test_wsdl]
|
127
|
+
end
|
128
|
+
|
129
|
+
authorize do |username, password|
|
130
|
+
username == 'admin' && password == 'secret'
|
131
|
+
end
|
132
|
+
|
133
|
+
protect do
|
134
|
+
documentation "Get path used to test basic auth. User is 'admin' & password is 'secret'" do
|
135
|
+
response 'Secret text'
|
136
|
+
end
|
137
|
+
get '/basic_secrets' do
|
138
|
+
'Secret data'
|
139
|
+
end
|
140
|
+
|
141
|
+
documentation 'This is the basic service being hit by SOAP actions'
|
142
|
+
post '/BLZService' do
|
143
|
+
Soaspec::TestServer::GetBank.response_for request
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
documentation 'Used for testing storage of data' do
|
148
|
+
payload 'Puppy JSON',
|
149
|
+
Name: 'Test', Failure_Type__c: 'Fail'
|
150
|
+
end
|
151
|
+
post '/test/puppy' do
|
152
|
+
request_hash = JSON.parse(request.body.string)
|
153
|
+
id = Soaspec::TestServer::PuppyService.new_id
|
154
|
+
Soaspec::TestServer::PuppyService.data[id][:Name] = request_hash['Name']
|
155
|
+
Soaspec::TestServer::PuppyService.data[id][:Failure_Type__c] = request_hash['Failure_Type__c'] if request_hash['Failure_Type__c']
|
156
|
+
response_hash = { result: { Status: 'success', Data: Soaspec::TestServer::PuppyService.data[id] } }
|
157
|
+
JSON.generate response_hash
|
158
|
+
end
|
159
|
+
|
160
|
+
documentation 'Used for testing retrieving storage of data'
|
161
|
+
get '/test/puppy/:id' do |id|
|
162
|
+
result = Soaspec::TestServer::PuppyService.data[id.to_i]
|
163
|
+
JSON.generate result
|
164
|
+
end
|
165
|
+
|
166
|
+
documentation 'Used for testing updating data'
|
167
|
+
patch '/test/puppy/:id' do |id|
|
168
|
+
request_hash = JSON.parse(request.body.string)
|
169
|
+
Soaspec::TestServer::PuppyService.data[id.to_i][:Name] = request_hash['Name']
|
170
|
+
response_hash = { result: { Status: 'updated', With: request_hash['Name'] } }
|
171
|
+
JSON.generate response_hash
|
172
|
+
end
|
173
|
+
|
174
|
+
documentation 'Used for testing the handling of JSON path' do
|
175
|
+
response 'JSON with multiple elements of the same name at different nested levels'
|
176
|
+
end
|
177
|
+
get '/test/multiple_json' do
|
178
|
+
<<-BOOKS
|
179
|
+
{"store":
|
180
|
+
{"bicycle":
|
181
|
+
{"price":19.95, "color":"red"},
|
182
|
+
"book":[
|
183
|
+
{"price":8.95, "category":"reference", "title":"Sayings of the Century", "author":"Nigel Rees"},
|
184
|
+
{"price":12.99, "category":"fiction", "title":"Sword of Honour", "author":"Evelyn Waugh"},
|
185
|
+
{"price":8.99, "category":"fiction", "isbn":"0-553-21311-3", "title":"Moby Dick", "author":"Herman Melville","color":"blue"},
|
186
|
+
{"price":22.99, "category":"fiction", "isbn":"0-395-19395-8", "title":"The Lord of the Rings", "author":"Tolkien"}
|
187
|
+
]
|
188
|
+
}
|
189
|
+
}
|
190
|
+
BOOKS
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|