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.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/README.md +1 -0
  4. data/db/migrations/20180611_make_webhook_pacticipant_ids_optional.rb +11 -0
  5. data/example/config.ru +2 -0
  6. data/lib/pact_broker/api.rb +9 -3
  7. data/lib/pact_broker/api/contracts/webhook_contract.rb +36 -0
  8. data/lib/pact_broker/api/decorators/pact_decorator.rb +22 -1
  9. data/lib/pact_broker/api/decorators/pact_webhooks_status_decorator.rb +1 -26
  10. data/lib/pact_broker/api/decorators/triggered_webhook_decorator.rb +33 -0
  11. data/lib/pact_broker/api/decorators/triggered_webhooks_decorator.rb +19 -0
  12. data/lib/pact_broker/api/decorators/verification_decorator.rb +6 -0
  13. data/lib/pact_broker/api/decorators/webhook_decorator.rb +32 -18
  14. data/lib/pact_broker/api/decorators/webhook_execution_result_decorator.rb +27 -0
  15. data/lib/pact_broker/api/decorators/{webhook_request_decorator.rb → webhook_request_template_decorator.rb} +1 -1
  16. data/lib/pact_broker/api/pact_broker_urls.rb +21 -1
  17. data/lib/pact_broker/api/resources/all_webhooks.rb +82 -0
  18. data/lib/pact_broker/api/resources/base_resource.rb +18 -0
  19. data/lib/pact_broker/api/resources/error_handler.rb +5 -1
  20. data/lib/pact_broker/api/resources/pact_triggered_webhooks.rb +41 -0
  21. data/lib/pact_broker/api/resources/pact_webhooks.rb +2 -15
  22. data/lib/pact_broker/api/resources/pact_webhooks_status.rb +1 -1
  23. data/lib/pact_broker/api/resources/verification_triggered_webhooks.rb +45 -0
  24. data/lib/pact_broker/api/resources/webhook_execution.rb +1 -5
  25. data/lib/pact_broker/api/resources/webhooks.rb +69 -6
  26. data/lib/pact_broker/configuration.rb +5 -2
  27. data/lib/pact_broker/doc/controllers/app.rb +1 -2
  28. data/lib/pact_broker/doc/views/pact-webhooks.markdown +3 -0
  29. data/lib/pact_broker/doc/views/webhooks.markdown +53 -33
  30. data/lib/pact_broker/domain/pact.rb +4 -0
  31. data/lib/pact_broker/domain/webhook.rb +19 -3
  32. data/lib/pact_broker/domain/webhook_execution_result.rb +6 -1
  33. data/lib/pact_broker/domain/webhook_request.rb +87 -65
  34. data/lib/pact_broker/locale/en.yml +1 -0
  35. data/lib/pact_broker/matrix/repository.rb +3 -1
  36. data/lib/pact_broker/pacts/placeholder_pact.rb +17 -0
  37. data/lib/pact_broker/pacts/repository.rb +14 -0
  38. data/lib/pact_broker/pacts/service.rb +6 -2
  39. data/lib/pact_broker/ui/view_models/index_item.rb +1 -1
  40. data/lib/pact_broker/verifications/placeholder_verification.rb +23 -0
  41. data/lib/pact_broker/verifications/repository.rb +9 -0
  42. data/lib/pact_broker/verifications/service.rb +5 -1
  43. data/lib/pact_broker/version.rb +1 -1
  44. data/lib/pact_broker/webhooks/repository.rb +54 -4
  45. data/lib/pact_broker/webhooks/service.rb +37 -2
  46. data/lib/pact_broker/webhooks/webhook.rb +4 -3
  47. data/lib/pact_broker/webhooks/webhook_event.rb +8 -0
  48. data/lib/pact_broker/webhooks/webhook_request_template.rb +72 -0
  49. data/pact_broker.gemspec +1 -1
  50. data/script/seed.rb +32 -51
  51. data/spec/features/create_webhook_spec.rb +85 -36
  52. data/spec/features/execute_webhook_spec.rb +9 -18
  53. data/spec/features/get_triggered_webhooks_for_pact_spec.rb +20 -0
  54. data/spec/features/get_triggered_webhooks_for_verification_spec.rb +21 -0
  55. data/spec/fixtures/webhook_valid_with_pacticipants.json +23 -0
  56. data/spec/integration/webhooks/certificate_spec.rb +2 -2
  57. data/spec/lib/pact_broker/api/contracts/webhook_contract_spec.rb +98 -2
  58. data/spec/lib/pact_broker/api/decorators/triggered_webhook_decorator_spec.rb +64 -0
  59. data/spec/lib/pact_broker/api/decorators/triggered_webhooks_decorator_spec.rb +28 -0
  60. data/spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb +8 -0
  61. data/spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb +37 -1
  62. data/spec/lib/pact_broker/api/decorators/webhook_execution_result_decorator_spec.rb +34 -1
  63. data/spec/lib/pact_broker/api/decorators/{webhook_request_decorator_spec.rb → webhook_request_template_decorator_spec.rb} +7 -9
  64. data/spec/lib/pact_broker/api/pact_broker_urls_spec.rb +22 -0
  65. data/spec/lib/pact_broker/api/resources/{pact_webhooks_spec.rb → all_webhooks_spec.rb} +46 -80
  66. data/spec/lib/pact_broker/api/resources/error_handler_spec.rb +34 -0
  67. data/spec/lib/pact_broker/api/resources/pact_triggered_webhooks_spec.rb +54 -0
  68. data/spec/lib/pact_broker/api/resources/pacticipant_spec.rb +1 -6
  69. data/spec/lib/pact_broker/api/resources/tag_spec.rb +1 -6
  70. data/spec/lib/pact_broker/api/resources/verification_triggered_webhooks_spec.rb +68 -0
  71. data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +2 -8
  72. data/spec/lib/pact_broker/api/resources/webhooks_spec.rb +216 -21
  73. data/spec/lib/pact_broker/configuration_spec.rb +30 -0
  74. data/spec/lib/pact_broker/domain/webhook_request_spec.rb +20 -64
  75. data/spec/lib/pact_broker/domain/webhook_spec.rb +40 -11
  76. data/spec/lib/pact_broker/matrix/repository_spec.rb +33 -0
  77. data/spec/lib/pact_broker/pacts/pact_version_spec.rb +1 -0
  78. data/spec/lib/pact_broker/pacts/repository_spec.rb +39 -1
  79. data/spec/lib/pact_broker/ui/view_models/index_item_spec.rb +1 -1
  80. data/spec/lib/pact_broker/verifications/repository_spec.rb +37 -0
  81. data/spec/lib/pact_broker/verifications/service_spec.rb +2 -2
  82. data/spec/lib/pact_broker/webhooks/render_spec.rb +15 -0
  83. data/spec/lib/pact_broker/webhooks/repository_spec.rb +149 -30
  84. data/spec/lib/pact_broker/webhooks/service_spec.rb +84 -7
  85. data/spec/lib/pact_broker/webhooks/webhook_request_template_spec.rb +81 -0
  86. data/spec/service_consumers/pact_helper.rb +2 -0
  87. data/spec/service_consumers/provider_states_for_pact_broker_client.rb +8 -0
  88. data/spec/service_consumers/provider_states_for_pact_ruby.rb +132 -0
  89. data/spec/support/test_data_builder.rb +30 -7
  90. 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
