Skip to content

Commit a06899e

Browse files
committed
feat(clean): support specifying which versions to keep using selectors
1 parent 02ba3b7 commit a06899e

File tree

4 files changed

+48
-103
lines changed

4 files changed

+48
-103
lines changed

lib/pact_broker/db/clean.rb

+14-1
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,25 @@ def call
1717
deleted_counts = {}
1818
kept_counts = {}
1919
date = options[:date]
20+
21+
version_ids_to_keep = nil
22+
23+
if options[:keep]
24+
version_ids_to_keep = options[:keep].collect do | selector |
25+
PactBroker::Domain::Version.select(:id).for_selector(selector)
26+
end.reduce(&:union)
27+
end
28+
2029
pact_publication_ids_to_delete = if date
2130
db[:pact_publications].select(:id).where(Sequel.lit('created_at < ?', date))
31+
elsif version_ids_to_keep
32+
db[:pact_publications].select(:id).where(consumer_version_id: version_ids_to_keep).invert
2233
else
23-
db[:pact_publications].select(:id).where(id: db[:head_matrix].select(:pact_publication_id)).invert
34+
keep = db[:latest_tagged_pact_publications].select(:id).union(db[:latest_pact_publications].select(:id))
35+
db[:pact_publications].select(:id).where(id: keep).invert
2436
end
2537

38+
2639
deleted_counts[:pact_publications] = pact_publication_ids_to_delete.count
2740
kept_counts[:pact_publications] = db[:pact_publications].where(id: pact_publication_ids_to_delete).invert.count
2841

lib/pact_broker/domain/version.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,13 @@ def delete
4444
super
4545
end
4646

47-
def find_for_selector(selector)
48-
query = select_all_qualified
47+
def for_selector(selector)
48+
query = self
4949
query = query.where_pacticipant_name(selector.pacticipant_name) if selector.pacticipant_name
5050
query = query.where_tag(selector.tag) if selector.tag
5151
query = query.where_number(selector.pacticipant_version_number) if selector.pacticipant_version_number
5252
query = query.reverse_order(:order).limit(1) if selector.latest
53-
versions = query.all
53+
query
5454
end
5555
end
5656

lib/pact_broker/versions/repository.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ def delete_orphan_versions consumer, provider
8787
end
8888

8989
def find_versions_for_selector(selector)
90-
PactBroker::Domain::Version.find_for_selector(selector)
90+
PactBroker::Domain::Version.select_all_qualified.for_selector(selector).all
9191
end
9292
end
9393
end

spec/lib/pact_broker/db/clean_spec.rb

+30-98
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
require 'pact_broker/db/clean'
2+
require 'pact_broker/matrix/unresolved_selector'
23

34
IS_MYSQL = !!DB.mysql?
45

@@ -12,111 +13,42 @@ module DB
1213
subject { Clean.call(PactBroker::DB.connection, options) }
1314

