pact 1.0.30 → 1.0.31

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 (51) hide show
  1. data/.gitignore +1 -0
  2. data/.travis.yml +2 -2
  3. data/Gemfile.lock +0 -7
  4. data/README.md +50 -53
  5. data/Rakefile +1 -25
  6. data/documentation/Testing with pact.png +0 -0
  7. data/documentation/faq.md +45 -0
  8. data/documentation/raq.md +39 -0
  9. data/documentation/terminology.md +25 -0
  10. data/example/animal-service/Gemfile +4 -4
  11. data/example/animal-service/Gemfile.lock +20 -15
  12. data/example/animal-service/Rakefile +1 -1
  13. data/example/animal-service/config.ru +3 -0
  14. data/example/animal-service/db/animal_db.sqlite3 +0 -0
  15. data/example/animal-service/db/animals_db.sqlite3 +0 -0
  16. data/example/animal-service/lib/animal_service/animal_repository.rb +16 -0
  17. data/example/animal-service/lib/animal_service/api.rb +28 -0
  18. data/example/animal-service/lib/animal_service/db.rb +5 -0
  19. data/example/animal-service/spec/service_consumers/pact_helper.rb +10 -16
  20. data/example/animal-service/spec/service_consumers/provider_states_for_zoo_app.rb +13 -3
  21. data/example/zoo-app/Gemfile +0 -2
  22. data/example/zoo-app/Gemfile.lock +7 -8
  23. data/example/zoo-app/lib/zoo_app/animal_service_client.rb +8 -4
  24. data/example/zoo-app/spec/pacts/zoo_app-animal_service.json +18 -64
  25. data/example/zoo-app/spec/service_providers/animal_service_client_spec.rb +76 -0
  26. data/example/zoo-app/spec/service_providers/pact_helper.rb +1 -1
  27. data/example/zoo-app/spec/spec_helper.rb +0 -2
  28. data/lib/pact/app.rb +4 -2
  29. data/lib/pact/consumer/configuration.rb +2 -2
  30. data/lib/pact/consumer/consumer_contract_builder.rb +2 -1
  31. data/lib/pact/consumer/interactions_filter.rb +7 -0
  32. data/lib/pact/consumer/mock_service/app.rb +7 -2
  33. data/lib/pact/consumer/mock_service/interaction_mismatch.rb +6 -1
  34. data/lib/pact/consumer/mock_service/interaction_post.rb +1 -1
  35. data/lib/pact/consumer/mock_service/rack_request_helper.rb +1 -1
  36. data/lib/pact/consumer/rspec.rb +9 -15
  37. data/lib/pact/consumer/rspec/full_example_description.rb +28 -0
  38. data/lib/pact/consumer/spec_hooks.rb +31 -0
  39. data/lib/pact/consumer_contract/consumer_contract.rb +2 -31
  40. data/lib/pact/consumer_contract/file_name.rb +13 -0
  41. data/lib/pact/consumer_contract/pact_file.rb +24 -0
  42. data/lib/pact/provider/matchers.rb +3 -1
  43. data/lib/pact/provider/provider_state.rb +43 -20
  44. data/lib/pact/version.rb +1 -1
  45. data/pact.gemspec +0 -1
  46. data/spec/features/consumption_spec.rb +5 -0
  47. data/spec/lib/pact/consumer/consumer_contract_builder_spec.rb +162 -147
  48. data/spec/lib/pact/consumer/mock_service/app_spec.rb +52 -0
  49. data/spec/lib/pact/consumer/mock_service/interaction_mismatch_spec.rb +3 -3
  50. metadata +19 -25
  51. data/example/zoo-app/spec/service_providers/animal_service_spec.rb +0 -92
@@ -4,6 +4,9 @@ require 'pact/consumer/rspec'
4
4
 
5
5
  describe "A service consumer side of a pact", :pact => true do
6
6
 
7
+ describe "blah" do
8
+ describe "thing" do
9
+
7
10
  it "goes a little something like this" do
8
11
  Pact.clear_configuration
9
12
 
@@ -101,4 +104,6 @@ describe "A service consumer side of a pact", :pact => true do
101
104
  end
102
105
 
103
106
  end
107
+ end
108
+ end
104
109
 
