pact_broker 2.51.0 → 2.52.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +26 -0
- data/db/migrations/20200318_add_created_at_to_latest_pact_publications.rb +9 -0
- data/db/migrations/20200319_add_created_at_to_latest_verifications.rb +9 -0
- data/lib/pact_broker/api/contracts/dry_validation_predicates.rb +4 -0
- data/lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema.rb +26 -1
- data/lib/pact_broker/api/contracts/verifiable_pacts_query_schema.rb +2 -0
- data/lib/pact_broker/api/decorators/matrix_text_decorator.rb +1 -1
- data/lib/pact_broker/api/decorators/verifiable_pacts_query_decorator.rb +1 -0
- data/lib/pact_broker/api/pact_broker_urls.rb +11 -0
- data/lib/pact_broker/api/renderers/html_pact_renderer.rb +1 -1
- data/lib/pact_broker/db/data_migrations/set_created_at_for_latest_pact_publications.rb +25 -0
- data/lib/pact_broker/db/data_migrations/set_created_at_for_latest_verifications.rb +24 -0
- data/lib/pact_broker/db/migrate_data.rb +2 -0
- data/lib/pact_broker/matrix/every_row.rb +11 -5
- data/lib/pact_broker/matrix/parse_query.rb +6 -0
- data/lib/pact_broker/matrix/query_builder.rb +28 -16
- data/lib/pact_broker/matrix/query_results_with_deployment_status_summary.rb +15 -4
- data/lib/pact_broker/matrix/quick_row.rb +49 -65
- data/lib/pact_broker/matrix/repository.rb +2 -12
- data/lib/pact_broker/matrix/resolved_selector.rb +1 -1
- data/lib/pact_broker/matrix/service.rb +1 -1
- data/lib/pact_broker/pacts/pact_publication.rb +8 -0
- data/lib/pact_broker/pacts/repository.rb +10 -11
- data/lib/pact_broker/pacts/selector.rb +21 -0
- data/lib/pact_broker/pacts/verifiable_pact_messages.rb +5 -1
- data/lib/pact_broker/test/test_data_builder.rb +6 -0
- data/lib/pact_broker/ui/view_models/matrix_line.rb +8 -0
- data/lib/pact_broker/ui/views/matrix/show.haml +4 -4
- data/lib/pact_broker/verifications/repository.rb +2 -1
- data/lib/pact_broker/version.rb +1 -1
- data/lib/rack/pact_broker/request_target.rb +1 -1
- data/pact_broker.gemspec +1 -1
- data/public/javascripts/matrix.js +20 -8
- data/script/docker/db-restore.sh +1 -1
- data/spec/lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema_spec.rb +43 -2
- data/spec/lib/pact_broker/api/contracts/verifiable_pacts_query_schema_spec.rb +13 -0
- data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +11 -2
- data/spec/lib/pact_broker/api/renderers/html_pact_renderer_spec.rb +2 -1
- data/spec/lib/pact_broker/matrix/every_row_spec.rb +0 -10
- data/spec/lib/pact_broker/matrix/quick_row_spec.rb +11 -11
- data/spec/lib/pact_broker/matrix/repository_dependency_spec.rb +1 -1
- data/spec/lib/pact_broker/matrix/repository_spec.rb +9 -9
- data/spec/lib/pact_broker/pacts/repository_find_for_verification_spec.rb +43 -1
- data/spec/lib/pact_broker/pacts/repository_spec.rb +9 -0
- data/spec/lib/pact_broker/pacts/selector_spec.rb +5 -2
- data/spec/lib/pact_broker/pacts/verifiable_pact_messages_spec.rb +6 -0
- data/spec/lib/pact_broker/verifications/repository_spec.rb +21 -0
- metadata +10 -12
@@ -12,7 +12,7 @@ module PactBroker
|
|
12
12
|
ENV['TZ'] = "Australia/Melbourne"
|
13
13
|
PactBroker.configuration.enable_public_badge_access = true
|
14
14
|
allow(PactBroker::Api::PactBrokerUrls).to receive(:pact_url).with('http://base', pact).and_return(pact_url)
|
15
|
-
allow(PactBroker::Api::PactBrokerUrls).to receive(:
|
15
|
+
allow(PactBroker::Api::PactBrokerUrls).to receive(:matrix_for_pact_url).with(pact, 'http://base').and_return(matrix_url)
|
16
16
|
allow_any_instance_of(HtmlPactRenderer).to receive(:logger).and_return(logger)
|
17
17
|
|
18
18
|
Timecop.freeze(created_at + 3)
|
@@ -95,6 +95,7 @@ module PactBroker
|
|
95
95
|
before do
|
96
96
|
allow(pact).to receive(:content_hash).and_return(content_hash)
|
97
97
|
end
|
98
|
+
|
98
99
|
let(:json_content) { '[1]' }
|
99
100
|
let(:content_hash) { [1] }
|
100
101
|
|
@@ -8,13 +8,6 @@ module PactBroker
|
|
8
8
|
let(:bar) { PactBroker::Domain::Pacticipant.where(name: "Bar").single_record }
|
9
9
|
let(:wiffle) { PactBroker::Domain::Pacticipant.where(name: "Wiffle").single_record }
|
10
10
|
|
11
|
-
describe "ALL_COLUMNS" do
|
12
|
-
it "has the same first column as QuickRow - this is required so that they both sort the same" do
|
13
|
-
expect(EveryRow::ALL_COLUMNS.first).to eq QuickRow::LAST_ACTION_DATE
|
14
|
-
expect(EveryRow::ALL_COLUMNS.first).to eq QuickRow::ALL_COLUMNS.first
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
11
|
describe "matching_selectors" do
|
19
12
|
before do
|
20
13
|
td.create_pact_with_verification("Foo", "1", "Bar", "2")
|
@@ -58,7 +51,6 @@ module PactBroker
|
|
58
51
|
EveryRow
|
59
52
|
.select_all_columns
|
60
53
|
.join_verifications
|
61
|
-
.join_pacticipants_and_pacticipant_versions
|
62
54
|
.eager_all_the_things
|
63
55
|
.all
|
64
56
|
end
|
@@ -99,7 +91,6 @@ module PactBroker
|
|
99
91
|
EveryRow
|
100
92
|
.select_all_columns
|
101
93
|
.join_verifications
|
102
|
-
.join_pacticipants_and_pacticipant_versions
|
103
94
|
.all
|
104
95
|
end
|
105
96
|
|
@@ -129,7 +120,6 @@ module PactBroker
|
|
129
120
|
EveryRow
|
130
121
|
.select_all_columns
|
131
122
|
.join_verifications_for(query_ids)
|
132
|
-
.join_pacticipants_and_pacticipant_versions
|
133
123
|
.all
|
134
124
|
end
|
135
125
|
|
@@ -38,20 +38,20 @@ module PactBroker
|
|
38
38
|
before do
|
39
39
|
td.create_consumer("Foo")
|
40
40
|
.create_provider("Bar")
|
41
|
-
.create_consumer_version("10"
|
42
|
-
.create_pact
|
43
|
-
.create_verification(provider_version: "2", created_at:
|
44
|
-
.create_consumer_version("3"
|
45
|
-
.create_pact
|
46
|
-
.create_verification(provider_version: "2")
|
41
|
+
.create_consumer_version("10")
|
42
|
+
.create_pact(created_at: day_1)
|
43
|
+
.create_verification(provider_version: "2", created_at: day_3)
|
44
|
+
.create_consumer_version("3")
|
45
|
+
.create_pact(created_at: day_2)
|
46
|
+
.create_verification(provider_version: "2", created_at: day_3)
|
47
47
|
end
|
48
48
|
|
49
|
-
let(:
|
50
|
-
let(:
|
51
|
-
let(:
|
49
|
+
let(:day_1) { DateTime.now + 1 }
|
50
|
+
let(:day_2) { DateTime.now + 2 }
|
51
|
+
let(:day_3) { DateTime.now + 3 }
|
52
52
|
|
53
|
-
|
54
|
-
|
53
|
+
it "orders by the pact publication id desc" do
|
54
|
+
expect(subject.first.last_action_date).to eq subject.last.last_action_date
|
55
55
|
expect(subject.first.consumer_version_number).to eq "3"
|
56
56
|
expect(subject.last.consumer_version_number).to eq "10"
|
57
57
|
end
|
@@ -359,8 +359,8 @@ module PactBroker
|
|
359
359
|
|
360
360
|
it "returns a row for each verification for that version" do
|
361
361
|
expect(subject.size).to eq 2
|
362
|
-
expect(subject.collect
|
363
|
-
expect(subject.collect
|
362
|
+
expect(subject.collect(&:consumer_version_number).sort).to eq ["1.2.3", "1.2.3"]
|
363
|
+
expect(subject.collect(&:provider_version_number).sort).to eq ["4.5.6", "6.7.8"]
|
364
364
|
end
|
365
365
|
end
|
366
366
|
|
@@ -376,8 +376,8 @@ module PactBroker
|
|
376
376
|
let(:selectors) { build_selectors("A" => nil) }
|
377
377
|
|
378
378
|
it "returns a row for each verification for the pacticipant" do
|
379
|
-
expect(subject.collect
|
380
|
-
provider_version_numbers = subject.collect
|
379
|
+
expect(subject.collect(&:consumer_name).uniq).to eq ["A"]
|
380
|
+
provider_version_numbers = subject.collect(&:provider_version_number)
|
381
381
|
expect(provider_version_numbers).to include nil
|
382
382
|
expect(provider_version_numbers).to include "4.5.6"
|
383
383
|
end
|
@@ -398,8 +398,8 @@ module PactBroker
|
|
398
398
|
|
399
399
|
it "returns a row for each verification for that version" do
|
400
400
|
expect(subject.size).to eq 2
|
401
|
-
expect(subject.collect
|
402
|
-
expect(subject.collect
|
401
|
+
expect(subject.collect(&:consumer_version_number).sort).to eq ["1.2.3", "3.4.5"]
|
402
|
+
expect(subject.collect(&:provider_version_number).sort).to eq ["4.5.6", "4.5.6"]
|
403
403
|
end
|
404
404
|
end
|
405
405
|
|
@@ -422,8 +422,8 @@ module PactBroker
|
|
422
422
|
|
423
423
|
it "returns a row for each verification for that version" do
|
424
424
|
expect(subject.size).to eq 3
|
425
|
-
expect(subject.collect
|
426
|
-
expect(subject.collect
|
425
|
+
expect(subject.collect(&:consumer_version_number).sort).to eq ["1.2.3", "3.4.5", "3.4.5"]
|
426
|
+
expect(subject.collect(&:provider_version_number).sort).to eq ["4.5.6", "4.5.6", "6.7.8"]
|
427
427
|
end
|
428
428
|
end
|
429
429
|
|
@@ -565,7 +565,7 @@ module PactBroker
|
|
565
565
|
|
566
566
|
it "returns all matching rows" do
|
567
567
|
# postgres orders differently, and ruby array sort blows up with a nil string
|
568
|
-
provider_version_numbers = subject.collect
|
568
|
+
provider_version_numbers = subject.collect(&:provider_version_number)
|
569
569
|
expect(provider_version_numbers).to include nil
|
570
570
|
expect(provider_version_numbers).to include "2.0.0"
|
571
571
|
expect(provider_version_numbers.size).to eq 2
|
@@ -72,6 +72,17 @@ module PactBroker
|
|
72
72
|
it "sets the latest_consumer_version_tag_names" do
|
73
73
|
expect(find_by_consumer_version_number("foo-latest-prod-version").selectors.collect(&:tag)).to eq ['prod']
|
74
74
|
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
|
75
86
|
end
|
76
87
|
|
77
88
|
context "when all versions with a given tag are requested" do
|
@@ -99,7 +110,38 @@ module PactBroker
|
|
99
110
|
td.create_consumer_version("prod-version-3", tag_names: %w[prod])
|
100
111
|
.republish_same_pact
|
101
112
|
expect(subject.size).to be 2
|
102
|
-
expect(subject.collect(&:consumer_version_number)).to eq %w[prod-version-1 prod-version-3]
|
113
|
+
expect(subject.collect(&:consumer_version_number).sort).to eq %w[prod-version-1 prod-version-3]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context "when all versions with a given tag for a given consumer are requested" do
|
118
|
+
before do
|
119
|
+
td.create_pact_with_hierarchy("Foo2", "prod-version-1", "Bar2")
|
120
|
+
.create_consumer_version_tag("prod")
|
121
|
+
.create_consumer_version("not-prod-version", tag_names: %w[master])
|
122
|
+
.create_pact
|
123
|
+
.create_consumer_version("prod-version-2", tag_names: %w[prod])
|
124
|
+
.create_pact
|
125
|
+
.create_consumer("Foo3")
|
126
|
+
.create_consumer_version("prod-version-3", tag_names: %w[prod])
|
127
|
+
.create_pact
|
128
|
+
end
|
129
|
+
|
130
|
+
let(:consumer_version_selectors) { Selectors.new(pact_selector_1) }
|
131
|
+
let(:pact_selector_1) { Selector.all_for_tag_and_consumer('prod', "Foo2") }
|
132
|
+
|
133
|
+
subject { Repository.new.find_for_verification("Bar2", consumer_version_selectors) }
|
134
|
+
|
135
|
+
it "returns all the versions with the specified tag and consumer" do
|
136
|
+
expect(subject.size).to be 2
|
137
|
+
expect(find_by_consumer_version_number("prod-version-1")).to_not be nil
|
138
|
+
expect(find_by_consumer_version_number("prod-version-2")).to_not be nil
|
139
|
+
expect(find_by_consumer_version_number("prod-version-3")).to be nil
|
140
|
+
end
|
141
|
+
|
142
|
+
it "sets the selectors" do
|
143
|
+
expect(find_by_consumer_version_number("prod-version-1").selectors.first.tag).to eq 'prod'
|
144
|
+
expect(find_by_consumer_version_number("prod-version-1").selectors.first.consumer).to eq 'Foo2'
|
103
145
|
end
|
104
146
|
end
|
105
147
|
|
@@ -53,6 +53,15 @@ module PactBroker
|
|
53
53
|
expect(subject.created_at).to be_datey
|
54
54
|
end
|
55
55
|
|
56
|
+
it "creates a LatestPactPublicationIdForConsumerVersion" do
|
57
|
+
expect{ subject }.to change { LatestPactPublicationIdForConsumerVersion.count }.by(1)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "sets the created_at of the LatestPactPublicationIdForConsumerVersion to the same as the consumer version, because that's how pacts are ordered" do
|
61
|
+
subject
|
62
|
+
expect(LatestPactPublicationIdForConsumerVersion.first.created_at).to eq PactBroker::Domain::Version.find(number: subject.consumer_version_number).created_at
|
63
|
+
end
|
64
|
+
|
56
65
|
context "when a pact already exists with exactly the same content" do
|
57
66
|
let(:another_version) { Versions::Repository.new.create number: '2.0.0', pacticipant_id: consumer.id }
|
58
67
|
|
@@ -8,15 +8,18 @@ module PactBroker
|
|
8
8
|
let(:overall_latest_2) { Selector.overall_latest }
|
9
9
|
let(:latest_for_tag_prod) { Selector.latest_for_tag('prod') }
|
10
10
|
let(:latest_for_tag_dev) { Selector.latest_for_tag('dev') }
|
11
|
+
let(:all_prod_for_consumer_1) { Selector.all_for_tag_and_consumer('prod', 'Foo') }
|
12
|
+
let(:all_prod_for_consumer_2) { Selector.all_for_tag_and_consumer('prod', 'Bar') }
|
13
|
+
let(:all_dev_for_consumer_1) { Selector.all_for_tag_and_consumer('dev', 'Bar') }
|
11
14
|
let(:all_prod) { Selector.all_for_tag('prod') }
|
12
15
|
let(:all_dev) { Selector.all_for_tag('dev') }
|
13
16
|
|
14
17
|
let(:unsorted_selectors) do
|
15
|
-
[all_prod, all_dev, latest_for_tag_prod, overall_latest_1, overall_latest_1, latest_for_tag_dev]
|
18
|
+
[all_prod, all_dev, all_dev_for_consumer_1, latest_for_tag_prod, overall_latest_1, overall_latest_1, latest_for_tag_dev, all_prod_for_consumer_2, all_prod_for_consumer_1]
|
16
19
|
end
|
17
20
|
|
18
21
|
let(:expected_sorted_selectors) do
|
19
|
-
[overall_latest_1, overall_latest_1, latest_for_tag_dev, latest_for_tag_prod, all_dev, all_prod]
|
22
|
+
[overall_latest_1, overall_latest_1, latest_for_tag_dev, latest_for_tag_prod, all_dev_for_consumer_1, all_prod_for_consumer_2, all_prod_for_consumer_1, all_dev, all_prod]
|
20
23
|
end
|
21
24
|
|
22
25
|
it "sorts the selectors" do
|
@@ -67,6 +67,12 @@ module PactBroker
|
|
67
67
|
|
68
68
|
its(:inclusion_reason) { is_expected.to include "The pact at http://pact is being verified because it matches the following configured selection criterion: pacts for all consumer versions tagged 'prod'"}
|
69
69
|
end
|
70
|
+
|
71
|
+
context "when the pact is one of all versions for a tag and consumer" do
|
72
|
+
let(:selectors) { Selectors.new(Selector.all_for_tag_and_consumer('prod', 'Foo')) }
|
73
|
+
|
74
|
+
its(:inclusion_reason) { is_expected.to include "The pact at http://pact is being verified because it matches the following configured selection criterion: pacts for all Foo versions tagged 'prod'"}
|
75
|
+
end
|
70
76
|
end
|
71
77
|
|
72
78
|
describe "#pending_reason" do
|
@@ -3,6 +3,27 @@ require 'pact_broker/verifications/repository'
|
|
3
3
|
module PactBroker
|
4
4
|
module Verifications
|
5
5
|
describe Repository do
|
6
|
+
describe "#create" do
|
7
|
+
let(:verification) do
|
8
|
+
PactBroker::Domain::Verification.new(success: true)
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:provider_version_number) { "2" }
|
12
|
+
let(:pact) do
|
13
|
+
td.create_pact_with_hierarchy("Foo", "1", "Bar").and_return(:pact)
|
14
|
+
end
|
15
|
+
|
16
|
+
subject { Repository.new.create verification, provider_version_number, pact}
|
17
|
+
|
18
|
+
it "creates a LatestVerificationIdForPactVersionAndProviderVersion" do
|
19
|
+
expect { subject }.to change { LatestVerificationIdForPactVersionAndProviderVersion.count }.by(1)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "sets the created_at of the LatestVerificationIdForPactVersionAndProviderVersion to the same as the verification" do
|
23
|
+
expect(subject.created_at).to eq LatestVerificationIdForPactVersionAndProviderVersion.first.created_at
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
6
27
|
describe "#find" do
|
7
28
|
let!(:pact) do
|
8
29
|
builder = TestDataBuilder.new
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pact_broker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.52.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bethany Skurrie
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2020-03-
|
13
|
+
date: 2020-03-25 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: httparty
|
@@ -30,22 +30,16 @@ dependencies:
|
|
30
30
|
name: json
|
31
31
|
requirement: !ruby/object:Gem::Requirement
|
32
32
|
requirements:
|
33
|
-
- - "
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
-
version: '1.8'
|
36
|
-
- - "<"
|
33
|
+
- - "~>"
|
37
34
|
- !ruby/object:Gem::Version
|
38
|
-
version: '3
|
35
|
+
version: '2.3'
|
39
36
|
type: :runtime
|
40
37
|
prerelease: false
|
41
38
|
version_requirements: !ruby/object:Gem::Requirement
|
42
39
|
requirements:
|
43
|
-
- - "
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version: '1.8'
|
46
|
-
- - "<"
|
40
|
+
- - "~>"
|
47
41
|
- !ruby/object:Gem::Version
|
48
|
-
version: '3
|
42
|
+
version: '2.3'
|
49
43
|
- !ruby/object:Gem::Dependency
|
50
44
|
name: roar
|
51
45
|
requirement: !ruby/object:Gem::Requirement
|
@@ -765,6 +759,8 @@ files:
|
|
765
759
|
- db/migrations/20191030_optimise_latest_pact_publications_by_consumer_versions_.rb
|
766
760
|
- db/migrations/20191031_optimise_latest_verification_ids_for_consumer_version_tags.rb
|
767
761
|
- db/migrations/20191101_create_head_pact_tags.rb
|
762
|
+
- db/migrations/20200318_add_created_at_to_latest_pact_publications.rb
|
763
|
+
- db/migrations/20200319_add_created_at_to_latest_verifications.rb
|
768
764
|
- db/migrations/migration_helper.rb
|
769
765
|
- db/test/backwards_compatibility/.rspec
|
770
766
|
- db/test/backwards_compatibility/Appraisals
|
@@ -952,6 +948,8 @@ files:
|
|
952
948
|
- lib/pact_broker/db/data_migrations/helpers.rb
|
953
949
|
- lib/pact_broker/db/data_migrations/migrate_webhook_headers.rb
|
954
950
|
- lib/pact_broker/db/data_migrations/set_consumer_ids_for_pact_publications.rb
|
951
|
+
- lib/pact_broker/db/data_migrations/set_created_at_for_latest_pact_publications.rb
|
952
|
+
- lib/pact_broker/db/data_migrations/set_created_at_for_latest_verifications.rb
|
955
953
|
- lib/pact_broker/db/data_migrations/set_latest_version_sequence_value.rb
|
956
954
|
- lib/pact_broker/db/data_migrations/set_pacticipant_ids_for_verifications.rb
|
957
955
|
- lib/pact_broker/db/data_migrations/set_webhooks_enabled.rb
|