pact_broker 2.71.0 → 2.72.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +1 -21
  3. data/CHANGELOG.md +11 -0
  4. data/Dockerfile +5 -1
  5. data/docker-compose-ci-mysql.yml +37 -0
  6. data/lib/pact_broker/api/pact_broker_urls.rb +5 -1
  7. data/lib/pact_broker/api/resources/metadata_resource_methods.rb +23 -0
  8. data/lib/pact_broker/api/resources/pact.rb +2 -13
  9. data/lib/pact_broker/api/resources/pact_resource_methods.rb +23 -0
  10. data/lib/pact_broker/api/resources/pact_version.rb +3 -0
  11. data/lib/pact_broker/api/resources/tagged_pact_versions.rb +4 -0
  12. data/lib/pact_broker/api/resources/verifications.rb +2 -4
  13. data/lib/pact_broker/db/clean_incremental.rb +132 -22
  14. data/lib/pact_broker/db/delete_overwritten_data.rb +55 -27
  15. data/lib/pact_broker/domain/tag.rb +42 -0
  16. data/lib/pact_broker/domain/verification.rb +87 -0
  17. data/lib/pact_broker/metrics/service.rb +5 -3
  18. data/lib/pact_broker/pacts/all_pact_publications.rb +8 -0
  19. data/lib/pact_broker/pacts/repository.rb +35 -11
  20. data/lib/pact_broker/tasks/clean_task.rb +9 -3
  21. data/lib/pact_broker/tasks/delete_overwritten_data_task.rb +23 -7
  22. data/lib/pact_broker/test/test_data_builder.rb +24 -0
  23. data/lib/pact_broker/version.rb +1 -1
  24. data/script/docker-container/test.sh +3 -0
  25. data/script/docker/db-psql.sh +3 -0
  26. data/script/docker/db-reload.sh +11 -0
  27. data/script/pry.rb +25 -0
  28. data/script/seed.rb +1 -0
  29. data/script/test/run-rake-on-docker-compose-mysql.sh +8 -0
  30. data/spec/features/delete_tagged_pact_versions_spec.rb +2 -2
  31. data/spec/features/get_pact_spec.rb +2 -2
  32. data/spec/features/get_pact_version.rb +26 -3
  33. data/spec/fixtures/approvals/clean_incremental_dry_run.approved.json +100 -0
  34. data/spec/lib/pact_broker/api/pact_broker_urls_spec.rb +6 -0
  35. data/spec/lib/pact_broker/api/resources/pact_spec.rb +20 -9
  36. data/spec/lib/pact_broker/api/resources/tagged_pact_versions_spec.rb +10 -2
  37. data/spec/lib/pact_broker/api/resources/verifications_spec.rb +7 -3
  38. data/spec/lib/pact_broker/db/clean_incremental_spec.rb +9 -1
  39. data/spec/lib/pact_broker/db/delete_overwritten_data_spec.rb +71 -11
  40. data/spec/lib/pact_broker/domain/tag_spec.rb +23 -9
  41. data/spec/lib/pact_broker/domain/verification_spec.rb +49 -0
  42. data/spec/lib/pact_broker/metrics/service_spec.rb +4 -1
  43. data/spec/lib/pact_broker/pacts/repository_spec.rb +54 -7
  44. data/spec/migrations/change_migration_strategy_spec.rb +1 -1
  45. metadata +12 -2
@@ -40,6 +40,7 @@ module PactBroker
40
40
  attr_reader :provider_version
41
41
  attr_reader :version
42
42
  attr_reader :pact
43
+ attr_reader :pact_version
43
44
  attr_reader :verification
44
45
  attr_reader :webhook
45
46
  attr_reader :webhook_execution
@@ -96,6 +97,15 @@ module PactBroker
96
97
  self
97
98
  end
98
99
 
100
+ def create_pact_with_verification_and_tags consumer_name = "Consumer", consumer_version = "1.0.#{model_counter}", consumer_version_tags = [], provider_name = "Provider", provider_version = "1.0.#{model_counter}", provider_version_tags = []
101
+ create_pact_with_hierarchy(consumer_name, consumer_version, provider_name)
102
+ consumer_version_tags.each do | tag |
103
+ create_consumer_version_tag(tag)
104
+ end
105
+ create_verification(number: model_counter, provider_version: provider_version, tag_names: provider_version_tags)
106
+ self
107
+ end
108
+
99
109
  def create_version_with_hierarchy pacticipant_name, pacticipant_version