@@ -3,150 +3,165 @@ require 'fileutils'
3
3
  require 'pathname'
4
4
 
5
5
  module Pact
6
- module Consumer
7
- describe ConsumerContractBuilder do
8
-
9
- describe "initialize" do
10
- SUPPORT_PACT_FILE = './spec/support/a_consumer-a_provider.json'
11
- before do
12
- Pact.clear_configuration
13
- Pact.configuration.stub(:pact_dir).and_return(File.expand_path(tmp_pact_dir))
14
- FileUtils.rm_rf tmp_pact_dir
15
- FileUtils.mkdir_p tmp_pact_dir
16
- FileUtils.cp SUPPORT_PACT_FILE, "#{tmp_pact_dir}/a_consumer-a_provider.json"
17
- end
18
-
19
- let(:expected_interactions) { ConsumerContract.from_json(File.read(SUPPORT_PACT_FILE)).interactions }
20
-
21
- let(:tmp_pact_dir) {"./tmp/pacts"}
22
-
23
- let(:consumer_name) { 'a consumer' }
24
- let(:provider_name) { 'a provider' }
25
- let(:consumer_contract_builder) {
26
- Pact::Consumer::ConsumerContractBuilder.new(
27
- :pactfile_write_mode => pactfile_write_mode,
28
- :consumer_name => consumer_name,
29
- :provider_name => provider_name,
30
- :port => 1234)}
31
-
32
- context "when overwriting pact" do
33
- let(:pactfile_write_mode) {:overwrite}
34
- it "it overwrites the existing pact file" do
35
- expect(consumer_contract_builder.consumer_contract.interactions).to eq []
36
- end
37
-
38
- it "uses an DistinctInteractionsFilter to handle new interactions" do
39
- Pact::Consumer::DistinctInteractionsFilter.should_receive(:new).with([])
40
- consumer_contract_builder
41
- end
42
- end
43
-
44
- context "when updating pact" do
45
- before do
46
-
47
- end
48
- let(:pactfile_write_mode) {:update}
49
- it "loads the interactions from the existing pact file" do
50
- ConsumerContractBuilder.any_instance.stub(:info_and_puts)
51
- expect(consumer_contract_builder.consumer_contract.interactions).to eq expected_interactions
52
- end
53
-
54
- it "uses an UpdatableInteractionsFilter to handle new interactions" do
55
- ConsumerContractBuilder.any_instance.stub(:info_and_puts)
56
- Pact::Consumer::UpdatableInteractionsFilter.should_receive(:new).with(expected_interactions)
57
- consumer_contract_builder
58
- end
59
-
60
- let(:line0) { /\*/ }
61
- let(:line1) { /Updating existing file/ }
62
- let(:line2) { /Only interactions defined in this test run will be updated/ }
63
- let(:line3) { /As interactions are identified by description and provider state/ }
64
- it "logs a description message" do
65
- $stdout.should_receive(:puts).with(line0).twice
66
- $stdout.should_receive(:puts).with(line1)
67
- $stdout.should_receive(:puts).with(line2)
68
- $stdout.should_receive(:puts).with(line3)
69
- Pact.configuration.logger.should_receive(:info).with(line0).twice
70
- Pact.configuration.logger.should_receive(:info).with(line1)
71
- Pact.configuration.logger.should_receive(:info).with(line2)
72
- Pact.configuration.logger.should_receive(:info).with(line3)
73
- consumer_contract_builder
74
- end
75
- end
76
-
77
- context "when an error occurs deserializing the existing pactfile" do
78
- let(:pactfile_write_mode) {:update}
79
- let(:error) { RuntimeError.new('some error')}
80
- let(:line1) { /Could not load existing consumer contract from .* due to some error/ }
81
- let(:line2) {'Creating a new file.'}
82
- before do
83
- ConsumerContract.stub(:from_json).and_raise(error)
84
- $stderr.should_receive(:puts).with(line1)
85
- $stderr.should_receive(:puts).with(line2)
86
- Pact.configuration.logger.should_receive(:warn).with(line1)
87
- Pact.configuration.logger.should_receive(:warn).with(line2)
88
- end
89
- it "logs the error" do
90
- consumer_contract_builder
91
- end
92
-
93
- it "continues with a new file" do
94
- expect(consumer_contract_builder.consumer_contract.interactions).to eq []
95
- end
96
- end
97
- end
98
-
99
- describe "handle_interaction_fully_defined" do
100
-
101
- subject {
102
- Pact::Consumer::ConsumerContractBuilder.new({:consumer_name => 'blah', :provider_name => 'blah', :port => 2222})
103
- }
104
-
105
- let(:interaction_hash) {
106
- {
107
- description: 'Test request',
108
- request: {
109
- method: 'post',
110
- path: '/foo',
111
- body: Term.new(generate: 'waffle', matcher: /ffl/),
112
- headers: { 'Content-Type' => 'application/json' },
113
- query: "",
114
- },
115
- response: {
116
- baz: 'qux',
117
- wiffle: 'wiffle'
118
- }
119
- }
120
- }
121
-
122
- let(:interaction_json) { {} }
123
-
124
- let(:interaction) { Pact::Interaction.from_hash(JSON.load(interaction_hash.to_json)) }
125
-
126
- before do
127
- stub_request(:post, 'localhost:2222/interactions')
128
- end
129
-
130
- it "posts the interaction with generated response to the mock service" do
131
- subject.handle_interaction_fully_defined interaction
132
- WebMock.should have_requested(:post, 'localhost:2222/interactions').with(body: interaction_json)
133
- end
134
-
135
- it "adds the interaction to the consumer contract" do
136
- subject.handle_interaction_fully_defined interaction
137
- expect(subject.consumer_contract.interactions).to eq [interaction]
138
- end
139
-
140
- it "updates the provider's pactfile" do
141
- subject.consumer_contract.should_receive(:update_pactfile)
142
- subject.handle_interaction_fully_defined interaction
143
- end
144
-
145
- it "resets the interaction_builder to nil" do
146
- subject.should_receive(:interaction_builder=).with(nil)
147
- subject.handle_interaction_fully_defined interaction
148
- end
149
- end
150
- end
151
- end
152
- end
6
+ module Consumer
7
+ describe ConsumerContractBuilder do
8
+
9
+ let(:consumer_name) { 'a consumer' }
10
+ let(:provider_name) { 'a provider' }
11
+
12
+ describe "initialize" do
13
+ SUPPORT_PACT_FILE = './spec/support/a_consumer-a_provider.json'
14
+ before do
15
+ Pact.clear_configuration
16
+ Pact.configuration.stub(:pact_dir).and_return(File.expand_path(tmp_pact_dir))
17
+ FileUtils.rm_rf tmp_pact_dir
18
+ FileUtils.mkdir_p tmp_pact_dir
19
+ FileUtils.cp SUPPORT_PACT_FILE, "#{tmp_pact_dir}/a_consumer-a_provider.json"
20
+ end
21
+
22
+ let(:expected_interactions) { ConsumerContract.from_json(File.read(SUPPORT_PACT_FILE)).interactions }
23
+
24
+ let(:tmp_pact_dir) {"./tmp/pacts"}
25
+
26
+ let(:consumer_contract_builder) {
27
+ Pact::Consumer::ConsumerContractBuilder.new(
28
+ :pactfile_write_mode => pactfile_write_mode,
29
+ :consumer_name => consumer_name,
30
+ :provider_name => provider_name,
31
+ :port => 1234)}
32
+
33
+ context "when overwriting pact" do
34
+ let(:pactfile_write_mode) {:overwrite}
35
+ it "it overwrites the existing pact file" do
36
+ expect(consumer_contract_builder.consumer_contract.interactions).to eq []
37
+ end
38
+
39
+ it "uses an DistinctInteractionsFilter to handle new interactions" do
40
+ Pact::Consumer::DistinctInteractionsFilter.should_receive(:new).with([])
41
+ consumer_contract_builder
42
+ end
43
+ end
44
+
45
+ context "when updating pact" do
46
+ before do
47
+
48
+ end
49
+ let(:pactfile_write_mode) {:update}
50
+ it "loads the interactions from the existing pact file" do
51
+ ConsumerContractBuilder.any_instance.stub(:info_and_puts)
52
+ expect(consumer_contract_builder.consumer_contract.interactions).to eq expected_interactions
53
+ end
54
+
55
+ it "uses an UpdatableInteractionsFilter to handle new interactions" do
56
+ ConsumerContractBuilder.any_instance.stub(:info_and_puts)
57
+ Pact::Consumer::UpdatableInteractionsFilter.should_receive(:new).with(expected_interactions)
58
+ consumer_contract_builder
59
+ end
60
+
61
+ let(:line0) { /\*/ }
62
+ let(:line1) { /Updating existing file/ }
63
+ let(:line2) { /Only interactions defined in this test run will be updated/ }
64
+ let(:line3) { /As interactions are identified by description and provider state/ }
65
+ it "logs a description message" do
66
+ $stdout.should_receive(:puts).with(line0).twice
67
+ $stdout.should_receive(:puts).with(line1)
68
+ $stdout.should_receive(:puts).with(line2)
69
+ $stdout.should_receive(:puts).with(line3)
70
+ Pact.configuration.logger.should_receive(:info).with(line0).twice
71
+ Pact.configuration.logger.should_receive(:info).with(line1)
72
+ Pact.configuration.logger.should_receive(:info).with(line2)
73
+ Pact.configuration.logger.should_receive(:info).with(line3)
74
+ consumer_contract_builder
75
+ end
76
+ end
77
+
78
+ context "when an error occurs deserializing the existing pactfile" do
79
+ let(:pactfile_write_mode) {:update}
80
+ let(:error) { RuntimeError.new('some error')}
81
+ let(:line1) { /Could not load existing consumer contract from .* due to some error/ }
82
+ let(:line2) {'Creating a new file.'}
83
+ before do
84
+ ConsumerContract.stub(:from_json).and_raise(error)
85
+ $stderr.should_receive(:puts).with(line1)
86
+ $stderr.should_receive(:puts).with(line2)
87
+ Pact.configuration.logger.should_receive(:warn).with(line1)
88
+ Pact.configuration.logger.should_receive(:warn).with(line2)
89
+ end
90
+ it "logs the error" do
91
+ consumer_contract_builder
92
+ end
93
+
94
+ it "continues with a new file" do
95
+ expect(consumer_contract_builder.consumer_contract.interactions).to eq []
96
+ end
97
+ end
98
+ end
99
+
100
+ describe "handle_interaction_fully_defined" do
101
+
102
+ subject {
103
+ Pact::Consumer::ConsumerContractBuilder.new({:consumer_name => 'blah', :provider_name => 'blah', :port => 2222})
104
+ }
105
+
106
+ let(:interaction_hash) {
107
+ {
108
+ description: 'Test request',
109
+ request: {
110
+ method: 'post',
111
+ path: '/foo',
112
+ body: Term.new(generate: 'waffle', matcher: /ffl/),
113
+ headers: { 'Content-Type' => 'application/json' },
114
+ query: "",
115
+ },
116
+ response: {
117
+ baz: 'qux',
118
+ wiffle: 'wiffle'
119
+ }
120
+ }
121
+ }
122
+
123
+ let(:interaction_json) { {} }
124
+
125
+ let(:interaction) { Pact::Interaction.from_hash(JSON.load(interaction_hash.to_json)) }
126
+
127
+ before do
128
+ stub_request(:post, 'localhost:2222/interactions')
129
+ end
130
+
131
+ it "posts the interaction with generated response to the mock service" do
132
+ subject.handle_interaction_fully_defined interaction
133
+ WebMock.should have_requested(:post, 'localhost:2222/interactions').with(body: interaction_json)
134
+ end
135
+
136
+ it "adds the interaction to the consumer contract" do
137
+ subject.handle_interaction_fully_defined interaction
138
+ expect(subject.consumer_contract.interactions).to eq [interaction]
139
+ end
140
+
141
+ it "updates the provider's pactfile" do
142
+ subject.consumer_contract.should_receive(:update_pactfile)
143
+ subject.handle_interaction_fully_defined interaction
144
+ end
145
+
146
+ it "resets the interaction_builder to nil" do
147
+ subject.should_receive(:interaction_builder=).with(nil)
148
+ subject.handle_interaction_fully_defined interaction
149
+ end
150
+ end
151
+
152
+ describe "#mock_service_base_url" do
153
+
154
+ subject {
155
+ ConsumerContractBuilder.new(
156
+ :pactfile_write_mode => :overwrite,
157
+ :consumer_name => consumer_name,
158
+ :provider_name => provider_name,
159
+ :port => 1234) }
160
+
161
+ it "returns the mock service base URL" do
162
+ expect(subject.mock_service_base_url).to eq("http://localhost:1234")
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,52 @@
1
+ require 'spec_helper'
2
+ require 'rack/test'
3
+ require 'tempfile'
4
+
5
+ module Pact
6
+ module Consumer
7
+
8
+ describe MockService do
9
+
10
+ include Rack::Test::Methods
11
+
12
+ def app
13
+ MockService.new(log_file: temp_file)
14
+ end
15
+
16
+ let(:temp_file) { Tempfile.new('log') }
17
+
18
+ after do
19
+ temp_file.close
20
+ temp_file.unlink
21
+ end
22
+
23
+ context "when a StandardError is encountered" do
24
+ let(:response) { JSON.parse(last_response.body)}
25
+ let(:interaction_replay) { double(InteractionReplay, :match? => true)}
26
+
27
+ before do
28
+ InteractionReplay.stub(:new).and_return(interaction_replay)
29
+ interaction_replay.stub(:respond).and_raise("an error")
30
+ end
31
+
32
+ subject { get "/" }
33
+
34
+ it "returns a json error" do
35
+ subject
36
+ expect(last_response.content_type).to eq 'application/json'
37
+ end
38
+
39
+ it "includes the error message" do
40
+ subject
41
+ expect(response['message']).to eq "an error"
42
+ end
43
+
44
+ it "includes the backtrace" do
45
+ subject
46
+ expect(response['backtrace']).to be_instance_of Array
47
+ end
48
+ end
49
+
50
+ end
51
+ end
52
+ end
@@ -27,20 +27,20 @@ module Pact
27
27
  let(:diff_1) { {body: nil} }
