pact-mock_service 0.2.4 → 0.3.0

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/lib/pact/consumer/mock_service/set_location.rb +28 -0
  4. data/lib/pact/consumer_contract/consumer_contract_writer.rb +2 -2
  5. data/lib/pact/mock_service/app.rb +56 -0
  6. data/lib/pact/{consumer → mock_service}/app_manager.rb +4 -4
  7. data/lib/pact/{consumer/mock_service_client.rb → mock_service/client.rb} +2 -2
  8. data/lib/pact/mock_service/control_server/delegator.rb +1 -12
  9. data/lib/pact/mock_service/control_server/mock_service_creator.rb +1 -1
  10. data/lib/pact/mock_service/interactions/actual_interactions.rb +36 -0
  11. data/lib/pact/mock_service/interactions/candidate_interactions.rb +15 -0
  12. data/lib/pact/mock_service/interactions/expected_interactions.rb +18 -0
  13. data/lib/pact/mock_service/interactions/interaction_diff_message.rb +45 -0
  14. data/lib/pact/mock_service/interactions/interaction_mismatch.rb +74 -0
  15. data/lib/pact/mock_service/interactions/interactions_filter.rb +34 -0
  16. data/lib/pact/mock_service/interactions/verification.rb +48 -0
  17. data/lib/pact/mock_service/interactions/verified_interactions.rb +20 -0
  18. data/lib/pact/mock_service/logger.rb +27 -0
  19. data/lib/pact/mock_service/request_handlers/base_administration_request_handler.rb +42 -0
  20. data/lib/pact/mock_service/request_handlers/base_request_handler.rb +22 -0
  21. data/lib/pact/mock_service/request_handlers/index_get.rb +23 -0
  22. data/lib/pact/mock_service/request_handlers/interaction_delete.rb +36 -0
  23. data/lib/pact/mock_service/request_handlers/interaction_post.rb +41 -0
  24. data/lib/pact/mock_service/request_handlers/interaction_replay.rb +163 -0
  25. data/lib/pact/mock_service/request_handlers/interactions_put.rb +42 -0
  26. data/lib/pact/mock_service/request_handlers/log_get.rb +27 -0
  27. data/lib/pact/mock_service/request_handlers/missing_interactions_get.rb +33 -0
  28. data/lib/pact/mock_service/request_handlers/options.rb +42 -0
  29. data/lib/pact/mock_service/request_handlers/pact_post.rb +38 -0
  30. data/lib/pact/mock_service/request_handlers/verification_get.rb +72 -0
  31. data/lib/pact/mock_service/request_handlers.rb +40 -0
  32. data/lib/pact/mock_service/run.rb +14 -4
  33. data/lib/pact/mock_service/session.rb +70 -0
  34. data/lib/pact/mock_service/spawn.rb +26 -12
  35. data/lib/pact/mock_service/version.rb +1 -1
  36. data/lib/pact/mock_service.rb +2 -1
  37. metadata +29 -24
  38. data/lib/pact/consumer/interactions_filter.rb +0 -32
  39. data/lib/pact/consumer/mock_service/actual_interactions.rb +0 -34
  40. data/lib/pact/consumer/mock_service/app.rb +0 -58
  41. data/lib/pact/consumer/mock_service/candidate_interactions.rb +0 -13
  42. data/lib/pact/consumer/mock_service/expected_interactions.rb +0 -17
  43. data/lib/pact/consumer/mock_service/index_get.rb +0 -22
  44. data/lib/pact/consumer/mock_service/interaction_delete.rb +0 -39
  45. data/lib/pact/consumer/mock_service/interaction_mismatch.rb +0 -73
  46. data/lib/pact/consumer/mock_service/interaction_post.rb +0 -95
  47. data/lib/pact/consumer/mock_service/interaction_replay.rb +0 -162
  48. data/lib/pact/consumer/mock_service/log_get.rb +0 -28
  49. data/lib/pact/consumer/mock_service/missing_interactions_get.rb +0 -32
  50. data/lib/pact/consumer/mock_service/mock_service_administration_endpoint.rb +0 -40
  51. data/lib/pact/consumer/mock_service/options.rb +0 -43
  52. data/lib/pact/consumer/mock_service/pact_post.rb +0 -38
  53. data/lib/pact/consumer/mock_service/request_handlers.rb +0 -41
  54. data/lib/pact/consumer/mock_service/verification.rb +0 -46
  55. data/lib/pact/consumer/mock_service/verification_get.rb +0 -73
  56. data/lib/pact/consumer/mock_service/verified_interactions.rb +0 -18
  57. data/lib/pact/consumer/mock_service.rb +0 -43
