Skip to content

Commit 749e708

Browse files
committed
feat(pacts for verification): support finding all pacts with a given tag for a specified consumer
1 parent 2baec29 commit 749e708

10 files changed

+87
-8
lines changed

lib/pact_broker/api/contracts/dry_validation_predicates.rb

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ module DryValidationPredicates
99
predicate(:date?) do |value|
1010
DateTime.parse(value) rescue false
1111
end
12+
13+
predicate(:not_blank?) do | value |
14+
value && value.is_a?(String) && value.strip.size > 0
15+
end
1216
end
1317
end
1418
end

lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema.rb

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class VerifiablePactsJSONQuerySchema
1313
SCHEMA = Dry::Validation.Schema do
1414
configure do
1515
predicates(DryValidationPredicates)
16+
config.messages_file = File.expand_path("../../../locale/en.yml", __FILE__)
1617
end
1718
optional(:providerVersionTags).maybe(:array?)
1819
optional(:consumerVersionSelectors).each do
@@ -26,6 +27,7 @@ class VerifiablePactsJSONQuerySchema
2627
required(:tag).filled(:str?)
2728
optional(:latest).filled(included_in?: [true, false])
2829
optional(:fallbackTag).filled(:str?)
30+
optional(:consumer).filled(:str?, :not_blank?)
2931

3032
# rule(fallbackTagMustBeForLatest: [:fallbackTag, :latest]) do | fallback_tag, latest |
3133
# fallback_tag.filled?.then(latest.eql?(true))

lib/pact_broker/api/contracts/verifiable_pacts_query_schema.rb

+2
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,15 @@ class VerifiablePactsQuerySchema
1212
SCHEMA = Dry::Validation.Schema do
1313
configure do
1414
predicates(DryValidationPredicates)
15+
config.messages_file = File.expand_path("../../../locale/en.yml", __FILE__)
1516
end
1617
optional(:provider_version_tags).maybe(:array?)
1718
optional(:consumer_version_selectors).each do
1819
schema do
1920
required(:tag).filled(:str?)
2021
optional(:latest).filled(included_in?: ["true", "false"])
2122
optional(:fallback_tag).filled(:str?)
23+
optional(:consumer).filled(:str?, :not_blank?)
2224
end
2325
end
2426
optional(:include_pending_status).filled(included_in?: ["true", "false"])

lib/pact_broker/api/decorators/verifiable_pacts_query_decorator.rb

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class VerifiablePactsQueryDecorator < BaseDecorator
2020
represented.latest = (fragment == 'true' || fragment == true)
2121
}
2222
property :fallback_tag
23+
property :consumer
2324
end
2425

2526
property :include_pending_status, default: false,

lib/pact_broker/pacts/pact_publication.rb

+8
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,14 @@ def order_by_consumer_name
8282
def order_by_consumer_version_order
8383
order_append(Sequel[:cv][:order])
8484
end
85+
86+
def where_consumer_if_set(consumer)
87+
if consumer
88+
where(consumer: consumer)
89+
else
90+
self
91+
end
92+
end
8593
end
8694

8795
def before_create

lib/pact_broker/pacts/repository.rb

+7-8
Original file line numberDiff line numberDiff line change
@@ -130,17 +130,18 @@ def find_latest_pact_versions_for_provider provider_name, tag = nil
130130
end
131131
end
132132

