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
@@ -49,6 +49,10 @@ module PactBroker
49
49
  def content_hash
50
50
  JSON.parse(json_content, PACT_PARSING_OPTIONS)
51
51
  end
52
+
53
+ def pact_publication_id
54
+ id
55
+ end
52
56
  end
53
57
 
54
58
  end
@@ -25,7 +25,15 @@ module PactBroker
25
25
  end
26
26
 
27
27
  def description
28
- "A webhook for the pact between #{consumer.name} and #{provider.name}"
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.execute pact, verification, options
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} request=#{request}"
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.gsub(PactBroker::Webhooks::Render::TEMPLATE_PARAMETER_REGEXP, 'placeholder')).host}"
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 pact, verification, options = {}
63
- logs = StringIO.new
64
- execution_logger = Logger.new(logs)
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(pact, verification, options, logs, execution_logger)
96
+ execute_and_build_result
67
97
  rescue StandardError => e
68
- handle_error_and_build_result(e, options, logs, execution_logger)
98
+ handle_error_and_build_result(e)
69
99
  end
70
100
  end
71
101
 
72
102
  private
73
103
 
74
- def execute_and_build_result pact, verification, options, logs, execution_logger
75
- uri = build_uri(pact, verification)
76
- req = build_request(uri, pact, verification, execution_logger)
77
- response = do_request(uri, req)
78
- log_response(response, execution_logger, options)
79
- result = WebhookExecutionResult.new(response, logs.string)
80
- log_completion_message(options, execution_logger, result.success?)
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, options, logs, execution_logger
85
- log_error(e, execution_logger, options)
86
- log_completion_message(options, execution_logger, false)
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 build_request uri, pact, verification, execution_logger
91
- req = http_request(uri)
92
- execution_logger.info "HTTP/1.1 #{method.upcase} #{url_with_credentials(pact, verification)}"
93
-
94
- headers_to_log = redacted_headers
95
- headers.each_pair do | name, value |
96
- execution_logger.info "#{name}: #{headers_to_log[name]}"
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 uri, req
111
- logger.info "Making webhook #{uuid} request #{to_s}"
131
+ def do_request
112
132
  options = PactBroker::BuildHttpOptions.call(uri)
113
- Net::HTTP.start(uri.hostname, uri.port, :ENV, options) do |http|
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 log_response response, execution_logger, options
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, execution_logger)
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.body}"
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, execution_logger
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 | header |
140
- execution_logger.info "#{header.split("-").collect(&:capitalize).join('-')}: #{response[header]}"
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
- safe_body = response.body.encode('UTF-8', 'binary', invalid: :replace, undef: :replace, replace: '')
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 options, execution_logger, success
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, execution_logger, options
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 http_request(uri)
181
- Net::HTTP.const_get(method.capitalize).new(uri)
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("Could not find version with tag #{selector[:tag].inspect} for #{selector[:pacticipant_name]}") unless version
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.execute_webhooks updated_pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED
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.execute_webhooks pact, nil, PactBroker::Webhooks::WebhookEvent::CONTRACT_CONTENT_CHANGED
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.webhooks_for_pact_url @relationship.latest_pact.consumer, @relationship.latest_pact.provider
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