@@ -1,5 +1,8 @@
1
- require 'pact/consumer/mock_service'
1
+ require 'pact/mock_service/app'
2
2
  require 'pact/consumer/server'
3
+ require 'pact/consumer/mock_service/set_location'
4
+
5
+ # Starts a new MockService on a new Thread. Called by the Control Server.
3
6
 
4
7
  module Pact
5
8
  module MockService
@@ -19,7 +22,7 @@ module Pact
19
22
  end
20
23
 
21
24
  def call
22
- mock_service = create_mock_service
25
+ mock_service = build_app
23
26
  start_mock_service mock_service, port
24
27
  puts "Started mock service for #{provider} on #{port}"
25
28
  mock_service
@@ -27,10 +30,13 @@ module Pact
27
30
 
28
31
  private
29
32
 
30
- def create_mock_service
31
- name = "#{provider} mock service"
32
- Pact::Consumer::MockService.new(
33
- log_file: create_log_file(name),
33
+ def build_app
34
+ Pact::Consumer::SetLocation.new(mock_service, base_url)
35
+ end
36
+
37
+ def mock_service
38
+ Pact::MockService.new(
39
+ log_file: create_log_file,
34
40
  name: name,
35
41
  consumer: consumer,
36
42
  provider: provider,
@@ -43,15 +49,15 @@ module Pact
43
49
  Pact::Server.new(app, port, ssl: options[:ssl]).boot
44
50
  end
45
51
 
46
- def create_log_file service_name
52
+ def create_log_file
47
53
  FileUtils::mkdir_p options[:log_dir]
48
- log = File.open(log_file_path(service_name), 'w')
54
+ log = File.open(log_file_path, 'w')
49
55
  log.sync = true
50
56
  log
51
57
  end
52
58
 
53
- def log_file_name service_name
54
- lower_case_name = service_name.downcase.gsub(/\s+/, '_')
59
+ def log_file_name
60
+ lower_case_name = name.downcase.gsub(/\s+/, '_')
55
61
  if lower_case_name.include?('_service')
56
62
  lower_case_name.gsub('_service', '_mock_service')
57
63
  else
@@ -59,8 +65,16 @@ module Pact
59
65
  end
60
66
  end
61
67
 
62
- def log_file_path service_name
63
- File.join(options[:log_dir], "#{log_file_name(service_name)}.log")
68
+ def log_file_path
69
+ File.join(options[:log_dir], "#{log_file_name}.log")
70
+ end
71
+
72
+ def base_url
73
+ options[:ssl] ? "https://localhost:#{port}" : "http://localhost:#{port}"
74
+ end
75
+
76
+ def name
77
+ "#{provider} mock service"
64
78
  end
65
79
  end
66
80
 
@@ -1,5 +1,5 @@
1
1
  module Pact
2
2
  module MockService
3
- VERSION = "0.2.4"
3
+ VERSION = "0.3.0"
4
4
  end
5
5
  end
@@ -1 +1,2 @@
1
- require 'pact/consumer/mock_service'
1
+ require 'pact/consumer/app_manager'
2
+ require 'pact/mock_service/app'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact-mock_service
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Fraser
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2015-01-24 00:00:00.000000000 Z
15
+ date: 2015-02-04 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rack
@@ -251,39 +251,21 @@ extensions: []
251
251
  extra_rdoc_files: []
252
252
  files:
253
253
  - bin/pact-mock-service
254
- - lib/pact/consumer/app_manager.rb
255
- - lib/pact/consumer/interactions_filter.rb
256
- - lib/pact/consumer/mock_service/actual_interactions.rb
257
- - lib/pact/consumer/mock_service/app.rb
258
- - lib/pact/consumer/mock_service/candidate_interactions.rb
259
254
  - lib/pact/consumer/mock_service/cors_origin_header_middleware.rb
260
255
  - lib/pact/consumer/mock_service/error_handler.rb
261
- - lib/pact/consumer/mock_service/expected_interactions.rb
262
- - lib/pact/consumer/mock_service/index_get.rb
263
- - lib/pact/consumer/mock_service/interaction_delete.rb
264
- - lib/pact/consumer/mock_service/interaction_mismatch.rb
265
- - lib/pact/consumer/mock_service/interaction_post.rb
266
- - lib/pact/consumer/mock_service/interaction_replay.rb
267
- - lib/pact/consumer/mock_service/log_get.rb
268
- - lib/pact/consumer/mock_service/missing_interactions_get.rb
269
- - lib/pact/consumer/mock_service/mock_service_administration_endpoint.rb
270
- - lib/pact/consumer/mock_service/options.rb
271
- - lib/pact/consumer/mock_service/pact_post.rb
272
256
  - lib/pact/consumer/mock_service/rack_request_helper.rb
273
- - lib/pact/consumer/mock_service/request_handlers.rb
274
- - lib/pact/consumer/mock_service/verification.rb
275
- - lib/pact/consumer/mock_service/verification_get.rb
276
- - lib/pact/consumer/mock_service/verified_interactions.rb
277
- - lib/pact/consumer/mock_service.rb
278
- - lib/pact/consumer/mock_service_client.rb
257
+ - lib/pact/consumer/mock_service/set_location.rb
279
258
  - lib/pact/consumer/server.rb
280
259
  - lib/pact/consumer_contract/consumer_contract_decorator.rb
281
260
  - lib/pact/consumer_contract/consumer_contract_writer.rb
282
261
  - lib/pact/consumer_contract/interaction_decorator.rb
283
262
  - lib/pact/consumer_contract/request_decorator.rb
284
263
  - lib/pact/consumer_contract/response_decorator.rb
264
+ - lib/pact/mock_service/app.rb
265
+ - lib/pact/mock_service/app_manager.rb
285
266
  - lib/pact/mock_service/cli/pidfile.rb
286
267
  - lib/pact/mock_service/cli.rb
268
+ - lib/pact/mock_service/client.rb
287
269
  - lib/pact/mock_service/control_server/app.rb
288
270
  - lib/pact/mock_service/control_server/delegator.rb
289
271
  - lib/pact/mock_service/control_server/index.rb
@@ -292,12 +274,35 @@ files:
292
274
  - lib/pact/mock_service/control_server/require_pacticipant_headers.rb
293
275
  - lib/pact/mock_service/control_server/run.rb
294
276
  - lib/pact/mock_service/interaction_decorator.rb
277
+ - lib/pact/mock_service/interactions/actual_interactions.rb
278
+ - lib/pact/mock_service/interactions/candidate_interactions.rb
279
+ - lib/pact/mock_service/interactions/expected_interactions.rb
280
+ - lib/pact/mock_service/interactions/interaction_diff_message.rb
281
+ - lib/pact/mock_service/interactions/interaction_mismatch.rb
282
+ - lib/pact/mock_service/interactions/interactions_filter.rb
283
+ - lib/pact/mock_service/interactions/verification.rb
284
+ - lib/pact/mock_service/interactions/verified_interactions.rb
285
+ - lib/pact/mock_service/logger.rb
295
286
  - lib/pact/mock_service/request_decorator.rb
287
+ - lib/pact/mock_service/request_handlers/base_administration_request_handler.rb
288
+ - lib/pact/mock_service/request_handlers/base_request_handler.rb
289
+ - lib/pact/mock_service/request_handlers/index_get.rb
290
+ - lib/pact/mock_service/request_handlers/interaction_delete.rb
291
+ - lib/pact/mock_service/request_handlers/interaction_post.rb
292
+ - lib/pact/mock_service/request_handlers/interaction_replay.rb
293
+ - lib/pact/mock_service/request_handlers/interactions_put.rb
294
+ - lib/pact/mock_service/request_handlers/log_get.rb
295
+ - lib/pact/mock_service/request_handlers/missing_interactions_get.rb
296
+ - lib/pact/mock_service/request_handlers/options.rb
297
+ - lib/pact/mock_service/request_handlers/pact_post.rb
298
+ - lib/pact/mock_service/request_handlers/verification_get.rb
299
+ - lib/pact/mock_service/request_handlers.rb
296
300
  - lib/pact/mock_service/response_decorator.rb
297
301
  - lib/pact/mock_service/run.rb
298
302
  - lib/pact/mock_service/server/restart.rb
299
303
  - lib/pact/mock_service/server/spawn.rb
300
304
  - lib/pact/mock_service/server/wait_for_server_up.rb
305
+ - lib/pact/mock_service/session.rb
301
306
  - lib/pact/mock_service/spawn.rb
302
307
  - lib/pact/mock_service/version.rb
303
308
  - lib/pact/mock_service.rb
@@ -1,32 +0,0 @@
1
- #
2
- # When running in pactfile_write_mode :overwrite, all interactions are cleared from the
3
- # pact file, and all new interactions should be distinct (unique description and provider state).
4
- # When running in pactfile_write_mode :update, an interaction with the same description
5
- # and provider state as an existing one will just overwrite that one interaction.
6
- #
7
-
8
- module Pact
9
- module Consumer
10
-
11
- #TODO: think of a better word than filter
12
- class InteractionsFilter
13
- def initialize interactions = []
14
- @interactions = interactions
15
- end
16
-
17
- def index_of interaction
18
- @interactions.find_index{ |i| i.matches_criteria?(description: interaction.description, provider_state: interaction.provider_state)}
19
- end
20
- end
21
-
22
- class UpdatableInteractionsFilter < InteractionsFilter
23
- def << interaction
24
- if (ndx = index_of(interaction))
25
- @interactions[ndx] = interaction
26
- else
27
- @interactions << interaction
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,34 +0,0 @@
1
- require 'pact/consumer/mock_service/candidate_interactions'
2
-
3
- module Pact
4
- module Consumer
5
- class ActualInteractions
6
-
7
- attr_reader :matched_interactions, :interaction_mismatches, :unexpected_requests
8
-
9
- def initialize
10
- clear
11
- end
12
-
13
- # For testing, sigh
14
- def clear
15
- @matched_interactions = []
16
- @interaction_mismatches = []
17
- @unexpected_requests = []
18
- end
19
-
20
- def register_matched interaction
21
- @matched_interactions << interaction
22
- end
23
-
24
- def register_unexpected_request request
25
- @unexpected_requests << request
26
- end
27
-
28
- def register_interaction_mismatch interaction_mismatch
29
- @interaction_mismatches << interaction_mismatch
30
- end
31
-
32
- end
33
- end
34
- end
@@ -1,58 +0,0 @@
1
- require 'rack'
2
- require 'uri'
3
- require 'json'
4
- require 'logger'
5
- require 'pact/consumer/mock_service/cors_origin_header_middleware'
6
- require 'pact/consumer/mock_service/request_handlers'
7
-
8
- module Pact
9
- module Consumer
10
- class MockService
11
- class App
12
-
13
- def initialize options = {}
14
- @name = options.fetch(:name, "MockService")
15
- @logger = options.fetch(:logger)
16
- expected_interactions = ExpectedInteractions.new
17
- actual_interactions = ActualInteractions.new
18
- verified_interactions = VerifiedInteractions.new
19
- @consumer_contact_details = {
20
- pact_dir: options[:pact_dir],
21
- consumer: {name: options[:consumer]},
22
- provider: {name: options[:provider]},
23
- interactions: verified_interactions
24
- }
25
-
26
- @request_handlers = Pact::Consumer::MockService::RequestHandlers.new(@name, @logger, expected_interactions, actual_interactions, verified_interactions, options)
27
- end
28
-
29
- def call env
30
- @request_handlers.call(env)
31
- end
32
-
33
- def shutdown
34
- write_pact_if_configured
35
- end
36
-
37
- private
38
-
39
- def write_pact_if_configured
40
- consumer_contract_writer = ConsumerContractWriter.new(@consumer_contact_details, StdoutLogger.new)
41
- consumer_contract_writer.write if consumer_contract_writer.can_write?
42
- end
43
-
44
- def to_s
45
- "#{@name} #{super.to_s}"
46
- end
47
-
48
- end
49
-
50
- # Can't write to a file in a TRAP, might deadlock
51
- class StdoutLogger
52
- def info message
53
- $stdout.puts "\n#{message}"
54
- end
55
- end
56
- end
57
- end
58
- end
@@ -1,13 +0,0 @@
1
- module Pact
2
- module Consumer
3
- class CandidateInteractions < Array
4
-
5
- def matching_interactions actual_request
6
- select do | candidate_interaction |
7
- candidate_interaction.request.matches? actual_request
8
- end
9
- end
10
-
11
- end
12
- end
13
- end
@@ -1,17 +0,0 @@
1
- require 'pact/consumer/mock_service/candidate_interactions'
2
-
3
- module Pact
4
- module Consumer
5
- class ExpectedInteractions < Array
6
-
7
- def find_candidate_interactions actual_request
8
- CandidateInteractions.new(
9
- select do | interaction |
10
- interaction.request.matches_route? actual_request
11
- end
12
- )
13
- end
14
-
15
- end
16
- end
17
- end
@@ -1,22 +0,0 @@
1
- require 'pact/consumer/mock_service/rack_request_helper'
2
- require 'pact/consumer/mock_service/mock_service_administration_endpoint'
3
-
4
- module Pact
5
- module Consumer
6
-
7
- class IndexGet < MockServiceAdministrationEndpoint
8
-
9
- def request_path
10
- ''
11
- end
12
-
13
- def request_method
14
- 'GET'
15
- end
16
-
17
- def respond env
18
- [200, {'Content-Type' => 'text/plain'}, ['Mock service running']]
19
- end
20
- end
21
- end
22
- end
@@ -1,39 +0,0 @@
1
- require 'pact/consumer/mock_service/rack_request_helper'
2
- require 'pact/consumer/mock_service/mock_service_administration_endpoint'
3
-
4
- module Pact
5
- module Consumer
6
-
7
- class InteractionDelete < MockServiceAdministrationEndpoint
8
-
9
- include RackRequestHelper
10
-
11
- attr_accessor :expected_interactions, :actual_interactions
12
-
13
- def initialize name, logger, expected_interactions, actual_interactions
14
- super name, logger
15
- @expected_interactions = expected_interactions
16
- @actual_interactions = actual_interactions
17
- end
18
-
19
- def request_path
20
- '/interactions'
21
- end
22
-
23
- def request_method
24
- 'DELETE'
25
- end
26
-
27
- def respond env
28
- expected_interactions.clear
29
- actual_interactions.clear
30
- logger.info "Cleared interactions before example \"#{example_description(env)}\""
31
- [200, {}, ['Deleted interactions']]
32
- end
33
-
34
- def example_description env
35
- params_hash(env).fetch('example_description', [])[0]
36
- end
37
- end
38
- end
39
- end
@@ -1,73 +0,0 @@
1
- module Pact
2
- module Consumer
3
-
4
- # Presents the differences between an actual request, and a list of
5
- # expected interactions where the methods and paths match the actual request.
6
- # This is used to display a helpful message to the user when a request
7
- # comes in that doesn't match any of the expected interactions.
8
- class InteractionMismatch
9
-
10
- attr_accessor :candidate_interactions, :actual_request
11
-
12
- # Assumes the method and path matches...
13
-
14
- def initialize candidate_interactions, actual_request
15
- @candidate_interactions = candidate_interactions
16
- @actual_request = actual_request
17
- @candiate_diffs = candidate_interactions.collect{ | candidate_interaction| CandidateDiff.new(candidate_interaction, actual_request)}
18
- end
19
-
20
- def to_hash
21
- candiate_diffs.collect(&:to_hash)
22
- end
23
-
24
- def to_s
25
- candiate_diffs.collect(&:to_s).join("\n")
26
- end
27
-
28
- def short_summary
29
- mismatched_attributes = candiate_diffs.collect(&:mismatched_attributes).flatten.uniq.join(", ").reverse.sub(",", "dna ").reverse #OMG what a hack!
30
- actual_request.method_and_path + " (request #{mismatched_attributes} did not match)"
31
- end
32
-
33
- private
34
-
35
- attr_accessor :candiate_diffs
36
-
37
- class CandidateDiff
38
-
39
- attr_accessor :candidate_interaction, :actual_request
40
-
41
- def initialize candidate_interaction, actual_request
42
- @candidate_interaction = candidate_interaction
43
- @actual_request = actual_request
44
- end
45
-
46
- def mismatched_attributes
47
- diff.keys
48
- end
49
-
50
- def to_hash
51
- summary = {:description => candidate_interaction.description}
52
- summary[:provider_state] = candidate_interaction.provider_state if candidate_interaction.provider_state
53
- summary.merge(diff)
54
- end
55
-
56
- def to_s
57
- [
58
- "Diff with interaction: #{candidate_interaction.description_with_provider_state_quoted}",
59
- diff_formatter.call(diff, {colour: false})
60
- ].join("\n")
61
- end
62
-
63
- def diff_formatter
64
- Pact.configuration.diff_formatter_for_content_type(candidate_interaction.request.content_type)
65
- end
66
-
67
- def diff
68
- @diff ||= candidate_interaction.request.difference(actual_request)
69
- end
70
- end
71
- end
72
- end
73
- end
@@ -1,95 +0,0 @@
1
- require 'pact/consumer/mock_service/mock_service_administration_endpoint'
2
- require 'pact/mock_service/interaction_decorator'
3
- require 'pact/shared/json_differ'
4
-
5
- module Pact
6
- module Consumer
7
- class InteractionPost < MockServiceAdministrationEndpoint
8
-
9
- def initialize name, logger, expected_interactions, verified_interactions
10
- super name, logger
11
- @expected_interactions = expected_interactions
12
- @verified_interactions = verified_interactions
13
- end
14
-
15
- def request_path
16
- '/interactions'
17
- end
18
-
19
- def request_method
20
- 'POST'
21
- end
22
-
23
- def respond env
24
- request_body = env['rack.input'].string
25
- interaction = Interaction.from_hash(JSON.load(request_body)) # Load creates the Pact::XXX classes
26
-
27
- if (previous_interaction = interaction_already_verified_with_same_description_and_provider_state_but_not_equal(interaction))
28
- handle_almost_duplicate_interaction previous_interaction, interaction
29
- else
30
- add_expected_interaction request_body, interaction
31
- end
32
- end
33
-
34
- private
35
-
36
- attr_accessor :expected_interactions, :verified_interactions
37
-
38
- def add_expected_interaction request_body, interaction
39
- expected_interactions << interaction
40
- logger.info "Registered expected interaction #{interaction.request.method_and_path}"
41
- logger.debug JSON.pretty_generate JSON.parse(request_body)
42
- [200, {}, ['Added interaction']]
43
- end
44
-
45
- def handle_almost_duplicate_interaction previous_interaction, interaction
46
- message = InteractionDiffMessage.new(previous_interaction, interaction).to_s
47
- logger.error message
48
- [500, {}, [message]]
49
- end
50
-
51
- def interaction_already_verified_with_same_description_and_provider_state_but_not_equal interaction
52
- other = verified_interactions.find_matching_description_and_provider_state interaction
53
- other && other != interaction ? other : nil
54
- end
55
-
56
- class InteractionDiffMessage
57
-
58
- def initialize previous_interaction, new_interaction
59
- @previous_interaction = previous_interaction
60
- @new_interaction = new_interaction
61
- end
62
-
63
- def to_s
64
- "An interaction with same description (#{new_interaction.description.inspect}) and provider state (#{new_interaction.provider_state.inspect}) but a different #{differences} has already been used. Please use a different description or provider state."
65
- end
66
-
67
- private
68
-
69
- attr_reader :previous_interaction, :new_interaction
70
-
71
- def differences
72
- diff = Pact::JsonDiffer.call(previous_interaction_hash, new_interaction_hash, allow_unexpected_keys: false)
73
- diff.keys.collect do | parent_key |
74
- diff[parent_key].keys.collect do | child_key |
75
- "#{parent_key} #{child_key}"
76
- end
77
- end.flatten.join(", ").reverse.sub(",", "dna ").reverse
78
- end
79
-
80
- def previous_interaction_hash
81
- raw_hash previous_interaction
82
- end
83
-
84
- def new_interaction_hash
85
- raw_hash new_interaction
86
- end
87
-
88
- def raw_hash interaction
89
- JSON.parse(Pact::MockService::InteractionDecorator.new(interaction).to_json)
90
- end
91
-
92
- end
93
- end
94
- end
95
- end