Skip to content

Commit 0eb7429

Browse files
committed
fix(matrix badge): correct status of pact when consumer and provider version tags are specified
1 parent 5f4a7c1 commit 0eb7429

File tree

8 files changed

+102
-46
lines changed

8 files changed

+102
-46
lines changed

lib/pact_broker/api/resources/badge.rb

+7-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ def forbidden?
3232

3333
def to_svg
3434
response.headers['Cache-Control'] = 'no-cache'
35-
badge_service.pact_verification_badge pact, label, initials, verification_status
35+
comment + badge_service.pact_verification_badge(pact, label, initials, verification_status)
3636
end
3737

3838
def pact
@@ -55,6 +55,12 @@ def label
5555
def initials
5656
request.query['initials'] == 'true'
5757
end
58+
59+
def comment
60+
consumer_version_number = pact ? pact.consumer_version_number : "?"
61+
provider_version_number = latest_verification ? latest_verification.provider_version_number : "?"
62+
"<!-- #{identifier_from_path[:consumer_name]} version #{consumer_version_number} #{identifier_from_path[:provider_name]} version #{provider_version_number} -->\n"
63+
end
5864
end
5965
end
6066
end

lib/pact_broker/api/resources/matrix_badge.rb

+6-6
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ class MatrixBadge < Badge
88
private
99

1010
def latest_verification
11-
@latest_verification ||= begin
12-
matrix_row = matrix_service.find_for_consumer_and_provider_with_tags(identifier_from_path)
13-
if matrix_row && matrix_row[:verification_id]
14-
verification_service.find_by_id(matrix_row[:verification_id])
15-
end
16-
end
11+
@latest_verification ||= verification_service.find_latest_verification_for_tags(
12+
identifier_from_path[:consumer_name],
13+
identifier_from_path[:provider_name],
14+
identifier_from_path[:tag],
15+
identifier_from_path[:provider_tag]
16+
)
1717
end
1818
end
1919
end

lib/pact_broker/domain/verification.rb

+6
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ def untagged
5555
.left_outer_join(:tags, {version_id: :consumer_version_id})
5656
.where(Sequel.qualify(:tags, :name) => nil)
5757
end
58+
59+
def provider_version_tag tag_name
60+
filter = name_like(Sequel.qualify(:ptags, :name), tag_name)
61+
join_params = { Sequel[:ptags][:version_id] => Sequel[model.table_name][:provider_version_id] }
62+
join(:tags, join_params, {table_alias: :ptags}).where(filter)
63+
end
5864
end
5965

6066
def pact_version_sha
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
require 'pact_broker/domain/verification'
2+
3+
module PactBroker
4+
module Verifications
5+
include PactBroker::Repositories::Helpers
6+
7+
class AllVerifications < PactBroker::Domain::Verification
8+
set_dataset(:all_verifications)
9+
end
10+
11+
end
12+
end

lib/pact_broker/verifications/repository.rb

+20
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require 'sequel'
22
require 'pact_broker/domain/verification'
33
require 'pact_broker/verifications/latest_verifications_by_consumer_version'
4+
require 'pact_broker/verifications/all_verifications'
45

56
module PactBroker
67
module Verifications
@@ -64,6 +65,25 @@ def find_latest_verification_for consumer_name, provider_name, tag = nil
6465
).limit(1).single_record
6566
end
6667

68+
def find_latest_verification_for_tags consumer_name, provider_name, consumer_version_tag, provider_version_tag
69+
view_name = PactBroker::Verifications::AllVerifications.table_name
70+
query = PactBroker::Verifications::AllVerifications
71+
.select_all_qualified
72+
.join(:versions, {Sequel[:provider_versions][:id] => Sequel[view_name][:provider_version_id]}, {table_alias: :provider_versions})
73+
.join(:all_pact_publications, { Sequel[view_name][:pact_version_id] => Sequel[:all_pact_publications][:pact_version_id] })
74+
.consumer(consumer_name)
75+
.provider(provider_name)
76+
.tag(consumer_version_tag)
77+
.provider_version_tag(provider_version_tag)
78+
79+
query.reverse_order(
80+
Sequel[:all_pact_publications][:consumer_version_order],
81+
Sequel[:all_pact_publications][:revision_number],
82+
Sequel[:provider_versions][:order],
83+
Sequel[view_name][:execution_date]
84+
).limit(1).single_record
85+
end
86+
6787
def pact_version_id_for pact
6888
PactBroker::Pacts::PactPublication.select(:pact_version_id).where(id: pact.id)
6989
end

lib/pact_broker/verifications/service.rb

+4
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ def find_latest_verification_for consumer, provider, tag = nil
4848
verification_repository.find_latest_verification_for consumer.name, provider.name, tag
4949
end
5050

51+
def find_latest_verification_for_tags consumer_name, provider_name, consumer_version_tag_name, provider_version_tag_name
52+
verification_repository.find_latest_verification_for_tags(consumer_name, provider_name, consumer_version_tag_name, provider_version_tag_name)
53+
end
54+
5155
def verification_summary_for_consumer_version params
5256
verifications = find_latest_verifications_for_consumer_version(params)
5357
pacts = pact_service.find_by_consumer_version(params)