100
110
  pacticipant = pacticipant_service.create(:name => pacticipant_name)
101
111
  version = PactBroker::Domain::Version.create(:number => pacticipant_version, :pacticipant => pacticipant)
@@ -237,6 +247,20 @@ module PactBroker
237
247
  self
238
248
  end
239
249
 
250
+ def create_pact_version_without_publication(json_content = nil )
251
+ json_content = json_content ? json_content : {random: rand}.to_json
252
+ pact_version_sha = generate_pact_version_sha(json_content)
253
+
254
+ @pact_version = PactBroker::Pacts::PactVersion.new(
255
+ consumer_id: consumer.id,
256
+ provider_id: provider.id,
257
+ sha: pact_version_sha,
258
+ content: json_content,
259
+ created_at: Sequel.datetime_class.now
260
+ ).save
261
+ self
262
+ end
263
+
240
264
  def create_webhook parameters = {}
241
265
  params = parameters.dup
242
266
  consumer = params.key?(:consumer) ? params.delete(:consumer) : @consumer
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = '2.71.0'
2
+ VERSION = '2.72.0'
3
3
  end
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+
3
+ bundle exec rake
@@ -0,0 +1,3 @@
1
+ #!/bin/bash
2
+
3
+ docker exec -it pact-broker-postgres psql -U postgres postgres
@@ -0,0 +1,11 @@
1
+ #!/bin/bash
2
+
3
+ : "${1:?Please specify file to restore}"
4
+
5
+ script/docker/db-rm.sh
6
+ sleep 2
7
+ script/docker/db-start.sh
8
+ sleep 3
9
+
10
+ echo "restoring"
11
+ script/docker/db-restore.sh "$1"
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # raise "Please supply database path" unless ARGV[0]
4
+
5
+ $LOAD_PATH.unshift './lib'
6
+ $LOAD_PATH.unshift './spec'
7
+ $LOAD_PATH.unshift './tasks'
8
+ ENV['RACK_ENV'] = 'development'
9
+ require 'sequel'
10
+ require 'logger'
11
+ #DATABASE_CREDENTIALS = {logger: Logger.new($stdout), adapter: "sqlite", database: ARGV[0], :encoding => 'utf8'}.tap { |it| puts it }
12
+ DATABASE_CREDENTIALS = {adapter: "postgres", database: "postgres", username: 'postgres', password: 'postgres', host: "localhost", :encoding => 'utf8'}
13
+
14
+ connection = Sequel.connect(DATABASE_CREDENTIALS)
15
+ connection.timezone = :utc
16
+ # Uncomment these lines to open a pry session for inspecting the database
17
+
18
+
19
+ require 'pact_broker/db'
20
+ require 'pact_broker'
21
+ require 'support/test_data_builder'
22
+ puts "bout to pry"
23
+
24
+ require 'pry'; pry(binding);
25
+ puts "fater pry"
@@ -8,6 +8,7 @@ $LOAD_PATH.unshift './tasks'
8
8
  ENV['RACK_ENV'] = 'development'
9
9
  require 'sequel'
10
10
  require 'logger'
11
+ require 'stringio'
11
12
  logger = Logger.new($stdout)
12
13
  logger = Logger.new(StringIO.new)
13
14
  DATABASE_CREDENTIALS = {logger: logger, adapter: "sqlite", database: ARGV[0], :encoding => 'utf8'}.tap { |it| puts it }
@@ -0,0 +1,8 @@
1
+ #/bin/sh
2
+
3
+ cleanup() {
4
+ docker-compose -f docker-compose-ci-mysql.yml down
5
+ }
6
+
7
+ trap cleanup EXIT
8
+ docker-compose -f docker-compose-ci-mysql.yml up --exit-code-from tests --abort-on-container-exit --remove-orphans
@@ -15,8 +15,8 @@ describe "Deleting tagged pact versions" do
15
15
  expect{ subject }.to change{ PactBroker::Pacts::PactPublication.count }.by(-1)
16
16
  end
17
17
 
18
- it "returns a 204" do
19
- expect(subject.status).to be 204
18
+ it "returns a 200" do
19
+ expect(subject.status).to be 200
20
20
  end
21
21
  end
22
22
 
@@ -1,6 +1,5 @@
1
1
  describe "retrieving a pact" do