1415
describe ".call"do
15-
16-
before do
17-
td.create_pact_with_hierarchy("Foo", "0", "Bar")
18-
.create_consumer_version_tag("prod")
19-
.create_consumer_version("1")
20-
.create_pact
21-
.create_consumer_version_tag("prod")
22-
.comment("keep")
23-
.create_verification(provider_version: "20")
24-
.create_consumer_version("2")
25-
.create_pact
26-
.comment("don't keep")
27-
.create_webhook
28-
.create_triggered_webhook
29-
.create_webhook_execution
30-
.create_verification(provider_version: "30")
31-
.create_verification_webhook
32-
.create_triggered_webhook
33-
.create_webhook_execution
34-
.create_consumer_version("3")
35-
.create_pact
36-
.comment("keep")
37-
.create_verification(provider_version: "40")
38-
.create_verification(provider_version: "40", number: 2)
39-
.create_verification(provider_version: "50", number: 3)
40-
end
41-
42-
43-
it "does not delete any rows in the head matrix" do
44-
head_matrix_before = db[:head_matrix].select_all
45-
subject
46-
head_matrix_after = db[:head_matrix].select_all
47-
expect(head_matrix_before).to eq head_matrix_after
48-
end
49-
50-
it "deletes rows that aren't the latest or latest tagged" do
51-
subject
52-
expect(db[:matrix].where(consumer_version_number: "2").count).to eq 0
53-
end
54-
55-
it "deletes orphan pact_versions" do
56-
subject
57-
expect(db[:pact_versions].count).to eq 2
58-
end
59-
60-
it "deletes orphan versions" do
61-
subject
62-
expect(db[:versions].where(number: "20").count).to be 1
63-
expect(db[:versions].where(number: "30").count).to be 0
64-
expect(db[:versions].where(number: "40").count).to be 1
65-
expect(db[:versions].where(number: "50").count).to be 1
66-
end
67-
68-
it "deletes overwritten verifications" do
69-
expect(db[:matrix].where(provider_version_number: "40").count).to eq 2
70-
subject
71-
expect(db[:matrix].where(provider_version_number: "40", verification_number: 2).count).to eq 1
72-
end
73-
end
74-
75-
describe ".call with a date" do
76-
before do
77-
td.set_now(DateTime.new(2019, 1, 1))
78-
.create_pact_with_hierarchy
79-
.create_verification
80-
end
81-
let(:options) { { date: date } }
82-
83-
context "when the data is older than the given date" do
84-
let(:date) { DateTime.new(2019, 1, 2) }
85-
let(:expected_report) do
86-
{
87-
kept: { pact_publications: 0, verification_results: 0 },
88-
deleted: { pact_publications: 1, verification_results: 1 }
89-
}
16+
context "when there are specified versions to keep" do
17+
before do
18+
td.create_pact_with_hierarchy("Foo", "1", "Bar")
19+
.create_consumer_version_tag("prod")
20+
.create_consumer_version_tag("master")
21+
.create_consumer_version("3", tag_names: %w{prod})
22+
.create_pact
23+
.create_consumer_version("4", tag_names: %w{master})
24+
.create_pact
25+
.create_consumer_version("5", tag_names: %w{master})
26+
.create_pact
27+
.create_consumer_version("6", tag_names: %w{foo})
28+
.create_pact
9029
end
9130

92-
it "is deleted" do
93-
subject
94-
expect(db[:head_matrix].count).to be 0
95-
end
96-
97-
it "returns a report" do
98-
expect(subject).to include(expected_report)
99-
end
100-
end
101-
102-
context "when the data is not older than the given date" do
103-
let(:date) { DateTime.new(2019, 1, 1) }
104-
let(:expected_report) do
31+
let(:options) do
10532
{
106-
kept: { pact_publications: 1, verification_results: 1 },
107-
deleted: { pact_publications: 0, verification_results: 0 }
33+
keep: [
34+
PactBroker::Matrix::UnresolvedSelector.new(tag: "prod"),
35+
PactBroker::Matrix::UnresolvedSelector.new(tag: "master", latest: true)
36+
]
10837
}
10938
end
11039

111-
it "is not deleted" do
40+
it "does not delete the consumer versions specified" do
41+
expect(PactBroker::Domain::Version.where(number: "1").count).to be 1
42+
expect(PactBroker::Domain::Version.where(number: "3").count).to be 1
43+
expect(PactBroker::Domain::Version.where(number: "4").count).to be 1
44+
expect(PactBroker::Domain::Version.where(number: "5").count).to be 1
45+
expect(PactBroker::Domain::Version.where(number: "6").count).to be 1
11246
subject
113-
expect(db[:head_matrix].count).to be 1
114-
expect(db[:pact_publications].count).to be 1
115-
expect(db[:verifications].count).to be 1
116-
end
117-
118-
it "returns a report" do
119-
expect(subject).to include(expected_report)
47+
expect(PactBroker::Domain::Version.where(number: "1").count).to be 1
48+
expect(PactBroker::Domain::Version.where(number: "3").count).to be 1
49+
expect(PactBroker::Domain::Version.where(number: "4").count).to be 0
50+
expect(PactBroker::Domain::Version.where(number: "5").count).to be 1
51+
expect(PactBroker::Domain::Version.where(number: "6").count).to be 0
12052
end
12153
end
12254
end

0 commit comments

Comments
 (0)