pact 0.1.37 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +6 -19
- data/example/zoo-app/Gemfile +1 -2
- data/example/zoo-app/Gemfile.lock +16 -13
- data/example/zoo-app/spec/pacts/zoo_app-animal_service.json +6 -6
- data/lib/pact/consumer/app_manager.rb +8 -28
- data/lib/pact/consumer/consumer_contract_builder.rb +65 -36
- data/lib/pact/consumer/dsl.rb +20 -10
- data/lib/pact/consumer/interaction_builder.rb +42 -0
- data/lib/pact/consumer/interactions_filter.rb +41 -0
- data/lib/pact/consumer/mock_service.rb +26 -19
- data/lib/pact/consumer/rspec.rb +2 -3
- data/lib/pact/consumer/server.rb +90 -0
- data/lib/pact/consumer.rb +6 -3
- data/lib/pact/consumer_contract/consumer_contract.rb +103 -0
- data/lib/pact/consumer_contract/interaction.rb +70 -0
- data/lib/pact/consumer_contract/service_consumer.rb +20 -0
- data/lib/pact/consumer_contract/service_provider.rb +20 -0
- data/lib/pact/consumer_contract.rb +1 -112
- data/lib/pact/{producer → provider}/dsl.rb +15 -4
- data/lib/pact/{producer → provider}/matchers.rb +0 -0
- data/lib/pact/{producer → provider}/pact_spec_runner.rb +2 -2
- data/lib/pact/{producer/producer_state.rb → provider/provider_state.rb} +13 -22
- data/lib/pact/provider/rspec.rb +128 -1
- data/lib/pact/{producer → provider}/test_methods.rb +12 -12
- data/lib/pact/{producer.rb → provider.rb} +0 -0
- data/lib/pact/verification_task.rb +4 -4
- data/lib/pact/version.rb +1 -1
- data/lib/pact.rb +1 -1
- data/pact.gemspec +1 -2
- data/scratchpad.txt +1 -1
- data/spec/features/consumption_spec.rb +15 -23
- data/spec/features/production_spec.rb +5 -5
- data/spec/features/{producer_states → provider_states}/zebras.rb +3 -3
- data/spec/integration/pact/consumer_configuration_spec.rb +3 -66
- data/spec/integration/pact/provider_configuration_spec.rb +1 -1
- data/spec/lib/pact/consumer/consumer_contract_builder_spec.rb +59 -15
- data/spec/lib/pact/consumer/dsl_spec.rb +4 -5
- data/spec/lib/pact/consumer/interaction_builder_spec.rb +91 -0
- data/spec/lib/pact/consumer/interactions_spec.rb +64 -0
- data/spec/lib/pact/consumer/mock_service_spec.rb +2 -6
- data/spec/lib/pact/consumer/service_consumer_spec.rb +1 -1
- data/spec/lib/pact/{consumer_contract_spec.rb → consumer_contract/consumer_contract_spec.rb} +72 -28
- data/spec/lib/pact/{consumer → consumer_contract}/interaction_spec.rb +49 -64
- data/spec/lib/pact/{producer/configuration_dsl_spec.rb → provider/dsl_spec.rb} +29 -28
- data/spec/lib/pact/{producer/producer_state_spec.rb → provider/provider_state_spec.rb} +17 -17
- data/spec/lib/pact/{producer → provider}/rspec_spec.rb +1 -1
- data/spec/lib/pact/verification_task_spec.rb +3 -3
- data/spec/spec_helper.rb +1 -0
- data/spec/support/a_consumer-a_producer.json +1 -1
- data/spec/support/a_consumer-a_provider.json +34 -0
- data/spec/support/consumer_contract_template.json +26 -0
- data/spec/support/factories.rb +78 -0
- data/spec/support/pact_rake_support.rb +1 -1
- data/spec/support/test_app_fail.json +1 -1
- data/spec/support/test_app_pass.json +1 -1
- data/tasks/pact-test.rake +3 -3
- metadata +38 -45
- data/lib/pact/consumer/configuration_dsl.rb +0 -73
- data/lib/pact/consumer/interaction.rb +0 -74
- data/lib/pact/consumer/run_condor.rb +0 -4
- data/lib/pact/consumer/run_mock_contract_service.rb +0 -13
- data/lib/pact/consumer/service_consumer.rb +0 -22
- data/lib/pact/consumer/service_producer.rb +0 -23
- data/lib/pact/producer/configuration_dsl.rb +0 -62
- data/lib/pact/producer/rspec.rb +0 -129
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'pact/consumer/dsl'
|
3
|
-
require 'pact/consumer/configuration_dsl'
|
4
3
|
|
5
4
|
module Pact::Consumer::DSL
|
6
5
|
|
@@ -18,7 +17,7 @@ module Pact::Consumer::DSL
|
|
18
17
|
end
|
19
18
|
}
|
20
19
|
|
21
|
-
let(:
|
20
|
+
let(:provider_name) { 'Mock Provider'}
|
22
21
|
let(:consumer_contract_builder) { double('Pact::Consumer::ConsumerContractBuilder').as_null_object}
|
23
22
|
let(:url) { "http://localhost:1234"}
|
24
23
|
|
@@ -26,7 +25,7 @@ module Pact::Consumer::DSL
|
|
26
25
|
Pact::Consumer::ConsumerContractBuilder.stub(:new).and_return(consumer_contract_builder)
|
27
26
|
subject.configure_consumer_contract_builder({})
|
28
27
|
consumer_contract_builder.should_receive(:verify)
|
29
|
-
Pact.configuration.
|
28
|
+
Pact.configuration.provider_verifications.first.call
|
30
29
|
end
|
31
30
|
|
32
31
|
context "when standalone" do
|
@@ -44,8 +43,8 @@ module Pact::Consumer::DSL
|
|
44
43
|
end
|
45
44
|
}
|
46
45
|
it "registers the app with the AppManager" do
|
47
|
-
Pact::Consumer::AppManager.instance.should_receive(:register_mock_service_for).with(
|
48
|
-
subject.configure_consumer_contract_builder({:
|
46
|
+
Pact::Consumer::AppManager.instance.should_receive(:register_mock_service_for).with(provider_name, url)
|
47
|
+
subject.configure_consumer_contract_builder({:provider_name => provider_name })
|
49
48
|
end
|
50
49
|
end
|
51
50
|
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact/consumer/interaction_builder'
|
3
|
+
|
4
|
+
module Pact
|
5
|
+
module Consumer
|
6
|
+
describe InteractionBuilder do
|
7
|
+
|
8
|
+
subject { InteractionBuilder.new }
|
9
|
+
let(:interaction) { double('Interaction').as_null_object}
|
10
|
+
|
11
|
+
before do
|
12
|
+
Interaction.should_receive(:new).and_return(interaction)
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "given" do
|
16
|
+
context "with a string provider state" do
|
17
|
+
it "sets the provider_state on the interaction" do
|
18
|
+
interaction.should_receive(:provider_state=).with('blah')
|
19
|
+
subject.given('blah')
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "with a symbol provider state" do
|
24
|
+
it "sets the provider_state on the interaction as a string" do
|
25
|
+
interaction.should_receive(:provider_state=).with('some_symbol')
|
26
|
+
subject.given(:some_symbol)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
it "returns itself" do
|
31
|
+
expect(subject.given(nil)).to be(subject)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "upon_receiving" do
|
36
|
+
it "sets the description on the interaction" do
|
37
|
+
interaction.should_receive(:description=).with('blah')
|
38
|
+
subject.upon_receiving('blah')
|
39
|
+
end
|
40
|
+
|
41
|
+
it "returns itself" do
|
42
|
+
expect(subject.given(nil)).to be(subject)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "with" do
|
47
|
+
|
48
|
+
let(:request) { {a: 'request'} }
|
49
|
+
let(:expected_request) { {an: 'expected_request'} }
|
50
|
+
|
51
|
+
it "sets the request on the interaction as a instance of Request::Expected" do
|
52
|
+
Request::Expected.should_receive(:from_hash).with(request).and_return(expected_request)
|
53
|
+
interaction.should_receive(:request=).with(expected_request)
|
54
|
+
subject.with(request)
|
55
|
+
end
|
56
|
+
|
57
|
+
it "returns itself" do
|
58
|
+
expect(subject.given(nil)).to be(subject)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "will_respond_with" do
|
63
|
+
let(:response) { {a: 'response'} }
|
64
|
+
|
65
|
+
let(:provider) do
|
66
|
+
double(callback: nil)
|
67
|
+
end
|
68
|
+
|
69
|
+
before do
|
70
|
+
subject.on_interaction_fully_defined do | interaction |
|
71
|
+
provider.callback interaction
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
it "sets the response on the interaction" do
|
76
|
+
interaction.should_receive(:response=).with(response)
|
77
|
+
subject.will_respond_with(response)
|
78
|
+
end
|
79
|
+
|
80
|
+
it "returns itself" do
|
81
|
+
expect(subject.given(nil)).to be(subject)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "invokes the 'on_interaction_fully_defined' callback" do
|
85
|
+
provider.should_receive(:callback).with(interaction)
|
86
|
+
subject.will_respond_with response
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact/consumer/interactions_filter'
|
3
|
+
|
4
|
+
module Pact::Consumer
|
5
|
+
|
6
|
+
describe 'Interactions' do
|
7
|
+
let(:interaction) { InteractionFactory.create }
|
8
|
+
let(:indentical_interaction) { InteractionFactory.create }
|
9
|
+
let(:interaction_with_diff_request) { InteractionFactory.create :request => {:path => '/different'} }
|
10
|
+
let(:interaction_with_diff_description) { InteractionFactory.create :description => 'blah' }
|
11
|
+
let(:interaction_with_diff_provider_state) { InteractionFactory.create :provider_state => 'blah' }
|
12
|
+
let(:interactions) { [interaction] }
|
13
|
+
|
14
|
+
shared_examples_for 'interactions' do
|
15
|
+
|
16
|
+
subject { described_class.new(interactions) }
|
17
|
+
|
18
|
+
describe "<<" do
|
19
|
+
context "when an interaction with the same provider state and description is not already included" do
|
20
|
+
it "adds the interaction" do
|
21
|
+
subject << interaction_with_diff_description
|
22
|
+
expect(interactions).to eq [interaction, interaction_with_diff_description]
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe UpdatableInteractionsFilter do
|
29
|
+
context "which, by default, is used when running rspec" do
|
30
|
+
include_examples 'interactions'
|
31
|
+
describe "<<" do
|
32
|
+
context "when an interaction with the same provider state and description is already included" do
|
33
|
+
it "overwrites the existing interaction, as the user has most likely just updated a test, and is rerunning the one spec" do
|
34
|
+
subject << interaction_with_diff_request
|
35
|
+
expect(interactions).to eq [interaction_with_diff_request]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe DistinctInteractionsFilter do
|
43
|
+
context "which, by default, this is used when running rake" do
|
44
|
+
include_examples 'interactions'
|
45
|
+
describe "<<" do
|
46
|
+
context "when an interaction with the same provider state and description is already included" do
|
47
|
+
context "when the interactions are not equal" do
|
48
|
+
it "raises an error as the user has most likely copy/pasted an existing interaction and forgotten to update the description or provider state" do
|
49
|
+
expect{ subject << interaction_with_diff_request }.to raise_error 'Interaction with same description (a description) and provider state (a thing exists) already exists'
|
50
|
+
end
|
51
|
+
end
|
52
|
+
context "when the interactions are equal" do
|
53
|
+
it "does not add the interaction as it already exists" do
|
54
|
+
subject << indentical_interaction
|
55
|
+
expect(interactions).to eq [interaction]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -4,15 +4,11 @@ require 'pact/consumer/mock_service'
|
|
4
4
|
module Pact::Consumer
|
5
5
|
|
6
6
|
describe InteractionList do
|
7
|
-
before do
|
8
|
-
InteractionList.instance.clear
|
9
|
-
end
|
10
|
-
|
11
7
|
shared_context "unexpected requests and missed interactions" do
|
12
8
|
let(:expected_call) { {request: 'blah'} }
|
13
9
|
let(:unexpected_call) { Pact::Request::Actual.from_hash(path: '/path', method: 'get') }
|
14
10
|
subject {
|
15
|
-
interactionList = InteractionList.
|
11
|
+
interactionList = InteractionList.new
|
16
12
|
interactionList.add expected_call
|
17
13
|
interactionList.register_unexpected unexpected_call
|
18
14
|
interactionList
|
@@ -23,7 +19,7 @@ module Pact::Consumer
|
|
23
19
|
let(:expected_call) { {request: 'blah'} }
|
24
20
|
let(:unexpected_call) { Pact::Request::Actual.from_hash(path: '/path', method: 'get') }
|
25
21
|
subject {
|
26
|
-
interactionList = InteractionList.
|
22
|
+
interactionList = InteractionList.new
|
27
23
|
interactionList.add expected_call
|
28
24
|
interactionList.register_matched expected_call
|
29
25
|
interactionList
|
data/spec/lib/pact/{consumer_contract_spec.rb → consumer_contract/consumer_contract_spec.rb}
RENAMED
@@ -27,9 +27,9 @@ module Pact
|
|
27
27
|
end
|
28
28
|
|
29
29
|
let(:service_consumer) { double('ServiceConsumer', :as_json => {:a => 'consumer'}) }
|
30
|
-
let(:
|
31
|
-
let(:pact) { ConsumerContract.new({:interactions => [MockInteraction.new], :consumer => service_consumer, :
|
32
|
-
let(:expected_as_json) { {:
|
30
|
+
let(:service_provider) { double('ServiceProvider', :as_json => {:a => 'provider'}) }
|
31
|
+
let(:pact) { ConsumerContract.new({:interactions => [MockInteraction.new], :consumer => service_consumer, :provider => service_provider }) }
|
32
|
+
let(:expected_as_json) { {:provider=>{:a=>"provider"}, :consumer=>{:a=>"consumer"}, :interactions=>[{:mock=>"interaction"}], :metadata=>{:pact_gem=>{:version=>"1.0"}}} }
|
33
33
|
|
34
34
|
it "should return a hash representation of the Pact" do
|
35
35
|
pact.as_json.should eq expected_as_json
|
@@ -56,67 +56,111 @@ module Pact
|
|
56
56
|
end
|
57
57
|
|
58
58
|
it "should have a consumer" do
|
59
|
-
loaded_pact.consumer.should be_instance_of Pact::
|
59
|
+
loaded_pact.consumer.should be_instance_of Pact::ServiceConsumer
|
60
60
|
end
|
61
61
|
|
62
|
-
it "should have a
|
63
|
-
loaded_pact.
|
62
|
+
it "should have a provider" do
|
63
|
+
loaded_pact.provider.should be_instance_of Pact::ServiceProvider
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context "with old 'producer' key" do
|
68
|
+
let(:string) { File.read('./spec/support/a_consumer-a_producer.json')}
|
69
|
+
it "should create a Pact" do
|
70
|
+
loaded_pact.should be_instance_of ConsumerContract
|
71
|
+
end
|
72
|
+
|
73
|
+
it "should have interactions" do
|
74
|
+
loaded_pact.interactions.should be_instance_of Array
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should have a consumer" do
|
78
|
+
loaded_pact.consumer.should be_instance_of Pact::ServiceConsumer
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should have a provider" do
|
82
|
+
loaded_pact.provider.should be_instance_of Pact::ServiceProvider
|
83
|
+
loaded_pact.provider.name.should eq "an old producer"
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should have a provider_state" do
|
87
|
+
loaded_pact.interactions.first.provider_state.should eq 'state one'
|
64
88
|
end
|
65
89
|
end
|
66
90
|
end
|
67
91
|
|
68
92
|
describe "find_interactions" do
|
69
|
-
let(:consumer) { double('ServiceConsumer', :name => 'Consumer')}
|
70
|
-
let(:
|
71
|
-
let(:
|
72
|
-
|
73
|
-
|
93
|
+
let(:consumer) { double('Pact::ServiceConsumer', :name => 'Consumer')}
|
94
|
+
let(:provider) { double('Pact::ServiceProvider', :name => 'Provider')}
|
95
|
+
let(:interaction) { double('Pact::Interaction') }
|
96
|
+
subject { ConsumerContract.new(:interactions => [interaction], :consumer => consumer, :provider => provider) }
|
97
|
+
let(:criteria) { {:description => /blah/} }
|
98
|
+
before do
|
99
|
+
interaction.should_receive(:matches_criteria?).with(criteria).and_return(matches)
|
100
|
+
end
|
74
101
|
context "by description" do
|
75
102
|
context "when no interactions are found" do
|
103
|
+
let(:matches) { false }
|
76
104
|
it "returns an empty array" do
|
77
|
-
expect(subject.find_interactions(
|
105
|
+
expect(subject.find_interactions(criteria)).to eql []
|
78
106
|
end
|
79
107
|
end
|
80
108
|
context "when interactions are found" do
|
109
|
+
let(:matches) { true }
|
81
110
|
it "returns an array of the matching interactions" do
|
82
|
-
expect(subject.find_interactions(
|
111
|
+
expect(subject.find_interactions(criteria)).to eql [interaction]
|
83
112
|
end
|
84
113
|
end
|
85
114
|
end
|
86
115
|
end
|
116
|
+
|
87
117
|
describe "find_interaction" do
|
88
|
-
let(:consumer) { double('ServiceConsumer', :name => 'Consumer')}
|
89
|
-
let(:
|
90
|
-
|
91
|
-
let(:
|
92
|
-
let(:
|
93
|
-
|
118
|
+
let(:consumer) { double('Pact::ServiceConsumer', :name => 'Consumer')}
|
119
|
+
let(:provider) { double('Pact::ServiceProvider', :name => 'Provider')}
|
120
|
+
let(:interaction1) { double('Pact::Interaction') }
|
121
|
+
let(:interaction2) { double('Pact::Interaction') }
|
122
|
+
let(:criteria) { {:description => /blah/} }
|
123
|
+
|
124
|
+
before do
|
125
|
+
interaction1.should_receive(:matches_criteria?).with(criteria).and_return(matches1)
|
126
|
+
interaction2.should_receive(:matches_criteria?).with(criteria).and_return(matches2)
|
127
|
+
end
|
128
|
+
|
129
|
+
subject { ConsumerContract.new(:interactions => [interaction1, interaction2], :consumer => consumer, :provider => provider) }
|
94
130
|
context "by description" do
|
95
131
|
context "when a match is found" do
|
132
|
+
let(:matches1) { true }
|
133
|
+
let(:matches2) { false }
|
134
|
+
|
96
135
|
it "returns the interaction" do
|
97
|
-
expect(subject.find_interaction
|
136
|
+
expect(subject.find_interaction criteria).to eql interaction1
|
98
137
|
end
|
99
138
|
end
|
100
139
|
context "when more than one match is found" do
|
140
|
+
let(:matches1) { true }
|
141
|
+
let(:matches2) { true }
|
101
142
|
it "raises an error" do
|
102
|
-
expect{ subject.find_interaction(
|
143
|
+
expect{ subject.find_interaction(criteria) }.to raise_error "Found more than 1 interaction matching {:description=>/blah/} in pact file between Consumer and Provider."
|
103
144
|
end
|
104
145
|
end
|
105
146
|
context "when a match is not found" do
|
147
|
+
let(:matches1) { false }
|
148
|
+
let(:matches2) { false }
|
106
149
|
it "raises an error" do
|
107
|
-
expect{ subject.find_interaction(
|
150
|
+
expect{ subject.find_interaction(criteria) }.to raise_error "Could not find interaction matching {:description=>/blah/} in pact file between Consumer and Provider."
|
108
151
|
end
|
109
152
|
end
|
110
153
|
end
|
111
154
|
end
|
155
|
+
|
112
156
|
describe "update_pactfile" do
|
113
157
|
let(:pacts_dir) { Pathname.new("./tmp/pactfiles") }
|
114
158
|
let(:expected_pact_path) { pacts_dir + "test_consumer-test_service.json" }
|
115
159
|
let(:expected_pact_string) { 'the_json' }
|
116
|
-
let(:consumer) { Pact::
|
117
|
-
let(:
|
160
|
+
let(:consumer) { Pact::ServiceConsumer.new(:name => 'test_consumer')}
|
161
|
+
let(:provider) { Pact::ServiceProvider.new(:name => 'test_service')}
|
118
162
|
let(:interactions) { [double("interaction", as_json: "something")]}
|
119
|
-
subject { ConsumerContract.new(:consumer => consumer, :
|
163
|
+
subject { ConsumerContract.new(:consumer => consumer, :provider => provider, :interactions => interactions) }
|
120
164
|
before do
|
121
165
|
Pact.configuration.stub(:pact_dir).and_return(Pathname.new("./tmp/pactfiles"))
|
122
166
|
FileUtils.rm_rf pacts_dir
|
@@ -125,13 +169,13 @@ module Pact
|
|
125
169
|
subject.update_pactfile
|
126
170
|
end
|
127
171
|
|
128
|
-
it "should write to a file specified by the consumer and
|
172
|
+
it "should write to a file specified by the consumer and provider name" do
|
129
173
|
File.exist?(expected_pact_path).should be_true
|
130
174
|
end
|
131
175
|
|
132
176
|
it "should write the interactions to the file" do
|
133
177
|
File.read(expected_pact_path).should eql expected_pact_string
|
134
178
|
end
|
135
|
-
end
|
136
|
-
end
|
179
|
+
end
|
180
|
+
end
|
137
181
|
end
|
@@ -1,44 +1,42 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'pact/reification'
|
3
|
+
require 'pact/consumer_contract/interaction'
|
2
4
|
|
3
5
|
module Pact
|
4
6
|
module Consumer
|
5
|
-
describe InteractionBuilder do
|
6
7
|
|
7
|
-
|
8
|
-
interaction_builder = InteractionBuilder.new('Test request', nil).with(request)
|
9
|
-
interaction_builder.on_interaction_fully_defined do | interaction |
|
10
|
-
producer.callback interaction
|
11
|
-
end
|
12
|
-
interaction_builder
|
13
|
-
}
|
14
|
-
|
15
|
-
let(:pact_path) { File.expand_path('../../../../pacts/mock', __FILE__) }
|
16
|
-
|
17
|
-
let(:request) do
|
18
|
-
{
|
19
|
-
method: 'post',
|
20
|
-
path: '/foo',
|
21
|
-
body: Term.new(generate: 'waffle', matcher: /ffl/),
|
22
|
-
headers: { 'Content-Type' => 'application/json' },
|
23
|
-
query: '',
|
24
|
-
}
|
25
|
-
end
|
26
|
-
|
27
|
-
let(:response) do
|
28
|
-
{ baz: /qux/, wiffle: Term.new(generate: 'wiffle', matcher: /iff/) }
|
29
|
-
end
|
8
|
+
describe Interaction do
|
30
9
|
|
31
|
-
|
32
|
-
|
10
|
+
describe "==" do
|
11
|
+
subject { InteractionFactory.create }
|
12
|
+
context "when other is the same" do
|
13
|
+
let(:other) { InteractionFactory.create }
|
14
|
+
it "returns true" do
|
15
|
+
expect(subject == other).to be_true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
context "when other is not the same" do
|
19
|
+
let(:other) { InteractionFactory.create(:request => {:path => '/a_different_path'}) }
|
20
|
+
it "returns false" do
|
21
|
+
expect(subject == other).to be_false
|
22
|
+
end
|
23
|
+
end
|
33
24
|
end
|
34
25
|
|
35
|
-
describe "
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
26
|
+
describe "matches_criteria?" do
|
27
|
+
subject { InteractionFactory.create(:description => 'a request for food') }
|
28
|
+
context "by description" do
|
29
|
+
context "when the interaction matches" do
|
30
|
+
it "returns true" do
|
31
|
+
expect(subject.matches_criteria?(:description => /request.*food/)).to be_true
|
32
|
+
end
|
33
|
+
end
|
34
|
+
context "when the interaction does not match" do
|
35
|
+
it "returns false" do
|
36
|
+
expect(subject.matches_criteria?(:description => /blah/)).to be_false
|
37
|
+
end
|
38
|
+
end
|
40
39
|
end
|
41
|
-
|
42
40
|
end
|
43
41
|
|
44
42
|
describe "as_json_for_mock_service" do
|
@@ -46,7 +44,7 @@ module Pact
|
|
46
44
|
let(:request) { double(Pact::Request::Expected, :as_json_with_options => {:opts => 'blah'})}
|
47
45
|
let(:response) { double('response') }
|
48
46
|
let(:generated_response ) { double('generated_response', :to_json => 'generated_response') }
|
49
|
-
subject { Interaction.new(:description => 'description', :request => request, :response => response, :
|
47
|
+
subject { Interaction.new(:description => 'description', :request => request, :response => response, :provider_state => 'some state')}
|
50
48
|
let(:expected_hash) { {:response => generated_response, :request => as_json_with_options, :description => '' } }
|
51
49
|
|
52
50
|
before do
|
@@ -62,8 +60,8 @@ module Pact
|
|
62
60
|
expect(subject.as_json_for_mock_service[:request]).to eq as_json_with_options
|
63
61
|
end
|
64
62
|
|
65
|
-
it "includes the
|
66
|
-
expect(subject.as_json_for_mock_service[:
|
63
|
+
it "includes the provider state" do
|
64
|
+
expect(subject.as_json_for_mock_service[:provider_state]).to eq 'some state'
|
67
65
|
end
|
68
66
|
|
69
67
|
it "includes the description" do
|
@@ -71,19 +69,30 @@ module Pact
|
|
71
69
|
end
|
72
70
|
|
73
71
|
it "doesn't have any other keys" do
|
74
|
-
expect(subject.as_json_for_mock_service.keys).to eq [:response, :request, :description, :
|
72
|
+
expect(subject.as_json_for_mock_service.keys).to eq [:response, :request, :description, :provider_state]
|
75
73
|
end
|
76
74
|
end
|
77
75
|
|
78
76
|
describe "to JSON" do
|
77
|
+
let(:request) do
|
78
|
+
{
|
79
|
+
method: 'post',
|
80
|
+
path: '/foo',
|
81
|
+
body: Term.new(generate: 'waffle', matcher: /ffl/),
|
82
|
+
headers: { 'Content-Type' => 'application/json' },
|
83
|
+
query: '',
|
84
|
+
}
|
85
|
+
end
|
86
|
+
|
87
|
+
let(:response) do
|
88
|
+
{ baz: /qux/, wiffle: Term.new(generate: 'wiffle', matcher: /iff/) }
|
89
|
+
end
|
79
90
|
|
80
91
|
let(:parsed_result) do
|
81
|
-
JSON.load(JSON.dump(subject
|
92
|
+
JSON.load(JSON.dump(subject))
|
82
93
|
end
|
83
94
|
|
84
|
-
|
85
|
-
subject.will_respond_with response
|
86
|
-
end
|
95
|
+
subject { Interaction.from_hash('response' => response, 'request' => request) }
|
87
96
|
|
88
97
|
it "contains the request" do
|
89
98
|
expect(parsed_result['request']).to eq({
|
@@ -112,30 +121,6 @@ module Pact
|
|
112
121
|
|
113
122
|
end
|
114
123
|
|
115
|
-
context "with a producer_state" do
|
116
|
-
context "described with a string" do
|
117
|
-
subject {
|
118
|
-
interaction_builder = InteractionBuilder.new('Test request', "there are no alligators").with(request)
|
119
|
-
interaction_builder.on_interaction_fully_defined {}
|
120
|
-
interaction_builder
|
121
|
-
}
|
122
|
-
|
123
|
-
it "includes the state name as a string" do
|
124
|
-
expect(parsed_result['producer_state']).to eql("there are no alligators")
|
125
|
-
end
|
126
|
-
end
|
127
|
-
context "described with a symbol" do
|
128
|
-
subject {
|
129
|
-
interaction_builder = InteractionBuilder.new('Test request', :there_are_no_alligators).with(request)
|
130
|
-
interaction_builder.on_interaction_fully_defined {}
|
131
|
-
interaction_builder
|
132
|
-
}
|
133
|
-
|
134
|
-
it "includes the state name as a symbol" do
|
135
|
-
expect(parsed_result['producer_state']).to eql("there_are_no_alligators")
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
124
|
end
|
140
125
|
end
|
141
126
|
end
|