soaspec 0.0.81 → 0.0.82

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.
Files changed (59) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +15 -15
  3. data/.gitlab-ci.yml +31 -31
  4. data/.rspec +3 -3
  5. data/.rubocop.yml +2 -2
  6. data/.travis.yml +5 -5
  7. data/CODE_OF_CONDUCT.md +74 -74
  8. data/ChangeLog +345 -341
  9. data/Gemfile +6 -6
  10. data/LICENSE.txt +21 -21
  11. data/README.md +85 -85
  12. data/Rakefile +24 -24
  13. data/Todo.md +6 -6
  14. data/exe/soaspec +123 -123
  15. data/exe/soaspec-virtual-server +98 -92
  16. data/exe/xml_to_yaml_file +60 -60
  17. data/lib/soaspec.rb +86 -85
  18. data/lib/soaspec/core_ext/hash.rb +83 -83
  19. data/lib/soaspec/exchange.rb +230 -230
  20. data/lib/soaspec/exchange_handlers/exchange_handler.rb +98 -98
  21. data/lib/soaspec/exchange_handlers/handler_accessors.rb +95 -95
  22. data/lib/soaspec/exchange_handlers/rest_handler.rb +367 -367
  23. data/lib/soaspec/exchange_handlers/rest_methods.rb +44 -44
  24. data/lib/soaspec/exchange_handlers/soap_handler.rb +231 -231
  25. data/lib/soaspec/exe_helpers.rb +56 -56
  26. data/lib/soaspec/generator/.rspec.erb +5 -5
  27. data/lib/soaspec/generator/.travis.yml.erb +5 -5
  28. data/lib/soaspec/generator/Gemfile.erb +8 -8
  29. data/lib/soaspec/generator/README.md.erb +29 -29
  30. data/lib/soaspec/generator/Rakefile.erb +19 -19
  31. data/lib/soaspec/generator/config/data/default.yml.erb +1 -1
  32. data/lib/soaspec/generator/lib/blz_service.rb.erb +24 -24
  33. data/lib/soaspec/generator/lib/dynamic_class_content.rb.erb +12 -12
  34. data/lib/soaspec/generator/lib/shared_example.rb.erb +8 -8
  35. data/lib/soaspec/generator/spec/dynamic_soap_spec.rb.erb +14 -14
  36. data/lib/soaspec/generator/spec/soap_spec.rb.erb +53 -53
  37. data/lib/soaspec/generator/spec/spec_helper.rb.erb +20 -20
  38. data/lib/soaspec/generator/template/soap_template.xml +6 -6
  39. data/lib/soaspec/interpreter.rb +25 -25
  40. data/lib/soaspec/matchers.rb +65 -65
  41. data/lib/soaspec/not_found_errors.rb +13 -13
  42. data/lib/soaspec/soaspec_shared_examples.rb +24 -24
  43. data/lib/soaspec/spec_logger.rb +27 -27
  44. data/lib/soaspec/test_server/bank.wsdl +90 -90
  45. data/lib/soaspec/test_server/get_bank.rb +160 -160
  46. data/lib/soaspec/test_server/invoices.rb +27 -27
  47. data/lib/soaspec/test_server/namespace.xml +15 -0
  48. data/lib/soaspec/test_server/note.xml +5 -5
  49. data/lib/soaspec/test_server/puppy_service.rb +20 -20
  50. data/lib/soaspec/test_server/test_attribute.rb +13 -13
  51. data/lib/soaspec/test_server/test_namespace.rb +13 -0
  52. data/lib/soaspec/version.rb +2 -2
  53. data/lib/soaspec/wsdl_generator.rb +93 -93
  54. data/soaspec.gemspec +45 -45
  55. data/test.wsdl +116 -116
  56. data/test.xml +10 -10
  57. data/test_rest.rb +97 -97
  58. data/test_wsdl.rb +43 -43
  59. metadata +5 -3