spec/lib/pact_broker/api/resources/badge_spec.rb

+23-39
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ module Resources
1616
allow(PactBroker::Verifications::Status).to receive(:new).and_return(verification_status)
1717
end
1818

19-
let(:pact) { instance_double("PactBroker::Domain::Pact", consumer: consumer, provider: provider) }
19+
let(:pact) { instance_double("PactBroker::Domain::Pact", consumer: consumer, provider: provider, consumer_version_number: "2") }
2020
let(:consumer) { double('consumer') }
2121
let(:provider) { double('provider') }
22-
let(:verification) { double("verification") }
22+
let(:verification) { double("verification", provider_version_number: "3") }
2323
let(:verification_status) { instance_double("PactBroker::Verifications::Status", to_sym: :verified) }
2424

2525

@@ -82,7 +82,11 @@ module Resources
8282
end
8383

8484
it "returns the badge" do
85-
expect(subject.body).to eq "badge"
85+
expect(subject.body).to end_with "badge"
86+
end
87+
88+
it "returns a comment with the consumer and provider numbers" do
89+
expect(subject.body).to include "<!-- consumer version 2 provider version 3 -->"
8690
end
8791

8892
context "when the label param is specified" do
@@ -127,55 +131,35 @@ module Resources
127131
end
128132

129133
let(:path) { "/matrix/provider/provider/latest/master/consumer/consumer/latest/prod/badge" }
130-
let(:row) { { verification_id: 1 } }
134+
let(:row) { { consumer_name: 'consumer', provider_name: 'provider' } }
131135

132-
133-
it "looks up the matrix row" do
134-
expect(PactBroker::Matrix::Service).to receive(:find_for_consumer_and_provider_with_tags).with(
135-
hash_including(consumer_name: 'consumer',
136-
provider_name: 'provider',
137-
tag: 'prod',
138-
provider_tag: 'master'
139-
))
136+
it "looks up the verification" do
137+
expect(PactBroker::Verifications::Service).to receive(:find_latest_verification_for_tags) do | consumer, provider, tag|
138+
expect(consumer.name).to eq 'consumer'
139+
expect(provider.name).to eq 'provider'
140+
expect(tag).to eq 'prod'
141+
end
140142
subject
141143
end
142144

143-
context "when a matrix row is found" do
144-
context "when there is a verification_id" do
145-
it "looks up the verification" do
146-
expect(PactBroker::Verifications::Service).to receive(:find_by_id).with(1)
147-
subject
148-
end
149145

150-
it "returns the badge" do
151-
expect(subject.body).to eq "badge"
152-
end
146+
context "when a verification is found" do
147+
before do
148+
allow(PactBroker::Verifications::Service).to receive(:find_latest_verification_for_tags).and_return(verification)
153149
end
154150

155-
context "when there is not a verification_id" do
156-
let(:row) { {} }
157-
158-
it "does not look up the verification" do
159-
expect(PactBroker::Verifications::Service).to_not receive(:find_by_id)
160-
subject
161-
end
162-
163-
it "returns the badge" do
164-
expect(subject.body).to eq "badge"
165-
end
151+
it "returns the badge" do
152+
expect(subject.body).to end_with "badge"
166153
end
167154
end
168155

169-
context "when a matrix row is not found" do
170-
let(:row) { nil }
171-
172-
it "does not look up the verification" do
173-
expect(PactBroker::Verifications::Service).to_not receive(:find_by_id)
174-
subject
156+
context "when a verification is not found" do
157+
before do
158+
allow(PactBroker::Verifications::Service).to receive(:find_latest_verification_for_tags).and_return(nil)
175159
end
176160

177161
it "returns the badge" do
178-
expect(subject.body).to eq "badge"
162+
expect(subject.body).to end_with "badge"
179163
end
180164
end
181165
end

spec/lib/pact_broker/verifications/repository_spec.rb

+24
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,30 @@ module Verifications
216216
end
217217
end
218218
end
219+
220+
describe "find_latest_verification_for_tags" do
221+
before do
222+
TestDataBuilder.new
223+
.create_pact_with_hierarchy("Foo", "1", "Bar")
224+
.create_consumer_version_tag("feat-x")
225+
.create_verification(provider_version: "5")
226+
.use_provider_version("5")
227+
.create_provider_version_tag("feat-y")
228+
.create_verification(provider_version: "6", number: 2)
229+
.use_provider_version("6")
230+
.create_provider_version_tag("feat-y")
231+
.create_verification(provider_version: "7", number: 3)
232+
.create_consumer_version("2")
233+
.create_pact
234+
.create_verification(provider_version: "8")
235+
end
236+
237+
subject { Repository.new.find_latest_verification_for_tags("Foo", "Bar", "feat-x", "feat-y") }
238+
239+
it "returns the latest verification for a pact with the given consumer tag, by a provider version with the given provider tag" do
240+
expect(subject.provider_version_number).to eq "6"
241+
end
242+
end
219243
end
220244
end
221245
end

0 commit comments

Comments
 (0)