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.
Files changed (86) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +15 -15
  3. data/.gitlab-ci.yml +62 -62
  4. data/.rspec +3 -3
  5. data/.rubocop.yml +2 -2
  6. data/CODE_OF_CONDUCT.md +74 -74
  7. data/ChangeLog +643 -632
  8. data/Dockerfile +7 -7
  9. data/Gemfile +8 -8
  10. data/LICENSE.txt +21 -21
  11. data/README.md +253 -231
  12. data/Rakefile +52 -52
  13. data/Todo.md +16 -16
  14. data/exe/soaspec +140 -138
  15. data/exe/xml_to_yaml_file +43 -43
  16. data/lib/soaspec.rb +118 -106
  17. data/lib/soaspec/baseline.rb +82 -22
  18. data/lib/soaspec/core_ext/hash.rb +44 -44
  19. data/lib/soaspec/cucumber/generic_steps.rb +94 -94
  20. data/lib/soaspec/demo.rb +6 -6
  21. data/lib/soaspec/errors.rb +24 -24
  22. data/lib/soaspec/exchange/exchange.rb +131 -129
  23. data/lib/soaspec/exchange/exchange_extractor.rb +105 -90
  24. data/lib/soaspec/exchange/exchange_properties.rb +28 -28
  25. data/lib/soaspec/exchange/exchange_repeater.rb +21 -21
  26. data/lib/soaspec/exchange/request_builder.rb +108 -70
  27. data/lib/soaspec/exchange/variable_storer.rb +24 -24
  28. data/lib/soaspec/exchange_handlers/exchange_handler.rb +98 -98
  29. data/lib/soaspec/exchange_handlers/exchange_handler_defaults.rb +61 -61
  30. data/lib/soaspec/exchange_handlers/handler_accessors.rb +132 -132
  31. data/lib/soaspec/exchange_handlers/request/rest_request.rb +77 -59
  32. data/lib/soaspec/exchange_handlers/request/soap_request.rb +41 -41
  33. data/lib/soaspec/exchange_handlers/response_extractor.rb +84 -84
  34. data/lib/soaspec/exchange_handlers/rest_exchanger_factory.rb +111 -111
  35. data/lib/soaspec/exchange_handlers/rest_handler.rb +307 -307
  36. data/lib/soaspec/exchange_handlers/rest_methods.rb +65 -65
  37. data/lib/soaspec/exchange_handlers/rest_parameters.rb +112 -112
  38. data/lib/soaspec/exchange_handlers/rest_parameters_defaults.rb +42 -42
  39. data/lib/soaspec/exchange_handlers/soap_handler.rb +241 -241
  40. data/lib/soaspec/exe_helpers.rb +94 -94
  41. data/lib/soaspec/generate_server.rb +48 -48
  42. data/lib/soaspec/generator/.rspec.erb +5 -5
  43. data/lib/soaspec/generator/.travis.yml.erb +5 -5
  44. data/lib/soaspec/generator/Gemfile.erb +8 -8
  45. data/lib/soaspec/generator/README.md.erb +29 -29
  46. data/lib/soaspec/generator/Rakefile.erb +20 -19
  47. data/lib/soaspec/generator/config/data/default.yml.erb +2 -2
  48. data/lib/soaspec/generator/css/bootstrap.css +6833 -6833
  49. data/lib/soaspec/generator/features/support/env.rb.erb +3 -3
  50. data/lib/soaspec/generator/generate_exchange.html.erb +47 -47
  51. data/lib/soaspec/generator/lib/blz_service.rb.erb +26 -26
  52. data/lib/soaspec/generator/lib/dynamic_class_content.rb.erb +12 -12
  53. data/lib/soaspec/generator/lib/new_rest_service.rb.erb +56 -56
  54. data/lib/soaspec/generator/lib/new_soap_service.rb.erb +29 -29
  55. data/lib/soaspec/generator/lib/package_service.rb.erb +2 -2
  56. data/lib/soaspec/generator/lib/shared_example.rb.erb +8 -8
  57. data/lib/soaspec/generator/spec/dynamic_soap_spec.rb.erb +12 -12
  58. data/lib/soaspec/generator/spec/rest_spec.rb.erb +9 -9
  59. data/lib/soaspec/generator/spec/soap_spec.rb.erb +51 -51
  60. data/lib/soaspec/generator/spec/spec_helper.rb.erb +23 -23
  61. data/lib/soaspec/generator/template/soap_template.xml +6 -6
  62. data/lib/soaspec/indifferent_hash.rb +9 -9
  63. data/lib/soaspec/interpreter.rb +70 -70
  64. data/lib/soaspec/matchers.rb +136 -140
  65. data/lib/soaspec/o_auth2.rb +142 -142
  66. data/lib/soaspec/soaspec_shared_examples.rb +26 -26
  67. data/lib/soaspec/spec_logger.rb +143 -143
  68. data/lib/soaspec/template_reader.rb +30 -30
  69. data/lib/soaspec/test_server/bank.wsdl +90 -90
  70. data/lib/soaspec/test_server/get_bank.rb +166 -166
  71. data/lib/soaspec/test_server/id_manager.rb +41 -41
  72. data/lib/soaspec/test_server/invoices.rb +29 -29
  73. data/lib/soaspec/test_server/namespace.xml +14 -14
  74. data/lib/soaspec/test_server/note.xml +5 -5
  75. data/lib/soaspec/test_server/puppy_service.rb +21 -21
  76. data/lib/soaspec/test_server/test_attribute.rb +14 -14
  77. data/lib/soaspec/test_server/test_namespace.rb +14 -14
  78. data/lib/soaspec/version.rb +6 -6
  79. data/lib/soaspec/virtual_server.rb +193 -190
  80. data/lib/soaspec/wait.rb +43 -43
  81. data/lib/soaspec/wsdl_generator.rb +215 -215
  82. data/soaspec.gemspec +58 -58
  83. data/test.wsdl +116 -116
  84. data/test.xml +10 -10
  85. data/test_wsdl.rb +43 -43
  86. metadata +3 -3
