Skip to content

Commit 30522c0

Browse files
committed
feat: log the reason why a webhook has been triggered
1 parent 3b6f33c commit 30522c0

File tree

6 files changed

+229
-115
lines changed

6 files changed

+229
-115
lines changed

lib/pact_broker/pacts/repository.rb

+4-2
Original file line numberDiff line numberDiff line change
@@ -258,9 +258,11 @@ def find_previous_distinct_pact pact
258258

259259
def find_previous_pacts pact
260260
if pact.consumer_version_tag_names.any?
261-
pact.consumer_version_tag_names.map { |tag| find_previous_pact(pact, tag) }
261+
pact.consumer_version_tag_names.each_with_object({}) do |tag, tags_to_pacts|
262+
tags_to_pacts[tag] = find_previous_pact(pact, tag)
263+
end
262264
else
263-
[find_previous_pact(pact, :untagged)]
265+
{ :untagged => find_previous_pact(pact, :untagged) }
264266
end
265267
end
266268

lib/pact_broker/pacts/service.rb

+4-23
Original file line numberDiff line numberDiff line change
@@ -110,13 +110,9 @@ def find_distinct_pacts_between consumer, options
110110
distinct
111111
end
112112

113-
# TODO also take into account overridden revisions
114-
def pact_is_new_or_pact_has_changed_since_previous_version? pact
115-
pact_repository.find_previous_pacts(pact).any? { |previous_pact| previous_pact.nil? || pact.json_content != previous_pact.json_content}
116-
end
117-
118113
private
119114

115+
# Overwriting an existing pact with the same consumer/provider/consumer version number
120116
def update_pact params, existing_pact
121117
logger.info "Updating existing pact publication with params #{params.reject{ |k, v| k == :json_content}}"
122118
logger.debug "Content #{params[:json_content]}"
@@ -125,17 +121,12 @@ def update_pact params, existing_pact
125121
update_params = { pact_version_sha: pact_version_sha, json_content: json_content }
126122
updated_pact = pact_repository.update(existing_pact.id, update_params)
127123

128-
webhook_service.trigger_webhooks updated_pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_PUBLISHED
129-
# TODO this should use the sha!
130-
if existing_pact.json_content != updated_pact.json_content
131-
webhook_service.trigger_webhooks updated_pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED
132-
else
133-
logger.debug "Pact has not changed since previous version, not triggering webhooks for changed content"
134-
end
124+
webhook_trigger_service.trigger_webhooks_for_updated_pact(existing_pact, updated_pact)
135125

136126
updated_pact
137127
end
138128

129+
# When no publication for the given consumer/provider/consumer version number exists
139130
def create_pact params, version, provider
140131
logger.info "Creating new pact publication with params #{params.reject{ |k, v| k == :json_content}}"
141132
logger.debug "Content #{params[:json_content]}"
@@ -148,7 +139,7 @@ def create_pact params, version, provider
148139
pact_version_sha: pact_version_sha,
149140
json_content: json_content
150141
)
151-
trigger_webhooks pact
142+
webhook_trigger_service.trigger_webhooks_for_new_pact pact
152143
pact
153144
end
154145

@@ -159,16 +150,6 @@ def generate_sha(json_content)
159150
def add_interaction_ids(json_content)
160151
Content.from_json(json_content).with_ids.to_json
161152
end
162-
163-
def trigger_webhooks pact
164-
# TODO add tests for this
165-
webhook_service.trigger_webhooks pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_PUBLISHED
166-
if pact_is_new_or_pact_has_changed_since_previous_version?(pact)
167-
webhook_service.trigger_webhooks pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED
168-
else
169-
logger.debug "Pact has not changed since previous version, not triggering webhooks for changed content"
170-
end
171-
end
172153
end
173154
end
174155
end

lib/pact_broker/services.rb