2
-
3
- subject { get path; last_response }
2
+ subject { get(path) }
4
3
 
5
4
  context "when differing case is used in the consumer and provider names" do
6
5
 
@@ -30,6 +29,7 @@ describe "retrieving a pact" do
30
29
  end
31
30
  end
32
31
  end
32
+
33
33
  context "when differing case is used in the tag name" do
34
34
 
35
35
  let(:path) { "/pacts/provider/a%20provider/consumer/a%20consumer/latest/PROD" }
@@ -1,8 +1,7 @@
1
- describe "retrieving a pact" do
2
- subject { get path; last_response }
1
+ RSpec.describe "retrieving a pact" do
2
+ subject { get(path) }
3
3
 
4
4
  context "when differing case is used in the consumer and provider names" do
5
- let(:td) { TestDataBuilder.new }
6
5
  let(:pact) { td.create_pact_with_hierarchy("Foo", "1", "Bar").and_return(:pact) }
7
6
  let!(:path) { "/pacts/provider/Bar/consumer/Foo/pact-version/#{pact.pact_version_sha}" }
8
7
 
@@ -10,4 +9,28 @@ describe "retrieving a pact" do
10
9
  expect(subject.status).to be 200
11
10
  end
12
11
  end
12
+
13
+ context "when there are multiple consumer versions for the same sha" do
14
+ before do
15
+ td.create_pact_with_hierarchy("Foo", "1", "Bar")
16
+ .create_consumer_version("2")
17
+ .republish_same_pact
18
+ end
19
+
20
+ let(:pact) { PactBroker::Pacts::PactPublication.order(:id).first.to_domain }
21
+ let(:path) { PactBroker::Api::PactBrokerUrls.pact_version_url(pact) }
22
+
23
+ it "returns the latest" do
24
+ expect(JSON.parse(subject.body)['_links']['pb:consumer-version']['name']).to eq "2"
25
+ end
26
+
27
+ context "when there is metadata specifying the consumer version number" do
28
+ let(:pact) { PactBroker::Pacts::PactPublication.order(:id).first.to_domain }
29
+ let(:path) { PactBroker::Api::PactBrokerUrls.pact_version_url_with_webhook_metadata(pact) }
30
+
31
+ it "returns the pact with the matching consumer version number" do
32
+ expect(JSON.parse(subject.body)['_links']['pb:consumer-version']['name']).to eq "1"
33
+ end
34
+ end
35
+ end
13
36
  end
@@ -0,0 +1,100 @@
1
+ {
2
+ "counts": {
3
+ "totalVersions": 9,
4
+ "versionsToDelete": 3,
5
+ "versionsNotToKeep": 6,
6
+ "versionsToKeep": 3,
7
+ "versionsToKeepBySelector": [
8
+ {
9
+ "selector": {
10
+ "tag": "prod"
11
+ },
12
+ "count": 2
13
+ },
14
+ {
15
+ "selector": {
16
+ "tag": "dev",
17
+ "latest": true
18
+ },
19
+ "count": 1
20
+ }
21
+ ]
22
+ },
23
+ "versionSummary": {
24
+ "Bar": {
25
+ "toDelete": {
26
+ "count": 0
27
+ },
28
+ "toKeep": {
29
+ "count": 0
30
+ }
31
+ },
32
+ "Foo": {
33
+ "toDelete": {
34
+ "count": 3,
35
+ "fromVersion": {
36
+ "number": "2",
37
+ "created": "1 day ago",
38
+ "tags": [
39
+
40
+ ]
41
+ },
42
+ "toVersion": {
43
+ "number": "6",
44
+ "created": "5 days ago",
45
+ "tags": [
46
+ "foo"
47
+ ]
48
+ }
49
+ },
50
+ "toKeep": {
51
+ "count": 4,
52
+ "latestVersion": {
53
+ "number": "1",
54
+ "created": "less than a minute ago",
55
+ "tags": [
56
+ "dev",
57
+ "prod"
58
+ ]
59
+ },
60
+ "firstVersion": {
61
+ "number": "7",
62
+ "created": "6 days ago",
63
+ "tags": [
64
+
65
+ ]
66
+ }
67
+ }
68
+ },
69
+ "Meep": {
70
+ "toDelete": {
71
+ "count": 0
72
+ },
73
+ "toKeep": {
74
+ "count": 2,
75
+ "latestVersion": {
76
+ "number": "2",
77
+ "created": "6 days ago",
78
+ "tags": [
79
+ "foop"
80
+ ]
81
+ },
82
+ "firstVersion": {
83
+ "number": "3",
84
+ "created": "6 days ago",
85
+ "tags": [
86
+ "blah"
87
+ ]
88
+ }
89
+ }
90
+ },
91
+ "Moop": {
92
+ "toDelete": {
93
+ "count": 0
94
+ },
95
+ "toKeep": {
96
+ "count": 0
97
+ }
98
+ }
99
+ }
100
+ }
@@ -123,6 +123,12 @@ module PactBroker
123
123
  end