@@ -1,41 +1,41 @@
1
- # frozen_string_literal: true
2
-
3
- module Soaspec
4
- # Models a request made to a SOAP API
5
- class SoapRequest
6
- # @example SOAP operation
7
- # :login
8
- # @return [Symbol] SOAP operation used
9
- attr_accessor :operation
10
- # Hash representing what will be sent to Savon. Either the exact xml (if using a template)
11
- # or a message Hash that will be converted to XML by Savon
12
- # @example
13
- # { xml: "<env:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ...</env:Body>\n</env:Envelope> " }
14
- # @return [Hash] Body of request sent
15
- attr_accessor :body
16
- # @return [Symbol] Method of building the request (:hash, :template)
17
- attr_accessor :request_option
18
- # @return [String] Name given to test to describe it
19
- attr_accessor :test_name
20
-
21
- # @param [Symbol] operation Soap operation used
22
- # @param [Hash] body Hash with method of SOAP generated contained
23
- # @param [Symbol] request_option Method of building the request (:hash, :template)
24
- def initialize(operation, body, request_option)
25
- self.body = body
26
- self.operation = operation
27
- self.request_option = request_option
28
- end
29
-
30
- # @param [String, Symbol] value Message to send to object retrieving a value
31
- # @return [Object] Result of retrieving value
32
- def [](value)
33
- send(value)
34
- end
35
-
36
- # @return [String] Show inspection of all parameters
37
- def to_s
38
- inspect
39
- end
40
- end
41
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Soaspec
4
+ # Models a request made to a SOAP API
5
+ class SoapRequest
6
+ # @example SOAP operation
7
+ # :login
8
+ # @return [Symbol] SOAP operation used
9
+ attr_accessor :operation
10
+ # Hash representing what will be sent to Savon. Either the exact xml (if using a template)
11
+ # or a message Hash that will be converted to XML by Savon
12
+ # @example
13
+ # { xml: "<env:Envelope xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" ...</env:Body>\n</env:Envelope> " }
14
+ # @return [Hash] Body of request sent
15
+ attr_accessor :body
16
+ # @return [Symbol] Method of building the request (:hash, :template)
17
+ attr_accessor :request_option
18
+ # @return [String] Name given to test to describe it
19
+ attr_accessor :test_name
20
+
21
+ # @param [Symbol] operation Soap operation used
22
+ # @param [Hash] body Hash with method of SOAP generated contained
23
+ # @param [Symbol] request_option Method of building the request (:hash, :template)
24
+ def initialize(operation, body, request_option)
25
+ self.body = body
26
+ self.operation = operation
27
+ self.request_option = request_option
28
+ end
29
+
30
+ # @param [String, Symbol] value Message to send to object retrieving a value
31
+ # @return [Object] Result of retrieving value
32
+ def [](value)
33
+ send(value)
34
+ end
35
+
36
+ # @return [String] Show inspection of all parameters
37
+ def to_s
38
+ inspect
39
+ end
40
+ end
41
+ end
@@ -1,84 +1,84 @@
1
- # frozen_string_literal: true
2
-
3
- module Soaspec
4
- # Enables extracting a response according to type / path
5
- module ResponseExtractor
6
- # Convert XML or JSON response into a Hash. Doesn't accept empty body
7
- # @param [String] response Response as a String (either in XML or JSON)
8
- # @return [Hash] Extracted Hash from response
9
- def extract_hash(response)
10
- raise NoElementAtPath, "Empty Body. Can't assert on it" if response.body.empty?
11
-
12
- case Interpreter.response_type_for response
13
- when :xml then parse_xml(response.body.to_s)
14
- when :json
15
- converted = JSON.parse(response.body)
16
- return converted.transform_keys_to_symbols if converted.is_a? Hash
17
- return converted.map!(&:transform_keys_to_symbols) if converted.is_a? Array
18
-
19
- raise 'Incorrect Type produced ' + converted.class
20
- else
21
- raise "Neither XML nor JSON detected. It is #{type}. Don't know how to parse It is #{response.body}"
22
- end
23
- end
24
-
25
- # @param [Object] response Response object
26
- # @return [Hash] Hash representing response body
27
- def to_hash(response)
28
- case Interpreter.response_type_for(response)
29
- when :xml then IndifferentHash.new(parse_xml(response.body.to_s))
30
- when :json
31
- IndifferentHash.new(JSON.parse(response.body.to_s))
32
- else
33
- raise "Unable to interpret type of '#{response.body}'. Could be because of: #{Interpreter.diagnose_error}"
34
- end
35
- end
36
-
37
- private
38
-
39
- # @param [String] xml XML to convert
40
- # @return [Hash] Hash representing XML
41
- def parse_xml(xml)
42
- parser = Nori.new(strip_namespaces: strip_namespaces?, convert_tags_to: ->(tag) { tag.snakecase.to_sym })
43
- parser.parse(xml)
44
- end
45
-
46
- # This enables shortcut xpaths to be used. If no '/' is given, one is appended to the start of the path
47
- # If attribute value is set then this is also adjusted
48
- # @return [String] New Xpath adjusted according to any add ons
49
- def prefix_xpath(xpath, attribute)
50
- xpath = "//*[@#{attribute}]" unless attribute.nil?
51
- if xpath[0] != '/'
52
- xpath = convert_to_pascal_case(xpath) if pascal_keys?
53
- xpath = '//' + xpath
54
- end
55
- xpath
56
- end
57
-
58
- # Convert snakecase to PascalCase
59
- # @return [String] PascalCase converted path
60
- def convert_to_pascal_case(key)
61
- return key if /[[:upper:]]/ =~ key[0] # If first character already capital, don't do conversion
62
-
63
- key.split('_').map(&:capitalize).join
64
- end
65
-
66
- # Find element with name specified or pascal case equivalent
67
- # @return [String] String to find paths with pascal converted or given path
68
- def add_pascal_path(json_path)
69
- return json_path unless pascal_keys?
70
-
71
- json_path.split(',').collect do |sub_path|
72
- "#{sub_path},#{convert_to_pascal_case(sub_path)}"
73
- end.join(',')
74
- end
75
-
76
- # @param [String] json_path Path set from Exchange
77
- # @return [String] JSON Path
78
- def prefix_json_path(json_path)
79
- return json_path if json_path[0] == '$'
80
-
81
- "$..#{json_path}"
82
- end
83
- end
84
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Soaspec
4
+ # Enables extracting a response according to type / path
5
+ module ResponseExtractor
6
+ # Convert XML or JSON response into a Hash. Doesn't accept empty body
7
+ # @param [String] response Response as a String (either in XML or JSON)
8
+ # @return [Hash] Extracted Hash from response
9
+ def extract_hash(response)
10
+ raise NoElementAtPath, "Empty Body. Can't assert on it" if response.body.empty?
11
+
12
+ case Interpreter.response_type_for response
13
+ when :xml then parse_xml(response.body.to_s)
14
+ when :json
15
+ converted = JSON.parse(response.body)
16
+ return converted.transform_keys_to_symbols if converted.is_a? Hash
17
+ return converted.map!(&:transform_keys_to_symbols) if converted.is_a? Array
18
+
19
+ raise 'Incorrect Type produced ' + converted.class
20
+ else
21
+ raise "Neither XML nor JSON detected. It is #{type}. Don't know how to parse It is #{response.body}"
22
+ end
23
+ end
24
+
25
+ # @param [Object] response Response object
26
+ # @return [Hash] Hash representing response body
27
+ def to_hash(response)
28
+ case Interpreter.response_type_for(response)
29
+ when :xml then IndifferentHash.new(parse_xml(response.body.to_s))
30
+ when :json
31
+ IndifferentHash.new(JSON.parse(response.body.to_s))
32
+ else
33
+ raise "Unable to interpret type of '#{response.body}'. Could be because of: #{Interpreter.diagnose_error}"
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ # @param [String] xml XML to convert
40
+ # @return [Hash] Hash representing XML
41
+ def parse_xml(xml)
42
+ parser = Nori.new(strip_namespaces: strip_namespaces?, convert_tags_to: ->(tag) { tag.snakecase.to_sym })
43
+ parser.parse(xml)
44
+ end
45
+
46
+ # This enables shortcut xpaths to be used. If no '/' is given, one is appended to the start of the path
47
+ # If attribute value is set then this is also adjusted
48
+ # @return [String] New Xpath adjusted according to any add ons
49
+ def prefix_xpath(xpath, attribute)
50
+ xpath = "//*[@#{attribute}]" unless attribute.nil?
51
+ if xpath[0] != '/'
52
+ xpath = convert_to_pascal_case(xpath) if pascal_keys?
53
+ xpath = '//' + xpath
54
+ end
55
+ xpath
56
+ end
57
+
58
+ # Convert snakecase to PascalCase
59
+ # @return [String] PascalCase converted path
60
+ def convert_to_pascal_case(key)
61
+ return key if /[[:upper:]]/ =~ key[0] # If first character already capital, don't do conversion
62
+
63
+ key.split('_').map(&:capitalize).join
64
+ end
65
+
66
+ # Find element with name specified or pascal case equivalent
67
+ # @return [String] String to find paths with pascal converted or given path
68
+ def add_pascal_path(json_path)
69
+ return json_path unless pascal_keys?
70
+
71
+ json_path.split(',').collect do |sub_path|
72
+ "#{sub_path},#{convert_to_pascal_case(sub_path)}"
73
+ end.join(',')
74
+ end
75
+
76
+ # @param [String] json_path Path set from Exchange
77
+ # @return [String] JSON Path
78
+ def prefix_json_path(json_path)
79
+ return json_path if json_path[0] == '$'
80
+
81
+ "$..#{json_path}"
82
+ end
83
+ end
84
+ end
@@ -1,111 +1,111 @@
1
- # frozen_string_literal: true
2
-
3
- module Soaspec
4
- # Convenience methods for once off usage of a REST request
5
- module RestExchangeFactory
6
- # Make REST Exchange with 'post' method within this Handler context
7
- # @param [Hash, String] params Exchange parameters. If String is used it will be for the request payload
8
- # @option params [String] :name Name to appear in traffic logs
9
- # @option params [Hash] :params Extra parameters (E.g. headers)
10
- # @option params [String] :suburl URL appended to base_url of class
11
- # @option params [Hash] :q Query for REST
12
- # Following are for the body of the request
13
- # @option params [Hash] :body Hash to be converted to JSON in request body
14
- # @option params [String] :payload String to be passed directly in request body
15
- # @option params [String] :template_name Path to file to be read via ERB and passed in request body
16
- # @return [Exchange] Instance of Exchange class. Assertions are made by default on the response body
17
- def post(params = {})
18
- perform_exchange_with(:post, params)
19
- end
20
-
21
- # Make REST Exchange with 'patch' method within this Handler context
22
- # @param [Hash, String] params Exchange parameters. If String is used it will be for the request payload
23
- # @option params [String] :name Name to appear in traffic logs
24
- # @option params [Hash] :params Extra parameters (E.g. headers)
25
- # @option params [String] suburl URL appended to base_url of class
26
- # @option params [Hash] :q Query for REST
27
- # Following are for the body of the request
28
- # @option params [Hash] :body Hash to be converted to JSON in request body
29
- # @option params [String] :payload String to be passed directly in request body
30
- # @option params [String] :template_name Path to file to be read via ERB and passed in request body
31
- # @return [Exchange] Instance of Exchange class. Assertions are made by default on the response body
32
- def patch(params)
33
- perform_exchange_with(:patch, params)
34
- end
35
-
36
- # Make REST Exchange with 'put' method within this Handler context
37
- # @param [Hash, String] params Exchange parameters. If String is used it will be for the request payload
38
- # @option params [String] :name Name to appear in traffic logs
39
- # @option params [Hash] :params Extra parameters (E.g. headers)
40
- # @option params [String] :suburl URL appended to base_url of class
41
- # @option params [Hash] :q Query for REST
42
- # Following are for the body of the request
43
- # @option params [Hash] :body Hash to be converted to JSON in request body
44
- # @option params [String] :payload String to be passed directly in request body
45
- # @option params [String] :template_name Path to file to be read via ERB and passed in request body
46
- # @return [Exchange] Instance of Exchange class. Assertions are made by default on the response body
47
- def put(params = {})
48
- perform_exchange_with(:put, params)
49
- end
50
-
51
- # Make REST Exchange with 'get' method within this Handler context.
52
- # If merely a string is passed it will be used as the URL appended to base_url (same as suburl). Otherwise a Hash is expected
53
- # @param [Hash, String] params Exchange parameters. If String is used it will be for suburl
54
- # @option params [String] :name Name to appear in traffic logs
55
- # @option params [String] :suburl URL appended to base_url of class
56
- # @option params [Hash] :params Extra parameters (E.g. headers)
57
- # @option params [Hash] :q Query for REST
58
- # @return [Exchange] Instance of Exchange class. Assertions are made by default on the response body
59
- def get(params = {})
60
- perform_exchange_with(:get, params)
61
- end
62
-
63
- # Make REST Exchange with 'delete' method within this Handler context.
64
- # If merely a string is passed it will be used as the URL appended to base_url (same as suburl). Otherwise a Hash is expected
65
- # @param [Hash, String] params Exchange parameters. If String is used it will be for suburl
66
- # @option params [String] :name Name to appear in traffic logs
67
- # @option params [String] :suburl URL appended to base_url of class
68
- # @option params [Hash] :q Query for REST
69
- # @option params [Hash] :params Extra parameters (E.g. headers)
70
- # @return [Exchange] Instance of Exchange class. Assertions are made by default on the response body
71
- def delete(params = {})
72
- perform_exchange_with(:delete, params)
73
- end
74
-
75
- private
76
-
77
- # Make REST Exchange within this Handler context
78
- # @param [Symbol] rest_method HTTP rest method to use
79
- # @param [Hash, String] params Exchange parameters.
80
- # @return [Exchange] Instance of Exchange class. Assertions are made by default on the response body
81
- def perform_exchange_with(rest_method, params = {})
82
- params = determine_params_for(rest_method, params)
83
- params[:name] ||= rest_method.to_s
84
- exchange_params = { name: params[:name] }
85
- if params[:template_name]
86
- exchange_params[:template_name] = params[:template_name]
87
- params.delete :template_name
88
- end
89
- new(exchange_params)
90
- exchange = Exchange.new(params[:name], method: rest_method, **params)
91
- yield exchange if block_given?
92
- exchange
93
- end
94
-
95
- # @param [Symbol] method HTTP rest method to use
96
- # @param [Hash, String] params Exchange parameters.
97
- # @return [Hash] Exchange Parameters after setting shorthand parameters
98
- def determine_params_for(method, params)
99
- return params if params.is_a? Hash
100
-
101
- case method
102
- when :get, :delete
103
- { suburl: params.to_s }
104
- when :post, :put, :patch
105
- { payload: params.to_s }
106
- else
107
- raise "'#{params}' needs to be a 'Hash' but is a #{params.class}"
108
- end
109
- end
110
- end
111
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Soaspec
4
+ # Convenience methods for once off usage of a REST request
5
+ module RestExchangeFactory
6
+ # Make REST Exchange with 'post' method within this Handler context
7
+ # @param [Hash, String] params Exchange parameters. If String is used it will be for the request payload
8
+ # @option params [String] :name Name to appear in traffic logs
9
+ # @option params [Hash] :params Extra parameters (E.g. headers)
10
+ # @option params [String] :suburl URL appended to base_url of class
11
+ # @option params [Hash] :q Query for REST
12
+ # Following are for the body of the request
13
+ # @option params [Hash] :body Hash to be converted to JSON in request body
14
+ # @option params [String] :payload String to be passed directly in request body
15
+ # @option params [String] :template_name Path to file to be read via ERB and passed in request body
16
+ # @return [Exchange] Instance of Exchange class. Assertions are made by default on the response body
17
+ def post(params = {})
18
+ perform_exchange_with(:post, params)
19
+ end
20
+
21
+ # Make REST Exchange with 'patch' method within this Handler context
22
+ # @param [Hash, String] params Exchange parameters. If String is used it will be for the request payload
23
+ # @option params [String] :name Name to appear in traffic logs
24
+ # @option params [Hash] :params Extra parameters (E.g. headers)
25
+ # @option params [String] suburl URL appended to base_url of class
26
+ # @option params [Hash] :q Query for REST
27
+ # Following are for the body of the request
28
+ # @option params [Hash] :body Hash to be converted to JSON in request body
29
+ # @option params [String] :payload String to be passed directly in request body
30
+ # @option params [String] :template_name Path to file to be read via ERB and passed in request body
31
+ # @return [Exchange] Instance of Exchange class. Assertions are made by default on the response body
32
+ def patch(params)
33
+ perform_exchange_with(:patch, params)
34
+ end
35
+
36
+ # Make REST Exchange with 'put' method within this Handler context
37
+ # @param [Hash, String] params Exchange parameters. If String is used it will be for the request payload
38
+ # @option params [String] :name Name to appear in traffic logs
39
+ # @option params [Hash] :params Extra parameters (E.g. headers)
40
+ # @option params [String] :suburl URL appended to base_url of class
41
+ # @option params [Hash] :q Query for REST
42
+ # Following are for the body of the request
43
+ # @option params [Hash] :body Hash to be converted to JSON in request body
44
+ # @option params [String] :payload String to be passed directly in request body
45
+ # @option params [String] :template_name Path to file to be read via ERB and passed in request body
46
+ # @return [Exchange] Instance of Exchange class. Assertions are made by default on the response body
47
+ def put(params = {})
48
+ perform_exchange_with(:put, params)
49
+ end
50
+
51
+ # Make REST Exchange with 'get' method within this Handler context.
52
+ # If merely a string is passed it will be used as the URL appended to base_url (same as suburl). Otherwise a Hash is expected
53
+ # @param [Hash, String] params Exchange parameters. If String is used it will be for suburl
54
+ # @option params [String] :name Name to appear in traffic logs
55
+ # @option params [String] :suburl URL appended to base_url of class
56
+ # @option params [Hash] :params Extra parameters (E.g. headers)
57
+ # @option params [Hash] :q Query for REST
58
+ # @return [Exchange] Instance of Exchange class. Assertions are made by default on the response body
59
+ def get(params = {})
60
+ perform_exchange_with(:get, params)
61
+ end
62
+
63
+ # Make REST Exchange with 'delete' method within this Handler context.
64
+ # If merely a string is passed it will be used as the URL appended to base_url (same as suburl). Otherwise a Hash is expected
65
+ # @param [Hash, String] params Exchange parameters. If String is used it will be for suburl
66
+ # @option params [String] :name Name to appear in traffic logs
67
+ # @option params [String] :suburl URL appended to base_url of class
68
+ # @option params [Hash] :q Query for REST
69
+ # @option params [Hash] :params Extra parameters (E.g. headers)
70
+ # @return [Exchange] Instance of Exchange class. Assertions are made by default on the response body
71
+ def delete(params = {})
72
+ perform_exchange_with(:delete, params)
73
+ end
74
+
75
+ private
76
+
77
+ # Make REST Exchange within this Handler context
78
+ # @param [Symbol] rest_method HTTP rest method to use
79
+ # @param [Hash, String] params Exchange parameters.
80
+ # @return [Exchange] Instance of Exchange class. Assertions are made by default on the response body
81
+ def perform_exchange_with(rest_method, params = {})
82
+ params = determine_params_for(rest_method, params)
83
+ params[:name] ||= rest_method.to_s
84
+ exchange_params = { name: params[:name] }
85
+ if params[:template_name]
86
+ exchange_params[:template_name] = params[:template_name]
87
+ params.delete :template_name
88
+ end
89
+ new(exchange_params)
90
+ exchange = Exchange.new(params[:name], method: rest_method, **params)
91
+ yield exchange if block_given?
92
+ exchange
93
+ end
94
+
95
+ # @param [Symbol] method HTTP rest method to use
96
+ # @param [Hash, String] params Exchange parameters.
97
+ # @return [Hash] Exchange Parameters after setting shorthand parameters
98
+ def determine_params_for(method, params)
99
+ return params if params.is_a? Hash
100
+
101
+ case method
102
+ when :get, :delete
103
+ { suburl: params.to_s }
104
+ when :post, :put, :patch
105
+ { payload: params.to_s }
106
+ else
107
+ raise "'#{params}' needs to be a 'Hash' but is a #{params.class}"
108
+ end
109
+ end
110
+ end
111
+ end