Skip to content

Commit fe498a7

Browse files
committed
feat(matrix): allow version to be specified by latest_tag
1 parent 4108d4d commit fe498a7

File tree

9 files changed

+95
-46
lines changed

9 files changed

+95
-46
lines changed

lib/pact_broker/domain/tag.rb

+5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
require 'pact_broker/db'
2+
require 'pact_Broker/repositories/helpers'
23

34
module PactBroker
45

56
module Domain
67
class Tag < Sequel::Model
78

9+
dataset_module do
10+
include PactBroker::Repositories::Helpers
11+
end
12+
813
unrestrict_primary_key
914

1015
associate(:many_to_one, :version, :class => "PactBroker::Domain::Version", :key => :version_id, :primary_key => :id)

lib/pact_broker/matrix/repository.rb

+17
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ def find_compatible_pacticipant_versions selectors
3737
# If the version is nil, it means all versions for that pacticipant are to be included
3838
#
3939
def find_all selectors
40+
selectors = look_up_versions_for_tags(selectors)
41+
4042
query = PactBroker::Pacts::LatestPactPublicationsByConsumerVersion
4143
.select_append(:consumer_version_number, :provider_name, :consumer_name, :provider_version_id, :provider_version_number, :success)
4244
.select_append(Sequel[:latest_pact_publications_by_consumer_versions][:created_at].as(:pact_created_at))
@@ -55,6 +57,21 @@ def find_all selectors
5557
.collect(&:values)
5658
end
5759