124
124
  end
125
125
 
126
+ context "when the metadata is empty" do
127
+ it "returns an empty hash" do
128
+ expect(PactBrokerUrls.decode_pact_metadata("")).to eq({})
129
+ end
130
+ end
131
+
126
132
  context "when the metadata is not valid base64" do
127
133
  it "returns an empty hash" do
128
134
  expect(PactBrokerUrls.decode_pact_metadata("foo==,")).to eq({})
@@ -13,7 +13,6 @@ module PactBroker::Api
13
13
  let(:json) { {some: 'json'}.to_json }
14
14
 
15
15
  describe "GET" do
16
-
17
16
  context "Accept: text/html" do
18
17
 
19
18
  let(:json_content) { 'json_content' }
@@ -130,20 +129,20 @@ module PactBroker::Api
130
129
  end
131
130
 
132
131
  describe "DELETE" do
133
-
134
- subject { delete "/pacts/provider/Provider/consumer/Consumer/version/1.2", json, {'CONTENT_TYPE' => "application/json"} ; last_response }
135
-
136
- let(:pact) { double('pact') }
137
- let(:pact_service) { PactBroker::Pacts::Service }
138
- let(:response) { subject; last_response }
139
-
140
132
  before do
141
133
  allow(pact_service).to receive(:find_pact).and_return(pact)
142
134
  allow(pact_service).to receive(:delete)
135
+ allow(pact_service).to receive(:find_latest_pact).and_return(latest_pact)
136
+ allow_any_instance_of(described_class).to receive(:latest_pact_url).and_return("http://latest-pact")
143
137
  end
144
138
 
145
- context "when the pact exists" do
139
+ let(:pact) { double('pact') }
140
+ let(:pact_service) { PactBroker::Pacts::Service }
141
+ let(:latest_pact) { double('latest pact') }
142
+
143
+ subject { delete "/pacts/provider/Provider/consumer/Consumer/version/1.2", json, {'CONTENT_TYPE' => "application/json"} ; last_response }
146
144
 
145
+ context "when the pact exists" do
147
146
  it "deletes the pact using the pact service" do
148
147
  expect(pact_service).to receive(:delete).with(instance_of(PactBroker::Pacts::PactParams))
149
148
  subject
@@ -152,6 +151,18 @@ module PactBroker::Api
152
151
  it "returns a 200" do
153
152
  expect(subject.status).to eq 200
154
153
  end
154
+
155
+ it "returns a link to the latest pact" do
156
+ expect(JSON.parse(subject.body)["_links"]["pb:latest-pact-version"]["href"]).to eq "http://latest-pact"
157
+ end
158
+
159
+ context "with there are no more pacts" do
160
+ let(:latest_pact) { nil }
161
+
162
+ it "does not return a link" do
163
+ expect(JSON.parse(subject.body)["_links"]).to_not have_key("pb:latest-pact-version")
164
+ end
165
+ end
155
166
  end
156
167
 
157
168
  context "when the pact does not exist" do
@@ -69,8 +69,12 @@ module PactBroker
69
69
  context "DELETE" do
70
70
  before do
71
71
  allow(pact_service).to receive(:delete_all_pact_publications_between)
72
+ allow(pact_service).to receive(:find_latest_pact).and_return(latest_pact)
73
+ allow_any_instance_of(described_class).to receive(:latest_pact_url).and_return("http://latest-pact")
72
74
  end
73
75
 
76
+ let(:latest_pact) { double('pact') }
77
+
74
78
  subject { delete(path) }
75
79
 
76
80
  it "deletes all the pacts with the given consumer/provider/tag" do
@@ -78,8 +82,12 @@ module PactBroker
78
82
  subject
79
83
  end
80
84
 