28
28
 
29
29
  it "returns a message indicating that the body does not match" do
30
- expect(subject.short_summary).to include "(body did not match)"
30
+ expect(subject.short_summary).to include "(request body did not match)"
31
31
  end
32
32
  end
33
33
  context "when the headers do not match" do
34
34
  let(:diff_1) { {headers: nil} }
35
35
  it "returns a message indicating that the body does not match" do
36
- expect(subject.short_summary).to include "(headers did not match)"
36
+ expect(subject.short_summary).to include "(request headers did not match)"
37
37
  end
38
38
  end
39
39
  context "when the headers and body do not match" do
40
40
  let(:diff_1) { {body: nil, headers: nil} }
41
41
  let(:diff_2) { {body: nil, headers: nil} }
42
42
  it "returns a message indicating that the headers and body do not match" do
43
- expect(subject.short_summary).to include "(body and headers did not match)"
43
+ expect(subject.short_summary).to include "(request body and headers did not match)"
44
44
  end
45
45
  end
46
46
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.30
4
+ version: 1.0.31
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ authors:
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
- date: 2013-12-16 00:00:00.000000000 Z
16
+ date: 2014-03-11 00:00:00.000000000 Z
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: randexp
@@ -31,22 +31,6 @@ dependencies:
31
31
  - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.1.7
