Skip to content

Commit 1f5fc9c

Browse files
committed
feat(verify): allow includePendingStatus to be specified when fetching pacts
1 parent 7a81742 commit 1f5fc9c

File tree

5 files changed

+55
-36
lines changed

5 files changed

+55
-36
lines changed

lib/pact/hal/link.rb

+16-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,15 @@ module Hal
66
class Link
77
attr_reader :request_method, :href
88

9+
DEFAULT_GET_HEADERS = {
10+
"Accept" => "application/hal+json"
11+
}.freeze
12+
13+
DEFAULT_POST_HEADERS = {
14+
"Accept" => "application/hal+json",
15+
"Content-Type" => "application/json"
16+
}.freeze
17+
918
def initialize(attrs, http_client)
1019
@attrs = attrs
1120
@request_method = attrs.fetch(:method, :get).to_sym
@@ -37,19 +46,23 @@ def name
3746
end
3847

3948
def get(payload = {}, headers = {})
40-
wrap_response(href, @http_client.get(href, payload, headers))
49+
wrap_response(href, @http_client.get(href, payload, DEFAULT_GET_HEADERS.merge(headers)))
4150
end
4251

4352
def get!(*args)
4453
get(*args).assert_success!
4554
end
4655

4756
def put(payload = nil, headers = {})
48-
wrap_response(href, @http_client.put(href, payload ? payload.to_json : nil, headers))
57+
wrap_response(href, @http_client.put(href, payload ? payload.to_json : nil, DEFAULT_POST_HEADERS.merge(headers)))
4958
end
5059

5160
def post(payload = nil, headers = {})
52-
wrap_response(href, @http_client.post(href, payload ? payload.to_json : nil, headers))
61+
wrap_response(href, @http_client.post(href, payload ? payload.to_json : nil, DEFAULT_POST_HEADERS.merge(headers)))
62+
end
63+
64+
def post!(payload = nil, headers = {})
65+
post(payload, headers).assert_success!
5366
end
5467

5568
def expand(params)

lib/pact/pact_broker/fetch_pact_uris_for_verification.rb

+14-15
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
module Pact
88
module PactBroker
99
class FetchPactURIsForVerification
10-
attr_reader :provider, :consumer_version_selectors, :provider_version_tags, :broker_base_url, :http_client_options, :http_client
10+
attr_reader :provider, :consumer_version_selectors, :provider_version_tags, :broker_base_url, :http_client_options, :http_client, :options
1111

1212
PACTS_FOR_VERIFICATION_RELATION = 'beta:provider-pacts-for-verification'.freeze
1313
PACTS = 'pacts'.freeze
@@ -16,17 +16,18 @@ class FetchPactURIsForVerification
1616
SELF = 'self'.freeze
1717
EMBEDDED = '_embedded'.freeze
1818

19-
def initialize(provider, consumer_version_selectors, provider_version_tags, broker_base_url, http_client_options)
19+
def initialize(provider, consumer_version_selectors, provider_version_tags, broker_base_url, http_client_options, options = {})
2020
@provider = provider
2121
@consumer_version_selectors = consumer_version_selectors || []
2222
@provider_version_tags = provider_version_tags || []
2323
@http_client_options = http_client_options
2424
@broker_base_url = broker_base_url
2525
@http_client = Pact::Hal::HttpClient.new(http_client_options)
26+
@options = options
2627
end
2728

28-
def self.call(provider, consumer_version_selectors, provider_version_tags, broker_base_url, http_client_options)
29-
new(provider, consumer_version_selectors, provider_version_tags, broker_base_url, http_client_options).call
29+
def self.call(provider, consumer_version_selectors, provider_version_tags, broker_base_url, http_client_options, options = {})
30+
new(provider, consumer_version_selectors, provider_version_tags, broker_base_url, http_client_options, options).call
3031
end
3132

3233
def call
@@ -50,8 +51,7 @@ def pacts_for_verification
5051
pacts_for_verification_entity.response.body[EMBEDDED][PACTS].collect do | pact |
5152
metadata = {
5253
pending: pact["verificationProperties"]["pending"],
53-
pending_reason: pact["verificationProperties"]["pendingReason"],
54-
inclusion_reason: pact["verificationProperties"]["inclusionReason"],
54+
notices: extract_notices(pact)
5555
}
5656
Pact::Provider::PactURI.new(pact[LINKS][SELF][HREF], http_client_options, metadata)
5757
end
@@ -61,22 +61,21 @@ def pacts_for_verification_entity
6161
index
6262
._link(PACTS_FOR_VERIFICATION_RELATION)
6363
.expand(provider: provider)
64-
.with_query(query)
65-
.get!
64+
.post!(query)
6665
end
6766

6867
def query
6968
q = {}
70-
if consumer_version_selectors.any?
71-
q["consumer_version_selectors"] = consumer_version_selectors
72-
end
73-
74-
if provider_version_tags.any?
75-
q["provider_version_tags"] = provider_version_tags
76-
end
69+
q["includePendingStatus"] = true if options[:include_pending_status]
70+
q["consumerVersionSelectors"] = consumer_version_selectors if consumer_version_selectors.any?
71+
q["providerVersionTags"] = provider_version_tags if provider_version_tags.any?
7772
q
7873
end
7974

75+
def extract_notices(pact)
76+
(pact["verificationProperties"]["notices"] || []).collect{ |notice| notice["text"] }.compact
77+
end
78+
8079
def log_message
8180
latest = consumer_version_selectors.any? ? "" : "latest "
8281
message = "INFO: Fetching #{latest}pacts for #{provider} from #{broker_base_url}"