- Domain::WebhookRequest.new(
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(:test_data_builder) { TestDataBuilder.new }
27
- let(:consumer) { test_data_builder.create_pacticipant 'Consumer'; test_data_builder.pacticipant}
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 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 uuid, webhook, consumer, provider
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 uuid, new_webhook }
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(:test_data_builder) { TestDataBuilder.new }
269
- subject { Repository.new.find_by_consumer_and_provider test_data_builder.consumer, test_data_builder.provider}
262
+ let(:consumer) { td.consumer }
263
+ let(:provider) { td.provider }
270
264
 
271
- context "when a webhook exists with a matching consumer and provider" do
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
- allow(SecureRandom).to receive(:urlsafe_base64).and_call_original
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 test_data_builder.webhook.uuid
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
- test_data_builder
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
- 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' }
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
- test_data_builder
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 ".execute_webhooks" do
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(:find_by_consumer_and_provider_and_event_name).and_return(webhooks)
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.execute_webhooks pact, verification, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED }
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(:find_by_consumer_and_provider_and_event_name).with(consumer, provider, PactBroker::Webhooks::WebhookEvent::DEFAULT_EVENT_NAME)
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 ".execute_webhooks integration test" do
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.execute_webhooks pact, td.verification, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED }
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(anything, anything, hash_including(expected_options)).and_call_original
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