34
- - !ruby/object:Gem::Dependency
35
- name: thin
36
- requirement: !ruby/object:Gem::Requirement
37
- none: false
38
- requirements:
39
- - - ! '>='
40
- - !ruby/object:Gem::Version
41
- version: '0'
42
- type: :runtime
43
- prerelease: false
44
- version_requirements: !ruby/object:Gem::Requirement
45
- none: false
46
- requirements:
47
- - - ! '>='
48
- - !ruby/object:Gem::Version
49
- version: '0'
50
34
  - !ruby/object:Gem::Dependency
51
35
  name: rspec
52
36
  requirement: !ruby/object:Gem::Requirement
@@ -297,9 +281,19 @@ files:
297
281
  - Rakefile
298
282
  - bin/pact
299
283
  - config.ru
284
+ - documentation/Testing with pact.png
285
+ - documentation/faq.md
286
+ - documentation/raq.md
287
+ - documentation/terminology.md
300
288
  - example/animal-service/Gemfile
301
289
  - example/animal-service/Gemfile.lock
302
290
  - example/animal-service/Rakefile
291
+ - example/animal-service/config.ru
292
+ - example/animal-service/db/animal_db.sqlite3
293
+ - example/animal-service/db/animals_db.sqlite3
294
+ - example/animal-service/lib/animal_service/animal_repository.rb
295
+ - example/animal-service/lib/animal_service/api.rb
296
+ - example/animal-service/lib/animal_service/db.rb
303
297
  - example/animal-service/spec/service_consumers/pact_helper.rb
