pact 1.0.30 → 1.0.31

Sign up to get free protection for your applications and to get access to all the features.
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