+5
Original file line numberDiff line numberDiff line change
@@ -66,5 +66,10 @@ def integration_service
6666
require 'pact_broker/integrations/service'
6767
Integrations::Service
6868
end
69+
70+
def webhook_trigger_service
71+
require 'pact_broker/webhooks/trigger_service'
72+
Webhooks::TriggerService
73+
end
6974
end
7075
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
require 'pact_broker/services'
2+
3+
module PactBroker
4+
module Webhooks
5+
module TriggerService
6+
7+
extend self
8+
extend PactBroker::Repositories
9+
extend PactBroker::Services
10+
include PactBroker::Logging
11+
12+
def trigger_webhooks_for_new_pact pact
13+
webhook_service.trigger_webhooks pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_PUBLISHED
14+
if pact_is_new_or_newly_tagged_or_pact_has_changed_since_previous_version?(pact)
15+
webhook_service.trigger_webhooks pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED
16+
else
17+
logger.debug "Pact content has not changed since previous version, not triggering webhooks for changed content"
18+
end
19+
end
20+
21+
def trigger_webhooks_for_updated_pact(existing_pact, updated_pact)
22+
webhook_service.trigger_webhooks updated_pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_PUBLISHED
23+
# TODO this should use the sha!
24+
if existing_pact.pact_version_sha != updated_pact.pact_version_sha
25+
logger.debug "Existing pact for version #{existing_pact.consumer_version_number} has been updated with new content, triggering webhooks for changed content"
26+
webhook_service.trigger_webhooks updated_pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED
27+
else
28+
logger.debug "Pact content has not changed since previous revision, not triggering webhooks for changed content"
29+
end
30+
end
31+
32+
private
33+
34+
def pact_is_new_or_newly_tagged_or_pact_has_changed_since_previous_version? pact
35+
changed_pacts = pact_repository
36+
.find_previous_pacts(pact)
37+
.reject { |_, previous_pact| !sha_changed_or_no_previous_version?(previous_pact, pact) }
38+
print_debug_messages(changed_pacts)
39+
changed_pacts.any?
40+
end
41+
42+
def sha_changed_or_no_previous_version?(previous_pact, new_pact)
43+
previous_pact.nil? || new_pact.pact_version_sha != previous_pact.pact_version_sha
44+
end
45+
46+
def print_debug_messages(changed_pacts)
47+
if changed_pacts.any?
48+
messages = changed_pacts.collect do |tag, previous_pact|
49+
if tag == :untagged
50+
if previous_pact
51+
"pact content has changed since previous untagged version"
52+
else
53+
"first time untagged pact published"
54+
end
55+
else
56+
if previous_pact
57+
"pact content has changed since the last consumer version tagged with #{tag}"
58+
else
59+
"first time pact published with consumer version tagged #{tag}"
60+
end
61+
end
62+
end
63+
logger.debug("Webhook triggered for the following reasons: #{messages.join(',')}" )
64+
end
65+
end
66+
end
67+
end
68+
end

spec/lib/pact_broker/pacts/service_spec.rb

+8-90
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ module Pacts
1414

1515
before do
1616
allow(described_class).to receive(:webhook_service).and_return(webhook_service)
17+
allow(described_class).to receive(:webhook_trigger_service).and_return(webhook_trigger_service)
1718
allow(pacticipant_repository).to receive(:find_by_name_or_create).with(params[:consumer_name]).and_return(consumer)
1819
allow(pacticipant_repository).to receive(:find_by_name_or_create).with(params[:provider_name]).and_return(provider)
1920
allow(version_repository).to receive(:find_by_pacticipant_id_and_number_or_create).and_return(version)
@@ -22,9 +23,12 @@ module Pacts
2223
allow(pact_repository).to receive(:update).and_return(new_pact)
2324
allow(pact_repository).to receive(:find_previous_pacts).and_return(previous_pacts)
2425
allow(webhook_service).to receive(:trigger_webhooks)
26+
allow(webhook_trigger_service).to receive(:trigger_webhooks_for_new_pact)
27+
allow(webhook_trigger_service).to receive(:trigger_webhooks_for_updated_pact)
2528
end
2629

2730
let(:webhook_service) { class_double("PactBroker::Webhooks::Service").as_stubbed_const }
31+
let(:webhook_trigger_service) { class_double("PactBroker::Webhooks::TriggerService").as_stubbed_const }
2832
let(:consumer) { double('consumer', id: 1) }
2933
let(:provider) { double('provider', id: 2) }
3034
let(:version) { double('version', id: 3, pacticipant_id: 1) }
@@ -52,7 +56,6 @@ module Pacts
5256

5357
subject { Service.create_or_update_pact(params) }
5458

55-
5659
context "when no pact exists with the same params" do
5760
it "creates the sha before adding the interaction ids" do
5861
expect(PactBroker::Pacts::GenerateSha).to receive(:call).ordered
@@ -65,8 +68,8 @@ module Pacts
6568
subject
6669
end
6770