@@ -1,93 +1,99 @@
1
- #!/usr/bin/env ruby
2
-
3
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
4
- require 'soaspec'
5
- require 'sinatra'
6
- require 'sinatra/basic_auth'
7
- require 'nokogiri'
8
- require 'erb'
9
- require 'json'
10
- require 'faker'
11
-
12
- class SoaspecVirtualServer < Sinatra::Application
13
-
14
- # Used to run virtual web service on localhost. This makes tests more reliable and faster
15
-
16
- set :port, 4999
17
-
18
- # Used to test attributes
19
- get '/test_attribute' do
20
- Soaspec::TestServer::TestAttribute.note
21
- end
22
-
23
- # This is the one being hit by SOAP actions
24
- post '/BLZService' do
25
- Soaspec::TestServer::GetBank.response_for request
26
- end
27
-
28
- # This is returned when a query for the WSDL is made
29
- get '/BLZService' do
30
- [200, { 'Content-Type' => 'text/xml' }, Soaspec::TestServer::GetBank.test_wsdl]
31
- end
32
-
33
- # Simulate retrieving an ouath token. Passed to '/invoices'
34
- post '/as/token.oauth2' do
35
- Soaspec::TestServer::Invoices.user_used = request.env['rack.request.form_hash']['username']
36
- [200, Soaspec::TestServer::Invoices.oauth_headers, JSON.generate(Soaspec::TestServer::Invoices.oauth_body)]
37
- end
38
-
39
- get '/invoice/:id' do |id|
40
- JSON.generate(customer_id: id, oauth: request.env['HTTP_AUTHORIZATION'], user: Soaspec::TestServer::Invoices.user_used)
41
- end
42
-
43
- authorize do |username, password|
44
- username == 'admin' && password == 'secret'
45
- end
46
-
47
- protect do
48
- get '/basic_secrets' do
49
- 'Secret data'
50
- end
51
- end
52
-
53
- # Used for testing storage of data
54
- post '/test/puppy' do
55
- request_hash = JSON.parse(request.body.string)
56
- id = Soaspec::TestServer::PuppyService.new_id
57
- Soaspec::TestServer::PuppyService.data[id][:Name] = request_hash['Name']
58
- Soaspec::TestServer::PuppyService.data[id][:Failure_Type__c] = request_hash['Failure_Type__c'] if request_hash['Failure_Type__c']
59
- response_hash = { result: { Status: 'success', Data: Soaspec::TestServer::PuppyService.data[id] } }
60
- JSON.generate response_hash
61
- end
62
-
63
- # Used for testing retrieving storage of data
64
- get '/test/puppy/:id' do |id|
65
- result = Soaspec::TestServer::PuppyService.data[id.to_i]
66
- JSON.generate result
67
- end
68
-
69
- get '/test/multiple_json' do
70
- <<-BOOKS
71
- {"store":
72
- {"bicycle":
73
- {"price":19.95, "color":"red"},
74
- "book":[
75
- {"price":8.95, "category":"reference", "title":"Sayings of the Century", "author":"Nigel Rees"},
76
- {"price":12.99, "category":"fiction", "title":"Sword of Honour", "author":"Evelyn Waugh"},
77
- {"price":8.99, "category":"fiction", "isbn":"0-553-21311-3", "title":"Moby Dick", "author":"Herman Melville","color":"blue"},
78
- {"price":22.99, "category":"fiction", "isbn":"0-395-19395-8", "title":"The Lord of the Rings", "author":"Tolkien"}
79
- ]
80
- }
81
- }
82
- BOOKS
83
- end
84
-
85
- patch '/test/puppy/:id' do |id|
86
- request_hash = JSON.parse(request.body.string)
87
- Soaspec::TestServer::PuppyService.data[id.to_i][:Name] = request_hash['Name']
88
- response_hash = { result: { Status: 'updated', With: request_hash['Name'] } }
89
- JSON.generate response_hash
90
- end
91
- end
92
-
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
4
+ require 'soaspec'
5
+ require 'sinatra'
6
+ require 'sinatra/basic_auth'
7
+ require 'nokogiri'
8
+ require 'erb'
9
+ require 'json'
10
+ require 'faker'
11
+
12
+ class SoaspecVirtualServer < Sinatra::Application
13
+
14
+ # Used to run virtual web service on localhost. This makes tests more reliable and faster
15
+
16
+ set :port, 4999
17
+
18
+ # Used to test attributes
19
+ get '/test_attribute' do
20
+ Soaspec::TestServer::TestAttribute.note
21
+ end
22
+
23
+ # Used to test attributes
24
+ get '/namespace' do
25
+ # Soaspec::TestServer::TestAttribute.note
26
+ Soaspec::TestServer::TestNamespace.food
27
+ end
28
+
29
+ # This is the one being hit by SOAP actions
30
+ post '/BLZService' do
31
+ Soaspec::TestServer::GetBank.response_for request
32
+ end
33
+
34
+ # This is returned when a query for the WSDL is made
35
+ get '/BLZService' do
36
+ [200, { 'Content-Type' => 'text/xml' }, Soaspec::TestServer::GetBank.test_wsdl]
37
+ end
38
+
39
+ # Simulate retrieving an ouath token. Passed to '/invoices'
40
+ post '/as/token.oauth2' do
41
+ Soaspec::TestServer::Invoices.user_used = request.env['rack.request.form_hash']['username']
42
+ [200, Soaspec::TestServer::Invoices.oauth_headers, JSON.generate(Soaspec::TestServer::Invoices.oauth_body)]
43
+ end
44
+
45
+ get '/invoice/:id' do |id|
46
+ JSON.generate(customer_id: id, oauth: request.env['HTTP_AUTHORIZATION'], user: Soaspec::TestServer::Invoices.user_used)
47
+ end
48
+
49
+ authorize do |username, password|
50
+ username == 'admin' && password == 'secret'
51
+ end
52
+
53
+ protect do
54
+ get '/basic_secrets' do
55
+ 'Secret data'
56
+ end
57
+ end
58
+
59
+ # Used for testing storage of data
60
+ post '/test/puppy' do
61
+ request_hash = JSON.parse(request.body.string)
62
+ id = Soaspec::TestServer::PuppyService.new_id
63
+ Soaspec::TestServer::PuppyService.data[id][:Name] = request_hash['Name']
64
+ Soaspec::TestServer::PuppyService.data[id][:Failure_Type__c] = request_hash['Failure_Type__c'] if request_hash['Failure_Type__c']
65
+ response_hash = { result: { Status: 'success', Data: Soaspec::TestServer::PuppyService.data[id] } }
66
+ JSON.generate response_hash
67
+ end
68
+
69
+ # Used for testing retrieving storage of data
70
+ get '/test/puppy/:id' do |id|
71
+ result = Soaspec::TestServer::PuppyService.data[id.to_i]
72
+ JSON.generate result
73
+ end
74
+
75
+ get '/test/multiple_json' do
76
+ <<-BOOKS
77
+ {"store":
78
+ {"bicycle":
79
+ {"price":19.95, "color":"red"},
80
+ "book":[
81
+ {"price":8.95, "category":"reference", "title":"Sayings of the Century", "author":"Nigel Rees"},
82
+ {"price":12.99, "category":"fiction", "title":"Sword of Honour", "author":"Evelyn Waugh"},
83
+ {"price":8.99, "category":"fiction", "isbn":"0-553-21311-3", "title":"Moby Dick", "author":"Herman Melville","color":"blue"},
84
+ {"price":22.99, "category":"fiction", "isbn":"0-395-19395-8", "title":"The Lord of the Rings", "author":"Tolkien"}
85
+ ]
86
+ }
87
+ }
88
+ BOOKS
89
+ end
90
+
91
+ patch '/test/puppy/:id' do |id|
92
+ request_hash = JSON.parse(request.body.string)
93
+ Soaspec::TestServer::PuppyService.data[id.to_i][:Name] = request_hash['Name']
94
+ response_hash = { result: { Status: 'updated', With: request_hash['Name'] } }
95
+ JSON.generate response_hash
96
+ end
97
+ end
98
+
93
99
  SoaspecVirtualServer.run!
