pact_broker 2.41.0 → 2.42.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 +14 -0
- data/lib/pact_broker/api/decorators/verifiable_pact_decorator.rb +11 -0
- data/lib/pact_broker/doc/views/webhooks.markdown +5 -1
- data/lib/pact_broker/domain/webhook.rb +8 -0
- data/lib/pact_broker/pacts/all_pact_publications.rb +1 -1
- data/lib/pact_broker/pacts/repository.rb +69 -18
- data/lib/pact_broker/test/test_data_builder.rb +18 -2
- data/lib/pact_broker/verifications/service.rb +2 -2
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/webhooks/trigger_service.rb +25 -0
- data/lib/pact_broker/webhooks/webhook_event.rb +10 -3
- data/script/seed.rb +10 -2
- data/spec/features/wip_pacts_spec.rb +7 -4
- data/spec/lib/pact_broker/api/decorators/verifiable_pact_decorator_spec.rb +14 -4
- data/spec/lib/pact_broker/pacts/repository_find_wip_pact_versions_for_provider_spec.rb +73 -6
- data/spec/lib/pact_broker/pacts/service_spec.rb +6 -1
- data/spec/lib/pact_broker/verifications/service_spec.rb +3 -3
- data/spec/lib/pact_broker/webhooks/trigger_service_spec.rb +33 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1beb82704006c0aa9708a9b4e9af93075bfc3bf9
|
4
|
+
data.tar.gz: 8cb7b7148ce8a3152d6ccbe35e49f3e646f5e628
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b289766c4bc421c975fefc7a109f97eb6bc5f31eac99d1dd6e7754d7f2c7cf7f7dca21652d55d28a1e64d5eacd5f26e16f30ac1af3e2111eefc9a38bb42128f4
|
7
|
+
data.tar.gz: d6ce416cd0133c2d8278e1addc4f99814a118d9a800a74d1937168ac132e9f7ff27c3a48d63866ffaac0ec0424bd433f468812695e133edbf7a6698edbc9ba09
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,17 @@
|
|
1
|
+
<a name="v2.42.0"></a>
|
2
|
+
### v2.42.0 (2019-12-05)
|
3
|
+
|
4
|
+
|
5
|
+
#### Features
|
6
|
+
|
7
|
+
* **pacts for verification**
|
8
|
+
* include list of notices to print rather than inclusionReason and pendingReason ([eed0120e](/../../commit/eed0120e))
|
9
|
+
* only include WIP pacts that were published after the provider tag was first used ([673fcb8c](/../../commit/673fcb8c))
|
10
|
+
|
11
|
+
* **webhooks**
|
12
|
+
* allow webhooks to be triggered for verification successes and failures ([6735da32](/../../commit/6735da32))
|
13
|
+
|
14
|
+
|
1
15
|
<a name="v2.41.0"></a>
|
2
16
|
### v2.41.0 (2019-11-21)
|
3
17
|
|
@@ -28,6 +28,9 @@ module PactBroker
|
|
28
28
|
property :pending_reason, as: :pendingReason, exec_context: :decorator,
|
29
29
|
if: ->(context) { context[:options][:user_options][:include_pending_status] }
|
30
30
|
|
31
|
+
property :notices, getter: -> (context) { context[:decorator].notices(context[:options][:user_options]) }
|
32
|
+
property :noteToDevelopers, getter: -> (_) { "Please print out the text from the 'notices' rather than using the inclusionReason and the pendingReason fields. These will be removed when this API moves out of beta."}
|
33
|
+
|
31
34
|
def inclusion_reason
|
32
35
|
PactBroker::Pacts::VerifiablePactMessages.new(represented).inclusion_reason
|
33
36
|
end
|
@@ -35,6 +38,14 @@ module PactBroker
|
|
35
38
|
def pending_reason
|
36
39
|
PactBroker::Pacts::VerifiablePactMessages.new(represented).pending_reason
|
37
40
|
end
|
41
|
+
|
42
|
+
def notices(user_options)
|
43
|
+
mess = [{
|
44
|
+
text: inclusion_reason
|
45
|
+
}]
|
46
|
+
mess << { text: pending_reason } if user_options[:include_pending_status]
|
47
|
+
mess
|
48
|
+
end
|
38
49
|
end
|
39
50
|
|
40
51
|
link :self do | context |
|
@@ -80,7 +80,11 @@ To specify an XML body, you will need to use a correctly escaped string (or use
|
|
80
80
|
|
81
81
|
`contract_content_changed:` triggered when the content of the contract, or tags applied to the contract have changed since the previous publication. If `base_equality_only_on_content_that_affects_verification_results` is set to `true` in the configuration (the default), any changes to whitespace, ordering of keys, or the ordering of the `interactions` or `messages` will be ignored, and will not trigger this event. It is recommended to trigger a provider verification build for this event.
|
82
82
|
|
83
|
-
`provider_verification_published:` triggered whenever a provider publishes a verification.
|
83
|
+
`provider_verification_published:` triggered whenever a provider publishes a verification result.
|
84
|
+
|
85
|
+
`provider_verification_succeeded:` triggered whenever a provider publishes a successful verification result.
|
86
|
+
|
87
|
+
`provider_verification_failed:` triggered whenever a provider publishes a failed verification result.
|
84
88
|
|
85
89
|
### Dynamic variable substitution
|
86
90
|
|
@@ -85,6 +85,14 @@ module PactBroker
|
|
85
85
|
events.any?(&:provider_verification_published?)
|
86
86
|
end
|
87
87
|
|
88
|
+
def trigger_on_provider_verification_succeeded?
|
89
|
+
events.any?(&:provider_verification_succeeded?)
|
90
|
+
end
|
91
|
+
|
92
|
+
def trigger_on_provider_verification_failed?
|
93
|
+
events.any?(&:provider_verification_failed?)
|
94
|
+
end
|
95
|
+
|
88
96
|
private
|
89
97
|
|
90
98
|
def execute_request(webhook_request)
|
@@ -109,7 +109,7 @@ module PactBroker
|
|
109
109
|
def head_tag_names
|
110
110
|
# Avoid circular dependency
|
111
111
|
require 'pact_broker/pacts/latest_tagged_pact_publications'
|
112
|
-
LatestTaggedPactPublications.where(id: id).select(:tag_name).collect{|t| t[:tag_name]}
|
112
|
+
@head_tag_names ||= LatestTaggedPactPublications.where(id: id).select(:tag_name).collect{|t| t[:tag_name]}
|
113
113
|
end
|
114
114
|
|
115
115
|
def to_domain_with_content
|
@@ -125,22 +125,57 @@ module PactBroker
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
-
|
129
|
-
|
128
|
+
# To find the work in progress pacts for this verification execution:
|
129
|
+
# For each provider tag that will be applied to this verification result (usually there will just be one, but
|
130
|
+
# we have to allow for multiple tags),
|
131
|
+
# find the head pacts (the pacts that are the latest for their tag) that have been successfully
|
132
|
+
# verified against the provider tag.
|
133
|
+
# Then, find all the head pacts, and remove the ones that have been successfully verified by ALL
|
134
|
+
# of the provider tags supplied.
|
135
|
+
# Then, for all of the head pacts that are remaining (these are the WIP ones) work out which
|
136
|
+
# provider tags they are pending for.
|
137
|
+
# Don't include pact publications that were created
|
138
|
+
def find_wip_pact_versions_for_provider provider_name, provider_tags_names = [], options = {}
|
139
|
+
return [] if provider_tags_names.empty?
|
140
|
+
|
141
|
+
provider = pacticipant_repository.find_by_name(provider_name)
|
142
|
+
|
143
|
+
# Hash of provider tag names => list of head pacts
|
144
|
+
successfully_verified_head_pacts_for_provider_tags = find_successfully_verified_head_pacts_by_provider_tag(provider_name, provider_tags_names, options)
|
145
|
+
successfully_verified_head_pact_publication_ids_for_each_provider_tag = successfully_verified_head_pacts_for_provider_tags.each_with_object({}) do | (provider_tag_name, head_pacts), hash |
|
146
|
+
hash[provider_tag_name] = head_pacts.collect(&:id)
|
147
|
+
end
|
130
148
|
|
131
|
-
#
|
132
|
-
|
149
|
+
# list of pact_publication_ids that are NOT work in progress
|
150
|
+
head_pact_publication_ids_successully_verified_by_all_provider_tags = successfully_verified_head_pacts_for_provider_tags.values.collect{ |head_pacts| head_pacts.collect(&:id) }.reduce(:&)
|
133
151
|
|
134
152
|
pact_publication_ids = find_head_pacts_that_have_not_been_successfully_verified_by_all_provider_tags(
|
135
153
|
provider_name,
|
136
|
-
|
154
|
+
head_pact_publication_ids_successully_verified_by_all_provider_tags,
|
137
155
|
options)
|
138
156
|
|
139
|
-
pacts = AllPactPublications.where(id: pact_publication_ids).order_ignore_case(:consumer_name).order_append(:consumer_version_order)
|
157
|
+
pacts = AllPactPublications.where(id: pact_publication_ids).order_ignore_case(:consumer_name).order_append(:consumer_version_order)
|
158
|
+
|
159
|
+
# The first instance (by date) of each provider tag with that name
|
160
|
+
provider_tag_collection = PactBroker::Domain::Tag
|
161
|
+
.select_group(Sequel[:tags][:name], Sequel[:pacticipant_id])
|
162
|
+
.select_append(Sequel.function(:min, Sequel[:tags][:created_at]).as(:created_at))
|
163
|
+
.distinct
|
164
|
+
.join(:versions, { Sequel[:tags][:version_id] => Sequel[:versions][:id] } )
|
165
|
+
.where(pacticipant_id: provider.id)
|
166
|
+
.where(name: provider_tags_names)
|
167
|
+
.all
|
168
|
+
|
140
169
|
pacts.collect do | pact|
|
141
|
-
|
142
|
-
|
143
|
-
|
170
|
+
pending_tag_names = find_provider_tags_for_which_pact_publication_id_is_pending(pact, successfully_verified_head_pact_publication_ids_for_each_provider_tag)
|
171
|
+
pre_existing_tag_names = find_provider_tag_names_that_were_first_used_before_pact_published(pact, provider_tag_collection)
|
172
|
+
|
173
|
+
pre_existing_pending_tags = pending_tag_names & pre_existing_tag_names
|
174
|
+
|
175
|
+
if pre_existing_pending_tags.any?
|
176
|
+
VerifiablePact.new(pact.to_domain, true, pre_existing_pending_tags, [], pact.head_tag_names, nil, true)
|
177
|
+
end
|
178
|
+
end.compact
|
144
179
|
end
|
145
180
|
|
146
181
|
def find_pact_versions_for_provider provider_name, tag = nil
|
@@ -333,13 +368,27 @@ module PactBroker
|
|
333
368
|
query
|
334
369
|
end
|
335
370
|
|
336
|
-
def find_provider_tags_for_which_pact_publication_id_is_pending(
|
371
|
+
def find_provider_tags_for_which_pact_publication_id_is_pending(pact_publication, successfully_verified_head_pact_publication_ids_for_each_provider_tag)
|
337
372
|
successfully_verified_head_pact_publication_ids_for_each_provider_tag
|
338
|
-
.select do |
|
339
|
-
!pact_publication_ids.include?(
|
373
|
+
.select do | _, pact_publication_ids |
|
374
|
+
!pact_publication_ids.include?(pact_publication.id)
|
340
375
|
end.keys
|
341
376
|
end
|
342
377
|
|
378
|
+
def find_provider_tag_names_that_were_first_used_before_pact_published(pact_publication, provider_tag_collection)
|
379
|
+
provider_tag_collection.select { | tag| to_datetime(tag.created_at) < pact_publication.created_at }.collect(&:name)
|
380
|
+
end
|
381
|
+
|
382
|
+
# Note: created_at is coming back as a string for sqlite
|
383
|
+
# Can't work out how to to tell Sequel that this should be a date
|
384
|
+
def to_datetime string_or_datetime
|
385
|
+
if string_or_datetime.is_a?(String)
|
386
|
+
Sequel.string_to_datetime(string_or_datetime)
|
387
|
+
else
|
388
|
+
string_or_datetime
|
389
|
+
end
|
390
|
+
end
|
391
|
+
|
343
392
|
def find_head_pacts_that_have_not_been_successfully_verified_by_all_provider_tags(provider_name, pact_publication_ids_successfully_verified_by_all_provider_tags, options)
|
344
393
|
# Exclude the head pacts that have been successfully verified by all the specified provider tags
|
345
394
|
pact_publication_ids = LatestTaggedPactPublications
|
@@ -349,18 +398,20 @@ module PactBroker
|
|
349
398
|
.select_for_subquery(:id)
|
350
399
|
end
|
351
400
|
|
401
|
+
# Find the head pacts that have been successfully verified by a provider version with the specified tags
|
402
|
+
# Returns a Hash of provider_tag => LatestTaggedPactPublications with only id and tag_name populated
|
352
403
|
def find_successfully_verified_head_pacts_by_provider_tag(provider_name, provider_tags, options)
|
353
|
-
provider_tags.compact.each_with_object({}) do | provider_tag,
|
354
|
-
|
404
|
+
provider_tags.compact.each_with_object({}) do | provider_tag, hash |
|
405
|
+
head_pacts = LatestTaggedPactPublications
|
355
406
|
.join(:verifications, { pact_version_id: :pact_version_id })
|
356
407
|
.join(:tags, { Sequel[:verifications][:provider_version_id] => Sequel[:provider_tags][:version_id] }, {table_alias: :provider_tags})
|
357
408
|
.where(Sequel[:provider_tags][:name] => provider_tag)
|
358
409
|
.provider(provider_name)
|
359
410
|
.where(Sequel[:verifications][:success] => true)
|
360
|
-
.
|
361
|
-
.select(Sequel[:latest_tagged_pact_publications][:id].as(:id))
|
362
|
-
.
|
363
|
-
|
411
|
+
.or(Sequel.lit('latest_tagged_pact_publications.created_at < ?', options.fetch(:include_wip_pacts_since)))
|
412
|
+
.select(Sequel[:latest_tagged_pact_publications][:id].as(:id), :tag_name)
|
413
|
+
.all
|
414
|
+
hash[provider_tag] = head_pacts
|
364
415
|
end
|
365
416
|
end
|
366
417
|
end
|
@@ -46,6 +46,7 @@ module PactBroker
|
|
46
46
|
attr_reader :triggered_webhook
|
47
47
|
|
48
48
|
def initialize(params = {})
|
49
|
+
@now = DateTime.now
|
49
50
|
end
|
50
51
|
|
51
52
|
def comment *args
|
@@ -73,8 +74,10 @@ module PactBroker
|
|
73
74
|
end
|
74
75
|
|
75
76
|
def create_pact_with_hierarchy consumer_name = "Consumer", consumer_version = "1.2.3", provider_name = "Provider", json_content = default_json_content
|
76
|
-
|
77
|
-
|
77
|
+
use_consumer(consumer_name)
|
78
|
+
create_consumer(consumer_name) if !consumer
|
79
|
+
use_provider(provider_name)
|
80
|
+
create_provider provider_name if !provider
|
78
81
|
create_consumer_version consumer_version
|
79
82
|
create_pact json_content: json_content
|
80
83
|
self
|
@@ -246,6 +249,14 @@ module PactBroker
|
|
246
249
|
create_webhook(parameters.merge(consumer: nil, provider: nil, event_names: [PactBroker::Webhooks::WebhookEvent::VERIFICATION_PUBLISHED]))
|
247
250
|
end
|
248
251
|
|
252
|
+
def create_global_verification_succeeded_webhook parameters = {}
|
253
|
+
create_webhook(parameters.merge(consumer: nil, provider: nil, event_names: [PactBroker::Webhooks::WebhookEvent::VERIFICATION_SUCCEEDED]))
|
254
|
+
end
|
255
|
+
|
256
|
+
def create_global_verification_failed_webhook parameters = {}
|
257
|
+
create_webhook(parameters.merge(consumer: nil, provider: nil, event_names: [PactBroker::Webhooks::WebhookEvent::VERIFICATION_FAILED]))
|
258
|
+
end
|
259
|
+
|
249
260
|
def create_provider_webhook parameters = {}
|
250
261
|
create_webhook(parameters.merge(consumer: nil))
|
251
262
|
end
|
@@ -334,6 +345,11 @@ module PactBroker
|
|
334
345
|
self
|
335
346
|
end
|
336
347
|
|
348
|
+
def add_minute
|
349
|
+
@now = @now + (1.0/(24*60))
|
350
|
+
self
|
351
|
+
end
|
352
|
+
|
337
353
|
def add_five_minutes
|
338
354
|
@now = @now + (1.0/(24*60)*5)
|
339
355
|
self
|
@@ -31,9 +31,9 @@ module PactBroker
|
|
31
31
|
execution_configuration = webhook_options[:webhook_execution_configuration]
|
32
32
|
.with_webhook_context(provider_version_tags: verification.provider_version_tag_names)
|
33
33
|
|
34
|
-
|
34
|
+
webhook_trigger_service.trigger_webhooks_for_verification_results_publication(
|
35
|
+
pact,
|
35
36
|
verification,
|
36
|
-
PactBroker::Webhooks::WebhookEvent::VERIFICATION_PUBLISHED,
|
37
37
|
webhook_options.deep_merge(webhook_execution_configuration: execution_configuration)
|
38
38
|
)
|
39
39
|
verification
|
data/lib/pact_broker/version.rb
CHANGED
@@ -29,6 +29,31 @@ module PactBroker
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
+
def trigger_webhooks_for_verification_results_publication(pact, verification, webhook_options)
|
33
|
+
if verification.success
|
34
|
+
webhook_service.trigger_webhooks(
|
35
|
+
pact,
|
36
|
+
verification,
|
37
|
+
PactBroker::Webhooks::WebhookEvent::VERIFICATION_SUCCEEDED,
|
38
|
+
webhook_options
|
39
|
+
)
|
40
|
+
else
|
41
|
+
webhook_service.trigger_webhooks(
|
42
|
+
pact,
|
43
|
+
verification,
|
44
|
+
PactBroker::Webhooks::WebhookEvent::VERIFICATION_FAILED,
|
45
|
+
webhook_options
|
46
|
+
)
|
47
|
+
end
|
48
|
+
|
49
|
+
webhook_service.trigger_webhooks(
|
50
|
+
pact,
|
51
|
+
verification,
|
52
|
+
PactBroker::Webhooks::WebhookEvent::VERIFICATION_PUBLISHED,
|
53
|
+
webhook_options
|
54
|
+
)
|
55
|
+
end
|
56
|
+
|
32
57
|
private
|
33
58
|
|
34
59
|
def pact_is_new_or_newly_tagged_or_pact_has_changed_since_previous_version? pact
|
@@ -8,11 +8,11 @@ module PactBroker
|
|
8
8
|
CONTRACT_PUBLISHED = 'contract_published'
|
9
9
|
CONTRACT_CONTENT_CHANGED = 'contract_content_changed'
|
10
10
|
VERIFICATION_PUBLISHED = 'provider_verification_published'
|
11
|
+
VERIFICATION_SUCCEEDED = 'provider_verification_succeeded'
|
12
|
+
VERIFICATION_FAILED = 'provider_verification_failed'
|
11
13
|
DEFAULT_EVENT_NAME = CONTRACT_CONTENT_CHANGED
|
12
|
-
#CONTRACT_VERIFIABLE_CONTENT_CHANGED = 'contract_verifiable_content_changed'
|
13
|
-
#VERIFICATION_STATUS_CHANGED = 'verification_status_changed'
|
14
14
|
|
15
|
-
EVENT_NAMES = [CONTRACT_PUBLISHED, CONTRACT_CONTENT_CHANGED, VERIFICATION_PUBLISHED]
|
15
|
+
EVENT_NAMES = [CONTRACT_PUBLISHED, CONTRACT_CONTENT_CHANGED, VERIFICATION_PUBLISHED, VERIFICATION_FAILED]
|
16
16
|
|
17
17
|
dataset_module do
|
18
18
|
include PactBroker::Repositories::Helpers
|
@@ -30,6 +30,13 @@ module PactBroker
|
|
30
30
|
name == VERIFICATION_PUBLISHED
|
31
31
|
end
|
32
32
|
|
33
|
+
def provider_verification_succeeded?
|
34
|
+
name == VERIFICATION_SUCCEEDED
|
35
|
+
end
|
36
|
+
|
37
|
+
def provider_verification_failed?
|
38
|
+
name == VERIFICATION_FAILED
|
39
|
+
end
|
33
40
|
end
|
34
41
|
|
35
42
|
WebhookEvent.plugin :timestamps, update_on_create: true
|
data/script/seed.rb
CHANGED
@@ -42,9 +42,17 @@ webhook_body = {
|
|
42
42
|
'githubVerificationStatus' => '${pactbroker.githubVerificationStatus}'
|
43
43
|
}
|
44
44
|
|
45
|
+
# .create_global_webhook(
|
46
|
+
# method: 'POST',
|
47
|
+
# url: "http://localhost:9292/pact-changed-webhook",
|
48
|
+
# body: webhook_body.to_json,
|
49
|
+
# username: "foo",
|
50
|
+
# password: "bar")
|
45
51
|
TestDataBuilder.new
|
46
|
-
.
|
47
|
-
|
52
|
+
.create_global_verification_succeeded_webhook(
|
53
|
+
method: 'POST',
|
54
|
+
url: "http://localhost:9292/verification-published-webhook",
|
55
|
+
body: webhook_body.to_json)
|
48
56
|
# .create_certificate(path: 'spec/fixtures/certificates/self-signed.badssl.com.pem')
|
49
57
|
# .create_consumer("Bethtest")
|
50
58
|
# .create_verification_webhook(method: 'GET', url: "http://localhost:9292", body: webhook_body, username: "foo", password: "bar", headers: {"Accept" => "application/json"})
|
@@ -1,4 +1,10 @@
|
|
1
1
|
RSpec.describe "the lifecycle of a WIP pact" do
|
2
|
+
before do
|
3
|
+
td.set_now(DateTime.now - 100)
|
4
|
+
.create_provider("Bar")
|
5
|
+
.create_provider_version("1")
|
6
|
+
.create_provider_version_tag("master")
|
7
|
+
end
|
2
8
|
let(:pact_content_1) { { interactions: [{ some: 'interaction'}] }.to_json }
|
3
9
|
let(:pact_content_2) { { interactions: [{ some: 'other interaction'}] }.to_json }
|
4
10
|
let(:request_headers) { { "CONTENT_TYPE" => "application/json", "HTTP_ACCEPT" => "application/hal+json"} }
|
@@ -122,7 +128,6 @@ RSpec.describe "the lifecycle of a WIP pact" do
|
|
122
128
|
verification_results_url = verification_results_url_from(pact_response)
|
123
129
|
publish_verification_results_with_tag_master(verification_results_url, successful_verification_results)
|
124
130
|
|
125
|
-
|
126
131
|
# ANOTHER PROVIDER BUILD 2
|
127
132
|
# get pacts for verification
|
128
133
|
# publish successful verification results
|
@@ -131,8 +136,6 @@ RSpec.describe "the lifecycle of a WIP pact" do
|
|
131
136
|
expect(wip_pacts_from(pacts_for_verification_response).size).to eq 0
|
132
137
|
end
|
133
138
|
end
|
134
|
-
|
135
|
-
end
|
136
|
-
|
139
|
+
end
|
137
140
|
end
|
138
141
|
end
|
@@ -6,15 +6,23 @@ module PactBroker
|
|
6
6
|
describe VerifiablePactDecorator do
|
7
7
|
before do
|
8
8
|
allow(decorator).to receive(:pact_version_url).and_return('/pact-version-url')
|
9
|
-
allow_any_instance_of(PactBroker::Pacts::VerifiablePactMessages).to receive(:inclusion_reason).and_return("
|
10
|
-
allow_any_instance_of(PactBroker::Pacts::VerifiablePactMessages).to receive(:pending_reason).and_return(
|
9
|
+
allow_any_instance_of(PactBroker::Pacts::VerifiablePactMessages).to receive(:inclusion_reason).and_return("the inclusion reason")
|
10
|
+
allow_any_instance_of(PactBroker::Pacts::VerifiablePactMessages).to receive(:pending_reason).and_return(pending_reason)
|
11
11
|
end
|
12
|
+
let(:pending_reason) { "the pending reason" }
|
12
13
|
let(:expected_hash) do
|
13
14
|
{
|
14
15
|
"verificationProperties" => {
|
15
16
|
"pending" => true,
|
16
|
-
"
|
17
|
-
|
17
|
+
"notices" => [
|
18
|
+
{
|
19
|
+
"text" => "the inclusion reason"
|
20
|
+
}, {
|
21
|
+
"text" => pending_reason
|
22
|
+
}
|
23
|
+
],
|
24
|
+
"pendingReason" => pending_reason,
|
25
|
+
"inclusionReason" => "the inclusion reason"
|
18
26
|
},
|
19
27
|
"_links" => {
|
20
28
|
"self" => {
|
@@ -55,6 +63,7 @@ module PactBroker
|
|
55
63
|
|
56
64
|
context "when include_pending_status is false" do
|
57
65
|
let(:include_pending_status) { false }
|
66
|
+
let(:notices) { subject['verificationProperties']['notices'].collect{ | notice | notice['text'] } }
|
58
67
|
|
59
68
|
it "does not include the pending flag" do
|
60
69
|
expect(subject['verificationProperties']).to_not have_key('pending')
|
@@ -62,6 +71,7 @@ module PactBroker
|
|
62
71
|
|
63
72
|
it "does not include the pending reason" do
|
64
73
|
expect(subject['verificationProperties']).to_not have_key('pendingReason')
|
74
|
+
expect(notices).to_not include(pending_reason)
|
65
75
|
end
|
66
76
|
end
|
67
77
|
|
@@ -39,7 +39,13 @@ module PactBroker
|
|
39
39
|
|
40
40
|
context "when the latest pact for a tag has been successfully verified by one of the given provider tags, but not the other" do
|
41
41
|
before do
|
42
|
-
td.
|
42
|
+
td.create_provider("bar")
|
43
|
+
.create_provider_version("44")
|
44
|
+
.create_provider_version_tag("feat-1")
|
45
|
+
.add_day
|
46
|
+
.create_consumer("foo")
|
47
|
+
.create_consumer_version("1")
|
48
|
+
.create_pact
|
43
49
|
.create_consumer_version_tag("prod")
|
44
50
|
.create_verification(provider_version: "3", tag_names: %w[dev], comment: "not included because already verified")
|
45
51
|
end
|
@@ -57,7 +63,11 @@ module PactBroker
|
|
57
63
|
|
58
64
|
context "when the latest pact for a tag has failed verification from the specified provider version" do
|
59
65
|
before do
|
60
|
-
td.
|
66
|
+
td.create_provider("bar")
|
67
|
+
.create_provider_version("333")
|
68
|
+
.create_provider_version_tag("dev")
|
69
|
+
.add_day
|
70
|
+
.create_pact_with_hierarchy("foo", "1", "bar")
|
61
71
|
.create_consumer_version_tag("feat-1")
|
62
72
|
.create_verification(provider_version: "3", success: false, tag_names: %[dev])
|
63
73
|
end
|
@@ -84,7 +94,11 @@ module PactBroker
|
|
84
94
|
|
85
95
|
context "when the latest pact for a tag has successful and failed verifications" do
|
86
96
|
before do
|
87
|
-
td.
|
97
|
+
td.create_provider("bar")
|
98
|
+
.create_provider_version("333")
|
99
|
+
.create_provider_version_tag("dev")
|
100
|
+
.add_day
|
101
|
+
.create_pact_with_hierarchy("foo", "1", "bar")
|
88
102
|
.create_consumer_version_tag("dev")
|
89
103
|
.create_verification(provider_version: "3", success: true, tag_names: %[dev])
|
90
104
|
.create_verification(provider_version: "5", success: false, number: 2, tag_names: %[dev])
|
@@ -97,8 +111,12 @@ module PactBroker
|
|
97
111
|
|
98
112
|
context "when the latest pact for a tag has not been verified" do
|
99
113
|
before do
|
100
|
-
td.
|
101
|
-
.
|
114
|
+
td.create_provider("bar")
|
115
|
+
.create_provider_version("333")
|
116
|
+
.create_provider_version_tag("dev")
|
117
|
+
.add_day
|
118
|
+
.create_pact_with_hierarchy("foo", "1", "bar")
|
119
|
+
.create_consumer_version_tag("feat-1")
|
102
120
|
end
|
103
121
|
|
104
122
|
it "is included" do
|
@@ -123,7 +141,11 @@ module PactBroker
|
|
123
141
|
|
124
142
|
context "when the pact was published before the specified include_wip_pacts_since" do
|
125
143
|
before do
|
126
|
-
td.
|
144
|
+
td.create_provider("bar")
|
145
|
+
.create_provider_version("333")
|
146
|
+
.create_provider_version_tag("dev")
|
147
|
+
.add_day
|
148
|
+
.create_pact_with_hierarchy("foo", "1", "bar")
|
127
149
|
.create_consumer_version_tag("prod")
|
128
150
|
end
|
129
151
|
|
@@ -133,6 +155,51 @@ module PactBroker
|
|
133
155
|
expect(subject.size).to be 0
|
134
156
|
end
|
135
157
|
end
|
158
|
+
|
159
|
+
context "when the first provider tag with a given name was created after the head pact was created" do
|
160
|
+
before do
|
161
|
+
td.create_pact_with_hierarchy("foo", "1", "bar")
|
162
|
+
.create_consumer_version_tag("feat-x")
|
163
|
+
.add_day
|
164
|
+
.create_provider_version("5")
|
165
|
+
.create_provider_version_tag(provider_tags.first)
|
166
|
+
end
|
167
|
+
|
168
|
+
it "doesn't return any pacts" do
|
169
|
+
expect(subject.size).to be 0
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
context "when the provider tag does not exist yet" do
|
174
|
+
before do
|
175
|
+
td.create_pact_with_hierarchy("foo", "1", "bar")
|
176
|
+
.create_consumer_version_tag("feat-x")
|
177
|
+
end
|
178
|
+
|
179
|
+
it "doesn't return any pacts" do
|
180
|
+
expect(subject.size).to be 0
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
context "when a pact was published between the first creation date of two provider tags" do
|
185
|
+
let(:provider_tags) { %w[dev feat-1] }
|
186
|
+
|
187
|
+
before do
|
188
|
+
td.create_provider("bar")
|
189
|
+
.create_provider_version("4")
|
190
|
+
.create_provider_version_tag(provider_tags.first)
|
191
|
+
.add_day
|
192
|
+
.create_pact_with_hierarchy("foo", "1", "bar")
|
193
|
+
.create_consumer_version_tag("feat-x")
|
194
|
+
.add_day
|
195
|
+
.create_provider_version("5")
|
196
|
+
.create_provider_version_tag(provider_tags.last)
|
197
|
+
end
|
198
|
+
|
199
|
+
it "is wip for the first tag but not the second" do
|
200
|
+
expect(subject.first.pending_provider_tags).to eq [provider_tags.first]
|
201
|
+
end
|
202
|
+
end
|
136
203
|
end
|
137
204
|
end
|
138
205
|
end
|
@@ -158,7 +158,11 @@ module PactBroker
|
|
158
158
|
|
159
159
|
describe "find_for_verification integration test" do
|
160
160
|
before do
|
161
|
-
td.
|
161
|
+
td.create_provider("Bar")
|
162
|
+
.create_provider_version
|
163
|
+
.create_provider_version_tag("master")
|
164
|
+
.add_minute
|
165
|
+
.create_pact_with_hierarchy("Foo", "1", "Bar")
|
162
166
|
.create_consumer_version_tag("feat-1", comment: "latest for feat-1")
|
163
167
|
.create_consumer_version("2")
|
164
168
|
.create_pact(comment: "overall latest")
|
@@ -189,6 +193,7 @@ module PactBroker
|
|
189
193
|
include_wip_pacts_since: (Date.today - 1).to_datetime
|
190
194
|
}
|
191
195
|
end
|
196
|
+
|
192
197
|
it "returns the WIP pacts as well as the specified pacts" do
|
193
198
|
expect(subject.size).to eq 2
|
194
199
|
expect(subject.last.consumer_version_number).to eq "1"
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'pact_broker/verifications/service'
|
2
2
|
require 'pact_broker/verifications/repository'
|
3
3
|
require 'pact_broker/webhooks/execution_configuration'
|
4
|
+
require 'pact_broker/webhooks/trigger_service'
|
4
5
|
|
5
6
|
module PactBroker
|
6
7
|
|
@@ -16,7 +17,7 @@ module PactBroker
|
|
16
17
|
|
17
18
|
describe "#create" do
|
18
19
|
before do
|
19
|
-
allow(PactBroker::Webhooks::
|
20
|
+
allow(PactBroker::Webhooks::TriggerService).to receive(:trigger_webhooks_for_verification_results_publication)
|
20
21
|
allow(webhook_execution_configuration).to receive(:with_webhook_context).and_return(webhook_execution_configuration)
|
21
22
|
end
|
22
23
|
|
@@ -61,10 +62,9 @@ module PactBroker
|
|
61
62
|
|
62
63
|
it "invokes the webhooks for the verification" do
|
63
64
|
verification = create_verification
|
64
|
-
expect(PactBroker::Webhooks::
|
65
|
+
expect(PactBroker::Webhooks::TriggerService).to have_received(:trigger_webhooks_for_verification_results_publication).with(
|
65
66
|
pact,
|
66
67
|
verification,
|
67
|
-
PactBroker::Webhooks::WebhookEvent::VERIFICATION_PUBLISHED,
|
68
68
|
options
|
69
69
|
)
|
70
70
|
end
|
@@ -136,6 +136,39 @@ module PactBroker
|
|
136
136
|
include_examples "not triggering a contract_content_changed event"
|
137
137
|
end
|
138
138
|
end
|
139
|
+
|
140
|
+
describe "#trigger_webhooks_for_verification_results_publication" do
|
141
|
+
let(:verification) { double("verification", success: success) }
|
142
|
+
let(:success) { true }
|
143
|
+
|
144
|
+
subject { TriggerService.trigger_webhooks_for_verification_results_publication(pact, verification, webhook_options) }
|
145
|
+
|
146
|
+
context "when the verification is successful" do
|
147
|
+
it "triggers a provider_verification_succeeded webhook" do
|
148
|
+
expect(webhook_service).to receive(:trigger_webhooks).with(pact, verification, PactBroker::Webhooks::WebhookEvent::VERIFICATION_SUCCEEDED, webhook_options)
|
149
|
+
subject
|
150
|
+
end
|
151
|
+
|
152
|
+
it "triggers a provider_verification_published webhook" do
|
153
|
+
expect(webhook_service).to receive(:trigger_webhooks).with(pact, verification, PactBroker::Webhooks::WebhookEvent::VERIFICATION_PUBLISHED, webhook_options)
|
154
|
+
subject
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
context "when the verification is not successful" do
|
159
|
+
let(:success) { false }
|
160
|
+
|
161
|
+
it "triggers a provider_verification_failed webhook" do
|
162
|
+
expect(webhook_service).to receive(:trigger_webhooks).with(pact, verification, PactBroker::Webhooks::WebhookEvent::VERIFICATION_FAILED, webhook_options)
|
163
|
+
subject
|
164
|
+
end
|
165
|
+
|
166
|
+
it "triggeres a provider_verification_published webhook" do
|
167
|
+
expect(webhook_service).to receive(:trigger_webhooks).with(pact, verification, PactBroker::Webhooks::WebhookEvent::VERIFICATION_PUBLISHED, webhook_options)
|
168
|
+
subject
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
139
172
|
end
|
140
173
|
end
|
141
174
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pact_broker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.42.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bethany Skurrie
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2019-12-
|
13
|
+
date: 2019-12-05 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: httparty
|