Skip to content

Commit ec18943

Browse files
committed
feat(verification webhooks): alter logic to select only the relevant webhooks when the pact has changed
1 parent 9fe8d47 commit ec18943

File tree

9 files changed

+58
-19
lines changed

9 files changed

+58
-19
lines changed

db/migrations/20171118_create_webhook_events.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from(:webhooks).each do | webhook |
66
from(:webhook_events).insert(
77
webhook_id: webhook[:id],
8-
name: 'contract_changed',
8+
name: 'contract_content_changed',
99
created_at: DateTime.now,
1010
updated_at: DateTime.now
1111
)

lib/pact_broker/webhooks/repository.rb

+9
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,15 @@ def find_by_consumer_and_provider consumer, provider
6363
Webhook.where(consumer_id: consumer.id, provider_id: provider.id).collect(&:to_domain)
6464
end
6565

66+
def find_by_consumer_and_provider_and_event_name consumer, provider, event_name
67+
Webhook
68+
.select_all_qualified
69+
.where(consumer_id: consumer.id, provider_id: provider.id)
70+
.join(:webhook_events, { webhook_id: :id })
71+
.where(Sequel[:webhook_events][:name] => event_name)
72+
.collect(&:to_domain)
73+
end
74+
6675
def find_by_consumer_and_provider_existing_at consumer, provider, date_time
6776
Webhook.where(consumer_id: consumer.id, provider_id: provider.id)
6877
.where(Sequel.lit("created_at < ?", date_time))

lib/pact_broker/webhooks/service.rb

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
require 'pact_broker/repositories'
22
require 'pact_broker/logging'
3-
require 'pact_broker/webhooks/job'
43
require 'base64'
54
require 'securerandom'
5+
require 'pact_broker/webhooks/job'
66
require 'pact_broker/webhooks/triggered_webhook'
77
require 'pact_broker/webhooks/status'
8+
require 'pact_broker/webhooks/webhook_event'
89

910
module PactBroker
1011

@@ -83,8 +84,8 @@ def self.find_by_consumer_and_provider consumer, provider
8384
webhook_repository.find_by_consumer_and_provider consumer, provider
8485
end
8586

86-
def self.execute_webhooks pact
87-
webhooks = webhook_repository.find_by_consumer_and_provider pact.consumer, pact.provider
87+
def self.execute_webhooks pact, event_name = PactBroker::Webhooks::WebhookEvent::DEFAULT_EVENT_NAME
88+
webhooks = webhook_repository.find_by_consumer_and_provider_and_event_name pact.consumer, pact.provider, event_name
8889

8990
if webhooks.any?
9091
run_later(webhooks, pact)

lib/pact_broker/webhooks/webhook_event.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ module PactBroker
55
module Webhooks
66
class WebhookEvent < Sequel::Model
77

8-
DEFAULT_EVENT_NAME = 'contract_changed'
8+
CONTRACT_CONTENT_CHANGED = 'contract_content_changed'
9+
CONTRACT_VERIFIABLE_CONTENT_CHANGED = 'contract_verifiable_content_changed'
10+
VERIFICATION_PUBLISHED = 'verification_published'
11+
VERIFICATION_STATUS_CHANGED = 'verification_status_changed'
12+
DEFAULT_EVENT_NAME = CONTRACT_CONTENT_CHANGED
913

1014
dataset_module do
1115
include PactBroker::Repositories::Helpers

spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ module Decorators
124124

125125
it "defaults to a single contract_changed event for backwards compatibility" do
126126
expect(parsed_object.events.size).to eq 1
127-
expect(parsed_object.events.first.name).to eq 'contract_changed'
127+
expect(parsed_object.events.first.name).to eq PactBroker::Webhooks::WebhookEvent::DEFAULT_EVENT_NAME
128128
end
129129
end
130130
end

spec/lib/pact_broker/api/resources/pact_webhooks_spec.rb

+8-9
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,14 @@ module Resources
1313
let(:headers) { {'CONTENT_TYPE' => 'application/json'} }
1414
let(:webhook) { double('webhook')}
1515
let(:saved_webhook) { double('saved_webhook')}
16-
let(:provider) { instance_double(PactBroker::Domain::Pacticipant)}
17-
let(:consumer) { instance_double(PactBroker::Domain::Pacticipant)}
16+
let(:provider) { instance_double(PactBroker::Domain::Pacticipant) }
17+
let(:consumer) { instance_double(PactBroker::Domain::Pacticipant) }
18+
let(:webhook_decorator) { instance_double(Decorators::WebhookDecorator, from_json: webhook) }
1819

1920
before do
2021
allow(PactBroker::Pacticipants::Service).to receive(:find_pacticipant_by_name).with("Some Provider").and_return(provider)
2122
allow(PactBroker::Pacticipants::Service).to receive(:find_pacticipant_by_name).with("Some Consumer").and_return(consumer)
23+
allow(Decorators::WebhookDecorator).to receive(:new).and_return(webhook_decorator)
2224
end
2325

2426
describe "GET" do
@@ -83,6 +85,7 @@ module Resources
8385

8486
context "when the provider is not found" do
8587
let(:provider) { nil }
88+
8689
it "returns a 404 status" do
8790
subject
8891
expect(last_response.status).to eq 404
@@ -142,10 +145,10 @@ module Resources
142145
context "with valid attributes" do
143146

