pact 1.0.30 → 1.0.31
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.travis.yml +2 -2
- data/Gemfile.lock +0 -7
- data/README.md +50 -53
- data/Rakefile +1 -25
- data/documentation/Testing with pact.png +0 -0
- data/documentation/faq.md +45 -0
- data/documentation/raq.md +39 -0
- data/documentation/terminology.md +25 -0
- data/example/animal-service/Gemfile +4 -4
- data/example/animal-service/Gemfile.lock +20 -15
- data/example/animal-service/Rakefile +1 -1
- data/example/animal-service/config.ru +3 -0
- data/example/animal-service/db/animal_db.sqlite3 +0 -0
- data/example/animal-service/db/animals_db.sqlite3 +0 -0
- data/example/animal-service/lib/animal_service/animal_repository.rb +16 -0
- data/example/animal-service/lib/animal_service/api.rb +28 -0
- data/example/animal-service/lib/animal_service/db.rb +5 -0
- data/example/animal-service/spec/service_consumers/pact_helper.rb +10 -16
- data/example/animal-service/spec/service_consumers/provider_states_for_zoo_app.rb +13 -3
- data/example/zoo-app/Gemfile +0 -2
- data/example/zoo-app/Gemfile.lock +7 -8
- data/example/zoo-app/lib/zoo_app/animal_service_client.rb +8 -4
- data/example/zoo-app/spec/pacts/zoo_app-animal_service.json +18 -64
- data/example/zoo-app/spec/service_providers/animal_service_client_spec.rb +76 -0
- data/example/zoo-app/spec/service_providers/pact_helper.rb +1 -1
- data/example/zoo-app/spec/spec_helper.rb +0 -2
- data/lib/pact/app.rb +4 -2
- data/lib/pact/consumer/configuration.rb +2 -2
- data/lib/pact/consumer/consumer_contract_builder.rb +2 -1
- data/lib/pact/consumer/interactions_filter.rb +7 -0
- data/lib/pact/consumer/mock_service/app.rb +7 -2
- data/lib/pact/consumer/mock_service/interaction_mismatch.rb +6 -1
- data/lib/pact/consumer/mock_service/interaction_post.rb +1 -1
- data/lib/pact/consumer/mock_service/rack_request_helper.rb +1 -1
- data/lib/pact/consumer/rspec.rb +9 -15
- data/lib/pact/consumer/rspec/full_example_description.rb +28 -0
- data/lib/pact/consumer/spec_hooks.rb +31 -0
- data/lib/pact/consumer_contract/consumer_contract.rb +2 -31
- data/lib/pact/consumer_contract/file_name.rb +13 -0
- data/lib/pact/consumer_contract/pact_file.rb +24 -0
- data/lib/pact/provider/matchers.rb +3 -1
- data/lib/pact/provider/provider_state.rb +43 -20
- data/lib/pact/version.rb +1 -1
- data/pact.gemspec +0 -1
- data/spec/features/consumption_spec.rb +5 -0
- data/spec/lib/pact/consumer/consumer_contract_builder_spec.rb +162 -147
- data/spec/lib/pact/consumer/mock_service/app_spec.rb +52 -0
- data/spec/lib/pact/consumer/mock_service/interaction_mismatch_spec.rb +3 -3
- metadata +19 -25
- 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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
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.
|
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:
|
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/
|
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
|