60+
def look_up_versions_for_tags(selectors)
61+
selectors.collect do | selector |
62+
if selector[:latest_tag]
63+
version = version_repository.find_by_latest_tag(selector[:pacticipant_name], selector[:latest_tag])
64+
# validation in resource should ensure we always have a version
65+
{
66+
pacticipant_name: selector[:pacticipant_name],
67+
pacticipant_version_number: version.number
68+
}
69+
else
70+
selector
71+
end
72+
end
73+
end
74+
5875
def where_consumer_and_provider_within selectors, query
5976
query.where{
6077
Sequel.&(

lib/pact_broker/tags/repository.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def create args
1414

1515
def find args
1616
PactBroker::Domain::Tag
17-
.select(Sequel.qualify("tags", "name"), Sequel.qualify("tags", "version_id"), Sequel.qualify("tags", "created_at"), Sequel.qualify("tags", "updated_at"))
17+
.select_all_qualified
1818
.join(:versions, {id: :version_id})
1919
.join(:pacticipants, {Sequel.qualify("pacticipants", "id") => Sequel.qualify("versions", "pacticipant_id")})
2020
.where(name_like(Sequel.qualify("tags", "name"), args.fetch(:tag_name)))

lib/pact_broker/versions/repository.rb

+11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,17 @@ def find_by_pacticipant_id_and_number pacticipant_id, number
1212
PactBroker::Domain::Version.where(number: number, pacticipant_id: pacticipant_id).single_record
1313
end
1414

15+
def find_by_latest_tag pacticipant_name, tag
16+
PactBroker::Domain::Version
17+
.select_all_qualified
18+
.join(:pacticipants, {id: :pacticipant_id}, {implicit_qualifier: :versions})
19+
.join(:tags, {version_id: :id}, {implicit_qualifier: :versions})
20+
.where(name_like(Sequel[:tags][:name], tag))
21+
.where(name_like(Sequel[:pacticipants][:name], pacticipant_name))
22+
.reverse_order(:order)
23+
.first
24+
end
25+
1526
def find_by_pacticipant_name_and_number pacticipant_name, number
1627
PactBroker::Domain::Version
1728
.select(Sequel[:versions][:id], Sequel[:versions][:number], Sequel[:versions][:pacticipant_id], Sequel[:versions][:order], Sequel[:versions][:created_at], Sequel[:versions][:updated_at])

lib/pact_broker/versions/service.rb

-7
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,6 @@ def self.delete version
1616
pact_repository.delete_by_version_id version.id
1717
version_repository.delete_by_id version.id
1818
end
19-
20-
def self.find_versions_by_selector selectors
21-
selectors.collect do | selector |
22-
pacticipant_name, type, number = selector.split("/")
23-
version_repository.find_by_pacticipant_name_and_number pacticipant_name, number
24-
end
25-
end
2619
end
2720
end
2821
end

spec/lib/pact_broker/matrix/repository_spec.rb

+27
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,33 @@ def build_selectors(hash)
219219
end
220220
end
221221
end
222+
223+
context "when the latest tag is specified for a provider instead of a version" do
224+
before do
225+
td.create_pact_with_hierarchy("A", "1.2.3", "B")
226+
.create_verification(provider_version: "1.0.0")
227+
.use_provider_version("1.0.0")
228+
.create_provider_version_tag("prod")
229+
.create_verification(provider_version: "2.0.0", number: 2)
230+
.use_provider_version("2.0.0")
231+
.create_provider_version_tag("prod")
232+
.create_verification(provider_version: "3.0.0", number: 3)
233+
end
234+
235+
let(:selectors) do
236+
[
237+
{ pacticipant_name: "A", pacticipant_version_number: "1.2.3" },
238+
{ pacticipant_name: "B", latest_tag: "prod" }
239+
]
240+
end
241+
242+
subject { Repository.new.find(selectors) }
243+
244+
it "returns the row for the version " do
245+
expect(subject.first).to include provider_version_number: "2.0.0"
246+
expect(subject.size).to eq 1
247+
end
248+
end
222249
end
223250

224251
describe "#find_for_consumer_and_provider" do

spec/lib/pact_broker/versions/repository_spec.rb

+24
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,33 @@ module PactBroker
55
module Versions
66
describe Repository do
77

8+
let(:td) { TestDataBuilder.new }
89
let(:pacticipant_name) { "test_pacticipant" }
910
let(:version_number) { "1.2.3" }
1011

12+
13+
describe "#find_by_latest_tag" do
14+
before do
15+
td.create_consumer("Bar")
16+
.create_consumer_version("2.3.4")
17+
.create_consumer_version_tag("prod")
18+
.create_consumer("Foo")
19+
.create_consumer_version("1.2.3")
20+
.create_consumer_version_tag("prod")
21+
.create_consumer_version("2.3.4")
22+
.create_consumer_version_tag("prod")
23+
.create_consumer_version("5.6.7")
24+
end
25+
26+
subject { Repository.new.find_by_latest_tag("Foo", "prod") }
27+
28+
it "returns the most recent version that has the specified tag" do
29+
30+
expect(subject.number).to eq "2.3.4"
31+
expect(subject.pacticipant.name).to eq "Foo"
32+
end
33+
end
34+
1135
describe "#create" do
1236
context "when a previous version exists" do
1337

spec/lib/pact_broker/versions/service_spec.rb

-38
Original file line numberDiff line numberDiff line change
@@ -4,44 +4,6 @@ module PactBroker
44

55
module Versions
66
describe Service do
7-
8-
describe ".find_versions_by_selector" do
9-
10-
context "without a version selector" do
11-
let(:selector) { "Foo" }
12-
end
13-
14-
context "with a version selector" do
15-
before do
16-
TestDataBuilder.new
17-
.create_pacticipant("Foo")
18-
.create_version("1.2.3")
19-
.create_version("4.5.6")
20-
.create_pacticipant("Bar")
21-
.create_version("1.2.3")
22-
end
23-
24-
let(:selector) { "Foo/version/1.2.3" }
25-
26-
subject { Service.find_versions_by_selector [selector] }
27-
28-
context "when the version exists" do
29-
it "returns the specfied version" do
30-
expect(subject.first.number).to eq "1.2.3"
31-
expect(subject.first.pacticipant.name).to eq "Foo"
32-
end
33-
end
34-
35-
context "when the version does not exist" do
36-
let(:selector) { "Wiffle/version/0.0.0" }
37-
38-
it "returns nil" do
39-
expect(subject.first).to eq nil
40-
end
41-
end
42-
end
43-
end
44-
457
describe ".delete" do
468
let!(:version) do
479
TestDataBuilder.new

spec/support/test_data_builder.rb

+10
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,11 @@ def use_consumer_version version_number
154154
self
155155
end
156156

157+
def use_provider_version version_number
158+
@provider_version = PactBroker::Domain::Version.where(pacticipant_id: @provider.id, number: version_number).single_record
159+
self
160+
end
161+
157162
def create_tag tag_name
158163
@tag = PactBroker::Domain::Tag.create(name: tag_name, version: @version)
159164
self
@@ -164,6 +169,11 @@ def create_consumer_version_tag tag_name
164169
self
165170
end
166171

172+
def create_provider_version_tag tag_name
173+
@tag = PactBroker::Domain::Tag.create(name: tag_name, version: @provider_version)
174+
self
175+
end
176+
167177
def create_label label_name
168178
@label = PactBroker::Domain::Label.create(name: label_name, pacticipant: @pacticipant)
169179
self

0 commit comments

Comments
 (0)