pact_broker 2.23.3 → 2.23.4
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 +15 -0
- data/lib/pact_broker/api/decorators/matrix_decorator.rb +12 -17
- data/lib/pact_broker/api/decorators/provider_pacts_decorator.rb +10 -2
- data/lib/pact_broker/api/resources.rb +4 -2
- data/lib/pact_broker/api/resources/relationships.rb +1 -3
- data/lib/pact_broker/matrix/deployment_status_summary.rb +89 -0
- data/lib/pact_broker/matrix/integration.rb +54 -0
- data/lib/pact_broker/matrix/parse_query.rb +1 -1
- data/lib/pact_broker/matrix/query_results.rb +18 -0
- data/lib/pact_broker/matrix/query_results_with_deployment_status_summary.rb +14 -0
- data/lib/pact_broker/matrix/repository.rb +32 -20
- data/lib/pact_broker/matrix/service.rb +10 -3
- data/lib/pact_broker/verifications/repository.rb +4 -0
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/versions/service.rb +1 -0
- data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +22 -47
- data/spec/lib/pact_broker/api/decorators/provider_pacts_decorator_spec.rb +5 -4
- data/spec/lib/pact_broker/matrix/deployment_status_summary_spec.rb +98 -0
- data/spec/lib/pact_broker/matrix/parse_query_spec.rb +8 -0
- data/spec/lib/pact_broker/matrix/repository_find_integrations_spec.rb +51 -0
- data/spec/lib/pact_broker/matrix/repository_spec.rb +24 -0
- data/spec/lib/pact_broker/matrix/service_spec.rb +26 -0
- data/spec/lib/pact_broker/verifications/repository_spec.rb +20 -0
- data/spec/lib/pact_broker/versions/service_spec.rb +9 -1
- data/spec/support/test_data_builder.rb +4 -2
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7bd5ebfd2122389ceccb3515386666e4152c57a4
|
4
|
+
data.tar.gz: fb9817503a5f8762b7d79092abc6a7b34cf10027
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4a893b1fc19db8c348e700f2d267828c39ee8eaba41ce8e9d97101f8b7e1f7e0a1d6c5269a53ccf34737cb14b0fe5dcd450c1a02a788bad77cbdcd3ecb47a83
|
7
|
+
data.tar.gz: 0c575437f3cb2ab677a22ca8d6d29849fc5033ea2028b887c8fe6a151a06222909d81fa22146ce8fba225230fb440cae381d3845900dd1cf120db11d4cf87242
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,18 @@
|
|
1
|
+
<a name="v2.23.4"></a>
|
2
|
+
### v2.23.4 (2018-07-04)
|
3
|
+
|
4
|
+
|
5
|
+
#### Features
|
6
|
+
|
7
|
+
* deprecate provider relation in provider pacts resource in preference for pb:provider ([eda8cbf](/../../commit/eda8cbf))
|
8
|
+
|
9
|
+
|
10
|
+
#### Bug Fixes
|
11
|
+
|
12
|
+
* correct the logic for determining the deployment status in the matrix resource ([ad85db4](/../../commit/ad85db4))
|
13
|
+
* delete associated verification results when a pacticipant version is deleted ([ddec810](/../../commit/ddec810))
|
14
|
+
|
15
|
+
|
1
16
|
<a name="v2.23.3"></a>
|
2
17
|
### v2.23.3 (2018-06-27)
|
3
18
|
|
@@ -7,8 +7,8 @@ module PactBroker
|
|
7
7
|
class MatrixDecorator
|
8
8
|
include PactBroker::Api::PactBrokerUrls
|
9
9
|
|
10
|
-
def initialize(
|
11
|
-
@
|
10
|
+
def initialize(query_results_with_deployment_status_summary)
|
11
|
+
@query_results_with_deployment_status_summary = query_results_with_deployment_status_summary
|
12
12
|
end
|
13
13
|
|
14
14
|
def to_json(options)
|
@@ -21,32 +21,27 @@ module PactBroker
|
|
21
21
|
deployable: deployable,
|
22
22
|
reason: reason
|
23
23
|
},
|
24
|
-
matrix: matrix(
|
25
|
-
}
|
24
|
+
matrix: matrix(options[:user_options][:base_url])
|
25
|
+
}.tap do | hash |
|
26
|
+
hash[:summary].merge!(query_results_with_deployment_status_summary.deployment_status_summary.counts)
|
27
|
+
end
|
28
|
+
|
26
29
|
end
|
27
30
|
|
28
31
|
def deployable
|
29
|
-
|
30
|
-
return nil if lines.any?{ |line| line.success.nil? }
|
31
|
-
lines.any? && lines.all?{ |line| line.success }
|
32
|
+
query_results_with_deployment_status_summary.deployment_status_summary.deployable?
|
32
33
|
end
|
33
34
|
|
34
35
|
def reason
|
35
|
-
|
36
|
-
case deployable
|
37
|
-
when true then "All verification results are published and successful"
|
38
|
-
when false then "One or more verifications have failed"
|
39
|
-
else
|
40
|
-
"Missing one or more verification results"
|
41
|
-
end
|
36
|
+
query_results_with_deployment_status_summary.deployment_status_summary.reasons.join("\n")
|
42
37
|
end
|
43
38
|
|
44
39
|
private
|
45
40
|
|
46
|
-
attr_reader :
|
41
|
+
attr_reader :query_results_with_deployment_status_summary
|
47
42
|
|
48
|
-
def matrix(
|
49
|
-
|
43
|
+
def matrix(base_url)
|
44
|
+
query_results_with_deployment_status_summary.rows.collect do | line |
|
50
45
|
provider = OpenStruct.new(name: line.provider_name)
|
51
46
|
consumer = OpenStruct.new(name: line.consumer_name)
|
52
47
|
consumer_version = OpenStruct.new(number: line.consumer_version_number, pacticipant: consumer)
|
@@ -14,10 +14,10 @@ module PactBroker
|
|
14
14
|
}
|
15
15
|
end
|
16
16
|
|
17
|
-
link :provider do | context |
|
17
|
+
link :'pb:provider' do | context |
|
18
18
|
{
|
19
19
|
href: pacticipant_url(context[:base_url], OpenStruct.new(name: context[:provider_name])),
|
20
|
-
|
20
|
+
name: context[:provider_name]
|
21
21
|
}
|
22
22
|
end
|
23
23
|
|
@@ -32,6 +32,14 @@ module PactBroker
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
+
link :provider do | context |
|
36
|
+
{
|
37
|
+
href: pacticipant_url(context[:base_url], OpenStruct.new(name: context[:provider_name])),
|
38
|
+
title: context[:provider_name],
|
39
|
+
name: "DEPRECATED - please use the pb:provider relation"
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
35
43
|
links :'pacts' do | context |
|
36
44
|
represented.collect do | pact |
|
37
45
|
{
|
@@ -5,6 +5,8 @@ Reform::Form.class_eval do
|
|
5
5
|
feature Reform::Form::Dry
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
require 'pact_broker/api/resources/base_resource'
|
9
|
+
|
10
|
+
Dir.glob(File.expand_path(File.join(__FILE__, "..", "resources", "*.rb"))).sort.each do | path |
|
11
|
+
require path
|
10
12
|
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
module PactBroker
|
2
|
+
module Matrix
|
3
|
+
class DeploymentStatusSummary
|
4
|
+
attr_reader :rows, :resolved_selectors, :integrations
|
5
|
+
|
6
|
+
def initialize(rows, resolved_selectors, integrations)
|
7
|
+
@rows = rows
|
8
|
+
@resolved_selectors = resolved_selectors
|
9
|
+
@integrations = integrations
|
10
|
+
end
|
11
|
+
|
12
|
+
def counts
|
13
|
+
{
|
14
|
+
success: rows.count{ |row| row.success },
|
15
|
+
failed: rows.count { |row| row.success == false },
|
16
|
+
unknown: integrations_without_a_row.count + rows.count { |row| row.success.nil? }
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def deployable?
|
21
|
+
return nil if rows.empty?
|
22
|
+
return nil if rows.any?{ |row| row.success.nil? }
|
23
|
+
return nil if integrations_without_a_row.any?
|
24
|
+
rows.all?{ |row| row.success }
|
25
|
+
end
|
26
|
+
|
27
|
+
def reasons
|
28
|
+
@reasons ||= begin
|
29
|
+
reasons = []
|
30
|
+
if rows.empty?
|
31
|
+
reasons << "No results matched the given query"
|
32
|
+
else
|
33
|
+
reasons.concat(missing_reasons)
|
34
|
+
reasons.concat(failure_messages)
|
35
|
+
reasons.concat(unverified_messages)
|
36
|
+
reasons.concat(success_messages)
|
37
|
+
end
|
38
|
+
reasons
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def unverified_messages
|
43
|
+
if rows.any?{ |row| row.success.nil? }
|
44
|
+
["Missing one or more verification results"]
|
45
|
+
else
|
46
|
+
[]
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def failure_messages
|
51
|
+
if rows.any?{ |row| row.success == false }
|
52
|
+
["One or more verifications have failed"]
|
53
|
+
else
|
54
|
+
[]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def success_messages
|
59
|
+
if rows.all?{ |row| row.success } && integrations_without_a_row.empty?
|
60
|
+
["All verification results are published and successful"]
|
61
|
+
else
|
62
|
+
[]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def integrations_without_a_row
|
67
|
+
@integrations_without_a_row ||= begin
|
68
|
+
integrations.select do | relationship |
|
69
|
+
!rows.find do | row |
|
70
|
+
row.consumer_id == relationship.consumer_id && row.provider_id == relationship.provider_id
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def missing_reasons
|
77
|
+
integrations_without_a_row.collect do | missing_relationship|
|
78
|
+
consumer_version_desc = "#{missing_relationship.consumer_name} (#{resolved_version_for(missing_relationship.consumer_id)})"
|
79
|
+
provider_version_desc = "#{missing_relationship.provider_name} (#{resolved_version_for(missing_relationship.provider_id)})"
|
80
|
+
"There is no verified pact between #{consumer_version_desc} and #{provider_version_desc}"
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def resolved_version_for(pacticipant_id)
|
85
|
+
resolved_selectors.find{ | s| s[:pacticipant_id] == pacticipant_id }[:pacticipant_version_number]
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#
|
2
|
+
# Represents the integration relationship between a consumer and a provider
|
3
|
+
#
|
4
|
+
module PactBroker
|
5
|
+
module Matrix
|
6
|
+
class Integration
|
7
|
+
|
8
|
+
attr_reader :consumer_name, :consumer_id, :provider_name, :provider_id
|
9
|
+
|
10
|
+
def initialize consumer_id, consumer_name, provider_id, provider_name
|
11
|
+
@consumer_id = consumer_id
|
12
|
+
@consumer_name = consumer_name
|
13
|
+
@provider_id = provider_id
|
14
|
+
@provider_name = provider_name
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.from_hash hash
|
18
|
+
new(
|
19
|
+
hash.fetch(:consumer_id),
|
20
|
+
hash.fetch(:consumer_name),
|
21
|
+
hash.fetch(:provider_id),
|
22
|
+
hash.fetch(:provider_name)
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
def == other
|
27
|
+
consumer_id == other.consumer_id && provider_id == other.provider_id
|
28
|
+
end
|
29
|
+
|
30
|
+
def <=> other
|
31
|
+
comparison = consumer_name <=> other.consumer_name
|
32
|
+
return comparison if comparison != 0
|
33
|
+
provider_name <=> other.provider_name
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_hash
|
37
|
+
{
|
38
|
+
consumer_name: consumer_name,
|
39
|
+
consumer_id: consumer_id,
|
40
|
+
provider_name: provider_name,
|
41
|
+
provider_id: provider_id,
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
def pacticipant_names
|
46
|
+
[consumer_name, provider_name]
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_s
|
50
|
+
"Relationship between #{consumer_name} (id=#{consumer_id}) and #{provider_name} (id=#{provider_id})"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -29,7 +29,7 @@ module PactBroker
|
|
29
29
|
options[:limit] = params['limit']
|
30
30
|
end
|
31
31
|
if params.key?('latest') && params['latest'] != ''
|
32
|
-
options[:latest] = params['latest']
|
32
|
+
options[:latest] = params['latest'] == 'true'
|
33
33
|
end
|
34
34
|
if params.key?('tag') && params['tag'] != ''
|
35
35
|
options[:tag] = params['tag']
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module PactBroker
|
2
|
+
module Matrix
|
3
|
+
class QueryResults < Array
|
4
|
+
attr_reader :selectors, :options, :resolved_selectors
|
5
|
+
|
6
|
+
def initialize rows, selectors, options, resolved_selectors
|
7
|
+
super(rows)
|
8
|
+
@selectors = selectors
|
9
|
+
@resolved_selectors = resolved_selectors
|
10
|
+
@options = options
|
11
|
+
end
|
12
|
+
|
13
|
+
def rows
|
14
|
+
to_a
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'pact_broker/matrix/query_results'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Matrix
|
5
|
+
class QueryResultsWithDeploymentStatusSummary < QueryResults
|
6
|
+
attr_reader :deployment_status_summary
|
7
|
+
|
8
|
+
def initialize rows, selectors, options, resolved_selectors, deployment_status_summary
|
9
|
+
super(rows, selectors, options, resolved_selectors)
|
10
|
+
@deployment_status_summary = deployment_status_summary
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -2,7 +2,9 @@ require 'pact_broker/repositories/helpers'
|
|
2
2
|
require 'pact_broker/matrix/row'
|
3
3
|
require 'pact_broker/matrix/head_row'
|
4
4
|
require 'pact_broker/error'
|
5
|
-
|
5
|
+
require 'pact_broker/matrix/query_results'
|
6
|
+
require 'pact_broker/matrix/integration'
|
7
|
+
require 'pact_broker/matrix/query_results_with_deployment_status_summary'
|
6
8
|
|
7
9
|
module PactBroker
|
8
10
|
module Matrix
|
@@ -65,7 +67,8 @@ module PactBroker
|
|
65
67
|
|
66
68
|
# Return the latest matrix row (pact/verification) for each consumer_version_number/provider_version_number
|
67
69
|
def find selectors, options = {}
|
68
|
-
|
70
|
+
resolved_selectors = resolve_selectors(selectors, options)
|
71
|
+
lines = query_matrix(resolved_selectors, options)
|
69
72
|
lines = apply_latestby(options, selectors, lines)
|
70
73
|
|
71
74
|
# This needs to be done after the latestby, so can't be done in the db unless
|
@@ -74,9 +77,31 @@ module PactBroker
|
|
74
77
|
lines = lines.select{ |l| options[:success].include?(l.success) }
|
75
78
|
end
|
76
79
|
|
77
|
-
lines.sort
|
80
|
+
QueryResults.new(lines.sort, selectors, options, resolved_selectors)
|
81
|
+
end
|
82
|
+
|
83
|
+
def find_for_consumer_and_provider pacticipant_1_name, pacticipant_2_name
|
84
|
+
selectors = [{ pacticipant_name: pacticipant_1_name }, { pacticipant_name: pacticipant_2_name }]
|
85
|
+
options = { latestby: 'cvpv' }
|
86
|
+
find(selectors, options)
|
87
|
+
end
|
88
|
+
|
89
|
+
def find_compatible_pacticipant_versions selectors
|
90
|
+
find(selectors, latestby: 'cvpv').select{|line| line.success }
|
91
|
+
end
|
92
|
+
|
93
|
+
def find_integrations(pacticipant_names)
|
94
|
+
selectors = pacticipant_names.collect{ | pacticipant_name | add_ids(pacticipant_name: pacticipant_name) }
|
95
|
+
Row
|
96
|
+
.select(:consumer_name, :consumer_id, :provider_name, :provider_id)
|
97
|
+
.matching_selectors(selectors)
|
98
|
+
.distinct
|
99
|
+
.all
|
100
|
+
.collect{ |row | Integration.from_hash(row.to_hash) }.uniq
|
78
101
|
end
|
79
102
|
|
103
|
+
private
|
104
|
+
|
80
105
|
def apply_latestby options, selectors, lines
|
81
106
|
return lines unless options[:latestby]
|
82
107
|
group_by_columns = case options[:latestby]
|
@@ -106,16 +131,6 @@ module PactBroker
|
|
106
131
|
latest_revisions
|
107
132
|
end
|
108
133
|
|
109
|
-
def find_for_consumer_and_provider pacticipant_1_name, pacticipant_2_name
|
110
|
-
selectors = [{ pacticipant_name: pacticipant_1_name }, { pacticipant_name: pacticipant_2_name }]
|
111
|
-
options = { latestby: 'cvpv' }
|
112
|
-
find(selectors, options)
|
113
|
-
end
|
114
|
-
|
115
|
-
def find_compatible_pacticipant_versions selectors
|
116
|
-
find(selectors, latestby: 'cvpv').select{|line| line.success }
|
117
|
-
end
|
118
|
-
|
119
134
|
def query_matrix selectors, options
|
120
135
|
query = view_for(options).select_all.matching_selectors(selectors)
|
121
136
|
query = query.limit(options[:limit]) if options[:limit]
|
@@ -195,7 +210,7 @@ module PactBroker
|
|
195
210
|
# eg. when checking to see if Foo version 2 can be deployed to prod,
|
196
211
|
# need to look up all the 'partner' pacticipants, and determine their latest prod versions
|
197
212
|
def apply_latest_and_tag_to_inferred_selectors(selectors, options)
|
198
|
-
all_pacticipant_names = all_pacticipant_names_in_specified_matrix(selectors
|
213
|
+
all_pacticipant_names = all_pacticipant_names_in_specified_matrix(selectors)
|
199
214
|
specified_names = selectors.collect{ |s| s[:pacticipant_name] }
|
200
215
|
inferred_names = all_pacticipant_names - specified_names
|
201
216
|
|
@@ -211,12 +226,9 @@ module PactBroker
|
|
211
226
|
selectors + look_up_version_numbers(inferred_selectors, options)
|
212
227
|
end
|
213
228
|
|
214
|
-
def all_pacticipant_names_in_specified_matrix(selectors
|
215
|
-
|
216
|
-
|
217
|
-
query
|
218
|
-
.all
|
219
|
-
.collect{ | row | [row.consumer_name, row.provider_name] }
|
229
|
+
def all_pacticipant_names_in_specified_matrix(selectors)
|
230
|
+
find_integrations(selectors.collect{|s| s[:pacticipant_name]})
|
231
|
+
.collect(&:pacticipant_names)
|
220
232
|
.flatten
|
221
233
|
.uniq
|
222
234
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'pact_broker/repositories'
|
2
2
|
require 'pact_broker/matrix/row'
|
3
|
+
require 'pact_broker/matrix/deployment_status_summary'
|
3
4
|
|
4
5
|
module PactBroker
|
5
6
|
module Matrix
|
@@ -17,12 +18,18 @@ module PactBroker
|
|
17
18
|
matrix_repository.refresh_tags(params, &block)
|
18
19
|
end
|
19
20
|
|
20
|
-
def find
|
21
|
-
matrix_repository.find
|
21
|
+
def find selectors, options = {}
|
22
|
+
query_results = matrix_repository.find selectors, options
|
23
|
+
pacticipant_names = selectors.collect{ | s| s[:pacticipant_name] }
|
24
|
+
integrations = matrix_repository.find_integrations(pacticipant_names)
|
25
|
+
deployment_status_summary = DeploymentStatusSummary.new(query_results.rows, query_results.resolved_selectors, integrations)
|
26
|
+
QueryResultsWithDeploymentStatusSummary.new(query_results.rows, query_results.selectors, query_results.options, query_results.resolved_selectors, deployment_status_summary)
|
22
27
|
end
|
23
28
|
|
24
29
|
def find_for_consumer_and_provider params
|
25
|
-
|
30
|
+
selectors = [{ pacticipant_name: params[:consumer_name] }, { pacticipant_name: params[:provider_name] }]
|
31
|
+
options = { latestby: 'cvpv' }
|
32
|
+
find(selectors, options)
|
26
33
|
end
|
27
34
|
|
28
35
|
def find_for_consumer_and_provider_with_tags params
|
@@ -98,6 +98,10 @@ module PactBroker
|
|
98
98
|
).limit(1).single_record
|
99
99
|
end
|
100
100
|
|
101
|
+
def delete_by_provider_version_id version_id
|
102
|
+
PactBroker::Domain::Verification.where(provider_version_id: version_id).delete
|
103
|
+
end
|
104
|
+
|
101
105
|
def pact_version_id_for pact
|
102
106
|
PactBroker::Pacts::PactPublication.select(:pact_version_id).where(id: pact.id)
|
103
107
|
end
|
data/lib/pact_broker/version.rb
CHANGED
@@ -22,6 +22,7 @@ module PactBroker
|
|
22
22
|
def self.delete version
|
23
23
|
tag_repository.delete_by_version_id version.id
|
24
24
|
pact_repository.delete_by_version_id version.id
|
25
|
+
verification_repository.delete_by_provider_version_id version.id
|
25
26
|
version_repository.delete_by_id version.id
|
26
27
|
end
|
27
28
|
end
|
@@ -1,4 +1,6 @@
|
|
1
1
|
require 'pact_broker/api/decorators/matrix_decorator'
|
2
|
+
require 'pact_broker/matrix/query_results_with_deployment_status_summary'
|
3
|
+
require 'pact_broker/matrix/deployment_status_summary'
|
2
4
|
|
3
5
|
module PactBroker
|
4
6
|
module Api
|
@@ -7,9 +9,9 @@ module PactBroker
|
|
7
9
|
describe "to_json" do
|
8
10
|
let(:verification_date) { DateTime.new(2017, 12, 31) }
|
9
11
|
let(:pact_created_at) { DateTime.new(2017, 1, 1) }
|
10
|
-
let(:
|
11
|
-
let(:
|
12
|
-
let(:
|
12
|
+
let(:row_1_success) { true }
|
13
|
+
let(:row_2_success) { true }
|
14
|
+
let(:row_1) do
|
13
15
|
double('PactBroker::Matrix::Row',
|
14
16
|
{
|
15
17
|
consumer_name: "Consumer",
|
@@ -18,7 +20,7 @@ module PactBroker
|
|
18
20
|
pact_created_at: pact_created_at,
|
19
21
|
provider_version_number: "4.5.6",
|
20
22
|
provider_name: "Provider",
|
21
|
-
success:
|
23
|
+
success: row_1_success,
|
22
24
|
verification_number: 1,
|
23
25
|
verification_build_url: nil,
|
24
26
|
verification_executed_at: verification_date
|
@@ -26,7 +28,7 @@ module PactBroker
|
|
26
28
|
)
|
27
29
|
end
|
28
30
|
|
29
|
-
let(:
|
31
|
+
let(:row_2) do
|
30
32
|
double('PactBroker::Matrix::Row',
|
31
33
|
{
|
32
34
|
consumer_name: "Consumer",
|
@@ -35,7 +37,7 @@ module PactBroker
|
|
35
37
|
pact_created_at: pact_created_at,
|
36
38
|
provider_version_number: nil,
|
37
39
|
provider_name: "Provider",
|
38
|
-
success:
|
40
|
+
success: row_2_success,
|
39
41
|
verification_number: nil,
|
40
42
|
verification_build_url: nil,
|
41
43
|
verification_executed_at: verification_date
|
@@ -99,8 +101,16 @@ module PactBroker
|
|
99
101
|
}
|
100
102
|
end
|
101
103
|
|
102
|
-
let(:
|
103
|
-
let(:
|
104
|
+
let(:query_results){ PactBroker::Matrix::QueryResultsWithDeploymentStatusSummary.new([row_1, row_2], selectors, options, resolved_selectors, deployment_status_summary)}
|
105
|
+
let(:selectors) { nil }
|
106
|
+
let(:options) { nil }
|
107
|
+
let(:resolved_selectors) { nil }
|
108
|
+
let(:counts) { { success: 1 } }
|
109
|
+
let(:deployment_status_summary) do
|
110
|
+
instance_double('PactBroker::Matrix::DeploymentStatusSummary', reasons: ['foo', 'bar'], deployable?: deployable, counts: counts)
|
111
|
+
end
|
112
|
+
let(:deployable) { true }
|
113
|
+
let(:json) { MatrixDecorator.new(query_results).to_json(user_options: { base_url: 'http://example.org' }) }
|
104
114
|
let(:parsed_json) { JSON.parse(json, symbolize_names: true) }
|
105
115
|
|
106
116
|
it "includes the consumer details" do
|
@@ -121,13 +131,14 @@ module PactBroker
|
|
121
131
|
|
122
132
|
it "includes a summary" do
|
123
133
|
expect(parsed_json[:summary][:deployable]).to eq true
|
124
|
-
expect(parsed_json[:summary][:reason]).to
|
134
|
+
expect(parsed_json[:summary][:reason]).to eq "foo\nbar"
|
135
|
+
expect(parsed_json[:summary][:success]).to eq 1
|
125
136
|
end
|
126
137
|
|
127
138
|
context "when the pact has not been verified" do
|
128
139
|
before do
|
129
|
-
allow(
|
130
|
-
allow(
|
140
|
+
allow(row_2).to receive(:success).and_return(nil)
|
141
|
+
allow(row_2).to receive(:verification_executed_at).and_return(nil)
|
131
142
|
end
|
132
143
|
|
133
144
|
let(:verification_hash) { nil }
|
@@ -140,42 +151,6 @@ module PactBroker
|
|
140
151
|
expect(parsed_json[:matrix][1][:verificationResult]).to eq verification_hash
|
141
152
|
end
|
142
153
|
end
|
143
|
-
|
144
|
-
context "when one or more successes are nil" do
|
145
|
-
let(:line_1_success) { nil }
|
146
|
-
|
147
|
-
it "has a deployable flag of nil" do
|
148
|
-
expect(parsed_json[:summary][:deployable]).to be nil
|
149
|
-
end
|
150
|
-
|
151
|
-
it "has an explanation" do
|
152
|
-
expect(parsed_json[:summary][:reason]).to match /Missing/
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
context "when one or more successes are false" do
|
157
|
-
let(:line_1_success) { false }
|
158
|
-
|
159
|
-
it "has a deployable flag of false" do
|
160
|
-
expect(parsed_json[:summary][:deployable]).to be false
|
161
|
-
end
|
162
|
-
|
163
|
-
it "has an explanation" do
|
164
|
-
expect(parsed_json[:summary][:reason]).to match /have failed/
|
165
|
-
end
|
166
|
-
end
|
167
|
-
|
168
|
-
context "when there are no results" do
|
169
|
-
let(:lines) { [] }
|
170
|
-
|
171
|
-
it "has a deployable flag of false" do
|
172
|
-
expect(parsed_json[:summary][:deployable]).to be nil
|
173
|
-
end
|
174
|
-
|
175
|
-
it "has an explanation" do
|
176
|
-
expect(parsed_json[:summary][:reason]).to match /No results/
|
177
|
-
end
|
178
|
-
end
|
179
154
|
end
|
180
155
|
end
|
181
156
|
end
|
@@ -13,7 +13,8 @@ module PactBroker
|
|
13
13
|
{
|
14
14
|
base_url: 'http://example.org',
|
15
15
|
resource_url: 'http://example.org/provider-pacts',
|
16
|
-
title: 'title'
|
16
|
+
title: 'title',
|
17
|
+
provider_name: 'foo'
|
17
18
|
}
|
18
19
|
end
|
19
20
|
|
@@ -30,9 +31,9 @@ module PactBroker
|
|
30
31
|
:href=> "http://example.org/provider-pacts",
|
31
32
|
:title => "title"
|
32
33
|
},
|
33
|
-
:provider => {
|
34
|
-
:href => "http://example.org/pacticipants/",
|
35
|
-
:
|
34
|
+
:"pb:provider" => {
|
35
|
+
:href => "http://example.org/pacticipants/foo",
|
36
|
+
:name => "foo"
|
36
37
|
},
|
37
38
|
:"pb:pacts" =>[{
|
38
39
|
:href => "pact_url",
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'pact_broker/matrix/deployment_status_summary'
|
2
|
+
require 'pact_broker/matrix/row'
|
3
|
+
require 'pact_broker/matrix/query_results'
|
4
|
+
require 'pact_broker/matrix/integration'
|
5
|
+
|
6
|
+
module PactBroker
|
7
|
+
module Matrix
|
8
|
+
describe DeploymentStatusSummary do
|
9
|
+
describe ".call" do
|
10
|
+
|
11
|
+
let(:rows) { [row_1, row_2] }
|
12
|
+
let(:row_1) do
|
13
|
+
double(Row,
|
14
|
+
consumer_name: "Foo",
|
15
|
+
consumer_id: 1,
|
16
|
+
provider_name: "Bar",
|
17
|
+
provider_id: 2,
|
18
|
+
success: row_1_success
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
let(:row_2) do
|
23
|
+
double(Row,
|
24
|
+
consumer_name: "Foo",
|
25
|
+
consumer_id: 1,
|
26
|
+
provider_name: "Baz",
|
27
|
+
provider_id: 3,
|
28
|
+
success: true
|
29
|
+
)
|
30
|
+
end
|
31
|
+
|
32
|
+
let(:row_1_success) { true }
|
33
|
+
|
34
|
+
let(:integrations) do
|
35
|
+
[
|
36
|
+
Integration.new(1, "Foo", 2, "Bar"),
|
37
|
+
Integration.new(1, "Foo", 3, "Baz")
|
38
|
+
]
|
39
|
+
end
|
40
|
+
|
41
|
+
let(:resolved_selectors) do
|
42
|
+
[
|
43
|
+
{
|
44
|
+
pacticipant_id: 1, pacticipant_version_number: "ddec8101dabf4edf9125a69f9a161f0f294af43c"
|
45
|
+
},
|
46
|
+
{
|
47
|
+
pacticipant_id: 2, pacticipant_version_number: "14131c5da3abf323ccf410b1b619edac76231243"
|
48
|
+
},
|
49
|
+
{
|
50
|
+
pacticipant_id: 3, pacticipant_version_number: "4ee06460f10e8207ad904fa9fa6c4842e462ab59"
|
51
|
+
}
|
52
|
+
]
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
subject { DeploymentStatusSummary.new(rows, resolved_selectors, integrations) }
|
57
|
+
|
58
|
+
context "when there is a row for all integrations" do
|
59
|
+
its(:deployable?) { is_expected.to be true }
|
60
|
+
its(:reasons) { is_expected.to eq ["All verification results are published and successful"] }
|
61
|
+
its(:counts) { is_expected.to eq success: 2, failed: 0, unknown: 0 }
|
62
|
+
end
|
63
|
+
|
64
|
+
context "when there are no rows" do
|
65
|
+
let(:rows) { [] }
|
66
|
+
|
67
|
+
its(:deployable?) { is_expected.to be nil }
|
68
|
+
its(:reasons) { is_expected.to eq ["No results matched the given query"] }
|
69
|
+
its(:counts) { is_expected.to eq success: 0, failed: 0, unknown: 2 }
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when one or more of the success flags are nil" do
|
73
|
+
let(:row_1_success) { nil }
|
74
|
+
|
75
|
+
its(:deployable?) { is_expected.to be nil }
|
76
|
+
its(:reasons) { is_expected.to eq ["Missing one or more verification results"] }
|
77
|
+
its(:counts) { is_expected.to eq success: 1, failed: 0, unknown: 1 }
|
78
|
+
end
|
79
|
+
|
80
|
+
context "when one or more of the success flags are false" do
|
81
|
+
let(:row_1_success) { false }
|
82
|
+
|
83
|
+
its(:deployable?) { is_expected.to be false }
|
84
|
+
its(:reasons) { is_expected.to eq ["One or more verifications have failed"] }
|
85
|
+
its(:counts) { is_expected.to eq success: 1, failed: 1, unknown: 0 }
|
86
|
+
end
|
87
|
+
|
88
|
+
context "when there is a relationship missing" do
|
89
|
+
let(:rows) { [row_1] }
|
90
|
+
|
91
|
+
its(:deployable?) { is_expected.to be nil }
|
92
|
+
its(:reasons) { is_expected.to eq ["There is no verified pact between Foo (ddec8101dabf4edf9125a69f9a161f0f294af43c) and Baz (4ee06460f10e8207ad904fa9fa6c4842e462ab59)"] }
|
93
|
+
its(:counts) { is_expected.to eq success: 1, failed: 0, unknown: 1 }
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -82,6 +82,14 @@ module PactBroker
|
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
+
context "when global latest is true" do
|
86
|
+
let(:query) { "q[][pacticipant]=Foo&latest=true" }
|
87
|
+
|
88
|
+
it "returns options with latest true" do
|
89
|
+
expect(subject.last).to eq latest: true
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
85
93
|
context "when latest is not true" do
|
86
94
|
let(:query) { "q[][pacticipant]=Foo&q[][latest]=false" }
|
87
95
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'pact_broker/matrix/repository'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Matrix
|
5
|
+
describe Repository do
|
6
|
+
let(:td) { TestDataBuilder.new}
|
7
|
+
|
8
|
+
describe "find_integrations" do
|
9
|
+
before do
|
10
|
+
td.create_pact_with_hierarchy("foo", "1", "bar")
|
11
|
+
.create_provider("baz")
|
12
|
+
.create_pact
|
13
|
+
.use_consumer("baz")
|
14
|
+
.create_consumer_version("3")
|
15
|
+
.create_provider("wiffle")
|
16
|
+
.create_pact
|
17
|
+
end
|
18
|
+
|
19
|
+
subject { Repository.new.find_integrations(["foo"]).sort }
|
20
|
+
|
21
|
+
context "with only one pacticipant name" do
|
22
|
+
it "returns all the integrations that the pacticipant with the given name has" do
|
23
|
+
expect(subject.first.consumer_name).to eq "foo"
|
24
|
+
expect(subject.first.provider_name).to eq "bar"
|
25
|
+
expect(subject.last.consumer_name).to eq "foo"
|
26
|
+
expect(subject.last.provider_name).to eq "baz"
|
27
|
+
expect(subject.size).to eq 2
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context "with the names of two pacticipants that are integrated" do
|
32
|
+
subject { Repository.new.find_integrations(["foo", "bar"]).sort }
|
33
|
+
|
34
|
+
it "returns only that integration" do
|
35
|
+
expect(subject.first.consumer_name).to eq "foo"
|
36
|
+
expect(subject.first.provider_name).to eq "bar"
|
37
|
+
expect(subject.size).to eq 1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "with the names of two pacticipants that aren't integrated" do
|
42
|
+
subject { Repository.new.find_integrations(["foo", "wiffle"]).sort }
|
43
|
+
|
44
|
+
it "returns an empty array" do
|
45
|
+
expect(subject).to eq []
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -998,6 +998,30 @@ module PactBroker
|
|
998
998
|
end
|
999
999
|
end
|
1000
1000
|
end
|
1001
|
+
|
1002
|
+
describe "find pact_broker-client issue 33" do
|
1003
|
+
before do
|
1004
|
+
td
|
1005
|
+
.create_consumer("foo")
|
1006
|
+
.create_provider("bar")
|
1007
|
+
.create_consumer_version("1.0.0")
|
1008
|
+
.create_pact
|
1009
|
+
.create_verification(provider_version: "10.0.0", tag_names: ["prod"])
|
1010
|
+
.create_provider("baz")
|
1011
|
+
.create_consumer_version("2.0.0")
|
1012
|
+
.create_pact
|
1013
|
+
.create_verification(provider_version: "20.0.0", tag_names: ["prod"])
|
1014
|
+
end
|
1015
|
+
|
1016
|
+
let(:selectors) { [{ pacticipant_name: "foo", pacticipant_version_number: "1.0.0" }] }
|
1017
|
+
let(:options) { {latestby: "cvp", latest: true, tag: "prod"} }
|
1018
|
+
|
1019
|
+
subject { shorten_rows(Repository.new.find(selectors, options)) }
|
1020
|
+
|
1021
|
+
it "only returns a row for the foo pact version that has been verified by the current production version of bar" do
|
1022
|
+
expect(subject).to eq ["foo1.0.0 bar10.0.0 n1"]
|
1023
|
+
end
|
1024
|
+
end
|
1001
1025
|
end
|
1002
1026
|
end
|
1003
1027
|
end
|
@@ -5,6 +5,32 @@ module PactBroker
|
|
5
5
|
describe Service do
|
6
6
|
let(:td) { TestDataBuilder.new }
|
7
7
|
|
8
|
+
describe "find integration test" do
|
9
|
+
let(:selectors) do
|
10
|
+
[ { pacticipant_name: "foo" } ]
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:options) do
|
14
|
+
{ latest: true, tag: "prod" }
|
15
|
+
end
|
16
|
+
|
17
|
+
before do
|
18
|
+
td.create_pact_with_hierarchy("foo", "1", "bar")
|
19
|
+
.create_verification(provider_version: "2", tag_names: ["prod"])
|
20
|
+
end
|
21
|
+
|
22
|
+
subject { Service.find(selectors, options) }
|
23
|
+
|
24
|
+
it "returns a QueryResultsWithDeploymentStatusSummary" do
|
25
|
+
expect(subject.rows).to be_a(Array)
|
26
|
+
expect(subject.selectors).to be selectors
|
27
|
+
expect(subject.options).to be options
|
28
|
+
expect(subject.resolved_selectors).to be_a(Array)
|
29
|
+
expect(subject.resolved_selectors.count).to eq 2
|
30
|
+
expect(subject.deployment_status_summary).to be_a(DeploymentStatusSummary)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
8
34
|
describe "validate_selectors" do
|
9
35
|
|
10
36
|
subject { Service.validate_selectors(selectors) }
|
@@ -275,6 +275,26 @@ module PactBroker
|
|
275
275
|
end
|
276
276
|
end
|
277
277
|
end
|
278
|
+
|
279
|
+
describe "delete_by_provider_version_id" do
|
280
|
+
let!(:provider_version) do
|
281
|
+
TestDataBuilder.new
|
282
|
+
.create_consumer
|
283
|
+
.create_provider
|
284
|
+
.create_consumer_version
|
285
|
+
.create_pact
|
286
|
+
.create_verification(provider_version: "1.0.0")
|
287
|
+
.create_verification(provider_version: "2.0.0", number: 2)
|
288
|
+
.create_verification(provider_version: "2.0.0", number: 3)
|
289
|
+
.and_return(:provider_version)
|
290
|
+
end
|
291
|
+
|
292
|
+
subject { Repository.new.delete_by_provider_version_id(provider_version.id) }
|
293
|
+
|
294
|
+
it "deletes the verifications associated with the given version id" do
|
295
|
+
expect { subject }.to change { PactBroker::Domain::Verification.count }.by(-2)
|
296
|
+
end
|
297
|
+
end
|
278
298
|
end
|
279
299
|
end
|
280
300
|
end
|
@@ -5,13 +5,15 @@ module PactBroker
|
|
5
5
|
module Versions
|
6
6
|
describe Service do
|
7
7
|
describe ".delete" do
|
8
|
+
let(:td) { TestDataBuilder.new }
|
8
9
|
let!(:version) do
|
9
|
-
|
10
|
+
td
|
10
11
|
.create_consumer
|
11
12
|
.create_provider
|
12
13
|
.create_consumer_version("1.2.3")
|
13
14
|
.create_consumer_version_tag("prod")
|
14
15
|
.create_pact
|
16
|
+
.create_verification(provider_version: "1.0.0")
|
15
17
|
.and_return(:consumer_version)
|
16
18
|
end
|
17
19
|
|
@@ -28,6 +30,12 @@ module PactBroker
|
|
28
30
|
it "deletes the version" do
|
29
31
|
expect{ subject }.to change { PactBroker::Domain::Version.count }.by(-1)
|
30
32
|
end
|
33
|
+
|
34
|
+
context "when deleting a provider version" do
|
35
|
+
it "deletes associated verifications" do
|
36
|
+
expect { Service.delete(td.provider_version ) }. to change { PactBroker::Domain::Verification.count }.by(-1)
|
37
|
+
end
|
38
|
+
end
|
31
39
|
end
|
32
40
|
end
|
33
41
|
end
|
@@ -34,6 +34,7 @@ class TestDataBuilder
|
|
34
34
|
attr_reader :consumer
|
35
35
|
attr_reader :provider
|
36
36
|
attr_reader :consumer_version
|
37
|
+
attr_reader :provider_version
|
37
38
|
attr_reader :pact
|
38
39
|
attr_reader :verification
|
39
40
|
attr_reader :webhook
|
@@ -320,10 +321,11 @@ class TestDataBuilder
|
|
320
321
|
parameters.delete(:provider_version)
|
321
322
|
verification = PactBroker::Domain::Verification.new(parameters)
|
322
323
|
@verification = PactBroker::Verifications::Repository.new.create(verification, provider_version_number, @pact)
|
324
|
+
@provider_version = PactBroker::Domain::Version.where(pacticipant_id: @provider.id, number: provider_version_number).single_record
|
325
|
+
|
323
326
|
if tag_names.any?
|
324
|
-
provider_version = PactBroker::Domain::Version.where(pacticipant_id: @provider.id, number: provider_version_number).single_record
|
325
327
|
tag_names.each do | tag_name |
|
326
|
-
PactBroker::Domain::Tag.create(name: tag_name, version: provider_version)
|
328
|
+
PactBroker::Domain::Tag.create(name: tag_name, version: @provider_version)
|
327
329
|
end
|
328
330
|
end
|
329
331
|
refresh_matrix
|
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.23.
|
4
|
+
version: 2.23.4
|
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: 2018-
|
13
|
+
date: 2018-07-04 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: httparty
|
@@ -824,8 +824,12 @@ files:
|
|
824
824
|
- lib/pact_broker/locale/en.yml
|
825
825
|
- lib/pact_broker/logging.rb
|
826
826
|
- lib/pact_broker/matrix/aggregated_row.rb
|
827
|
+
- lib/pact_broker/matrix/deployment_status_summary.rb
|
827
828
|
- lib/pact_broker/matrix/head_row.rb
|
829
|
+
- lib/pact_broker/matrix/integration.rb
|
828
830
|
- lib/pact_broker/matrix/parse_query.rb
|
831
|
+
- lib/pact_broker/matrix/query_results.rb
|
832
|
+
- lib/pact_broker/matrix/query_results_with_deployment_status_summary.rb
|
829
833
|
- lib/pact_broker/matrix/repository.rb
|
830
834
|
- lib/pact_broker/matrix/row.rb
|
831
835
|
- lib/pact_broker/matrix/service.rb
|
@@ -1130,8 +1134,10 @@ files:
|
|
1130
1134
|
- spec/lib/pact_broker/labels/repository_spec.rb
|
1131
1135
|
- spec/lib/pact_broker/labels/service_spec.rb
|
1132
1136
|
- spec/lib/pact_broker/matrix/aggregated_row_spec.rb
|
1137
|
+
- spec/lib/pact_broker/matrix/deployment_status_summary_spec.rb
|
1133
1138
|
- spec/lib/pact_broker/matrix/head_row_spec.rb
|
1134
1139
|
- spec/lib/pact_broker/matrix/parse_query_spec.rb
|
1140
|
+
- spec/lib/pact_broker/matrix/repository_find_integrations_spec.rb
|
1135
1141
|
- spec/lib/pact_broker/matrix/repository_spec.rb
|
1136
1142
|
- spec/lib/pact_broker/matrix/row_spec.rb
|
1137
1143
|
- spec/lib/pact_broker/matrix/service_spec.rb
|
@@ -1431,8 +1437,10 @@ test_files:
|
|
1431
1437
|
- spec/lib/pact_broker/labels/repository_spec.rb
|
1432
1438
|
- spec/lib/pact_broker/labels/service_spec.rb
|
1433
1439
|
- spec/lib/pact_broker/matrix/aggregated_row_spec.rb
|
1440
|
+
- spec/lib/pact_broker/matrix/deployment_status_summary_spec.rb
|
1434
1441
|
- spec/lib/pact_broker/matrix/head_row_spec.rb
|
1435
1442
|
- spec/lib/pact_broker/matrix/parse_query_spec.rb
|
1443
|
+
- spec/lib/pact_broker/matrix/repository_find_integrations_spec.rb
|
1436
1444
|
- spec/lib/pact_broker/matrix/repository_spec.rb
|
1437
1445
|
- spec/lib/pact_broker/matrix/row_spec.rb
|
1438
1446
|
- spec/lib/pact_broker/matrix/service_spec.rb
|