144147
let(:webhook_response_json) { {some: 'webhook'}.to_json }
145-
let(:decorator) { instance_double(Decorators::WebhookDecorator) }
146148

147149
before do
148150
allow_any_instance_of(Decorators::WebhookDecorator).to receive(:to_json).and_return(webhook_response_json)
151+
allow(webhook_decorator).to receive(:to_json).and_return(webhook_response_json)
149152
end
150153

151154
it "saves the webhook" do
@@ -169,9 +172,8 @@ module Resources
169172
end
170173

171174
it "generates the JSON response body" do
172-
allow(Decorators::WebhookDecorator).to receive(:new).and_call_original #Deserialise
173-
expect(Decorators::WebhookDecorator).to receive(:new).with(saved_webhook).and_return(decorator) #Serialize
174-
expect(decorator).to receive(:to_json).with(user_options: { base_url: 'http://example.org' })
175+
expect(Decorators::WebhookDecorator).to receive(:new).with(saved_webhook).and_return(webhook_decorator)
176+
expect(webhook_decorator).to receive(:to_json).with(user_options: { base_url: 'http://example.org' })
175177
subject
176178
end
177179

@@ -180,10 +182,7 @@ module Resources
180182
expect(last_response.body).to eq webhook_response_json
181183
end
182184
end
183-
184185
end
185-
186186
end
187187
end
188-
189188
end

spec/lib/pact_broker/webhooks/repository_spec.rb

+23
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,29 @@ module Webhooks
303303
end
304304
end
305305

306+
describe "find_by_consumer_and_provider_and_event_name" do
307+
let(:test_data_builder) { TestDataBuilder.new }
308+
subject { Repository.new.find_by_consumer_and_provider_and_event_name test_data_builder.consumer, test_data_builder.provider, 'something_happened' }
309+
310+
context "when a webhook exists with a matching consumer and provider and event name" do
311+
312+
before do
313+
test_data_builder
314+
.create_consumer("Consumer")
315+
.create_provider("Another Provider")
316+
.create_webhook
317+
.create_provider("Provider")
318+
.create_webhook(uuid: '1', events: [{ name: 'something_happened' }])
319+
.create_webhook(uuid: '2', events: [{ name: 'something_happened' }])
320+
.create_webhook(uuid: '3', events: [{ name: 'something_else_happened' }])
321+
end
322+
323+
it "returns an array of webhooks" do
324+
expect(subject.collect(&:uuid).sort).to eq ['1', '2']
325+
end
326+
end
327+
end
328+
306329
describe "create_triggered_webhook" do
307330
before do
308331
td.create_consumer

spec/lib/pact_broker/webhooks/service_spec.rb

+5-3
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ module Webhooks
3737
let(:triggered_webhook) { instance_double(PactBroker::Webhooks::TriggeredWebhook) }
3838

3939
before do
40-
allow_any_instance_of(PactBroker::Webhooks::Repository).to receive(:find_by_consumer_and_provider).and_return(webhooks)
40+
allow_any_instance_of(PactBroker::Webhooks::Repository).to receive(:find_by_consumer_and_provider_and_event_name).and_return(webhooks)
4141
allow_any_instance_of(PactBroker::Webhooks::Repository).to receive(:create_triggered_webhook).and_return(triggered_webhook)
4242
allow(Job).to receive(:perform_async)
4343
end
4444

4545
subject { Service.execute_webhooks pact }
4646

4747
it "finds the webhooks" do
48-
expect_any_instance_of(PactBroker::Webhooks::Repository).to receive(:find_by_consumer_and_provider).with(consumer, provider)
48+
expect_any_instance_of(PactBroker::Webhooks::Repository).to receive(:find_by_consumer_and_provider_and_event_name).with(consumer, provider, PactBroker::Webhooks::WebhookEvent::DEFAULT_EVENT_NAME)
4949
subject
5050
end
5151

@@ -126,12 +126,14 @@ module Webhooks
126126
to_return(:status => 200)
127127
end
128128

129+
let(:events) { [{ name: PactBroker::Webhooks::WebhookEvent::DEFAULT_EVENT_NAME }] }
130+
129131
let(:pact) do
130132
td.create_consumer
131133
.create_provider
132134
.create_consumer_version
133135
.create_pact
134-
.create_webhook(method: 'GET', url: 'http://example.org')
136+
.create_webhook(method: 'GET', url: 'http://example.org', events: events)
135137
.and_return(:pact)
136138
end
137139

spec/support/test_data_builder.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,8 @@ def revise_pact json_content = nil
200200

201201
def create_webhook params = {}
202202
uuid = params[:uuid] || PactBroker::Webhooks::Service.next_uuid
203-
events = (params[:events] || [{ name: 'pact_changed' }]).collect{ |e| PactBroker::Webhooks::WebhookEvent.new(e) }
203+
event_params = params[:events] || [{ name: PactBroker::Webhooks::WebhookEvent::DEFAULT_EVENT_NAME }]
204+
events = event_params.collect{ |e| PactBroker::Webhooks::WebhookEvent.new(e) }
204205
default_params = { method: 'POST', url: 'http://example.org', headers: {'Content-Type' => 'application/json'}}
205206
request = PactBroker::Domain::WebhookRequest.new(default_params.merge(params))
206207
@webhook = PactBroker::Webhooks::Repository.new.create uuid, PactBroker::Domain::Webhook.new(request: request, events: events), @consumer, @provider

0 commit comments

Comments
 (0)