304
298
  - example/animal-service/spec/service_consumers/provider_states_for_zoo_app.rb
305
299
  - example/zoo-app/Gemfile
@@ -307,7 +301,7 @@ files:
307
301
  - example/zoo-app/lib/zoo_app/animal_service_client.rb
308
302
  - example/zoo-app/lib/zoo_app/models/alligator.rb
309
303
  - example/zoo-app/spec/pacts/zoo_app-animal_service.json
310
- - example/zoo-app/spec/service_providers/animal_service_spec.rb
304
+ - example/zoo-app/spec/service_providers/animal_service_client_spec.rb
311
305
  - example/zoo-app/spec/service_providers/pact_helper.rb
312
306
  - example/zoo-app/spec/spec_helper.rb
313
307
  - lib/pact.rb
@@ -336,11 +330,15 @@ files:
336
330
  - lib/pact/consumer/mock_service_interaction_expectation.rb
337
331
  - lib/pact/consumer/request.rb
338
332
  - lib/pact/consumer/rspec.rb
333
+ - lib/pact/consumer/rspec/full_example_description.rb
339
334
  - lib/pact/consumer/server.rb
335
+ - lib/pact/consumer/spec_hooks.rb
340
336
  - lib/pact/consumer_contract.rb
341
337
  - lib/pact/consumer_contract/active_support_support.rb