data/exe/xml_to_yaml_file CHANGED
@@ -1,61 +1,61 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'xmlsimple'
4
- require 'yaml'
5
- require 'fileutils'
6
-
7
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
8
-
9
- require 'soaspec'
10
-
11
- include Soaspec::ExeHelpers
12
-
13
- default_output_file = 'output.yml'
14
-
15
- # Create file if not present. If present but different give warning
16
- def create_file(options)
17
- filename = options[:filename]
18
- raise 'Need to pass filename' unless filename
19
- content = options[:content]
20
- raise 'Need to pass contents to insert into file' unless content
21
- if File.exist? filename
22
- old_content = File.read(filename)
23
- if old_content != content
24
- warn "!! #{filename} already exists and differs from template"
25
- end
26
- else
27
- File.open(filename, 'w') do |f|
28
- f.puts content
29
- end
30
- puts 'Created: ' + filename
31
- end
32
- end
33
-
34
- # For all keys in a Hash, convert Camelcase to underscore separated
35
- def convert_hash_keys(value)
36
- case value
37
- when Array
38
- value.map { |v| convert_hash_keys(v) }
39
- when Hash
40
- Hash[value.map { |k, v| [k.snakecase, convert_hash_keys(v)] }]
41
- else
42
- value
43
- end
44
- end
45
-
46
- # Remove arrays created as another string
47
- def clean_up_yaml(yaml_string)
48
- yaml_string = yaml_string.gsub(/\R+(\s*)-/, '').gsub(/{}/, "''") # Remove arrays, {} -> ''
49
- # Insert new line where there are 2 ':' on 1 line. Issue from first gsub
50
- yaml_string.gsub(/:(\s)(\w*):/){|s| s.insert(1, "\n")}
51
- end
52
-
53
- if ARGV[0]
54
- warn "Using '#{default_output_file}' as default output file since no 2nd argument passed" unless ARGV[1]
55
- hash = XmlSimple.xml_in(ARGV[0])
56
- converted = convert_hash_keys hash
57
- yaml_file = clean_up_yaml(converted.to_yaml)
58
- create_file(filename: ARGV[1] || default_output_file, content: yaml_file)
59
- else
60
- puts 'usage: xml_to_yaml_file [input.xml] [output.yml] '
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'xmlsimple'
4
+ require 'yaml'
5
+ require 'fileutils'
6
+
7
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
8
+
9
+ require 'soaspec'
10
+
11
+ include Soaspec::ExeHelpers
12
+
13
+ default_output_file = 'output.yml'
14
+
15
+ # Create file if not present. If present but different give warning
16
+ def create_file(options)
17
+ filename = options[:filename]
18
+ raise 'Need to pass filename' unless filename
19
+ content = options[:content]
20
+ raise 'Need to pass contents to insert into file' unless content
21
+ if File.exist? filename
22
+ old_content = File.read(filename)
23
+ if old_content != content
24
+ warn "!! #{filename} already exists and differs from template"
25
+ end
26
+ else
27
+ File.open(filename, 'w') do |f|
28
+ f.puts content
29
+ end
30
+ puts 'Created: ' + filename
31
+ end
32
+ end
33
+
34
+ # For all keys in a Hash, convert Camelcase to underscore separated
35
+ def convert_hash_keys(value)
36
+ case value
37
+ when Array
38
+ value.map { |v| convert_hash_keys(v) }
39
+ when Hash
40
+ Hash[value.map { |k, v| [k.snakecase, convert_hash_keys(v)] }]
41
+ else
42
+ value
43
+ end
44
+ end
45
+
46
+ # Remove arrays created as another string
47
+ def clean_up_yaml(yaml_string)
48
+ yaml_string = yaml_string.gsub(/\R+(\s*)-/, '').gsub(/{}/, "''") # Remove arrays, {} -> ''
49
+ # Insert new line where there are 2 ':' on 1 line. Issue from first gsub
50
+ yaml_string.gsub(/:(\s)(\w*):/){|s| s.insert(1, "\n")}
51
+ end
52
+
53
+ if ARGV[0]
54
+ warn "Using '#{default_output_file}' as default output file since no 2nd argument passed" unless ARGV[1]
55
+ hash = XmlSimple.xml_in(ARGV[0])
56
+ converted = convert_hash_keys hash
57
+ yaml_file = clean_up_yaml(converted.to_yaml)
58
+ create_file(filename: ARGV[1] || default_output_file, content: yaml_file)
59
+ else
60
+ puts 'usage: xml_to_yaml_file [input.xml] [output.yml] '
61
61
  end
