pact_broker 2.35.0 → 2.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -0
- data/db/migrations/000029_create_latest_tagged_pact_publications.rb +2 -0
- data/lib/pact_broker/api.rb +3 -0
- data/lib/pact_broker/api/decorators/extended_pact_decorator.rb +42 -0
- data/lib/pact_broker/api/decorators/extended_verification_decorator.rb +16 -0
- data/lib/pact_broker/api/decorators/pact_decorator.rb +6 -3
- data/lib/pact_broker/api/decorators/verification_decorator.rb +4 -0
- data/lib/pact_broker/api/pact_broker_urls.rb +12 -0
- data/lib/pact_broker/api/resources/dashboard.rb +1 -3
- data/lib/pact_broker/api/resources/index.rb +5 -0
- data/lib/pact_broker/api/resources/latest_verification_for_pact.rb +19 -0
- data/lib/pact_broker/api/resources/latest_verifications_for_consumer_version.rb +0 -1
- data/lib/pact_broker/api/resources/metrics.rb +21 -0
- data/lib/pact_broker/api/resources/pact.rb +8 -1
- data/lib/pact_broker/api/resources/pact_versions.rb +0 -1
- data/lib/pact_broker/api/resources/verification.rb +14 -1
- data/lib/pact_broker/domain/pact.rb +1 -2
- data/lib/pact_broker/domain/verification.rb +5 -3
- data/lib/pact_broker/index/service.rb +16 -1
- data/lib/pact_broker/matrix/aggregated_row.rb +14 -1
- data/lib/pact_broker/matrix/repository.rb +29 -25
- data/lib/pact_broker/matrix/resolved_selector.rb +3 -1
- data/lib/pact_broker/matrix/row.rb +6 -2
- data/lib/pact_broker/metrics/service.rb +56 -0
- data/lib/pact_broker/pacts/all_pact_publications.rb +8 -1
- data/lib/pact_broker/pacts/pact_publication.rb +9 -2
- data/lib/pact_broker/services.rb +5 -0
- data/lib/pact_broker/ui/views/index/show-with-tags.haml +2 -2
- data/lib/pact_broker/ui/views/matrix/show.haml +2 -2
- data/lib/pact_broker/verifications/repository.rb +4 -0
- data/lib/pact_broker/verifications/service.rb +4 -0
- data/lib/pact_broker/version.rb +1 -1
- data/public/javascripts/clipboard.js +2 -2
- data/spec/features/get_latest_verification_for_pact_spec.rb +42 -0
- data/spec/features/get_pact_versions_spec.rb +0 -5
- data/spec/features/metrics_spec.rb +23 -0
- data/spec/lib/pact_broker/api/decorators/extended_pact_decorator_spec.rb +61 -0
- data/spec/lib/pact_broker/api/decorators/pact_decorator_spec.rb +2 -1
- data/spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb +4 -1
- data/spec/lib/pact_broker/api/decorators/verification_summary_decorator_spec.rb +3 -1
- data/spec/lib/pact_broker/index/service_spec.rb +29 -4
- data/spec/lib/pact_broker/matrix/aggregated_row_spec.rb +23 -2
- data/spec/lib/pact_broker/matrix/deployment_status_summary_spec.rb +2 -0
- data/spec/lib/pact_broker/matrix/repository_query_limit_spec.rb +44 -0
- data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +21 -3
- metadata +15 -2
@@ -103,6 +103,7 @@ module PactBroker
|
|
103
103
|
specified_pacticipant_names.include?(consumer_name)
|
104
104
|
end
|
105
105
|
|
106
|
+
# It would be nicer to do this in the SQL, but it requires time that I don't have at the moment
|
106
107
|
def apply_latestby options, selectors, lines
|
107
108
|
return lines unless options[:latestby]
|
108
109
|
group_by_columns = case options[:latestby]
|
@@ -119,6 +120,7 @@ module PactBroker
|
|
119
120
|
.flatten
|
120
121
|
end
|
121
122
|
|
123
|
+
# It would be nicer to do this in the SQL, but it requires time that I don't have at the moment
|
122
124
|
def remove_overwritten_revisions lines
|
123
125
|
latest_revisions_keys = {}
|
124
126
|
latest_revisions = []
|
@@ -143,7 +145,7 @@ module PactBroker
|
|
143
145
|
end
|
144
146
|
|
145
147
|
def resolve_selectors(specified_selectors, options)
|
146
|
-
resolved_specified_selectors = resolve_versions_and_add_ids(specified_selectors, :specified)
|
148
|
+
resolved_specified_selectors = resolve_versions_and_add_ids(specified_selectors, :specified, options[:latestby])
|
147
149
|
if options[:latest] || options[:tag]
|
148
150
|
add_inferred_selectors(resolved_specified_selectors, options)
|
149
151
|
else
|
@@ -152,19 +154,19 @@ module PactBroker
|
|
152
154
|
end
|
153
155
|
|
154
156
|
# Find the version number for selectors with the latest and/or tag specified
|
155
|
-
def resolve_versions_and_add_ids(selectors, selector_type)
|
157
|
+
def resolve_versions_and_add_ids(selectors, selector_type, latestby)
|
156
158
|
selectors.collect do | selector |
|
157
159
|
pacticipant = PactBroker::Domain::Pacticipant.find(name: selector[:pacticipant_name])
|
158
160
|
versions = find_versions_for_selector(selector)
|
159
|
-
build_selectors_for_pacticipant_and_versions(pacticipant, versions, selector, selector_type)
|
161
|
+
build_selectors_for_pacticipant_and_versions(pacticipant, versions, selector, selector_type, latestby)
|
160
162
|
end.flatten
|
161
163
|
end
|
162
164
|
|
163
|
-
def build_selectors_for_pacticipant_and_versions(pacticipant, versions, original_selector, selector_type)
|
165
|
+
def build_selectors_for_pacticipant_and_versions(pacticipant, versions, original_selector, selector_type, latestby)
|
164
166
|
if versions
|
165
167
|
versions.collect do | version |
|
166
168
|
if version
|
167
|
-
selector_for_version(pacticipant, version, original_selector, selector_type)
|
169
|
+
selector_for_version(pacticipant, version, original_selector, selector_type, latestby)
|
168
170
|
else
|
169
171
|
selector_for_non_existing_version(pacticipant, original_selector, selector_type)
|
170
172
|
end
|
@@ -192,23 +194,6 @@ module PactBroker
|
|
192
194
|
end
|
193
195
|
end
|
194
196
|
|
195
|
-
def add_ids_to_selector(selector)
|
196
|
-
if selector[:pacticipant_name]
|
197
|
-
pacticipant = PactBroker::Domain::Pacticipant.find(name: selector[:pacticipant_name])
|
198
|
-
selector[:pacticipant_id] = pacticipant ? pacticipant.id : nil
|
199
|
-
end
|
200
|
-
|
201
|
-
if selector[:pacticipant_name] && selector[:pacticipant_version_number] && !selector[:pacticipant_version_id]
|
202
|
-
version = version_repository.find_by_pacticipant_name_and_number(selector[:pacticipant_name], selector[:pacticipant_version_number])
|
203
|
-
selector[:pacticipant_version_id] = version ? version.id : nil
|
204
|
-
end
|
205
|
-
|
206
|
-
if !selector.key?(:pacticipant_version_id)
|
207
|
-
selector[:pacticipant_version_id] = nil
|
208
|
-
end
|
209
|
-
selector
|
210
|
-
end
|
211
|
-
|
212
197
|
# When only one selector is specified, (eg. checking to see if Foo version 2 can be deployed to prod),
|
213
198
|
# need to look up all integrated pacticipants, and determine their relevant (eg. latest prod) versions
|
214
199
|
def add_inferred_selectors(resolved_specified_selectors, options)
|
@@ -228,7 +213,7 @@ module PactBroker
|
|
228
213
|
selector[:latest] = options[:latest] if options[:latest]
|
229
214
|
selector
|
230
215
|
end
|
231
|
-
resolve_versions_and_add_ids(selectors, :inferred)
|
216
|
+
resolve_versions_and_add_ids(selectors, :inferred, options[:latestby])
|
232
217
|
end
|
233
218
|
|
234
219
|
def all_pacticipant_names_in_specified_matrix(selectors)
|
@@ -242,8 +227,27 @@ module PactBroker
|
|
242
227
|
ResolvedSelector.for_pacticipant_and_non_existing_version(pacticipant, original_selector, selector_type)
|
243
228
|
end
|
244
229
|
|
245
|
-
def selector_for_version(pacticipant, version, original_selector, selector_type)
|
246
|
-
|
230
|
+
def selector_for_version(pacticipant, version, original_selector, selector_type, latestby)
|
231
|
+
pact_publication_ids, verification_ids = nil, nil
|
232
|
+
|
233
|
+
# Querying for the "pre-filtered" pact publications and verifications directly, rather than just using the consumer
|
234
|
+
# and provider versions allows us to remove the "overwritten" pact revisions and verifications from the
|
235
|
+
# matrix result set, making the final matrix query more efficient and stopping the query limit from
|
236
|
+
# removing relevant data (eg. https://github.com/pact-foundation/pact_broker-client/issues/53)
|
237
|
+
if latestby
|
238
|
+
pact_publication_ids = PactBroker::Pacts::LatestPactPublicationsByConsumerVersion
|
239
|
+
.select(:id)
|
240
|
+
.where(consumer_version_id: version.id)
|
241
|
+
.collect{ |pact_publication| pact_publication[:id] }
|
242
|
+
|
243
|
+
verification_ids = PactBroker::Verifications::LatestVerificationIdForPactVersionAndProviderVersion
|
244
|
+
.select(:verification_id)
|
245
|
+
.distinct
|
246
|
+
.where(provider_version_id: version.id)
|
247
|
+
.collect{ |pact_publication| pact_publication[:verification_id] }
|
248
|
+
end
|
249
|
+
|
250
|
+
ResolvedSelector.for_pacticipant_and_version(pacticipant, version, pact_publication_ids, verification_ids, original_selector, selector_type)
|
247
251
|
end
|
248
252
|
|
249
253
|
def selector_without_version(pacticipant, selector_type)
|
@@ -23,11 +23,13 @@ module PactBroker
|
|
23
23
|
)
|
24
24
|
end
|
25
25
|
|
26
|
-
def self.for_pacticipant_and_version(pacticipant, version, original_selector, type)
|
26
|
+
def self.for_pacticipant_and_version(pacticipant, version, pact_publication_ids = [], verification_ids = [], original_selector, type)
|
27
27
|
ResolvedSelector.new(
|
28
28
|
pacticipant_id: pacticipant.id,
|
29
29
|
pacticipant_name: pacticipant.name,
|
30
30
|
pacticipant_version_id: version.id,
|
31
|
+
pact_publication_ids: pact_publication_ids,
|
32
|
+
verification_ids: verification_ids,
|
31
33
|
pacticipant_version_number: version.number,
|
32
34
|
latest: original_selector[:latest],
|
33
35
|
tag: original_selector[:tag],
|
@@ -67,7 +67,9 @@ module PactBroker
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def self.consumer_and_maybe_consumer_version_match_selector(s)
|
70
|
-
if s[:
|
70
|
+
if s[:pact_publication_ids]
|
71
|
+
Sequel.&(pact_publication_id: s[:pact_publication_ids])
|
72
|
+
elsif s[:pacticipant_version_id]
|
71
73
|
Sequel.&(consumer_id: s[:pacticipant_id], consumer_version_id: s[:pacticipant_version_id])
|
72
74
|
else
|
73
75
|
Sequel.&(consumer_id: s[:pacticipant_id])
|
@@ -75,7 +77,9 @@ module PactBroker
|
|
75
77
|
end
|
76
78
|
|
77
79
|
def self.provider_and_maybe_provider_version_match_selector(s)
|
78
|
-
if s[:
|
80
|
+
if s[:verification_ids]
|
81
|
+
Sequel.&(verification_id: s[:verification_ids])
|
82
|
+
elsif s[:pacticipant_version_id]
|
79
83
|
Sequel.&(provider_id: s[:pacticipant_id], provider_version_id: s[:pacticipant_version_id])
|
80
84
|
else
|
81
85
|
Sequel.&(provider_id: s[:pacticipant_id])
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'pact_broker/pacts/pact_publication'
|
2
|
+
require 'pact_broker/pacts/pact_version'
|
3
|
+
require 'pact_broker/domain/pacticipant'
|
4
|
+
require 'pact_broker/integrations/integration'
|
5
|
+
require 'pact_broker/domain/verification'
|
6
|
+
require 'pact_broker/domain/version'
|
7
|
+
require 'pact_broker/api/decorators/format_date_time'
|
8
|
+
require 'pact_broker/webhooks/webhook'
|
9
|
+
require 'pact_broker/webhooks/triggered_webhook'
|
10
|
+
require 'pact_broker/webhooks/execution'
|
11
|
+
|
12
|
+
module PactBroker
|
13
|
+
module Metrics
|
14
|
+
module Service
|
15
|
+
include PactBroker::Api::Decorators::FormatDateTime
|
16
|
+
|
17
|
+
extend self
|
18
|
+
|
19
|
+
def metrics
|
20
|
+
{
|
21
|
+
pacticipants: {
|
22
|
+
count: PactBroker::Domain::Pacticipant.count
|
23
|
+
},
|
24
|
+
integrations: {
|
25
|
+
count: PactBroker::Integrations::Integration.count
|
26
|
+
},
|
27
|
+
pactPublications: {
|
28
|
+
count: PactBroker::Pacts::PactPublication.count,
|
29
|
+
first: format_date_time(PactBroker::Pacts::PactPublication.order(:id).first&.created_at),
|
30
|
+
last: format_date_time(PactBroker::Pacts::PactPublication.order(:id).last&.created_at)
|
31
|
+
},
|
32
|
+
pactVersions: {
|
33
|
+
count: PactBroker::Pacts::PactVersion.count
|
34
|
+
},
|
35
|
+
verificationResults: {
|
36
|
+
count: PactBroker::Domain::Verification.count,
|
37
|
+
first: format_date_time(PactBroker::Domain::Verification.order(:id).first.created_at),
|
38
|
+
last: format_date_time(PactBroker::Domain::Verification.order(:id).last.created_at)
|
39
|
+
},
|
40
|
+
pacticipantVersions: {
|
41
|
+
count: PactBroker::Domain::Version.count
|
42
|
+
},
|
43
|
+
webhooks: {
|
44
|
+
count: PactBroker::Webhooks::Webhook.count
|
45
|
+
},
|
46
|
+
triggeredWebhooks: {
|
47
|
+
count: PactBroker::Webhooks::TriggeredWebhook.count
|
48
|
+
},
|
49
|
+
webhookExecutions: {
|
50
|
+
count: PactBroker::Webhooks::Execution.count
|
51
|
+
}
|
52
|
+
}
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -101,7 +101,14 @@ module PactBroker
|
|
101
101
|
consumer_version_number: consumer_version_number,
|
102
102
|
revision_number: revision_number,
|
103
103
|
pact_version_sha: pact_version_sha,
|
104
|
-
created_at: created_at
|
104
|
+
created_at: created_at,
|
105
|
+
head_tag_names: head_tag_names)
|
106
|
+
end
|
107
|
+
|
108
|
+
def head_tag_names
|
109
|
+
# Avoid circular dependency
|
110
|
+
require 'pact_broker/pacts/latest_tagged_pact_publications'
|
111
|
+
LatestTaggedPactPublications.where(id: id).select(:tag_name).collect{|t| t[:tag_name]}
|
105
112
|
end
|
106
113
|
|
107
114
|
def to_domain_with_content
|
@@ -31,10 +31,16 @@ module PactBroker
|
|
31
31
|
self.revision_number ||= 1
|
32
32
|
end
|
33
33
|
|
34
|
-
|
34
|
+
# The names of the tags for which this pact is the latest pact with that tag
|
35
|
+
# (ie. it is not necessarily the pact for the latest consumer version with the given tag)
|
36
|
+
def head_tag_names
|
35
37
|
LatestTaggedPactPublications.where(id: id).select(:tag_name).collect{|t| t[:tag_name]}
|
36
38
|
end
|
37
39
|
|
40
|
+
def consumer_version_tags
|
41
|
+
consumer_version.tags
|
42
|
+
end
|
43
|
+
|
38
44
|
def latest_verification
|
39
45
|
pact_version.latest_verification
|
40
46
|
end
|
@@ -50,7 +56,8 @@ module PactBroker
|
|
50
56
|
json_content: pact_version.content,
|
51
57
|
pact_version_sha: pact_version.sha,
|
52
58
|
latest_verification: latest_verification,
|
53
|
-
created_at: created_at
|
59
|
+
created_at: created_at,
|
60
|
+
head_tag_names: head_tag_names
|
54
61
|
)
|
55
62
|
end
|
56
63
|
|
data/lib/pact_broker/services.rb
CHANGED
@@ -41,7 +41,7 @@
|
|
41
41
|
%td.consumer-version-number
|
42
42
|
%div.clippable
|
43
43
|
= escape_html(index_item.consumer_version_number)
|
44
|
-
%button.clippy.
|
44
|
+
%button.clippy.invisible{ title: "Copy to clipboard" }
|
45
45
|
%span.glyphicon.glyphicon-copy
|
46
46
|
- if index_item.latest?
|
47
47
|
.tag.label.label-success
|
@@ -60,7 +60,7 @@
|
|
60
60
|
%td.provider-version-number
|
61
61
|
%div.clippable
|
62
62
|
= escape_html(index_item.provider_version_number)
|
63
|
-
%button.clippy.
|
63
|
+
%button.clippy.invisible{ title: "Copy to clipboard" }
|
64
64
|
%span.glyphicon.glyphicon-copy
|
65
65
|
- index_item.provider_version_latest_tag_names.each do | tag_name |
|
66
66
|
.tag.label.label-primary
|
@@ -106,7 +106,7 @@
|
|
106
106
|
%div.clippable
|
107
107
|
%a{href: line.consumer_version_number_url}
|
108
108
|
= line.display_consumer_version_number
|
109
|
-
%button.clippy.
|
109
|
+
%button.clippy.invisible{ title: "Copy to clipboard" }
|
110
110
|
%span.glyphicon.glyphicon-copy
|
111
111
|
- line.latest_consumer_version_tags.each do | tag |
|
112
112
|
.tag-parent{"title": tag.tooltip, "data-toggle": "tooltip", "data-placement": "right"}
|
@@ -132,7 +132,7 @@
|
|
132
132
|
%div.clippable
|
133
133
|
%a{href: line.provider_version_number_url}
|
134
134
|
= line.display_provider_version_number
|
135
|
-
%button.clippy.
|
135
|
+
%button.clippy.invisible{ title: "Copy to clipboard" }
|
136
136
|
%span.glyphicon.glyphicon-copy
|
137
137
|
- line.latest_provider_version_tags.each do | tag |
|
138
138
|
.tag-parent{"title": tag.tooltip, "data-toggle": "tooltip", "data-placement": "right"}
|
@@ -54,6 +54,10 @@ module PactBroker
|
|
54
54
|
.verification_number(verification_number).single_record
|
55
55
|
end
|
56
56
|
|
57
|
+
def find_latest_for_pact(pact)
|
58
|
+
PactBroker::Pacts::PactPublication.where(id: pact.id).single_record.latest_verification
|
59
|
+
end
|
60
|
+
|
57
61
|
def search_for_latest consumer_name, provider_name
|
58
62
|
query = LatestVerificationForPactVersion
|
59
63
|
.select_all_qualified
|
@@ -49,6 +49,10 @@ module PactBroker
|
|
49
49
|
verification_repository.find(params.fetch(:consumer_name), params.fetch(:provider_name), params.fetch(:pact_version_sha), params.fetch(:verification_number))
|
50
50
|
end
|
51
51
|
|
52
|
+
def find_latest_for_pact(pact)
|
53
|
+
verification_repository.find_latest_for_pact(pact)
|
54
|
+
end
|
55
|
+
|
52
56
|
def find_by_id id
|
53
57
|
PactBroker::Domain::Verification.find(id: id)
|
54
58
|
end
|
data/lib/pact_broker/version.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
* @example in Haml
|
5
5
|
* %div.clippable
|
6
6
|
* = Text to be copied
|
7
|
-
* %button.clippy.
|
7
|
+
* %button.clippy.invisible{ title: "Copy to clipboard" }
|
8
8
|
* %span.glyphicon.glyphicon-copy
|
9
9
|
*/
|
10
10
|
|
@@ -17,7 +17,7 @@ function initializeClipper(selector) {
|
|
17
17
|
const elements = $(selector);
|
18
18
|
|
19
19
|
elements.hover(function() {
|
20
|
-
$(this).children(".clippy").toggleClass("
|
20
|
+
$(this).children(".clippy").toggleClass("invisible");
|
21
21
|
});
|
22
22
|
|
23
23
|
elements
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec/support/test_data_builder'
|
2
|
+
|
3
|
+
describe "Get latest verification for pact" do
|
4
|
+
before do
|
5
|
+
td
|
6
|
+
.create_consumer("Consumer")
|
7
|
+
.create_consumer_version("1.2.3")
|
8
|
+
.create_provider("Another provider")
|
9
|
+
.create_pact
|
10
|
+
.create_verification(number: 1, provider_version: "5")
|
11
|
+
.create_provider("Provider")
|
12
|
+
.create_pact
|
13
|
+
.create_verification(number: 1, provider_version: "3")
|
14
|
+
.create_verification(number: 2, provider_version: "4")
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:last_response_body) { JSON.parse(subject.body, symbolize_names: true) }
|
18
|
+
let(:content_type) { "application/vnd.pactbrokerextended.v1+json" }
|
19
|
+
|
20
|
+
subject { get(path, nil, "HTTP_ACCEPT" => content_type) }
|
21
|
+
|
22
|
+
context "by pact version" do
|
23
|
+
let!(:path) { "/pacts/provider/Provider/consumer/Consumer/pact-version/#{td.pact.pact_version_sha}/verification-results/latest" }
|
24
|
+
|
25
|
+
it "returns a 200 OK" do
|
26
|
+
expect(subject.status).to eq 200
|
27
|
+
expect(subject.headers['Content-Type']).to include content_type
|
28
|
+
end
|
29
|
+
|
30
|
+
it "returns the verification" do
|
31
|
+
expect(last_response_body[:providerApplicationVersion]).to eq "4"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context "by consumer version" do
|
36
|
+
let(:path) { "/pacts/provider/Provider/consumer/Consumer/version/1.2.3/verification-results/latest" }
|
37
|
+
|
38
|
+
it "returns the verification" do
|
39
|
+
expect(last_response_body[:providerApplicationVersion]).to eq "4"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -1,14 +1,12 @@
|
|
1
1
|
require 'spec/support/test_data_builder'
|
2
2
|
|
3
3
|
describe "Get pact versions" do
|
4
|
-
|
5
4
|
let(:path) { "/pacts/provider/Provider/consumer/Consumer/versions" }
|
6
5
|
let(:last_response_body) { JSON.parse(subject.body, symbolize_names: true) }
|
7
6
|
|
8
7
|
subject { get path; last_response }
|
9
8
|
|
10
9
|
context "when the pacts exist" do
|
11
|
-
|
12
10
|
before do
|
13
11
|
TestDataBuilder.new
|
14
12
|
.create_provider("Provider")
|
@@ -26,14 +24,11 @@ describe "Get pact versions" do
|
|
26
24
|
it "returns a list of links to the pacts" do
|
27
25
|
expect(last_response_body[:_links][:"pact-versions"].size).to eq 2
|
28
26
|
end
|
29
|
-
|
30
27
|
end
|
31
28
|
|
32
29
|
context "when the pacts do not exist" do
|
33
|
-
|
34
30
|
it "returns a 404 response" do
|
35
31
|
expect(subject).to be_a_404_response
|
36
32
|
end
|
37
|
-
|
38
33
|
end
|
39
34
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
describe "get metrics" do
|
2
|
+
let(:path) { "/metrics"}
|
3
|
+
let(:json_response_body) { JSON.parse(subject.body, symbolize_names: true) }
|
4
|
+
|
5
|
+
subject { get(path) }
|
6
|
+
|
7
|
+
before do
|
8
|
+
TestDataBuilder.new
|
9
|
+
.create_consumer("Consumer")
|
10
|
+
.create_provider("Provider")
|
11
|
+
.create_consumer_version("1.2.3")
|
12
|
+
.create_consumer_version_tag("prod")
|
13
|
+
.create_pact
|
14
|
+
.create_verification(provider_version: "4.5.6")
|
15
|
+
.create_webhook
|
16
|
+
.create_triggered_webhook
|
17
|
+
.create_webhook_execution
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns some metrics" do
|
21
|
+
expect(json_response_body).to be_instance_of(Hash)
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'pact_broker/api/decorators/extended_pact_decorator'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Api
|
5
|
+
module Decorators
|
6
|
+
describe ExtendedPactDecorator do
|
7
|
+
before do
|
8
|
+
allow(decorator).to receive(:templated_diff_url).and_return('templated-diff-url')
|
9
|
+
allow(decorator).to receive(:verification_publication_url).and_return('verification-publication-url')
|
10
|
+
end
|
11
|
+
let(:content_hash) {
|
12
|
+
{
|
13
|
+
'consumer' => {'name' => 'Consumer'},
|
14
|
+
'provider' => {'name' => 'Provider'},
|
15
|
+
'interactions' => [],
|
16
|
+
'metadata' => {}
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
let(:base_url) { 'http://example.org' }
|
21
|
+
let(:created_at) { Time.new(2014, 3, 4) }
|
22
|
+
let(:pact) { double('pact',
|
23
|
+
content_hash: content_hash,
|
24
|
+
created_at: created_at,
|
25
|
+
consumer: consumer,
|
26
|
+
consumer_name: consumer.name,
|
27
|
+
provider: provider,
|
28
|
+
provider_name: provider.name,
|
29
|
+
consumer_version: consumer_version,
|
30
|
+
consumer_version_number: '1234',
|
31
|
+
pact_version_sha: '9999',
|
32
|
+
revision_number: 2,
|
33
|
+
name: 'A Pact',
|
34
|
+
head_tag_names: head_tag_names
|
35
|
+
)}
|
36
|
+
let(:head_tag_names) { ['prod'] }
|
37
|
+
let(:consumer) { instance_double(PactBroker::Domain::Pacticipant, name: 'A Consumer')}
|
38
|
+
let(:provider) { instance_double(PactBroker::Domain::Pacticipant, name: 'A Provider')}
|
39
|
+
let(:consumer_version) { instance_double(PactBroker::Domain::Version, number: '1234', pacticipant: consumer)}
|
40
|
+
let(:metadata) { "abcd" }
|
41
|
+
let(:decorator) { ExtendedPactDecorator.new(pact) }
|
42
|
+
let(:json) { decorator.to_json(user_options: { base_url: base_url, metadata: metadata }) }
|
43
|
+
subject { JSON.parse(json, symbolize_names: true) }
|
44
|
+
|
45
|
+
it "includes an array of tags" do
|
46
|
+
expect(subject[:_embedded][:tags].first).to include name: 'prod', latest: true
|
47
|
+
# Can't seem to stub the verification_publication_url method on the TagDecorator
|
48
|
+
expect(subject[:_embedded][:tags].first[:_links][:'pb:latest-pact'][:href]).to eq "http://example.org/pacts/provider/A%20Provider/consumer/A%20Consumer/latest/prod"
|
49
|
+
end
|
50
|
+
|
51
|
+
it "includes the pact contents under the contract key" do
|
52
|
+
expect(subject[:contract]).to eq JSON.parse(content_hash.to_json, symbolize_names: true)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "does not include the contract contents in the root" do
|
56
|
+
expect(subject).to_not have_key(:interactions)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|