pact_broker 2.71.0 → 2.72.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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