pact 1.4.0.rc2 → 1.4.0.rc3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +4 -0
- data/Gemfile.lock +3 -3
- data/lib/pact/version.rb +1 -1
- data/pact.gemspec +2 -4
- data/spec/integration/consumer_async_request_spec.rb +46 -0
- data/spec/integration/consumer_more_than_one_matching_interaction_spec.rb +49 -0
- data/spec/integration/consumer_no_matching_interaction_spec.rb +53 -0
- data/spec/integration/consumer_with_a_provider_state_spec.rb +44 -0
- data/spec/integration/consumer_with_params_hash_spec.rb +111 -0
- metadata +15 -7
- data/spec/integration/consumer_spec.rb +0 -212
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,10 @@ Do this to generate your change history
|
|
2
2
|
|
3
3
|
git log --pretty=format:' * %h - %s (%an, %ad)'
|
4
4
|
|
5
|
+
### 1.4.0.rc3 (17 October 2014)
|
6
|
+
|
7
|
+
* 602906f - Upped pact-support version to allow queries specified as hashes. (bethesque, Fri Oct 17 14:30:39 2014 +1100)
|
8
|
+
|
5
9
|
### 1.4.0.rc2 (12 October 2014)
|
6
10
|
|
7
11
|
* 61036fc - Updating pact-support version (bethesque, Sun Oct 12 14:39:36 2014 +1100)
|
data/Gemfile.lock
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
pact (1.4.0.
|
4
|
+
pact (1.4.0.rc3)
|
5
5
|
awesome_print (~> 1.1)
|
6
6
|
find_a_port (~> 1.0.1)
|
7
7
|
json
|
8
8
|
pact-mock_service (~> 0.0.1)
|
9
|
-
pact-support (~> 0.0.
|
9
|
+
pact-support (~> 0.0.3)
|
10
10
|
rack-test (~> 0.6.2)
|
11
11
|
randexp (~> 0.1.7)
|
12
12
|
rspec (>= 2.14)
|
@@ -49,7 +49,7 @@ GEM
|
|
49
49
|
term-ansicolor (~> 1.0)
|
50
50
|
thor
|
51
51
|
webrick
|
52
|
-
pact-support (0.0.
|
52
|
+
pact-support (0.0.3)
|
53
53
|
awesome_print (~> 1.1)
|
54
54
|
find_a_port (~> 1.0.1)
|
55
55
|
json
|
data/lib/pact/version.rb
CHANGED
data/pact.gemspec
CHANGED
@@ -28,10 +28,8 @@ Gem::Specification.new do |gem|
|
|
28
28
|
gem.add_runtime_dependency 'webrick'
|
29
29
|
gem.add_runtime_dependency 'term-ansicolor', '~> 1.0'
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
gem.add_runtime_dependency 'pact-mock_service', '~> 0.0.1'
|
34
|
-
end
|
31
|
+
gem.add_runtime_dependency 'pact-support', '~> 0.0.3'
|
32
|
+
gem.add_runtime_dependency 'pact-mock_service', '~> 0.0.1'
|
35
33
|
|
36
34
|
gem.add_development_dependency 'rake', '~> 10.0.3'
|
37
35
|
gem.add_development_dependency 'webmock', '~> 1.18.0'
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact/consumer'
|
3
|
+
require 'pact/consumer/rspec'
|
4
|
+
load 'pact/consumer/world.rb'
|
5
|
+
|
6
|
+
describe "A service consumer side of a pact", :pact => true do
|
7
|
+
|
8
|
+
context "with an asynchronous interaction with provider" do
|
9
|
+
before do
|
10
|
+
Pact.clear_configuration
|
11
|
+
|
12
|
+
Pact.service_consumer "Consumer" do
|
13
|
+
has_pact_with "Zebra Service" do
|
14
|
+
mock_service :zebra_service do
|
15
|
+
verify true
|
16
|
+
port 1239
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it "goes like this" do
|
23
|
+
zebra_service.
|
24
|
+
given(:the_zebras_are_here).
|
25
|
+
upon_receiving("a retrieve Mallory request").
|
26
|
+
with({
|
27
|
+
method: :get,
|
28
|
+
path: '/mallory'
|
29
|
+
}).
|
30
|
+
will_respond_with({status: 200})
|
31
|
+
|
32
|
+
async_interaction { Net::HTTP.get_response(URI('http://localhost:1239/mallory')) }
|
33
|
+
|
34
|
+
zebra_service.wait_for_interactions wait_max_seconds: 1, poll_interval: 0.1
|
35
|
+
end
|
36
|
+
|
37
|
+
def async_interaction
|
38
|
+
Thread.new do
|
39
|
+
sleep 0.2
|
40
|
+
yield
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'pact/consumer'
|
2
|
+
require 'pact/consumer/rspec'
|
3
|
+
load 'pact/consumer/world.rb'
|
4
|
+
|
5
|
+
describe "A service consumer side of a pact", :pact => true do
|
6
|
+
|
7
|
+
context "with more than one matching interaction found" do
|
8
|
+
let(:expected_response) do
|
9
|
+
{"message"=>"Multiple interaction found for GET /path", "matching_interactions"=>[{"description"=>"a request", "request"=>{"method"=>"get", "path"=>"/path", "body"=>{"a"=>"some body"}, "headers"=>{"Content-Type"=>"application/json"}}}, {"description"=>"an identical request", "request"=>{"method"=>"get", "path"=>"/path", "body"=>{"a"=>"some body"}, "headers"=>{"Content-Type"=>"application/json"}}}]}
|
10
|
+
end
|
11
|
+
|
12
|
+
it "returns an error" do
|
13
|
+
Pact.clear_configuration
|
14
|
+
Pact.clear_consumer_world
|
15
|
+
|
16
|
+
Pact.service_consumer "Consumer" do
|
17
|
+
has_pact_with "Mary Service" do
|
18
|
+
mock_service :mary_service do
|
19
|
+
verify false
|
20
|
+
port 1237
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
mary_service
|
26
|
+
.given("something")
|
27
|
+
.upon_receiving("a request")
|
28
|
+
.with(method: 'get', path: '/path', body: {a: 'some body'}, headers: {'Content-Type' => 'application/json'})
|
29
|
+
.will_respond_with(status: 200)
|
30
|
+
|
31
|
+
|
32
|
+
mary_service
|
33
|
+
.upon_receiving("an identical request")
|
34
|
+
.with(method: 'get', path: '/path', body: {a: 'some body'}, headers: {'Content-Type' => 'application/json'})
|
35
|
+
.will_respond_with(status: 200)
|
36
|
+
|
37
|
+
uri = URI('http://localhost:1237/path')
|
38
|
+
post_req = Net::HTTP::Get.new(uri.path)
|
39
|
+
post_req['Content-Type'] = "application/json"
|
40
|
+
post_req.body = {a: "some body"}.to_json
|
41
|
+
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
|
42
|
+
http.request post_req
|
43
|
+
end
|
44
|
+
|
45
|
+
expect(JSON.load(response.body)).to eq expected_response
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'pact/consumer'
|
2
|
+
require 'pact/consumer/rspec'
|
3
|
+
load 'pact/consumer/world.rb'
|
4
|
+
|
5
|
+
describe "A service consumer side of a pact", :pact => true do
|
6
|
+
context "with no matching interaction found" do
|
7
|
+
|
8
|
+
let(:expected_response) do
|
9
|
+
{
|
10
|
+
"message"=>"No interaction found for GET /path",
|
11
|
+
"interaction_diffs"=>[{
|
12
|
+
"description" => "a request that will not be properly matched",
|
13
|
+
"provider_state" => "something",
|
14
|
+
"body"=>{
|
15
|
+
"a"=>{
|
16
|
+
"EXPECTED"=>"some body",
|
17
|
+
"ACTUAL"=>"not matching body"
|
18
|
+
}
|
19
|
+
}
|
20
|
+
}]
|
21
|
+
}
|
22
|
+
end
|
23
|
+
|
24
|
+
it "returns an error" do
|
25
|
+
Pact.clear_configuration
|
26
|
+
|
27
|
+
Pact.service_consumer "Consumer" do
|
28
|
+
has_pact_with "Mary Service" do
|
29
|
+
mock_service :mary_service do
|
30
|
+
verify false
|
31
|
+
port 1236
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
mary_service
|
37
|
+
.given("something")
|
38
|
+
.upon_receiving("a request that will not be properly matched")
|
39
|
+
.with(method: 'get', path: '/path', body: {a: 'some body'}, headers: {'Content-Type' => 'application/json'})
|
40
|
+
.will_respond_with(status: 200)
|
41
|
+
|
42
|
+
uri = URI('http://localhost:1236/path')
|
43
|
+
post_req = Net::HTTP::Get.new(uri.path)
|
44
|
+
post_req['Content-Type'] = "application/json"
|
45
|
+
post_req.body = {a: "not matching body"}.to_json
|
46
|
+
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
|
47
|
+
http.request post_req
|
48
|
+
end
|
49
|
+
|
50
|
+
expect(JSON.load(response.body)).to eq expected_response
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'pact/consumer'
|
2
|
+
require 'pact/consumer/rspec'
|
3
|
+
load 'pact/consumer/world.rb'
|
4
|
+
require 'faraday'
|
5
|
+
|
6
|
+
describe "A service consumer side of a pact", :pact => true do
|
7
|
+
context "with a provider state" do
|
8
|
+
before do
|
9
|
+
Pact.clear_configuration
|
10
|
+
|
11
|
+
Pact.service_consumer "Consumer" do
|
12
|
+
has_pact_with "Zebra Service" do
|
13
|
+
mock_service :zebra_service do
|
14
|
+
verify false
|
15
|
+
port 1235
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:body) { 'That is some good Mallory.' }
|
22
|
+
|
23
|
+
it "goes like this" do
|
24
|
+
zebra_service.
|
25
|
+
given(:the_zebras_are_here).
|
26
|
+
upon_receiving("a retrieve Mallory request").with({
|
27
|
+
method: :get,
|
28
|
+
path: '/mallory',
|
29
|
+
headers: {'Accept' => 'text/html'}
|
30
|
+
}).
|
31
|
+
will_respond_with({
|
32
|
+
status: 200,
|
33
|
+
headers: { 'Content-Type' => 'text/html' },
|
34
|
+
body: Pact::Term.new(matcher: /Mallory/, generate: body)
|
35
|
+
})
|
36
|
+
|
37
|
+
response = Faraday.get(zebra_service.mock_service_base_url + "/mallory", nil, {'Accept' => 'text/html'})
|
38
|
+
expect(response.body).to eq body
|
39
|
+
|
40
|
+
interactions = Pact::ConsumerContract.from_json(zebra_service.write_pact).interactions
|
41
|
+
expect(interactions.first.provider_state).to eq("the_zebras_are_here")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'net/http'
|
3
|
+
require 'pact/consumer'
|
4
|
+
require 'pact/consumer/rspec'
|
5
|
+
require 'faraday'
|
6
|
+
load 'pact/consumer/world.rb'
|
7
|
+
|
8
|
+
describe "A service consumer side of a pact", :pact => true do
|
9
|
+
|
10
|
+
# Helper to make Faraday requests.
|
11
|
+
# Faraday::FlatParamsEncoder may only be needed with our current version of Faraday 0.9
|
12
|
+
# and ensures that when there are multiple parameters of the same name, they are encoded properly. e.g. colour=blue&colour=green
|
13
|
+
def faraday_mallory(base_url,params)
|
14
|
+
(Faraday.new base_url, :request => {
|
15
|
+
:params_encoder => Faraday::FlatParamsEncoder,
|
16
|
+
}).get '/mallory', params, {'Accept' => 'application/json'}
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:body) { 'That is some good Mallory.' }
|
20
|
+
|
21
|
+
context 'When expecting multiple instances of the same parameter in the query' do
|
22
|
+
|
23
|
+
before :all do
|
24
|
+
Pact.clear_configuration
|
25
|
+
|
26
|
+
Pact.service_consumer "Consumer" do
|
27
|
+
has_pact_with "Zebra Service" do
|
28
|
+
mock_service :zebra_service2 do
|
29
|
+
verify false
|
30
|
+
port 1241
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
before do
|
37
|
+
|
38
|
+
zebra_service2.
|
39
|
+
given(:the_zebras_are_here).
|
40
|
+
upon_receiving("a retrieve Mallory request").with({
|
41
|
+
method: :get,
|
42
|
+
path: '/mallory',
|
43
|
+
headers: {'Accept' => 'application/json'},
|
44
|
+
query: {colour: 'brown', size: ['small', 'large']}
|
45
|
+
}).
|
46
|
+
will_respond_with({
|
47
|
+
status: 200,
|
48
|
+
headers: { 'Content-Type' => 'application/json' },
|
49
|
+
body: Pact::Term.new(matcher: /Mallory/, generate: body)
|
50
|
+
})
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
it "matches when all instances are provided" do
|
55
|
+
response= faraday_mallory(zebra_service2.mock_service_base_url, { size: ['small','large'], colour: 'brown'})
|
56
|
+
expect(response.body).to eq body
|
57
|
+
|
58
|
+
interactions = Pact::ConsumerContract.from_json(zebra_service2.write_pact).interactions
|
59
|
+
expect(interactions.first.provider_state).to eq("the_zebras_are_here")
|
60
|
+
end
|
61
|
+
|
62
|
+
it "does not match when only the first instance is provided" do
|
63
|
+
response = Faraday.get(zebra_service2.mock_service_base_url + "/mallory?colour=brown&size=small", nil, {'Accept' => 'application/json'})
|
64
|
+
expect(response.body).not_to eq body
|
65
|
+
end
|
66
|
+
|
67
|
+
it "does not match when only the last instance is provided" do
|
68
|
+
response = Faraday.get(zebra_service2.mock_service_base_url + "/mallory?colour=brown&size=large", nil, {'Accept' => 'application/json'})
|
69
|
+
expect(response.body).not_to eq body
|
70
|
+
end
|
71
|
+
|
72
|
+
it "does not match when they are out of order" do
|
73
|
+
response= faraday_mallory(zebra_service2.mock_service_base_url, { size: ['large','small'], colour: 'brown'})
|
74
|
+
expect(response.body).not_to eq body
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "and a complex request matching Pact Terms and multiple instances of the same parameter" do
|
79
|
+
|
80
|
+
it "goes like this" do
|
81
|
+
Pact.clear_configuration
|
82
|
+
Pact.service_consumer "Consumer" do
|
83
|
+
has_pact_with "Zebra Service" do
|
84
|
+
mock_service :zebra_service do
|
85
|
+
verify false
|
86
|
+
port 1242
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
zebra_service.
|
91
|
+
given(:the_zebras_are_here).
|
92
|
+
upon_receiving("a retrieve Mallory request").
|
93
|
+
with({
|
94
|
+
method: :get,
|
95
|
+
path: '/mallory',
|
96
|
+
headers: {'Accept' => 'application/json'},
|
97
|
+
query: { size: ['small',Pact::Term.new(matcher: /med.*/, generate: 'medium'),'large'], colour: 'brown', weight: '5'}
|
98
|
+
}).
|
99
|
+
will_respond_with({
|
100
|
+
status: 200,
|
101
|
+
headers: { 'Content-Type' => 'application/json' },
|
102
|
+
body: Pact::Term.new(matcher: /Mallory/, generate: body)
|
103
|
+
})
|
104
|
+
response = faraday_mallory(zebra_service.mock_service_base_url, { weight: 5, size: ['small','medium','large'], colour: 'brown'})
|
105
|
+
expect(response.body).to eq body
|
106
|
+
|
107
|
+
interactions = Pact::ConsumerContract.from_json(zebra_service.write_pact).interactions
|
108
|
+
expect(interactions.first.provider_state).to eq("the_zebras_are_here")
|
109
|
+
end
|
110
|
+
end
|
111
|
+
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.4.0.
|
4
|
+
version: 1.4.0.rc3
|
5
5
|
prerelease: 6
|
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: 2014-10-
|
16
|
+
date: 2014-10-17 00:00:00.000000000 Z
|
17
17
|
dependencies:
|
18
18
|
- !ruby/object:Gem::Dependency
|
19
19
|
name: randexp
|
@@ -166,7 +166,7 @@ dependencies:
|
|
166
166
|
requirements:
|
167
167
|
- - ~>
|
168
168
|
- !ruby/object:Gem::Version
|
169
|
-
version: 0.0.
|
169
|
+
version: 0.0.3
|
170
170
|
type: :runtime
|
171
171
|
prerelease: false
|
172
172
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -174,7 +174,7 @@ dependencies:
|
|
174
174
|
requirements:
|
175
175
|
- - ~>
|
176
176
|
- !ruby/object:Gem::Version
|
177
|
-
version: 0.0.
|
177
|
+
version: 0.0.3
|
178
178
|
- !ruby/object:Gem::Dependency
|
179
179
|
name: pact-mock_service
|
180
180
|
requirement: !ruby/object:Gem::Requirement
|
@@ -419,7 +419,11 @@ files:
|
|
419
419
|
- spec/features/consumption_spec.rb
|
420
420
|
- spec/features/production_spec.rb
|
421
421
|
- spec/features/provider_states/zebras.rb
|
422
|
-
- spec/integration/
|
422
|
+
- spec/integration/consumer_async_request_spec.rb
|
423
|
+
- spec/integration/consumer_more_than_one_matching_interaction_spec.rb
|
424
|
+
- spec/integration/consumer_no_matching_interaction_spec.rb
|
425
|
+
- spec/integration/consumer_with_a_provider_state_spec.rb
|
426
|
+
- spec/integration/consumer_with_params_hash_spec.rb
|
423
427
|
- spec/integration/pact/consumer_configuration_spec.rb
|
424
428
|
- spec/integration/pact/provider_configuration_spec.rb
|
425
429
|
- spec/lib/pact/cli_spec.rb
|
@@ -507,7 +511,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
507
511
|
version: '0'
|
508
512
|
segments:
|
509
513
|
- 0
|
510
|
-
hash:
|
514
|
+
hash: 2688969630931365840
|
511
515
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
512
516
|
none: false
|
513
517
|
requirements:
|
@@ -526,7 +530,11 @@ test_files:
|
|
526
530
|
- spec/features/consumption_spec.rb
|
527
531
|
- spec/features/production_spec.rb
|
528
532
|
- spec/features/provider_states/zebras.rb
|
529
|
-
- spec/integration/
|
533
|
+
- spec/integration/consumer_async_request_spec.rb
|
534
|
+
- spec/integration/consumer_more_than_one_matching_interaction_spec.rb
|
535
|
+
- spec/integration/consumer_no_matching_interaction_spec.rb
|
536
|
+
- spec/integration/consumer_with_a_provider_state_spec.rb
|
537
|
+
- spec/integration/consumer_with_params_hash_spec.rb
|
530
538
|
- spec/integration/pact/consumer_configuration_spec.rb
|
531
539
|
- spec/integration/pact/provider_configuration_spec.rb
|
532
540
|
- spec/lib/pact/cli_spec.rb
|
@@ -1,212 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'net/http'
|
3
|
-
require 'pact/consumer'
|
4
|
-
require 'pact/consumer/rspec'
|
5
|
-
require 'faraday'
|
6
|
-
load 'pact/consumer/world.rb'
|
7
|
-
|
8
|
-
describe "A service consumer side of a pact", :pact => true do
|
9
|
-
|
10
|
-
context "with more than one matching interaction found" do
|
11
|
-
let(:expected_response) do
|
12
|
-
{"message"=>"Multiple interaction found for GET /path", "matching_interactions"=>[{"description"=>"a request", "request"=>{"method"=>"get", "path"=>"/path", "body"=>{"a"=>"some body"}, "headers"=>{"Content-Type"=>"application/json"}}}, {"description"=>"an identical request", "request"=>{"method"=>"get", "path"=>"/path", "body"=>{"a"=>"some body"}, "headers"=>{"Content-Type"=>"application/json"}}}]}
|
13
|
-
end
|
14
|
-
|
15
|
-
it "returns an error" do
|
16
|
-
Pact.clear_configuration
|
17
|
-
Pact.clear_consumer_world
|
18
|
-
|
19
|
-
Pact.service_consumer "Consumer" do
|
20
|
-
has_pact_with "Mary Service" do
|
21
|
-
mock_service :mary_service do
|
22
|
-
verify false
|
23
|
-
port 1237
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
mary_service
|
29
|
-
.given("something")
|
30
|
-
.upon_receiving("a request")
|
31
|
-
.with(method: 'get', path: '/path', body: {a: 'some body'}, headers: {'Content-Type' => 'application/json'})
|
32
|
-
.will_respond_with(status: 200)
|
33
|
-
|
34
|
-
|
35
|
-
mary_service
|
36
|
-
.upon_receiving("an identical request")
|
37
|
-
.with(method: 'get', path: '/path', body: {a: 'some body'}, headers: {'Content-Type' => 'application/json'})
|
38
|
-
.will_respond_with(status: 200)
|
39
|
-
|
40
|
-
uri = URI('http://localhost:1237/path')
|
41
|
-
post_req = Net::HTTP::Get.new(uri.path)
|
42
|
-
post_req['Content-Type'] = "application/json"
|
43
|
-
post_req.body = {a: "some body"}.to_json
|
44
|
-
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
|
45
|
-
http.request post_req
|
46
|
-
end
|
47
|
-
|
48
|
-
expect(JSON.load(response.body)).to eq expected_response
|
49
|
-
end
|
50
|
-
|
51
|
-
end
|
52
|
-
|
53
|
-
context "with no matching interaction found" do
|
54
|
-
|
55
|
-
let(:expected_response) do
|
56
|
-
{
|
57
|
-
"message"=>"No interaction found for GET /path",
|
58
|
-
"interaction_diffs"=>[{
|
59
|
-
"description" => "a request that will not be properly matched",
|
60
|
-
"provider_state" => "something",
|
61
|
-
"body"=>{
|
62
|
-
"a"=>{
|
63
|
-
"EXPECTED"=>"some body",
|
64
|
-
"ACTUAL"=>"not matching body"
|
65
|
-
}
|
66
|
-
}
|
67
|
-
}]
|
68
|
-
}
|
69
|
-
end
|
70
|
-
|
71
|
-
it "returns an error" do
|
72
|
-
Pact.clear_configuration
|
73
|
-
|
74
|
-
Pact.service_consumer "Consumer" do
|
75
|
-
has_pact_with "Mary Service" do
|
76
|
-
mock_service :mary_service do
|
77
|
-
verify false
|
78
|
-
port 1236
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
mary_service
|
84
|
-
.given("something")
|
85
|
-
.upon_receiving("a request that will not be properly matched")
|
86
|
-
.with(method: 'get', path: '/path', body: {a: 'some body'}, headers: {'Content-Type' => 'application/json'})
|
87
|
-
.will_respond_with(status: 200)
|
88
|
-
|
89
|
-
uri = URI('http://localhost:1236/path')
|
90
|
-
post_req = Net::HTTP::Get.new(uri.path)
|
91
|
-
post_req['Content-Type'] = "application/json"
|
92
|
-
post_req.body = {a: "not matching body"}.to_json
|
93
|
-
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
|
94
|
-
http.request post_req
|
95
|
-
end
|
96
|
-
|
97
|
-
expect(JSON.load(response.body)).to eq expected_response
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
context "with a provider state" do
|
102
|
-
before do
|
103
|
-
Pact.clear_configuration
|
104
|
-
|
105
|
-
Pact.service_consumer "Consumer" do
|
106
|
-
has_pact_with "Zebra Service" do
|
107
|
-
mock_service :zebra_service do
|
108
|
-
verify false
|
109
|
-
port 1235
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
let(:body) { 'That is some good Mallory.' }
|
116
|
-
|
117
|
-
it "goes like this" do
|
118
|
-
zebra_service.
|
119
|
-
given(:the_zebras_are_here).
|
120
|
-
upon_receiving("a retrieve Mallory request").with({
|
121
|
-
method: :get,
|
122
|
-
path: '/mallory',
|
123
|
-
headers: {'Accept' => 'text/html'}
|
124
|
-
}).
|
125
|
-
will_respond_with({
|
126
|
-
status: 200,
|
127
|
-
headers: { 'Content-Type' => 'text/html' },
|
128
|
-
body: Pact::Term.new(matcher: /Mallory/, generate: body)
|
129
|
-
})
|
130
|
-
|
131
|
-
response = Faraday.get(zebra_service.mock_service_base_url + "/mallory", nil, {'Accept' => 'text/html'})
|
132
|
-
expect(response.body).to eq body
|
133
|
-
|
134
|
-
interactions = Pact::ConsumerContract.from_json(zebra_service.write_pact).interactions
|
135
|
-
expect(interactions.first.provider_state).to eq("the_zebras_are_here")
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
context "with multiple headers" do
|
140
|
-
before do
|
141
|
-
Pact.clear_configuration
|
142
|
-
Pact.service_consumer "Consumer" do
|
143
|
-
has_pact_with "Multi Headers Service" do
|
144
|
-
mock_service :multi_headers_service do
|
145
|
-
verify true
|
146
|
-
port 1240
|
147
|
-
end
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
multi_headers_service.
|
152
|
-
given("there are multiple headers").
|
153
|
-
upon_receiving("a request with multiple headers").
|
154
|
-
with(method: :get, path: '/something', headers: {'X-Something' => "1, 2"}).
|
155
|
-
will_respond_with(status: 200)
|
156
|
-
|
157
|
-
uri = URI('http://localhost:1240/something')
|
158
|
-
post_req = Net::HTTP::Get.new(uri.path)
|
159
|
-
post_req.add_field('X-Something', '1')
|
160
|
-
post_req.add_field('X-Something', '2')
|
161
|
-
response = Net::HTTP.start(uri.hostname, uri.port) do |http|
|
162
|
-
http.request post_req
|
163
|
-
end
|
164
|
-
end
|
165
|
-
|
166
|
-
it "handles multiple headers with the same name in a comma separated list" do
|
167
|
-
interactions = Pact::ConsumerContract.from_json(multi_headers_service.write_pact).interactions
|
168
|
-
expect(interactions.first.request.headers['X-Something']).to eq("1, 2")
|
169
|
-
end
|
170
|
-
|
171
|
-
end
|
172
|
-
|
173
|
-
context "with a async interaction with provider" do
|
174
|
-
before do
|
175
|
-
Pact.clear_configuration
|
176
|
-
|
177
|
-
Pact.service_consumer "Consumer" do
|
178
|
-
has_pact_with "Zebra Service" do
|
179
|
-
mock_service :zebra_service do
|
180
|
-
verify true
|
181
|
-
port 1239
|
182
|
-
end
|
183
|
-
end
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
it "goes like this" do
|
188
|
-
zebra_service.
|
189
|
-
given(:the_zebras_are_here).
|
190
|
-
upon_receiving("a retrieve Mallory request").
|
191
|
-
with({
|
192
|
-
method: :get,
|
193
|
-
path: '/mallory'
|
194
|
-
}).
|
195
|
-
will_respond_with({status: 200})
|
196
|
-
|
197
|
-
async_interaction { Net::HTTP.get_response(URI('http://localhost:1239/mallory'))}
|
198
|
-
|
199
|
-
zebra_service.wait_for_interactions wait_max_seconds: 1, poll_interval: 0.1
|
200
|
-
end
|
201
|
-
|
202
|
-
def async_interaction
|
203
|
-
Thread.new do
|
204
|
-
sleep 0.2
|
205
|
-
yield
|
206
|
-
end
|
207
|
-
end
|
208
|
-
|
209
|
-
end
|
210
|
-
|
211
|
-
end
|
212
|
-
|