342
338
  - lib/pact/consumer_contract/consumer_contract.rb
339
+ - lib/pact/consumer_contract/file_name.rb
343
340
  - lib/pact/consumer_contract/interaction.rb
341
+ - lib/pact/consumer_contract/pact_file.rb
344
342
  - lib/pact/consumer_contract/request.rb
345
343
  - lib/pact/consumer_contract/service_consumer.rb
346
344
  - lib/pact/consumer_contract/service_provider.rb
@@ -394,6 +392,7 @@ files:
394
392
  - spec/lib/pact/consumer/consumer_contract_builder_spec.rb
395
393
  - spec/lib/pact/consumer/interaction_builder_spec.rb
396
394
  - spec/lib/pact/consumer/interactions_spec.rb
395
+ - spec/lib/pact/consumer/mock_service/app_spec.rb
397
396
  - spec/lib/pact/consumer/mock_service/interaction_list_spec.rb
398
397
  - spec/lib/pact/consumer/mock_service/interaction_mismatch_spec.rb
399
398
  - spec/lib/pact/consumer/mock_service/interaction_replay_spec.rb
@@ -450,18 +449,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
450
449
  - - ! '>='
451
450
  - !ruby/object:Gem::Version
452
451
  version: '0'
453
- segments:
454
- - 0
455
- hash: 2811888500832128334
456
452
  required_rubygems_version: !ruby/object:Gem::Requirement
457
453
  none: false
458
454
  requirements:
459
455
  - - ! '>='
460
456
  - !ruby/object:Gem::Version
461
457
  version: '0'
462
- segments:
463
- - 0
464
- hash: 2811888500832128334
465
458
  requirements: []
466
459
  rubyforge_project:
467
460
  rubygems_version: 1.8.23
@@ -483,6 +476,7 @@ test_files:
483
476
  - spec/lib/pact/consumer/consumer_contract_builder_spec.rb
484
477
  - spec/lib/pact/consumer/interaction_builder_spec.rb
485
478
  - spec/lib/pact/consumer/interactions_spec.rb
479
+ - spec/lib/pact/consumer/mock_service/app_spec.rb
486
480
  - spec/lib/pact/consumer/mock_service/interaction_list_spec.rb
487
481
  - spec/lib/pact/consumer/mock_service/interaction_mismatch_spec.rb
488
482
  - spec/lib/pact/consumer/mock_service/interaction_replay_spec.rb