68-
it "triggers webhooks for contract publications" do
69-
expect(webhook_service).to receive(:trigger_webhooks).with(new_pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_PUBLISHED)
71+
it "triggers webhooks" do
72+
expect(webhook_trigger_service).to receive(:trigger_webhooks_for_new_pact).with(new_pact)
7073
subject
7174
end
7275
end
@@ -85,8 +88,8 @@ module Pacts
8588
subject
8689
end
8790

88-
it "triggers webhooks for contract publications" do
89-
expect(webhook_service).to receive(:trigger_webhooks).with(new_pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_PUBLISHED)
91+
it "triggers webhooks" do
92+
expect(webhook_trigger_service).to receive(:trigger_webhooks_for_updated_pact).with(existing_pact, new_pact)
9093
subject
9194
end
9295
end
@@ -111,91 +114,6 @@ module Pacts
111114
end
112115
end
113116

114-
describe "#pact_is_new_or_pact_has_changed_since_previous_version?" do
115-
let(:json_content) { { 'some' => 'json'}.to_json }
116-
let(:pact) { instance_double(PactBroker::Domain::Pact, json_content: json_content)}
117-
118-
subject { Service.pact_is_new_or_pact_has_changed_since_previous_version? pact }
119-
120-
context "when consumer version is untagged" do
121-
before do
122-
allow(pact).to receive(:consumer_version_tag_names).and_return([]);
123-
allow_any_instance_of(Pacts::Repository).to receive(:find_previous_pact).with(pact, :untagged).and_return(previous_pact)
124-
end
125-
126-
context "when a previous pact is found" do
127-
let(:previous_pact) { instance_double(PactBroker::Domain::Pact, json_content: previous_json_content)}
128-
let(:previous_json_content) { {'some' => 'json'}.to_json }
129-
130-
context "when the json_content is the same" do
131-
it "returns false" do
132-
expect(subject).to be_falsey
133-
end
134-
end
135-
136-
context "when the json_content is not the same" do
137-
let(:previous_json_content) { {'some-other' => 'json'}.to_json }
138-
it "returns truthy" do
139-
expect(subject).to be_truthy
140-
end
141-
end
142-
end
143-
144-
context "when a previous pact is not found" do
145-
let(:previous_pact) { nil }
146-
147-
it "returns true" do
148-
expect(subject).to be_truthy
149-
end
150-
end
151-
end
152-
153-
context "when consumer version has two tags" do
154-
before do
155-
allow(pact).to receive(:consumer_version_tag_names).and_return(['tag_1', 'tag_2']);
156-
allow_any_instance_of(Pacts::Repository).to receive(:find_previous_pact).with(pact, 'tag_1').and_return(previous_pact_tag_1)
157-
allow_any_instance_of(Pacts::Repository).to receive(:find_previous_pact).with(pact, 'tag_2').and_return(previous_pact_tag_2)
158-
end
159-
160-
context "when a previous pact is found for both tags" do
161-
let(:previous_pact_tag_1) { instance_double(PactBroker::Domain::Pact, json_content: previous_json_content_tag_1)}
162-
let(:previous_json_content_tag_1) { {'some' => 'json'}.to_json }
163-
164-
let(:previous_pact_tag_2) { instance_double(PactBroker::Domain::Pact, json_content: previous_json_content_tag_2)}
165-
let(:previous_json_content_tag_2) { {'some' => 'json'}.to_json }
166-
167-
context "when the json_content of both previous pacts and new pact is the same" do
168-
it "returns false" do
169-
expect(subject).to be_falsey
170-
end
171-
end
172-
173-
context "when the json_content of first previous pact is not the same" do
174-
let(:previous_json_content_tag_1) { {'some-other' => 'json'}.to_json }
175-
it "returns truthy" do
176-
expect(subject).to be_truthy
177-
end
178-
end
179-
180-
context "when the json_content of second previous pact not the same" do
181-
let(:previous_json_content_tag_2) { {'some-other' => 'json'}.to_json }
182-
it "returns truthy" do
183-
expect(subject).to be_truthy
184-
end
185-
end
186-
end
187-
188-
context "when no previous pacts are found" do
189-
let(:previous_pact_tag_1) { nil }
190-
let(:previous_pact_tag_2) { nil }
191-
192-
it "returns true" do
193-
expect(subject).to be_truthy
194-
end
195-
end
196-
end
197-
end
198-
199117
describe "delete" do
200118
before do
201119
td.create_pact_with_hierarchy

0 commit comments

Comments
 (0)