133-
def find_all_pact_versions_for_provider_with_consumer_version_tags provider_name, consumer_version_tag_names
133+
def find_all_pact_versions_for_provider_with_consumer_version_tags provider_name, consumer_version_tag_name, consumer_name = nil
134134
provider = pacticipant_repository.find_by_name(provider_name)
135-
135+
consumer = consumer_name ? pacticipant_repository.find_by_name(consumer_name) : nil
136136
PactPublication
137137
.select_all_qualified
138138
.select_append(Sequel[:cv][:order].as(:consumer_version_order))
139139
.select_append(Sequel[:ct][:name].as(:consumer_version_tag_name))
140140
.remove_overridden_revisions
141141
.join_consumer_versions(:cv)
142-
.join_consumer_version_tags_with_names(consumer_version_tag_names)
142+
.join_consumer_version_tags_with_names(consumer_version_tag_name)
143143
.where(provider: provider)
144+
.where_consumer_if_set(consumer)
144145
.eager(:consumer)
145146
.eager(:consumer_version)
146147
.eager(:provider)
@@ -457,12 +458,10 @@ def find_pacts_for_which_the_latest_version_for_the_fallback_tag_is_required(pro
457458

458459
def find_pacts_for_which_all_versions_for_the_tag_are_required(provider_name, consumer_version_selectors)
459460
# The tags for which all versions are specified
460-
tag_names = consumer_version_selectors.tag_names_of_selectors_for_all_pacts
461+
selectors = consumer_version_selectors.select(&:all_for_tag?)
461462

462-
if tag_names.any?
463-
find_all_pact_versions_for_provider_with_consumer_version_tags(provider_name, tag_names)
464-
else
465-
[]
463+
selectors.flat_map do | selector |
464+
find_all_pact_versions_for_provider_with_consumer_version_tags(provider_name, selector.tag, selector.consumer)
466465
end
467466
end
468467

lib/pact_broker/pacts/selector.rb

+11
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,14 @@ def fallback_tag
2525
self[:fallback_tag]
2626
end
2727

28+
def consumer= consumer
29+
self[:consumer] = consumer
30+
end
31+
32+
def consumer
33+
self[:consumer]
34+
end
35+
2836
def self.overall_latest
2937
Selector.new(latest: true)
3038
end
@@ -41,6 +49,9 @@ def self.all_for_tag(tag)
4149
Selector.new(tag: tag)
4250
end
4351

52+
def self.all_for_tag_and_consumer(tag, consumer)
53+
Selector.new(tag: tag, consumer: consumer)
54+
end
4455

4556
def self.from_hash hash
4657
Selector.new(hash)

spec/lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema_spec.rb

+13
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,19 @@ module Contracts
113113
it { is_expected.to_not have_key(:includeWipPactsSince) }
114114
end
115115
end
116+
117+
context "when a blank consumer name is specified" do
118+
let(:consumer_version_selectors) do
119+
[{
120+
tag: "feat-x",
121+
consumer: ""
122+
}]
123+
end
124+
125+
it "has an error" do
126+
expect(subject[:consumerVersionSelectors].first).to include "blank"
127+
end
128+
end
116129
end
117130
end
118131
end

spec/lib/pact_broker/api/contracts/verifiable_pacts_query_schema_spec.rb

+13
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,19 @@ module Contracts
7878
it { is_expected.to_not have_key(:include_wip_pacts_since) }
7979
end
8080
end
81+
82+
context "when a blank consumer name is specified" do
83+
let(:consumer_version_selectors) do
84+
[{
85+
tag: "feat-x",
86+
consumer: ""
87+
}]
88+
end
89+
90+
it "has an error" do
91+
expect(subject[:consumer_version_selectors].first).to include "blank"
92+
end
93+
end
8194
end
8295
end
8396
end

spec/lib/pact_broker/pacts/repository_find_for_verification_spec.rb

+26
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,32 @@ def find_by_consumer_name_and_consumer_version_number(consumer_name, consumer_ve
103103
end
104104
end
105105

106+
context "when all versions with a given tag for a given consumer are requested" do
107+
before do
108+
td.create_pact_with_hierarchy("Foo2", "prod-version-1", "Bar2")
109+
.create_consumer_version_tag("prod")
110+
.create_consumer_version("not-prod-version", tag_names: %w[master])
111+
.create_pact
112+
.create_consumer_version("prod-version-2", tag_names: %w[prod])
113+
.create_pact
114+
.create_consumer("Foo3")
115+
.create_consumer_version("prod-version-3", tag_names: %w[prod])
116+
.create_pact
117+
end
118+
119+
let(:consumer_version_selectors) { Selectors.new(pact_selector_1) }
120+
let(:pact_selector_1) { Selector.all_for_tag_and_consumer('prod', "Foo2") }
121+
122+
subject { Repository.new.find_for_verification("Bar2", consumer_version_selectors) }
123+
124+
it "returns all the versions with the specified tag and consumer" do
125+
expect(subject.size).to be 2
126+
expect(find_by_consumer_version_number("prod-version-1")).to_not be nil
127+
expect(find_by_consumer_version_number("prod-version-2")).to_not be nil
128+
expect(find_by_consumer_version_number("prod-version-3")).to be nil
129+
end
130+
end
131+
106132
context "when a pact version has been selected by two different selectors" do
107133
before do
108134
td.create_pact_with_hierarchy("Foo", "1", "Bar")

0 commit comments

Comments
 (0)