spec/lib/pact/hal/entity_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ module Hal
4242
let(:post_provider) { entity.post("pb:provider", {'some' => 'data'} ) }
4343

4444
it "executes an http request" do
45-
expect(http_client).to receive(:post).with("http://provider", '{"some":"data"}', {})
45+
expect(http_client).to receive(:post).with("http://provider", '{"some":"data"}', {"Accept" => "application/hal+json", "Content-Type" => "application/json"})
4646
post_provider
4747
end
4848

@@ -54,7 +54,7 @@ module Hal
5454
let(:post_provider) { entity._link("pb:version-tag").expand(version: "1", tag: "prod").post({'some' => 'data'} ) }
5555

5656
it "posts to the expanded URL" do
57-
expect(http_client).to receive(:post).with("http://provider/version/1/tag/prod", '{"some":"data"}', {})
57+
expect(http_client).to receive(:post).with("http://provider/version/1/tag/prod", '{"some":"data"}', {"Accept" => "application/hal+json", "Content-Type" => "application/json"})
5858
post_provider
5959
end
6060
end

spec/lib/pact/hal/link_spec.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ module Hal
7979
let(:do_get) { subject.get({ 'foo' => 'bar' }) }
8080

8181
it "executes an HTTP Get request" do
82-
expect(http_client).to receive(:get).with('http://foo/{bar}', { 'foo' => 'bar' }, {})
82+
expect(http_client).to receive(:get).with('http://foo/{bar}', { 'foo' => 'bar' }, { 'Accept' => 'application/hal+json' })
8383
do_get
8484
end
8585
end
@@ -89,7 +89,7 @@ module Hal
8989

9090
context "with custom headers" do
9191
it "executes an HTTP Post request with the custom headers" do
92-
expect(http_client).to receive(:post).with('http://foo/{bar}', '{"foo":"bar"}', { 'Accept' => 'foo' })
92+
expect(http_client).to receive(:post).with('http://foo/{bar}', '{"foo":"bar"}', { 'Accept' => 'foo', 'Content-Type' => 'application/json' })
9393
do_post
9494
end
9595
end

spec/service_providers/pact_ruby_fetch_pacts_for_verification_test.rb

+21-14
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,26 @@
66
allow($stdout).to receive(:puts)
77
end
88

9-
let(:get_headers) { { Accept: 'application/hal+json' } }
9+
let(:get_headers) { { "Accept" => 'application/hal+json' } }
10+
let(:post_headers) do
11+
{
12+
"Accept" => 'application/hal+json',
13+
"Content-Type" => "application/json"
14+
}
15+
end
1016
let(:pacts_for_verification_relation) { Pact::PactBroker::FetchPactURIsForVerification::PACTS_FOR_VERIFICATION_RELATION }
11-
let(:query) do
17+
let(:body) do
1218
{
13-
"provider_version_tags[]" => "pdev",
14-
"consumer_version_selectors[][tag]" => "cdev",
15-
"consumer_version_selectors[][latest]" => "true",
19+
"providerVersionTags" => ["pdev"],
20+
"consumerVersionSelectors" => [{ "tag" => "cdev", "latest" => true}],
21+
"includePendingStatus" => true
1622
}
1723
end
1824
let(:provider_version_tags) { %w[pdev] }
1925
let(:consumer_version_selectors) { [ { tag: "cdev", latest: true }] }
26+
let(:options) { { include_pending_status: true }}
2027

21-
subject { Pact::PactBroker::FetchPactURIsForVerification.call(provider, consumer_version_selectors, provider_version_tags, broker_base_url, basic_auth_options) }
28+
subject { Pact::PactBroker::FetchPactURIsForVerification.call(provider, consumer_version_selectors, provider_version_tags, broker_base_url, basic_auth_options, options) }
2229

2330
describe 'fetch pacts' do
2431
let(:provider) { 'Bar' }
@@ -36,6 +43,7 @@
3643
)
3744
.will_respond_with(
3845
status: 200,
46+
headers: { "Content-Type" => Pact.term("application/hal+json", /hal/) },
3947
body: {
4048
_links: {
4149
pacts_for_verification_relation => {
@@ -52,23 +60,23 @@
5260
context 'retrieving pacts for verification by provider' do
5361
before do
5462
pact_broker
55-
.given('Foo has a pact with provider Bar')
63+
.given('Foo has a pact tagged cdev with provider Bar')
5664
.upon_receiving('a request to retrieve the pacts for verification for a provider')
5765
.with(
58-
method: :get,
66+
method: :post,
5967
path: '/pacts/provider/Bar/for-verification',
60-
query: query,
61-
headers: get_headers
68+
body: body,
69+
headers: post_headers
6270
)
6371
.will_respond_with(
6472
status: 200,
73+
headers: { "Content-Type" => Pact.term("application/hal+json", /hal/) },
6574
body: {
6675
"_embedded" => {
6776
"pacts" => [{
6877
"verificationProperties" => {
6978
"pending" => Pact.like(true),
70-
"pendingReason" => Pact.like("pending reason"),
71-
"inclusionReason" => Pact.like("inclusion reason")
79+
"notices" => Pact.each_like("text" => "some text")
7280
},
7381
'_links' => {
7482
"self" => {
@@ -84,8 +92,7 @@
8492
let(:expected_metadata) do
8593
{
8694
pending: true,
87-
inclusion_reason: "inclusion reason",
88-
pending_reason: "pending reason"
95+
notices: ["some text"]
8996
}
9097
end
9198

0 commit comments

Comments
 (0)