81
- it "returns a 204" do
82
- expect(subject.status).to eq 204
85
+ it "returns a 200" do
86
+ expect(subject.status).to eq 200
87
+ end
88
+
89
+ it "returns a link to the latest pact" do
90
+ expect(JSON.parse(subject.body)["_links"]["pb:latest-pact-version"]["href"]).to eq "http://latest-pact"
83
91
  end
84
92
  end
85
93
  end
@@ -17,7 +17,7 @@ module PactBroker
17
17
  let(:database_connector) { double('database_connector' )}
18
18
  let(:verification) { double(PactBroker::Domain::Verification) }
19
19
  let(:errors_empty) { true }
20
- let(:parsed_metadata) { { the: 'metadata' } }
20
+ let(:parsed_metadata) { { the: 'metadata', consumer_version_number: "2"} }
21
21
  let(:base_url) { "http://example.org" }
22
22
  let(:webhook_execution_configuration) { instance_double(PactBroker::Webhooks::ExecutionConfiguration) }
23
23
 
@@ -29,10 +29,14 @@ module PactBroker
29
29
  allow(webhook_execution_configuration).to receive(:with_webhook_context).and_return(webhook_execution_configuration)
30
30
  end
31
31
 
32
- subject { post url, request_body, rack_env; last_response }
32
+ subject { post(url, request_body, rack_env) }
33
33
 
34
34
  it "looks up the specified pact" do
35
- allow(Pacts::Service).to receive(:find_pact).with(instance_of(PactBroker::Pacts::PactParams))
35
+ expect(Pacts::Service).to receive(:find_pact) do | arg |
36
+ expect(arg).to be_a(PactBroker::Pacts::PactParams)
37
+ expect(arg[:consumer_version_number]).to eq "2"
38
+ end
39
+ subject
36
40
  end
37
41
 
38
42
  context "when the pact does not exist" do
@@ -6,7 +6,7 @@ IS_MYSQL = !!DB.mysql?
6
6
  module PactBroker
7
7
  module DB
8
8
  # Inner queries don't work on MySQL. Seriously, MySQL???
9
- describe CleanIncremental, pending: IS_MYSQL do
9
+ describe CleanIncremental, skip: IS_MYSQL do
10
10
 
11
11
  def pact_publication_count_for(consumer_name, version_number)
12
12
  PactBroker::Pacts::PactPublication.where(consumer_version: PactBroker::Domain::Version.where_pacticipant_name(consumer_name).where(number: version_number)).count
@@ -74,12 +74,20 @@ module PactBroker
74
74
  context "when dry_run: true" do
75
75
  before do
76
76
  td.create_pact_with_hierarchy("Meep", "2", "Moop")
77
+ .create_consumer_version_tag("foop")
78
+ .create_consumer_version("3")
79
+ .create_consumer_version_tag("blah")
77
80
  end
81
+
78
82
  let(:dry_run) { true }
79
83
 
80
84
  it "doesn't delete anything" do
81
85
  expect { subject }.to_not change { PactBroker::Domain::Version.count }
82
86
  end
87
+
88
+ it "returns info on what will be deleted" do
89
+ Approvals.verify(subject, :name => 'clean_incremental_dry_run', format: :json)
90
+ end
83
91
  end
84
92
  end
85
93
 
@@ -2,11 +2,14 @@ require 'pact_broker/db/delete_overwritten_data'
2
2
 
3
3
  module PactBroker
4
4
  module DB
5
- describe DeleteOverwrittenData, pending: !!DB.mysql? do
5
+ describe DeleteOverwrittenData, skip: !!DB.mysql? do
6
6
  describe ".call" do
7
7
  let(:db) { PactBroker::DB.connection }
8
- subject { DeleteOverwrittenData.call(db, before: before_date) }
9
- let(:before_date) { nil }
8
+ let(:max_age) { nil }
9
+ let(:dry_run) { nil }
10
+ let(:limit) { nil }
11
+
12
+ subject { DeleteOverwrittenData.call(db, max_age: max_age, limit: limit, dry_run: dry_run) }
10
13
 
11
14
  context "when a pact is overwritten" do
12
15
  let!(:pact_to_delete) { td.create_everything_for_an_integration.and_return(:pact) }
@@ -25,6 +28,14 @@ module PactBroker
25
28
  expect(subject[:deleted][:pact_publications]).to eq 1
26
29
  expect(subject[:kept][:pact_publications]).to eq 1
27
30
  end
