pact_broker 2.22.0 → 2.23.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/README.md +1 -0
- data/db/migrations/20180611_make_webhook_pacticipant_ids_optional.rb +11 -0
- data/example/config.ru +2 -0
- data/lib/pact_broker/api.rb +9 -3
- data/lib/pact_broker/api/contracts/webhook_contract.rb +36 -0
- data/lib/pact_broker/api/decorators/pact_decorator.rb +22 -1
- data/lib/pact_broker/api/decorators/pact_webhooks_status_decorator.rb +1 -26
- data/lib/pact_broker/api/decorators/triggered_webhook_decorator.rb +33 -0
- data/lib/pact_broker/api/decorators/triggered_webhooks_decorator.rb +19 -0
- data/lib/pact_broker/api/decorators/verification_decorator.rb +6 -0
- data/lib/pact_broker/api/decorators/webhook_decorator.rb +32 -18
- data/lib/pact_broker/api/decorators/webhook_execution_result_decorator.rb +27 -0
- data/lib/pact_broker/api/decorators/{webhook_request_decorator.rb → webhook_request_template_decorator.rb} +1 -1
- data/lib/pact_broker/api/pact_broker_urls.rb +21 -1
- data/lib/pact_broker/api/resources/all_webhooks.rb +82 -0
- data/lib/pact_broker/api/resources/base_resource.rb +18 -0
- data/lib/pact_broker/api/resources/error_handler.rb +5 -1
- data/lib/pact_broker/api/resources/pact_triggered_webhooks.rb +41 -0
- data/lib/pact_broker/api/resources/pact_webhooks.rb +2 -15
- data/lib/pact_broker/api/resources/pact_webhooks_status.rb +1 -1
- data/lib/pact_broker/api/resources/verification_triggered_webhooks.rb +45 -0
- data/lib/pact_broker/api/resources/webhook_execution.rb +1 -5
- data/lib/pact_broker/api/resources/webhooks.rb +69 -6
- data/lib/pact_broker/configuration.rb +5 -2
- data/lib/pact_broker/doc/controllers/app.rb +1 -2
- data/lib/pact_broker/doc/views/pact-webhooks.markdown +3 -0
- data/lib/pact_broker/doc/views/webhooks.markdown +53 -33
- data/lib/pact_broker/domain/pact.rb +4 -0
- data/lib/pact_broker/domain/webhook.rb +19 -3
- data/lib/pact_broker/domain/webhook_execution_result.rb +6 -1
- data/lib/pact_broker/domain/webhook_request.rb +87 -65
- data/lib/pact_broker/locale/en.yml +1 -0
- data/lib/pact_broker/matrix/repository.rb +3 -1
- data/lib/pact_broker/pacts/placeholder_pact.rb +17 -0
- data/lib/pact_broker/pacts/repository.rb +14 -0
- data/lib/pact_broker/pacts/service.rb +6 -2
- data/lib/pact_broker/ui/view_models/index_item.rb +1 -1
- data/lib/pact_broker/verifications/placeholder_verification.rb +23 -0
- data/lib/pact_broker/verifications/repository.rb +9 -0
- data/lib/pact_broker/verifications/service.rb +5 -1
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/webhooks/repository.rb +54 -4
- data/lib/pact_broker/webhooks/service.rb +37 -2
- data/lib/pact_broker/webhooks/webhook.rb +4 -3
- data/lib/pact_broker/webhooks/webhook_event.rb +8 -0
- data/lib/pact_broker/webhooks/webhook_request_template.rb +72 -0
- data/pact_broker.gemspec +1 -1
- data/script/seed.rb +32 -51
- data/spec/features/create_webhook_spec.rb +85 -36
- data/spec/features/execute_webhook_spec.rb +9 -18
- data/spec/features/get_triggered_webhooks_for_pact_spec.rb +20 -0
- data/spec/features/get_triggered_webhooks_for_verification_spec.rb +21 -0
- data/spec/fixtures/webhook_valid_with_pacticipants.json +23 -0
- data/spec/integration/webhooks/certificate_spec.rb +2 -2
- data/spec/lib/pact_broker/api/contracts/webhook_contract_spec.rb +98 -2
- data/spec/lib/pact_broker/api/decorators/triggered_webhook_decorator_spec.rb +64 -0
- data/spec/lib/pact_broker/api/decorators/triggered_webhooks_decorator_spec.rb +28 -0
- data/spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb +8 -0
- data/spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb +37 -1
- data/spec/lib/pact_broker/api/decorators/webhook_execution_result_decorator_spec.rb +34 -1
- data/spec/lib/pact_broker/api/decorators/{webhook_request_decorator_spec.rb → webhook_request_template_decorator_spec.rb} +7 -9
- data/spec/lib/pact_broker/api/pact_broker_urls_spec.rb +22 -0
- data/spec/lib/pact_broker/api/resources/{pact_webhooks_spec.rb → all_webhooks_spec.rb} +46 -80
- data/spec/lib/pact_broker/api/resources/error_handler_spec.rb +34 -0
- data/spec/lib/pact_broker/api/resources/pact_triggered_webhooks_spec.rb +54 -0
- data/spec/lib/pact_broker/api/resources/pacticipant_spec.rb +1 -6
- data/spec/lib/pact_broker/api/resources/tag_spec.rb +1 -6
- data/spec/lib/pact_broker/api/resources/verification_triggered_webhooks_spec.rb +68 -0
- data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +2 -8
- data/spec/lib/pact_broker/api/resources/webhooks_spec.rb +216 -21
- data/spec/lib/pact_broker/configuration_spec.rb +30 -0
- data/spec/lib/pact_broker/domain/webhook_request_spec.rb +20 -64
- data/spec/lib/pact_broker/domain/webhook_spec.rb +40 -11
- data/spec/lib/pact_broker/matrix/repository_spec.rb +33 -0
- data/spec/lib/pact_broker/pacts/pact_version_spec.rb +1 -0
- data/spec/lib/pact_broker/pacts/repository_spec.rb +39 -1
- data/spec/lib/pact_broker/ui/view_models/index_item_spec.rb +1 -1
- data/spec/lib/pact_broker/verifications/repository_spec.rb +37 -0
- data/spec/lib/pact_broker/verifications/service_spec.rb +2 -2
- data/spec/lib/pact_broker/webhooks/render_spec.rb +15 -0
- data/spec/lib/pact_broker/webhooks/repository_spec.rb +149 -30
- data/spec/lib/pact_broker/webhooks/service_spec.rb +84 -7
- data/spec/lib/pact_broker/webhooks/webhook_request_template_spec.rb +81 -0
- data/spec/service_consumers/pact_helper.rb +2 -0
- data/spec/service_consumers/provider_states_for_pact_broker_client.rb +8 -0
- data/spec/service_consumers/provider_states_for_pact_ruby.rb +132 -0
- data/spec/support/test_data_builder.rb +30 -7
- metadata +37 -9
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'pact_broker/webhooks/render'
|
2
|
+
require 'pact_broker/pacts/placeholder_pact'
|
3
|
+
require 'pact_broker/verifications/placeholder_verification'
|
2
4
|
require 'cgi'
|
3
5
|
|
4
6
|
module PactBroker
|
@@ -115,6 +117,19 @@ module PactBroker
|
|
115
117
|
it { is_expected.to eq "http%3A%2F%2Ffoo" }
|
116
118
|
end
|
117
119
|
end
|
120
|
+
|
121
|
+
describe "#call with placeholder domain objects" do
|
122
|
+
let(:placeholder_pact) { PactBroker::Pacts::PlaceholderPact.new }
|
123
|
+
let(:placeholder_verification) { PactBroker::Verifications::PlaceholderVerification.new }
|
124
|
+
|
125
|
+
it "does not blow up with a placeholder pact" do
|
126
|
+
Render.call("", placeholder_pact)
|
127
|
+
end
|
128
|
+
|
129
|
+
it "does not blow up with a placeholder verification" do
|
130
|
+
Render.call("", placeholder_pact, placeholder_verification)
|
131
|
+
end
|
132
|
+
end
|
118
133
|
end
|
119
134
|
end
|
120
135
|
end
|
@@ -10,7 +10,7 @@ module PactBroker
|
|
10
10
|
let(:body) { {'some' => 'json' } }
|
11
11
|
let(:headers) { {'Content-Type' => 'application/json', 'Accept' => 'application/json'} }
|
12
12
|
let(:request) do
|
13
|
-
|
13
|
+
Webhooks::WebhookRequestTemplate.new(
|
14
14
|
method: 'post',
|
15
15
|
url: url,
|
16
16
|
headers: headers,
|
@@ -23,9 +23,8 @@ module PactBroker
|
|
23
23
|
end
|
24
24
|
let(:events) { [event]}
|
25
25
|
let(:webhook) { Domain::Webhook.new(request: request, events: events)}
|
26
|
-
let(:
|
27
|
-
let(:
|
28
|
-
let(:provider) { test_data_builder.create_pacticipant 'Provider'; test_data_builder.pacticipant}
|
26
|
+
let(:consumer) { td.create_pacticipant 'Consumer'; td.pacticipant}
|
27
|
+
let(:provider) { td.create_pacticipant 'Provider'; td.pacticipant}
|
29
28
|
let(:uuid) { 'the-uuid' }
|
30
29
|
let(:created_webhook_record) { ::DB::PACT_BROKER_DB[:webhooks].order(:id).last }
|
31
30
|
let(:created_headers) { ::DB::PACT_BROKER_DB[:webhook_headers].where(webhook_id: created_webhook_record[:id]).order(:name).all }
|
@@ -44,8 +43,7 @@ module PactBroker
|
|
44
43
|
end
|
45
44
|
|
46
45
|
describe "#create" do
|
47
|
-
|
48
|
-
subject { Repository.new.create uuid, webhook, consumer, provider }
|
46
|
+
subject { Repository.new.create(uuid, webhook, consumer, provider) }
|
49
47
|
|
50
48
|
it "saves webhook" do
|
51
49
|
subject
|
@@ -74,7 +72,7 @@ module PactBroker
|
|
74
72
|
Repository.new.create 'another-uuid', webhook, consumer, provider
|
75
73
|
end
|
76
74
|
|
77
|
-
subject { Repository.new.delete_by_uuid
|
75
|
+
subject { Repository.new.delete_by_uuid(uuid) }
|
78
76
|
|
79
77
|
it "deletes the webhook headers" do
|
80
78
|
expect { subject }.to change {
|
@@ -93,7 +91,7 @@ module PactBroker
|
|
93
91
|
|
94
92
|
before do
|
95
93
|
allow(SecureRandom).to receive(:urlsafe_base64).and_return(uuid, 'another-uuid')
|
96
|
-
Repository.new.create
|
94
|
+
Repository.new.create(uuid, webhook, consumer, provider)
|
97
95
|
end
|
98
96
|
|
99
97
|
context "when the pacticipant is the consumer" do
|
@@ -121,9 +119,7 @@ module PactBroker
|
|
121
119
|
end
|
122
120
|
|
123
121
|
describe "find_by_uuid" do
|
124
|
-
|
125
|
-
|
126
|
-
subject { Repository.new.find_by_uuid uuid }
|
122
|
+
subject { Repository.new.find_by_uuid(uuid) }
|
127
123
|
|
128
124
|
context "when a webhook is found" do
|
129
125
|
before do
|
@@ -152,7 +148,6 @@ module PactBroker
|
|
152
148
|
expect(subject.request.headers).to eq headers
|
153
149
|
end
|
154
150
|
|
155
|
-
|
156
151
|
it "returns a webhook with the username set" do
|
157
152
|
expect(subject.request.username).to eq 'username'
|
158
153
|
end
|
@@ -202,7 +197,6 @@ module PactBroker
|
|
202
197
|
|
203
198
|
describe "update_by_uuid" do
|
204
199
|
let(:uuid) { '1234' }
|
205
|
-
let(:td) { TestDataBuilder.new }
|
206
200
|
let(:old_webhook_params) do
|
207
201
|
{
|
208
202
|
events: [{ name: 'something' }],
|
@@ -235,7 +229,7 @@ module PactBroker
|
|
235
229
|
PactBroker::Domain::Webhook.new(events: [new_event], request: PactBroker::Domain::WebhookRequest.new(new_webhook_params))
|
236
230
|
end
|
237
231
|
|
238
|
-
subject { Repository.new.update_by_uuid
|
232
|
+
subject { Repository.new.update_by_uuid(uuid, new_webhook) }
|
239
233
|
|
240
234
|
it "updates the webhook" do
|
241
235
|
updated_webhook = subject
|
@@ -265,32 +259,29 @@ module PactBroker
|
|
265
259
|
end
|
266
260
|
|
267
261
|
describe "find_by_consumer_and_provider" do
|
268
|
-
let(:
|
269
|
-
|
262
|
+
let(:consumer) { td.consumer }
|
263
|
+
let(:provider) { td.provider }
|
270
264
|
|
271
|
-
|
265
|
+
subject { Repository.new.find_by_consumer_and_provider(consumer, provider) }
|
272
266
|
|
267
|
+
context "when a webhook exists with a matching consumer and provider" do
|
273
268
|
before do
|
274
|
-
|
275
|
-
test_data_builder
|
276
|
-
.create_consumer("Consumer")
|
269
|
+
td.create_consumer("Consumer")
|
277
270
|
.create_provider("Another Provider")
|
278
271
|
.create_webhook
|
279
272
|
.create_provider("Provider")
|
280
273
|
.create_webhook
|
281
274
|
end
|
282
275
|
|
283
|
-
|
284
276
|
it "returns an array of webhooks" do
|
285
277
|
expect(subject).to be_instance_of Array
|
286
|
-
expect(subject.first.uuid).to eq
|
278
|
+
expect(subject.first.uuid).to eq td.webhook.uuid
|
287
279
|
end
|
288
280
|
end
|
289
281
|
|
290
282
|
context "when a webhook does not exist with a matching consumer and provider" do
|
291
|
-
|
292
283
|
before do
|
293
|
-
|
284
|
+
td
|
294
285
|
.create_consumer("Consumer")
|
295
286
|
.create_provider("Provider")
|
296
287
|
.create_webhook
|
@@ -301,16 +292,49 @@ module PactBroker
|
|
301
292
|
expect(subject).to eq []
|
302
293
|
end
|
303
294
|
end
|
295
|
+
|
296
|
+
context "when the consumer argument is nil" do
|
297
|
+
let(:consumer) { nil }
|
298
|
+
|
299
|
+
before do
|
300
|
+
td.create_provider("Provider")
|
301
|
+
.create_consumer("Consumer")
|
302
|
+
.create_provider_webhook
|
303
|
+
.create_webhook
|
304
|
+
end
|
305
|
+
|
306
|
+
it "returns all the webhooks where the provider matches and the consumer id is nil" do
|
307
|
+
expect(subject.size).to be 1
|
308
|
+
expect(subject.first.consumer).to be nil
|
309
|
+
expect(subject.first.provider).to_not be nil
|
310
|
+
end
|
311
|
+
end
|
312
|
+
|
313
|
+
context "when the provider argument is nil" do
|
314
|
+
let(:provider) { nil }
|
315
|
+
|
316
|
+
before do
|
317
|
+
td.create_consumer("Consumer")
|
318
|
+
.create_provider("Provider")
|
319
|
+
.create_consumer_webhook
|
320
|
+
.create_webhook
|
321
|
+
end
|
322
|
+
|
323
|
+
it "returns all the webhooks where the consumer matches and the provider id is nil" do
|
324
|
+
expect(subject.size).to be 1
|
325
|
+
expect(subject.first.provider).to be nil
|
326
|
+
expect(subject.first.consumer).to_not be nil
|
327
|
+
end
|
328
|
+
end
|
304
329
|
end
|
305
330
|
|
306
331
|
describe "find_by_consumer_and_provider_and_event_name" do
|
307
|
-
|
308
|
-
subject { Repository.new.find_by_consumer_and_provider_and_event_name test_data_builder.consumer, test_data_builder.provider, 'something_happened' }
|
332
|
+
subject { Repository.new.find_by_consumer_and_provider_and_event_name td.consumer, td.provider, 'something_happened' }
|
309
333
|
|
310
334
|
context "when a webhook exists with a matching consumer and provider and event name" do
|
311
335
|
|
312
336
|
before do
|
313
|
-
|
337
|
+
td
|
314
338
|
.create_consumer("Consumer")
|
315
339
|
.create_provider("Another Provider")
|
316
340
|
.create_webhook
|
@@ -326,6 +350,33 @@ module PactBroker
|
|
326
350
|
end
|
327
351
|
end
|
328
352
|
|
353
|
+
describe "find_for_pact_and_event_name" do
|
354
|
+
context "when a webhook exists with a matching consumer and provider and event name" do
|
355
|
+
before do
|
356
|
+
td
|
357
|
+
.create_consumer("Consumer")
|
358
|
+
.create_consumer_version("1")
|
359
|
+
.create_provider("Another Provider")
|
360
|
+
.create_webhook
|
361
|
+
.create_provider("Provider")
|
362
|
+
.create_pact
|
363
|
+
.create_webhook(uuid: '1', events: [{ name: 'something_happened' }])
|
364
|
+
.create_webhook(uuid: '2', events: [{ name: 'something_happened' }])
|
365
|
+
.create_webhook(uuid: '3', events: [{ name: 'something_else_happened' }])
|
366
|
+
.create_consumer_webhook(uuid: '4', events: [{ name: 'something_happened' }])
|
367
|
+
.create_provider_webhook(uuid: '5', events: [{ name: 'something_happened' }])
|
368
|
+
.create_global_webhook(uuid: '6', events: [{ name: 'something_happened' }])
|
369
|
+
.create_global_webhook(uuid: '7', events: [{ name: 'something_else_happened' }])
|
370
|
+
end
|
371
|
+
|
372
|
+
subject { Repository.new.find_for_pact_and_event_name(td.pact, 'something_happened') }
|
373
|
+
|
374
|
+
it "returns an array of webhooks" do
|
375
|
+
expect(subject.collect(&:uuid).sort).to eq ['1', '2', '4', '5', '6']
|
376
|
+
end
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
329
380
|
describe "create_triggered_webhook" do
|
330
381
|
before do
|
331
382
|
td.create_consumer
|
@@ -405,8 +456,6 @@ module PactBroker
|
|
405
456
|
end
|
406
457
|
|
407
458
|
describe "delete_triggered_webhooks_by_webhook_uuid" do
|
408
|
-
let(:td) { TestDataBuilder.new }
|
409
|
-
|
410
459
|
before do
|
411
460
|
td.create_consumer
|
412
461
|
.create_provider
|
@@ -421,8 +470,8 @@ module PactBroker
|
|
421
470
|
.create_deprecated_webhook_execution
|
422
471
|
.create_webhook_execution
|
423
472
|
end
|
424
|
-
|
425
473
|
let(:webhook_id) { Webhook.find(uuid: td.webhook.uuid).id }
|
474
|
+
|
426
475
|
subject { Repository.new.delete_triggered_webhooks_by_webhook_uuid td.webhook.uuid }
|
427
476
|
|
428
477
|
it "deletes the related triggered webhooks" do
|
@@ -553,6 +602,76 @@ module PactBroker
|
|
553
602
|
end
|
554
603
|
end
|
555
604
|
|
605
|
+
describe "find_latest_triggered_webhooks_for_pact" do
|
606
|
+
before do
|
607
|
+
td
|
608
|
+
.create_pact_with_hierarchy("Foo", "1.0.0", "Bar")
|
609
|
+
.create_webhook
|
610
|
+
.create_triggered_webhook
|
611
|
+
.create_webhook_execution
|
612
|
+
.create_pact_with_hierarchy
|
613
|
+
.create_webhook
|
614
|
+
.create_triggered_webhook(trigger_uuid: '256', created_at: DateTime.new(2016))
|
615
|
+
.create_webhook_execution
|
616
|
+
.create_triggered_webhook(trigger_uuid: '332', created_at: DateTime.new(2017))
|
617
|
+
.create_webhook_execution
|
618
|
+
.create_provider_webhook(uuid: '987')
|
619
|
+
.create_triggered_webhook(trigger_uuid: '876', created_at: DateTime.new(2017))
|
620
|
+
.create_webhook_execution
|
621
|
+
.create_triggered_webhook(trigger_uuid: '638', created_at: DateTime.new(2018))
|
622
|
+
.create_webhook_execution
|
623
|
+
.create_consumer_webhook
|
624
|
+
.create_triggered_webhook(trigger_uuid: '555', created_at: DateTime.new(2017))
|
625
|
+
.create_webhook_execution
|
626
|
+
.create_triggered_webhook(trigger_uuid: '777', created_at: DateTime.new(2018))
|
627
|
+
.create_webhook_execution
|
628
|
+
end
|
629
|
+
|
630
|
+
subject { Repository.new.find_latest_triggered_webhooks_for_pact(td.pact) }
|
631
|
+
|
632
|
+
it "finds the latest triggered webhooks" do
|
633
|
+
expect(subject.collect(&:trigger_uuid).sort).to eq ['332', '638', '777']
|
634
|
+
end
|
635
|
+
end
|
636
|
+
|
637
|
+
describe "find_triggered_webhooks_for_pact" do
|
638
|
+
before do
|
639
|
+
td
|
640
|
+
.create_pact_with_hierarchy("Foo", "1", "Bar")
|
641
|
+
.create_webhook
|
642
|
+
.create_triggered_webhook(trigger_uuid: "1")
|
643
|
+
.create_webhook_execution
|
644
|
+
.create_consumer_version("2")
|
645
|
+
.create_pact
|
646
|
+
.create_triggered_webhook(trigger_uuid: "2")
|
647
|
+
.create_webhook_execution
|
648
|
+
end
|
649
|
+
|
650
|
+
subject { Repository.new.find_triggered_webhooks_for_pact(td.pact) }
|
651
|
+
|
652
|
+
it "finds the triggered webhooks" do
|
653
|
+
expect(subject.collect(&:trigger_uuid).sort).to eq ["2"]
|
654
|
+
end
|
655
|
+
end
|
656
|
+
|
657
|
+
describe "find_triggered_webhooks_for_verification" do
|
658
|
+
before do
|
659
|
+
td
|
660
|
+
.create_pact_with_hierarchy("Foo", "1", "Bar")
|
661
|
+
.create_verification_webhook
|
662
|
+
.create_verification(provider_version: "1")
|
663
|
+
.create_triggered_webhook(trigger_uuid: "1")
|
664
|
+
.create_verification(provider_version: "2", number: 2)
|
665
|
+
.create_triggered_webhook(trigger_uuid: "2")
|
666
|
+
end
|
667
|
+
|
668
|
+
subject { Repository.new.find_triggered_webhooks_for_verification(td.verification) }
|
669
|
+
|
670
|
+
it "finds the triggered webhooks" do
|
671
|
+
expect(subject.collect(&:trigger_uuid).sort).to eq ["2"]
|
672
|
+
end
|
673
|
+
end
|
674
|
+
|
556
675
|
describe "fail_retrying_triggered_webhooks" do
|
557
676
|
before do
|
558
677
|
td.create_pact_with_hierarchy
|
@@ -28,7 +28,7 @@ module PactBroker
|
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
-
describe ".
|
31
|
+
describe ".trigger_webhooks" do
|
32
32
|
|
33
33
|
let(:verification) { instance_double(PactBroker::Domain::Verification)}
|
34
34
|
let(:pact) { instance_double(PactBroker::Domain::Pact, consumer: consumer, provider: provider, consumer_version: consumer_version)}
|
@@ -39,15 +39,15 @@ module PactBroker
|
|
39
39
|
let(:triggered_webhook) { instance_double(PactBroker::Webhooks::TriggeredWebhook) }
|
40
40
|
|
41
41
|
before do
|
42
|
-
allow_any_instance_of(PactBroker::Webhooks::Repository).to receive(:
|
42
|
+
allow_any_instance_of(PactBroker::Webhooks::Repository).to receive(:find_by_consumer_and_or_provider_and_event_name).and_return(webhooks)
|
43
43
|
allow_any_instance_of(PactBroker::Webhooks::Repository).to receive(:create_triggered_webhook).and_return(triggered_webhook)
|
44
44
|
allow(Job).to receive(:perform_in)
|
45
45
|
end
|
46
46
|
|
47
|
-
subject { Service.
|
47
|
+
subject { Service.trigger_webhooks pact, verification, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED }
|
48
48
|
|
49
49
|
it "finds the webhooks" do
|
50
|
-
expect_any_instance_of(PactBroker::Webhooks::Repository).to receive(:
|
50
|
+
expect_any_instance_of(PactBroker::Webhooks::Repository).to receive(:find_by_consumer_and_or_provider_and_event_name).with(consumer, provider, PactBroker::Webhooks::WebhookEvent::DEFAULT_EVENT_NAME)
|
51
51
|
subject
|
52
52
|
end
|
53
53
|
|
@@ -84,6 +84,83 @@ module PactBroker
|
|
84
84
|
end
|
85
85
|
end
|
86
86
|
|
87
|
+
describe ".test_execution" do
|
88
|
+
let(:webhook) do
|
89
|
+
instance_double(PactBroker::Domain::Webhook,
|
90
|
+
trigger_on_provider_verification_published?: trigger_on_verification,
|
91
|
+
consumer_name: 'consumer',
|
92
|
+
provider_name: 'provider',
|
93
|
+
execute: result
|
94
|
+
)
|
95
|
+
end
|
96
|
+
let(:pact) { instance_double(PactBroker::Domain::Pact) }
|
97
|
+
let(:verification) { instance_double(PactBroker::Domain::Verification) }
|
98
|
+
let(:trigger_on_verification) { false }
|
99
|
+
let(:result) { double('result') }
|
100
|
+
let(:options) do
|
101
|
+
{
|
102
|
+
failure_log_message: "Webhook execution failed",
|
103
|
+
show_response: 'foo'
|
104
|
+
}
|
105
|
+
end
|
106
|
+
|
107
|
+
before do
|
108
|
+
allow(PactBroker::Pacts::Service).to receive(:search_for_latest_pact).and_return(pact)
|
109
|
+
allow(PactBroker::Verifications::Service).to receive(:search_for_latest).and_return(verification)
|
110
|
+
allow(PactBroker.configuration).to receive(:show_webhook_response?).and_return('foo')
|
111
|
+
end
|
112
|
+
|
113
|
+
subject { Service.test_execution(webhook) }
|
114
|
+
|
115
|
+
it "searches for the latest matching pact" do
|
116
|
+
expect(PactBroker::Pacts::Service).to receive(:search_for_latest_pact).with(consumer_name: 'consumer', provider_name: 'provider')
|
117
|
+
subject
|
118
|
+
end
|
119
|
+
|
120
|
+
it "returns the result" do
|
121
|
+
expect(subject).to be result
|
122
|
+
end
|
123
|
+
|
124
|
+
context "when the trigger is not for a verification" do
|
125
|
+
it "executes the webhook with the pact" do
|
126
|
+
expect(webhook).to receive(:execute).with(pact, nil, options)
|
127
|
+
subject
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context "when a pact cannot be found" do
|
132
|
+
let(:pact) { nil }
|
133
|
+
|
134
|
+
it "executes the webhook with a placeholder pact" do
|
135
|
+
expect(webhook).to receive(:execute).with(an_instance_of(PactBroker::Pacts::PlaceholderPact), anything, anything)
|
136
|
+
subject
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context "when the trigger is for a verification publication" do
|
141
|
+
let(:trigger_on_verification) { true }
|
142
|
+
|
143
|
+
it "searches for the latest matching verification" do
|
144
|
+
expect(PactBroker::Verifications::Service).to receive(:search_for_latest).with('consumer', 'provider')
|
145
|
+
subject
|
146
|
+
end
|
147
|
+
|
148
|
+
it "executes the webhook with the pact and the verification" do
|
149
|
+
expect(webhook).to receive(:execute).with(pact, verification, options)
|
150
|
+
subject
|
151
|
+
end
|
152
|
+
|
153
|
+
context "when a verification cannot be found" do
|
154
|
+
let(:verification) { nil }
|
155
|
+
|
156
|
+
it "executes the webhook with a placeholder verification" do
|
157
|
+
expect(webhook).to receive(:execute).with(anything, an_instance_of(PactBroker::Verifications::PlaceholderVerification), anything)
|
158
|
+
subject
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
87
164
|
describe ".execute_webhook_now integration test" do
|
88
165
|
let(:td) { TestDataBuilder.new }
|
89
166
|
|
@@ -133,7 +210,7 @@ module PactBroker
|
|
133
210
|
end
|
134
211
|
end
|
135
212
|
|
136
|
-
describe ".
|
213
|
+
describe ".trigger_webhooks integration test" do
|
137
214
|
let!(:http_request) do
|
138
215
|
stub_request(:get, "http://example.org").
|
139
216
|
to_return(:status => 200)
|
@@ -151,7 +228,7 @@ module PactBroker
|
|
151
228
|
.and_return(:pact)
|
152
229
|
end
|
153
230
|
|
154
|
-
subject { PactBroker::Webhooks::Service.
|
231
|
+
subject { PactBroker::Webhooks::Service.trigger_webhooks pact, td.verification, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED }
|
155
232
|
|
156
233
|
it "executes the HTTP request of the webhook" do
|
157
234
|
subject
|
@@ -161,7 +238,7 @@ module PactBroker
|
|
161
238
|
it "executes the webhook with the correct options" do
|
162
239
|
allow(PactBroker.configuration).to receive(:show_webhook_response?).and_return('foo')
|
163
240
|
expected_options = {:show_response => 'foo' }
|
164
|
-
expect_any_instance_of(PactBroker::Domain::WebhookRequest).to receive(:execute).with(
|
241
|
+
expect_any_instance_of(PactBroker::Domain::WebhookRequest).to receive(:execute).with(hash_including(expected_options)).and_call_original
|
165
242
|
subject
|
166
243
|
end
|
167
244
|
|