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
@@ -25,7 +25,15 @@ module PactBroker
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def description
|
28
|
-
|
28
|
+
if consumer && provider
|
29
|
+
"A webhook for the pact between #{consumer.name} and #{provider.name}"
|
30
|
+
elsif provider
|
31
|
+
"A webhook for all pacts with provider #{provider.name}"
|
32
|
+
elsif consumer
|
33
|
+
"A webhook for all pacts with consumer #{consumer.name}"
|
34
|
+
else
|
35
|
+
"A webhook for all pacts"
|
36
|
+
end
|
29
37
|
end
|
30
38
|
|
31
39
|
def request_description
|
@@ -34,11 +42,11 @@ module PactBroker
|
|
34
42
|
|
35
43
|
def execute pact, verification, options
|
36
44
|
logger.info "Executing #{self}"
|
37
|
-
request.
|
45
|
+
request.build(pact: pact, verification: verification).execute(options)
|
38
46
|
end
|
39
47
|
|
40
48
|
def to_s
|
41
|
-
"webhook for consumer=#{consumer_name} provider=#{provider_name} uuid=#{uuid}
|
49
|
+
"webhook for consumer=#{consumer_name} provider=#{provider_name} uuid=#{uuid}"
|
42
50
|
end
|
43
51
|
|
44
52
|
def consumer_name
|
@@ -48,6 +56,14 @@ module PactBroker
|
|
48
56
|
def provider_name
|
49
57
|
provider && provider.name
|
50
58
|
end
|
59
|
+
|
60
|
+
def trigger_on_contract_content_changed?
|
61
|
+
events.any?(&:contract_content_changed?)
|
62
|
+
end
|
63
|
+
|
64
|
+
def trigger_on_provider_verification_published?
|
65
|
+
events.any?(&:provider_verification_published?)
|
66
|
+
end
|
51
67
|
end
|
52
68
|
end
|
53
69
|
end
|
@@ -4,7 +4,8 @@ module PactBroker
|
|
4
4
|
|
5
5
|
class WebhookExecutionResult
|
6
6
|
|
7
|
-
def initialize response, logs, error = nil
|
7
|
+
def initialize request, response, logs, error = nil
|
8
|
+
@request = request
|
8
9
|
@response = response
|
9
10
|
@logs = logs
|
10
11
|
@error = error
|
@@ -14,6 +15,10 @@ module PactBroker
|
|
14
15
|
!@response.nil? && @response.code.to_i < 300
|
15
16
|
end
|
16
17
|
|
18
|
+
def request
|
19
|
+
@request
|
20
|
+
end
|
21
|
+
|
17
22
|
def response
|
18
23
|
@response
|
19
24
|
end
|
@@ -8,18 +8,47 @@ require 'pact_broker/webhooks/render'
|
|
8
8
|
require 'pact_broker/api/pact_broker_urls'
|
9
9
|
require 'pact_broker/build_http_options'
|
10
10
|
require 'cgi'
|
11
|
+
require 'delegate'
|
11
12
|
|
12
13
|
module PactBroker
|
13
14
|
|
14
15
|
module Domain
|
15
16
|
|
16
17
|
class WebhookRequestError < StandardError
|
17
|
-
|
18
18
|
def initialize message, response
|
19
19
|
super message
|
20
20
|
@response = response
|
21
21
|
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class WebhookResponseWithUtf8SafeBody < SimpleDelegator
|
25
|
+
def body
|
26
|
+
if unsafe_body
|
27
|
+
unsafe_body.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
|
28
|
+
else
|
29
|
+
unsafe_body
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def unsafe_body
|
34
|
+
__getobj__().body
|
35
|
+
end
|
22
36
|
|
37
|
+
def unsafe_body?
|
38
|
+
unsafe_body != body
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class WebhookRequestWithRedactedHeaders < SimpleDelegator
|
43
|
+
def to_hash
|
44
|
+
__getobj__().to_hash.each_with_object({}) do | (key, values), new_hash |
|
45
|
+
new_hash[key] = redact?(key) ? ["**********"] : values
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def redact? name
|
50
|
+
WebhookRequest::HEADERS_TO_REDACT.any?{ | pattern | name =~ pattern }
|
51
|
+
end
|
23
52
|
end
|
24
53
|
|
25
54
|
class WebhookRequest
|
@@ -45,7 +74,7 @@ module PactBroker
|
|
45
74
|
end
|
46
75
|
|
47
76
|
def description
|
48
|
-
"#{method.upcase} #{URI(url
|
77
|
+
"#{method.upcase} #{URI(url).host}"
|
49
78
|
end
|
50
79
|
|
51
80
|
def display_password
|
@@ -59,66 +88,72 @@ module PactBroker
|
|
59
88
|
end
|
60
89
|
end
|
61
90
|
|
62
|
-
def execute
|
63
|
-
|
64
|
-
|
91
|
+
def execute options = {}
|
92
|
+
@options = options
|
93
|
+
@logs = StringIO.new
|
94
|
+
@execution_logger = Logger.new(logs)
|
65
95
|
begin
|
66
|
-
execute_and_build_result
|
96
|
+
execute_and_build_result
|
67
97
|
rescue StandardError => e
|
68
|
-
handle_error_and_build_result(e
|
98
|
+
handle_error_and_build_result(e)
|
69
99
|
end
|
70
100
|
end
|
71
101
|
|
72
102
|
private
|
73
103
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
104
|
+
attr_reader :options, :execution_logger, :logs
|
105
|
+
|
106
|
+
def execute_and_build_result
|
107
|
+
log_request
|
108
|
+
response = do_request
|
109
|
+
log_response(response)
|
110
|
+
result = WebhookExecutionResult.new(WebhookRequestWithRedactedHeaders.new(http_request), response, logs.string)
|
111
|
+
log_completion_message(result.success?)
|
81
112
|
result
|
82
113
|
end
|
83
114
|
|
84
|
-
def handle_error_and_build_result e
|
85
|
-
log_error(e
|
86
|
-
log_completion_message(
|
87
|
-
WebhookExecutionResult.new(nil, logs.string, e)
|
115
|
+
def handle_error_and_build_result e
|
116
|
+
log_error(e)
|
117
|
+
log_completion_message(false)
|
118
|
+
WebhookExecutionResult.new(WebhookRequestWithRedactedHeaders.new(http_request), nil, logs.string, e)
|
88
119
|
end
|
89
120
|
|
90
|
-
def
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
req[name] = value
|
98
|
-
end
|
99
|
-
|
100
|
-
req.basic_auth(username, password) if username
|
101
|
-
|
102
|
-
unless body.nil?
|
103
|
-
req.body = PactBroker::Webhooks::Render.call(String === body ? body : body.to_json, pact, verification)
|
121
|
+
def http_request
|
122
|
+
@http_request ||= begin
|
123
|
+
req = Net::HTTP.const_get(method.capitalize).new(url)
|
124
|
+
headers.each_pair { | name, value | req[name] = value }
|
125
|
+
req.basic_auth(username, password) if username
|
126
|
+
req.body = body unless body.nil?
|
127
|
+
req
|
104
128
|
end
|
105
|
-
|
106
|
-
execution_logger.info(req.body) if req.body
|
107
|
-
req
|
108
129
|
end
|
109
130
|
|
110
|
-
def do_request
|
111
|
-
logger.info "Making webhook #{uuid} request #{to_s}"
|
131
|
+
def do_request
|
112
132
|
options = PactBroker::BuildHttpOptions.call(uri)
|
113
|
-
|
133
|
+
req = http_request
|
134
|
+
response = Net::HTTP.start(uri.hostname, uri.port, :ENV, options) do |http|
|
114
135
|
http.request req
|
115
136
|
end
|
137
|
+
WebhookResponseWithUtf8SafeBody.new(response)
|
116
138
|
end
|
117
139
|
|
118
|
-
def
|
140
|
+
def log_request
|
141
|
+
redacted_request = WebhookRequestWithRedactedHeaders.new(http_request)
|
142
|
+
logger.info "Making webhook #{uuid} request #{http_method.upcase} URI=#{uri} (headers and body in debug logs)"
|
143
|
+
logger.debug "Webhook #{uuid} request headers=#{redacted_request.to_hash}"
|
144
|
+
logger.debug "Webhook #{uuid} request body=#{redacted_request.body}"
|
145
|
+
|
146
|
+
execution_logger.info "HTTP/1.1 #{http_method.upcase} #{url}"
|
147
|
+
redacted_request.to_hash.each do | name, value |
|
148
|
+
execution_logger.info "#{name}: #{value.join(", ")}"
|
149
|
+
end
|
150
|
+
execution_logger.info(body) if body
|
151
|
+
end
|
152
|
+
|
153
|
+
def log_response response
|
119
154
|
log_response_to_application_logger(response)
|
120
155
|
if options[:show_response]
|
121
|
-
log_response_to_execution_logger(response
|
156
|
+
log_response_to_execution_logger(response)
|
122
157
|
else
|
123
158
|
execution_logger.info response_body_hidden_message
|
124
159
|
end
|
@@ -129,29 +164,26 @@ module PactBroker
|
|
129
164
|
end
|
130
165
|
|
131
166
|
def log_response_to_application_logger response
|
132
|
-
logger.info "Received response for webhook #{uuid} status=#{response.code}"
|
133
|
-
logger.debug "headers=#{response.to_hash}"
|
134
|
-
logger.debug "body=#{response.
|
167
|
+
logger.info "Received response for webhook #{uuid} status=#{response.code} (headers and body in debug logs)"
|
168
|
+
logger.debug "Webhook #{uuid} response headers=#{response.to_hash} "
|
169
|
+
logger.debug "Webhook #{uuid} response body=#{response.unsafe_body}"
|
135
170
|
end
|
136
171
|
|
137
|
-
def log_response_to_execution_logger response
|
172
|
+
def log_response_to_execution_logger response
|
138
173
|
execution_logger.info "HTTP/#{response.http_version} #{response.code} #{response.message}"
|
139
|
-
response.each_header do |
|
140
|
-
execution_logger.info "#{
|
174
|
+
response.each_header do | name, value |
|
175
|
+
execution_logger.info "#{name}: #{value}"
|
141
176
|
end
|
142
177
|
|
143
|
-
safe_body = nil
|
144
|
-
|
145
178
|
if response.body
|
146
|
-
|
147
|
-
if response.body != safe_body
|
179
|
+
if response.unsafe_body?
|
148
180
|
execution_logger.debug "Note that invalid UTF-8 byte sequences were removed from response body before saving the logs"
|
149
181
|
end
|
182
|
+
execution_logger.info response.body
|
150
183
|
end
|
151
|
-
execution_logger.info safe_body
|
152
184
|
end
|
153
185
|
|
154
|
-
def log_completion_message
|
186
|
+
def log_completion_message success
|
155
187
|
if options[:success_log_message] && success
|
156
188
|
execution_logger.info(options[:success_log_message])
|
157
189
|
logger.info(options[:success_log_message])
|
@@ -163,7 +195,7 @@ module PactBroker
|
|
163
195
|
end
|
164
196
|
end
|
165
197
|
|
166
|
-
def log_error e
|
198
|
+
def log_error e
|
167
199
|
logger.error "Error executing webhook #{uuid} #{e.class.name} - #{e.message} #{e.backtrace.join("\n")}"
|
168
200
|
|
169
201
|
if options[:show_response]
|
@@ -177,18 +209,8 @@ module PactBroker
|
|
177
209
|
"#{method.upcase} #{url}, username=#{username}, password=#{display_password}, headers=#{redacted_headers}, body=#{body}"
|
178
210
|
end
|
179
211
|
|
180
|
-
def
|
181
|
-
|
182
|
-
end
|
183
|
-
|
184
|
-
def build_uri(pact, verification)
|
185
|
-
URI(PactBroker::Webhooks::Render.call(url, pact, verification){ | value | CGI::escape(value)} )
|
186
|
-
end
|
187
|
-
|
188
|
-
def url_with_credentials pact, verification
|
189
|
-
u = build_uri(pact, verification)
|
190
|
-
u.userinfo = "#{CGI::escape username}:#{display_password}" if username
|
191
|
-
u
|
212
|
+
def uri
|
213
|
+
@uri ||= URI(url)
|
192
214
|
end
|
193
215
|
end
|
194
216
|
end
|
@@ -8,6 +8,7 @@ en:
|
|
8
8
|
name_in_path_matches_name_in_pact?: "does not match %{left} name in path ('%{right}')."
|
9
9
|
valid_consumer_version_number?: "Consumer version number '%{value}' cannot be parsed to a version number. The expected format (unless this configuration has been overridden) is a semantic version. eg. 1.3.0 or 2.0.4.rc1"
|
10
10
|
non_templated_host?: "cannot have a template parameter in the host"
|
11
|
+
pacticipant_exists?: "does not match an existing pacticipant"
|
11
12
|
|
12
13
|
pact_broker:
|
13
14
|
messages:
|
@@ -144,7 +144,7 @@ module PactBroker
|
|
144
144
|
selectors.collect do | selector |
|
145
145
|
if selector[:tag] && selector[:latest]
|
146
146
|
version = version_repository.find_by_pacticipant_name_and_latest_tag(selector[:pacticipant_name], selector[:tag])
|
147
|
-
raise Error.new("
|
147
|
+
raise Error.new("No version of #{selector[:pacticipant_name]} found with tag #{selector[:tag]}") unless version
|
148
148
|
# validation in resource should ensure we always have a version
|
149
149
|
{
|
150
150
|
pacticipant_name: selector[:pacticipant_name],
|
@@ -152,6 +152,7 @@ module PactBroker
|
|
152
152
|
}
|
153
153
|
elsif selector[:latest]
|
154
154
|
version = version_repository.find_latest_by_pacticpant_name(selector[:pacticipant_name])
|
155
|
+
raise Error.new("No version of #{selector[:pacticipant_name]} found") unless version
|
155
156
|
{
|
156
157
|
pacticipant_name: selector[:pacticipant_name],
|
157
158
|
pacticipant_version_number: version.number
|
@@ -159,6 +160,7 @@ module PactBroker
|
|
159
160
|
elsif selector[:tag]
|
160
161
|
# validation in resource should ensure we always have at least one version
|
161
162
|
versions = version_repository.find_by_pacticipant_name_and_tag(selector[:pacticipant_name], selector[:tag])
|
163
|
+
raise Error.new("No version of #{selector[:pacticipant_name]} found with tag #{selector[:tag]}") unless versions.any?
|
162
164
|
versions.collect do | version |
|
163
165
|
{
|
164
166
|
pacticipant_name: selector[:pacticipant_name],
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'pact_broker/domain/pact'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Pacts
|
5
|
+
class PlaceholderPact < PactBroker::Domain::Pact
|
6
|
+
def initialize
|
7
|
+
consumer = OpenStruct.new(name: "placeholder-consumer")
|
8
|
+
@provider = OpenStruct.new(name: "placeholder-provider")
|
9
|
+
@consumer_version = OpenStruct.new(number: "gggghhhhjjjjkkkkllll66667777888899990000", pacticipant: consumer, tags: [OpenStruct.new(name: "master")])
|
10
|
+
@consumer_version_number = @consumer_version.number
|
11
|
+
@created_at = DateTime.now
|
12
|
+
@revision_number = 1
|
13
|
+
@pact_version_sha = "5d445a4612743728dfd99ccd4210423c052bb9db"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -121,6 +121,20 @@ module PactBroker
|
|
121
121
|
query.latest.all.collect(&:to_domain_with_content)[0]
|
122
122
|
end
|
123
123
|
|
124
|
+
# Allows optional consumer_name and provider_name
|
125
|
+
def search_for_latest_pact(consumer_name, provider_name, tag = nil)
|
126
|
+
query = LatestPactPublicationsByConsumerVersion.select_all_qualified
|
127
|
+
query = query.consumer(consumer_name) if consumer_name
|
128
|
+
query = query.provider(provider_name) if provider_name
|
129
|
+
|
130
|
+
if tag == :untagged
|
131
|
+
query = query.untagged
|
132
|
+
elsif tag
|
133
|
+
query = query.tag(tag)
|
134
|
+
end
|
135
|
+
query.latest.all.collect(&:to_domain_with_content)[0]
|
136
|
+
end
|
137
|
+
|
124
138
|
def find_pact consumer_name, consumer_version, provider_name, pact_version_sha = nil
|
125
139
|
query = if pact_version_sha
|
126
140
|
AllPactPublications
|
@@ -17,6 +17,10 @@ module PactBroker
|
|
17
17
|
pact_repository.find_latest_pact(params[:consumer_name], params[:provider_name], params[:tag])
|
18
18
|
end
|
19
19
|
|
20
|
+
def search_for_latest_pact params
|
21
|
+
pact_repository.search_for_latest_pact(params[:consumer_name], params[:provider_name], params[:tag])
|
22
|
+
end
|
23
|
+
|
20
24
|
def find_latest_pacts
|
21
25
|
pact_repository.find_latest_pacts
|
22
26
|
end
|
@@ -108,7 +112,7 @@ module PactBroker
|
|
108
112
|
updated_pact = pact_repository.update existing_pact.id, params
|
109
113
|
|
110
114
|
if existing_pact.json_content != updated_pact.json_content
|
111
|
-
webhook_service.
|
115
|
+
webhook_service.trigger_webhooks updated_pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED
|
112
116
|
else
|
113
117
|
logger.debug "Pact has not changed since previous revision, not triggering webhooks"
|
114
118
|
end
|
@@ -127,7 +131,7 @@ module PactBroker
|
|
127
131
|
def trigger_webhooks pact
|
128
132
|
# TODO add tests for this
|
129
133
|
if pact_is_new_or_pact_has_changed_since_previous_version?(pact)
|
130
|
-
webhook_service.
|
134
|
+
webhook_service.trigger_webhooks pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED
|
131
135
|
else
|
132
136
|
logger.debug "Pact has not changed since previous version, not triggering webhooks"
|
133
137
|
end
|
@@ -93,7 +93,7 @@ module PactBroker
|
|
93
93
|
def webhook_url
|
94
94
|
url = case @relationship.webhook_status
|
95
95
|
when :none
|
96
|
-
PactBroker::Api::PactBrokerUrls.
|
96
|
+
PactBroker::Api::PactBrokerUrls.webhooks_for_consumer_and_provider_url @relationship.latest_pact.consumer, @relationship.latest_pact.provider
|
97
97
|
else
|
98
98
|
PactBroker::Api::PactBrokerUrls.webhooks_status_url @relationship.latest_pact.consumer, @relationship.latest_pact.provider
|
99
99
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module PactBroker
|
2
|
+
module Verifications
|
3
|
+
class PlaceholderVerification
|
4
|
+
attr_accessor :id, :number, :success,
|
5
|
+
:consumer_name, :provider_name, :provider_version,
|
6
|
+
:provider_version_number, :build_url,
|
7
|
+
:execution_date, :created_at, :pact_version_sha
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@provider_name = "placeholder-provider"
|
11
|
+
@consumer_name = "placeholder-consumer"
|
12
|
+
@number = 1
|
13
|
+
@success = true
|
14
|
+
@pact_version_sha = "5d445a4612743728dfd99ccd4210423c052bb9db"
|
15
|
+
tags = [OpenStruct.new(name: "master")]
|
16
|
+
@provider_version = OpenStruct.new(number: "aaaabbbbccccddddeeeeffff1111222233334444", tags: tags)
|
17
|
+
@provider_version_number = @provider_version.number
|
18
|
+
@execution_date = DateTime.now
|
19
|
+
@created_at = DateTime.now
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|