31
+
32
+ context "when dry_run is true" do
33
+ let(:dry_run) { true }
34
+
35
+ it "does not delete anything" do
36
+ expect { subject }.to_not change{ db[:pact_publications].count }
37
+ end
38
+ end
28
39
  end
29
40
 
30
41
  context "when a pact has multiple verifications" do
@@ -53,10 +64,12 @@ module PactBroker
53
64
  context "when a pact version is orphaned" do
54
65
  before do
55
66
  td.create_pact_with_verification.comment("this one will still have the verification, so can't be deleted")
56
- .revise_pact.comment("this one can be deleted")
57
- .revise_pact.comment("this one will still have a pact publication, so can't be deleted")
67
+ .create_pact_version_without_publication.comment("will be deleted")
68
+ .create_pact_version_without_publication.comment("will be kept because of limit")
58
69
  end
59
70
 
71
+ let(:limit) { 1 }
72
+
60
73
  it "is deleted" do
61
74
  expect { subject }.to change{ db[:pact_versions].count }.by(-1)
62
75
  end
@@ -65,36 +78,83 @@ module PactBroker
65
78
  expect(subject[:deleted][:pact_versions]).to eq 1
66
79
  expect(subject[:kept][:pact_versions]).to eq 2
67
80
  end
81
+
82
+ context "when dry_run is true" do
83
+ let(:dry_run) { true }
84
+
85
+ it "does not delete anything" do
86
+ expect { subject }.to_not change{ db[:pact_versions].count }
87
+ end
88
+ end
68
89
  end
69
90
 
70
- context "when the pact publication is created after the before date" do
91
+ context "when the pact publication is younger than the max age" do
71
92
  before do
72
- td.set_now(before_date + 1)
93
+ td.set_now(DateTime.now - 3)
73
94
  .create_pact_with_hierarchy
74
95
  .revise_pact
75
96
  end
76
97
 
77
- let(:before_date) { DateTime.new(2010, 2, 5) }
98
+ let(:max_age) { 4 }
78
99
 
79
100
  it "doesn't delete the data" do
80
101
  expect { subject }.to_not change { db[:pact_publications].count }
81
102
  end
82
103
  end
83
104
 
84
- context "when the verification is created after the before date" do
105
+ context "when the verification is younger than the max age" do
85
106
  before do
86
- td.set_now(before_date + 1)
107
+ td.set_now(DateTime.now - 3)
87
108
  .create_pact_with_hierarchy
88
109
  .create_verification(provider_version: "1", success: false)
89
110
  .create_verification(provider_version: "1", success: true, number: 2)
90
111
  end
91
112
 
92
- let(:before_date) { DateTime.new(2010, 2, 5) }
113
+ let(:max_age) { 4 }
93
114
 
94
115
  it "doesn't delete the data" do
95
116
  expect { subject }.to_not change { db[:verifications].count }
96
117
  end
97
118
  end
119
+
120
+ context "when there are triggered webhooks and executions" do
121
+ before do
122
+ td.create_pact_with_hierarchy("Foo", "1", "Bar")
123
+ .create_webhook
124
+ .create_triggered_webhook
125
+ .create_webhook_execution
126
+ .create_triggered_webhook.comment("latest")
127
+ .create_webhook_execution
128
+ .create_pact_with_hierarchy("Foo1", "1", "Bar1")
129
+ .create_webhook
130
+ .create_triggered_webhook
131
+ .create_webhook_execution
132
+ .create_triggered_webhook.comment("latest")
133
+ .create_webhook_execution
134
+ end
135
+
136
+ let(:limit) { 3 }
137
+
138
+ it "deletes all but the latest triggered webhooks, considering the limit" do
139
+ expect { subject }.to change { PactBroker::Webhooks::TriggeredWebhook.count }.by(-2)
140
+ end
141
+
142
+ context "when dry_run is true" do
143
+ let(:dry_run) { true }
144
+
145
+ it "does not delete anything" do
146
+ expect { subject }.to_not change{ PactBroker::Webhooks::TriggeredWebhook.count }
147
+ end
148
+ end
149
+
150
+ context "when all the records are younger than the max age" do
151
+ let(:max_age) { 1 }
152
+
153
+ it "doesn't delete anything" do
154
+ expect { subject }.to_not change { PactBroker::Webhooks::TriggeredWebhook.count }
155
+ end
156
+ end
157
+ end
98
158
  end
99
159
  end
100
160
  end