Skip to content

Commit b39ad19

Browse files
committed
feat(pacts for verification): add validation to only allow consumer to be specified for 'all' versions for a tag
1 parent fdff0c5 commit b39ad19

File tree

3 files changed

+65
-3
lines changed

3 files changed

+65
-3
lines changed

lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema.rb

+24-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,30 @@ class VerifiablePactsJSONQuerySchema
3939
end
4040

4141
def self.call(params)
42-
select_first_message(flatten_indexed_messages(SCHEMA.call(params&.symbolize_keys).messages(full: true)))
42+
symbolized_params = params&.symbolize_keys
43+
results = select_first_message(flatten_indexed_messages(SCHEMA.call(symbolized_params).messages(full: true)))
44+
add_cross_field_validation_errors(symbolized_params, results)
45+
results
46+
end
47+
48+
def self.add_cross_field_validation_errors(params, results)
49+
# This is a ducking joke. Need to get rid of dry-validation
50+
if params[:consumerVersionSelectors].is_a?(Array)
51+
errors = []
52+
params[:consumerVersionSelectors].each_with_index do | selector, index |
53+
if selector[:fallbackTag] && !selector[:latest]
54+
errors << "fallbackTag can only be set if latest is true (at index #{index})"
55+
end
56+
57+
if selector[:consumer] && selector[:latest]
58+
errors << "specifying a consumer with latest == true is not yet supported (at index #{index})"
59+
end
60+
end
61+
if errors.any?
62+
results[:consumerVersionSelectors] ||= []
63+
results[:consumerVersionSelectors].concat(errors)
64+
end
65+
end
4366
end
4467
end
4568
end

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

+30-2
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ module Contracts
4343
end
4444
end
4545

46-
context "when latest is not specified", pending: true do
46+
context "when latest is not specified" do
4747
let(:consumer_version_selectors) do
4848
[{
4949
tag: "feat-x",
@@ -52,7 +52,21 @@ module Contracts
5252
end
5353

5454
it "has an error" do
55-
expect(subject[:consumerVersionSelectors].first).to include "not allowed"
55+
expect(subject[:consumerVersionSelectors].first).to match /can only be set.*index 0/
56+
end
57+
58+
context "when there are multiple errors" do
59+
let(:consumer_version_selectors) do
60+
[{
61+
consumer: "",
62+
tag: "feat-x",
63+
fallbackTag: "master"
64+
}]
65+
end
66+
67+
it "merges the array" do
68+
expect(subject[:consumerVersionSelectors].size).to be 2
69+
end
5670
end
5771
end
5872
end
@@ -126,6 +140,20 @@ module Contracts
126140
expect(subject[:consumerVersionSelectors].first).to include "blank"
127141
end
128142
end
143+
144+
context "when a consumer name is specified with a latest tag" do
145+
let(:consumer_version_selectors) do
146+
[{
147+
latest: true,
148+
tag: "feat-x",
149+
consumer: "foo"
150+
}]
151+
end
152+
153+
it "has an error" do
154+
expect(subject[:consumerVersionSelectors].first).to include "not yet supported"
155+
end
156+
end
129157
end
130158
end
131159
end

spec/lib/pact_broker/pacts/repository_find_for_verification_spec.rb

+11
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,17 @@ def find_by_consumer_name_and_consumer_version_number(consumer_name, consumer_ve
7272
it "sets the latest_consumer_version_tag_names" do
7373
expect(find_by_consumer_version_number("foo-latest-prod-version").selectors.collect(&:tag)).to eq ['prod']
7474
end
75+
76+
context "when a consumer name is specified", pending: "not yet implemented, but will do" do
77+
let(:consumer_version_selectors) do
78+
Selectors.new(Selector.all_for_tag_and_consumer('prod', 'Foo'))
79+
end
80+
81+
it "only returns the pacts for that consumer" do
82+
expect(subject.size).to eq 3
83+
expect(find_by_consumer_version_number("foo-latest-prod-version").selectors).to eq [Selector.all_for_tag_and_consumer('prod', 'Foo')]
84+
end
85+
end
7586
end
7687

7788
context "when all versions with a given tag are requested" do

0 commit comments

Comments
 (0)