data/lib/soaspec.rb CHANGED
@@ -1,85 +1,86 @@
1
- require 'rest-client' # REST
2
- require 'erb' # Embedded ruby
3
- require 'yaml' # Reading yaml
4
- require 'rspec' # Testing framework
5
- require 'rspec/its'
6
- require 'savon' # SOAP
7
- require 'nokogiri' # XPath
8
- require 'date'
9
- require 'jsonpath'
10
-
11
- require 'soaspec/version'
12
- require 'soaspec/exchange_handlers/soap_handler'
13
- require 'soaspec/exchange_handlers/exchange_handler'
14
- require 'soaspec/exchange_handlers/rest_methods'
15
- require 'soaspec/exchange'
16
- require 'soaspec/matchers'
17
- require 'soaspec/soaspec_shared_examples'
18
- require 'soaspec/core_ext/hash'
19
- require 'soaspec/spec_logger'
20
- require 'soaspec/exe_helpers'
21
- require 'soaspec/exchange_handlers/rest_handler'
22
- require 'soaspec/exchange_handlers/handler_accessors'
23
- require 'soaspec/interpreter'
24
- require 'soaspec/not_found_errors'
25
- require 'soaspec/test_server/get_bank'
26
- require 'soaspec/test_server/test_attribute'
27
- require 'soaspec/test_server/puppy_service'
28
- require 'soaspec/test_server/invoices'
29
- require 'soaspec/wsdl_generator'
30
-
31
- # Gem for handling SOAP and REST api tests
32
- module Soaspec
33
-
34
- class << self
35
-
36
- # Folder used to store credentials
37
- # Used in auth2_file command
38
- # @param [String] folder
39
- def credentials_folder=(folder)
40
- @credentials_folder = folder
41
- end
42
-
43
- # Credentials folder used to store secret data (not in source control) E.g passwords
44
- def credentials_folder
45
- @credentials_folder
46
- end
47
-
48
- # Used so that exchange class knows what context it's in
49
- # @param [ExchangeHandler] handler A class inheriting from Soaspec::ExchangeHandler. Exchange class uses this
50
- def api_handler=(handler)
51
- @api_handler = handler
52
- end
53
-
54
- # Exchange Handler class currently being used
55
- def api_handler
56
- @api_handler
57
- end
58
-
59
- # Set whether to transform strings to keys in request automatically
60
- # @param [Boolean] use_keys
61
- def always_use_keys=(use_keys)
62
- @always_use_keys = use_keys
63
- end
64
-
65
- # @return [Boolean] Whether to transform strings to keys in request automatically
66
- def always_use_keys?
67
- @always_use_keys || true
68
- end
69
-
70
- # Whether to remove namespaces from response in Xpath assertion automatically
71
- # For why this may not be a good thing in general see
72
- # http://tenderlovemaking.com/2009/04/23/namespaces-in-xml.html
73
- # This will be overridden if xpath has a ':' in it
74
- def strip_namespaces=(remove_namespaces)
75
- @strip_namespaces = remove_namespaces
76
- end
77
-
78
- # Whether to remove namespaces in xpath assertion automatically
79
- def strip_namespaces?
80
- @strip_namespaces || false
81
- end
82
- end
83
- end
84
-
85
- RestClient.log = Soaspec::SpecLogger.create
1
+ require 'rest-client' # REST
2
+ require 'erb' # Embedded ruby
3
+ require 'yaml' # Reading yaml
4
+ require 'rspec' # Testing framework
5
+ require 'rspec/its'
6
+ require 'savon' # SOAP
7
+ require 'nokogiri' # XPath
8
+ require 'date'
9
+ require 'jsonpath'
10
+
11
+ require 'soaspec/version'
12
+ require 'soaspec/exchange_handlers/soap_handler'
13
+ require 'soaspec/exchange_handlers/exchange_handler'
14
+ require 'soaspec/exchange_handlers/rest_methods'
15
+ require 'soaspec/exchange'
16
+ require 'soaspec/matchers'
17
+ require 'soaspec/soaspec_shared_examples'
18
+ require 'soaspec/core_ext/hash'
19
+ require 'soaspec/spec_logger'
20
+ require 'soaspec/exe_helpers'
21
+ require 'soaspec/exchange_handlers/rest_handler'
22
+ require 'soaspec/exchange_handlers/handler_accessors'
23
+ require 'soaspec/interpreter'
24
+ require 'soaspec/not_found_errors'
25
+ require 'soaspec/test_server/get_bank'
26
+ require 'soaspec/test_server/test_attribute'
27
+ require 'soaspec/test_server/puppy_service'
28
+ require 'soaspec/test_server/invoices'
29
+ require 'soaspec/test_server/test_namespace'
30
+ require 'soaspec/wsdl_generator'
31
+
32
+ # Gem for handling SOAP and REST api tests
33
+ module Soaspec
34
+
35
+ class << self
36
+
37
+ # Folder used to store credentials
38
+ # Used in auth2_file command
39
+ # @param [String] folder
40
+ def credentials_folder=(folder)
41
+ @credentials_folder = folder
42
+ end
43
+
44
+ # Credentials folder used to store secret data (not in source control) E.g passwords
45
+ def credentials_folder
46
+ @credentials_folder
47
+ end
48
+
49
+ # Used so that exchange class knows what context it's in
50
+ # @param [ExchangeHandler] handler A class inheriting from Soaspec::ExchangeHandler. Exchange class uses this
51
+ def api_handler=(handler)
52
+ @api_handler = handler
53
+ end
54
+
55
+ # Exchange Handler class currently being used
56
+ def api_handler
57
+ @api_handler
58
+ end
59
+
60
+ # Set whether to transform strings to keys in request automatically
61
+ # @param [Boolean] use_keys
62
+ def always_use_keys=(use_keys)
63
+ @always_use_keys = use_keys
64
+ end
65
+
66
+ # @return [Boolean] Whether to transform strings to keys in request automatically
67
+ def always_use_keys?
68
+ @always_use_keys || true
69
+ end
70
+
71
+ # Whether to remove namespaces from response in Xpath assertion automatically
72
+ # For why this may not be a good thing in general see
73
+ # http://tenderlovemaking.com/2009/04/23/namespaces-in-xml.html
74
+ # This will be overridden if xpath has a ':' in it
75
+ def strip_namespaces=(remove_namespaces)
76
+ @strip_namespaces = remove_namespaces
77
+ end
78
+
79
+ # Whether to remove namespaces in xpath assertion automatically
80
+ def strip_namespaces?
81
+ @strip_namespaces || false
82
+ end
83
+ end
84
+ end
85
+
86
+ RestClient.log = Soaspec::SpecLogger.create