pact_broker 2.40.0 → 2.41.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +36 -0
  3. data/DEVELOPER_DOCUMENTATION.md +11 -0
  4. data/db/ddl_statements/head_pact_tags.rb +10 -0
  5. data/db/ddl_statements/latest_pact_consumer_version_orders.rb +16 -0
  6. data/db/ddl_statements/latest_pact_publications_by_consumer_versions.rb +16 -0
  7. data/db/ddl_statements/latest_tagged_pact_consumer_version_orders.rb +23 -0
  8. data/db/ddl_statements/latest_verification_ids_for_consumer_version_tags.rb +15 -0
  9. data/db/ddl_statements/{latest_verification_ids_for_pact_versions_v001.rb → latest_verification_ids_for_pact_versions.rb} +0 -0
  10. data/db/migrations/000028_create_all_pact_publications.rb +1 -0
  11. data/db/migrations/20180311_optimise_head_matrix.rb +1 -9
  12. data/db/migrations/20180722_recreate_views.rb +6 -19
  13. data/db/migrations/20191028_optimise_latest_tagged_pact_cv_orders.rb +13 -0
  14. data/db/migrations/20191030_optimise_latest_pact_publications_by_consumer_versions_.rb +13 -0
  15. data/db/migrations/20191031_optimise_latest_verification_ids_for_consumer_version_tags.rb +13 -0
  16. data/db/migrations/20191101_create_head_pact_tags.rb +11 -0
  17. data/lib/db.rb +1 -0
  18. data/lib/pact_broker/api/contracts/dry_validation_predicates.rb +15 -0
  19. data/lib/pact_broker/api/contracts/dry_validation_workarounds.rb +38 -0
  20. data/lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema.rb +34 -0
  21. data/lib/pact_broker/api/contracts/verifiable_pacts_query_schema.rb +12 -20
  22. data/lib/pact_broker/api/decorators/matrix_decorator.rb +25 -6
  23. data/lib/pact_broker/api/decorators/relationships_csv_decorator.rb +4 -12
  24. data/lib/pact_broker/api/decorators/verifiable_pact_decorator.rb +5 -2
  25. data/lib/pact_broker/api/decorators/verifiable_pacts_query_decorator.rb +21 -9
  26. data/lib/pact_broker/api/renderers/integrations_dot_renderer.rb +1 -1
  27. data/lib/pact_broker/api/resources/base_resource.rb +1 -1
  28. data/lib/pact_broker/api/resources/can_i_deploy.rb +2 -9
  29. data/lib/pact_broker/api/resources/matrix.rb +2 -8
  30. data/lib/pact_broker/api/resources/matrix_for_consumer_and_provider.rb +1 -0
  31. data/lib/pact_broker/api/resources/provider_pacts_for_verification.rb +36 -7
  32. data/lib/pact_broker/app.rb +1 -0
  33. data/lib/pact_broker/db/data_migrations/migrate_webhook_headers.rb +1 -1
  34. data/lib/pact_broker/db/seed_example_data.rb +8 -5
  35. data/lib/pact_broker/diagnostic/resources/base_resource.rb +0 -8
  36. data/lib/pact_broker/domain/index_item.rb +47 -16
  37. data/lib/pact_broker/domain/pact.rb +12 -4
  38. data/lib/pact_broker/domain/version.rb +2 -0
  39. data/lib/pact_broker/hash_refinements.rb +48 -0
  40. data/lib/pact_broker/index/page.rb +12 -0
  41. data/lib/pact_broker/index/service.rb +156 -21
  42. data/lib/pact_broker/integrations/integration.rb +22 -0
  43. data/lib/pact_broker/locale/en.yml +2 -0
  44. data/lib/pact_broker/logging.rb +0 -1
  45. data/lib/pact_broker/matrix/aggregated_row.rb +3 -9
  46. data/lib/pact_broker/matrix/deployment_status_summary.rb +5 -5
  47. data/lib/pact_broker/matrix/head_row.rb +2 -0
  48. data/lib/pact_broker/matrix/quick_row.rb +7 -7
  49. data/lib/pact_broker/matrix/repository.rb +2 -4
  50. data/lib/pact_broker/pacticipants/repository.rb +1 -1
  51. data/lib/pact_broker/pacts/pact_publication.rb +27 -4
  52. data/lib/pact_broker/pacts/repository.rb +41 -18
  53. data/lib/pact_broker/pacts/service.rb +23 -3
  54. data/lib/pact_broker/pacts/verifiable_pact.rb +8 -2
  55. data/lib/pact_broker/pacts/verifiable_pact_messages.rb +14 -8
  56. data/lib/pact_broker/string_refinements.rb +36 -1
  57. data/lib/pact_broker/tags/head_pact_tags.rb +12 -0
  58. data/lib/pact_broker/tags/tag_with_latest_flag.rb +0 -1
  59. data/lib/pact_broker/test/test_data_builder.rb +1 -1
  60. data/lib/pact_broker/ui/controllers/index.rb +23 -2
  61. data/lib/pact_broker/ui/view_models/index_item.rb +7 -1
  62. data/lib/pact_broker/ui/view_models/index_items.rb +10 -8
  63. data/lib/pact_broker/ui/view_models/matrix_line.rb +14 -21
  64. data/lib/pact_broker/ui/view_models/matrix_tag.rb +6 -8
  65. data/lib/pact_broker/ui/views/index/_pagination.haml +31 -0
  66. data/lib/pact_broker/ui/views/index/show-with-tags.haml +6 -3
  67. data/lib/pact_broker/ui/views/index/show.haml +5 -2
  68. data/lib/pact_broker/ui/views/matrix/show.haml +6 -9
  69. data/lib/pact_broker/version.rb +1 -1
  70. data/lib/pact_broker/webhooks/webhook.rb +2 -2
  71. data/lib/pact_broker/webhooks/webhook_execution_result.rb +3 -18
  72. data/public/javascripts/matrix.js +26 -1
  73. data/public/javascripts/pagination.js +1127 -0
  74. data/public/stylesheets/index.css +13 -0
  75. data/public/stylesheets/matrix.css +10 -1
  76. data/spec/features/get_provider_pacts_for_verification_spec.rb +44 -9
  77. data/spec/features/pending_pacts_spec.rb +1 -1
  78. data/spec/features/wip_pacts_spec.rb +138 -0
  79. data/spec/integration/app_spec.rb +1 -1
  80. data/spec/lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema_spec.rb +90 -0
  81. data/spec/lib/pact_broker/api/contracts/verifiable_pacts_query_schema_spec.rb +26 -4
  82. data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +36 -2
  83. data/spec/lib/pact_broker/api/decorators/verifiable_pact_decorator_spec.rb +24 -1
  84. data/spec/lib/pact_broker/api/decorators/verifiable_pacts_query_decorator_spec.rb +62 -18
  85. data/spec/lib/pact_broker/api/resources/base_resource_spec.rb +10 -0
  86. data/spec/lib/pact_broker/api/resources/provider_pacts_for_verification_spec.rb +75 -6
  87. data/spec/lib/pact_broker/hash_refinements_spec.rb +24 -0
  88. data/spec/lib/pact_broker/index/service_spec.rb +38 -2
  89. data/spec/lib/pact_broker/integrations/integration_spec.rb +79 -41
  90. data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +2 -0
  91. data/spec/lib/pact_broker/pacts/repository_find_wip_pact_versions_for_provider_spec.rb +17 -2
  92. data/spec/lib/pact_broker/pacts/service_spec.rb +56 -0
  93. data/spec/lib/pact_broker/pacts/verifiable_pact_messages_spec.rb +12 -1
  94. data/spec/lib/pact_broker/ui/controllers/index_spec.rb +28 -6
  95. data/spec/lib/pact_broker/ui/view_models/index_items_spec.rb +8 -29
  96. data/spec/lib/pact_broker/ui/view_models/matrix_line_spec.rb +41 -0
  97. metadata +24 -3
@@ -142,3 +142,16 @@ div.getting-started {
142
142
  td.to-be-deleted {
143
143
  background-color: #f2dede !important
144
144
  }
145
+
146
+ div.pagination {
147
+ width: 100%;
148
+ text-align: center;
149
+ }
150
+
151
+ nav.paginationjs {
152
+ display: inline-block;
153
+ }
154
+
155
+ div.pagination div.nav-footer {
156
+ color: gray;
157
+ }
@@ -18,4 +18,13 @@ div.tag-parent {
18
18
 
19
19
  div.tag {
20
20
  display: inline-block;
21
- }
21
+ }
22
+
23
+ span.pre-verified-icon {
24
+ color: #337ab7;
25
+ }
26
+
27
+ /* Need to make the tooltip wide enough to show the full SHA */
28
+ td.pact-published .tooltip-inner {
29
+ max-width: 300px;
30
+ }
@@ -1,7 +1,13 @@
1
1
  describe "Get provider pacts for verification" do
2
2
  let(:last_response_body) { JSON.parse(subject.body, symbolize_names: true) }
3
3
  let(:pacts) { last_response_body[:_embedded][:'pacts'] }
4
- subject { get path; last_response }
4
+ let(:query) do
5
+ {
6
+ consumer_version_selectors: [ { tag: "prod", latest: "true" }]
7
+ }
8
+ end
9
+
10
+ subject { get(path, query) }
5
11
 
6
12
  context "when the provider exists" do
7
13
  before do
@@ -16,24 +22,53 @@ describe "Get provider pacts for verification" do
16
22
  .create_pact
17
23
  end
18
24
 
19
- context "with no tag specified" do
20
- let(:path) { "/pacts/provider/Provider/for-verification" }
25
+ let(:path) { "/pacts/provider/Provider/for-verification" }
21
26
 
27
+ context "when using GET" do
22
28
  it "returns a 200 HAL JSON response" do
23
29
  expect(subject).to be_a_hal_json_success_response
24
30
  end
25
31
 
26
32
  it "returns a list of links to the pacts" do
27
- expect(pacts.size).to eq 2
33
+ expect(pacts.size).to eq 1
34
+ end
35
+
36
+ context "when the provider does not exist" do
37
+ let(:path) { "/pacts/provider/ProviderThatDoesNotExist/for-verification" }
38
+
39
+ it "returns a 404 response" do
40
+ expect(subject).to be_a_404_response
41
+ end
28
42
  end
29
43
  end
30
- end
31
44
 
32
- context "when the provider does not exist" do
33
- let(:path) { "/pacts/provider/Provider" }
45
+ context "when using POST" do
46
+ let(:request_body) do
47
+ {
48
+ consumerVersionSelectors: [ { tag: "prod", latest: true }]
49
+ }
50
+ end
34
51
 
35
- it "returns a 404 response" do
36
- expect(subject).to be_a_404_response
52
+ let(:request_headers) do
53
+ {
54
+ 'CONTENT_TYPE' => 'application/json',
55
+ 'HTTP_ACCEPT' => 'application/hal+json'
56
+ }
57
+ end
58
+
59
+ subject { post(path, request_body.to_json, request_headers) }
60
+
61
+ it "returns a list of links to the pacts" do
62
+ expect(pacts.size).to eq 1
63
+ end
64
+
65
+ context "when the provider does not exist" do
66
+ let(:path) { "/pacts/provider/ProviderThatDoesNotExist/for-verification" }
67
+
68
+ it "returns a 404 response" do
69
+ expect(subject).to be_a_404_response
70
+ end
71
+ end
37
72
  end
38
73
  end
39
74
  end
@@ -20,7 +20,7 @@ RSpec.describe "the pending lifecycle of a pact (with no tags)" do
20
20
  end
21
21
 
22
22
  def get_pacts_for_verification
23
- get("/pacts/provider/Bar/for-verification", nil, request_headers)
23
+ post("/pacts/provider/Bar/for-verification", { includePendingStatus: true }.to_json, request_headers)
24
24
  end
25
25
 
26
26
  def pact_url_from(pacts_for_verification_response)
@@ -0,0 +1,138 @@
1
+ RSpec.describe "the lifecycle of a WIP pact" do
2
+ let(:pact_content_1) { { interactions: [{ some: 'interaction'}] }.to_json }
3
+ let(:pact_content_2) { { interactions: [{ some: 'other interaction'}] }.to_json }
4
+ let(:request_headers) { { "CONTENT_TYPE" => "application/json", "HTTP_ACCEPT" => "application/hal+json"} }
5
+ let(:provider_version_number) { "2" }
6
+ let(:failed_verification_results) do
7
+ {
8
+ providerApplicationVersion: provider_version_number,
9
+ success: false
10
+ }.to_json
11
+ end
12
+ let(:successful_verification_results) do
13
+ {
14
+ providerApplicationVersion: provider_version_number,
15
+ success: true
16
+ }.to_json
17
+ end
18
+ let(:pacts_for_verification_request_body) do
19
+ {
20
+ consumerVersionSelectors: [ { tag: "master", latest: true } ],
21
+ providerVersionTags: ["master"],
22
+ includeWipPactsSince: start_date
23
+ }.to_json
24
+ end
25
+ let(:start_date) { (Date.today - 1).to_datetime }
26
+
27
+ def publish_pact_with_master_tag
28
+ put("/pacts/provider/Bar/consumer/Foo/version/1", pact_content_1, request_headers)
29
+ put("/pacticipants/Foo/versions/1/tags/master", nil, request_headers)
30
+ end
31
+
32
+ def publish_pact_with_feature_tag
33
+ put("/pacts/provider/Bar/consumer/Foo/version/2", pact_content_2, request_headers)
34
+ put("/pacticipants/Foo/versions/2/tags/feat-x", nil, request_headers)
35
+ end
36
+
37
+ def get_pacts_for_verification
38
+ post("/pacts/provider/Bar/for-verification", pacts_for_verification_request_body, request_headers)
39
+ end
40
+
41
+ def wip_pact_url_from(pacts_for_verification_response)
42
+ wip_pacts_from(pacts_for_verification_response).first["_links"]["self"]["href"]
43
+ end
44
+
45
+ def get_pact(pact_url)
46
+ get pact_url, nil, request_headers
47
+ end
48
+
49
+ def verification_results_url_from(pact_response)
50
+ JSON.parse(pact_response.body)["_links"]["pb:publish-verification-results"]["href"]
51
+ end
52
+
53
+ def publish_verification_results_with_tag_master(verification_results_url, results)
54
+ post(verification_results_url, results, request_headers)
55
+ put("/pacticipants/Bar/versions/#{provider_version_number}/tags/master", nil, request_headers)
56
+ end
57
+
58
+ def pending_status_from(pacts_for_verification_response)
59
+ JSON.parse(pacts_for_verification_response.body)["_embedded"]["pacts"][0]["verificationProperties"]["pending"]
60
+ end
61
+
62
+ def wip_pacts_from(pacts_for_verification_response)
63
+ JSON.parse(pacts_for_verification_response.body)["_embedded"]["pacts"].select do | pact |
64
+ pact["verificationProperties"]["wip"]
65
+ end
66
+ end
67
+
68
+ context "when the includeWipPactsSince date is specified" do
69
+ context "a pact published afer the specified date, with a tag that is not specified explictly in the 'pacts for verification' request" do
70
+ describe "when it is first published" do
71
+ it "is included in the list of pacts to verify as a WIP pact" do
72
+ publish_pact_with_master_tag
73
+ publish_pact_with_feature_tag
74
+
75
+ pacts_for_verification_response = get_pacts_for_verification
76
+ expect(wip_pacts_from(pacts_for_verification_response).size).to eq 1
77
+ end
78
+ end
79
+
80
+ describe "when it is verified unsuccessfully" do
81
+ it "is still included as a WIP pact" do
82
+ # CONSUMER BUILD
83
+ # publish pact
84
+ publish_pact_with_master_tag
85
+ publish_pact_with_feature_tag
86
+
87
+ # PROVIDER BUILD
88
+ # fetch pacts to verify
89
+ pacts_for_verification_response = get_pacts_for_verification
90
+ pact_url = wip_pact_url_from(pacts_for_verification_response)
91
+ pact_response = get_pact(pact_url)
92
+
93
+ # verify pact... failure...
94
+
95
+ # publish failure verification results
96
+ verification_results_url = verification_results_url_from(pact_response)
97
+ publish_verification_results_with_tag_master(verification_results_url, failed_verification_results)
98
+
99
+ # ANOTHER PROVIDER BUILD
100
+ # get pacts for verification
101
+ pacts_for_verification_response = get_pacts_for_verification
102
+ # still pending
103
+ expect(wip_pacts_from(pacts_for_verification_response).size).to eq 1
104
+ end
105
+ end
106
+
107
+ describe "when it is verified successfully" do
108
+ it "is no longer included in the list of pacts to verify" do
109
+ # CONSUMER BUILD
110
+ publish_pact_with_master_tag
111
+ publish_pact_with_feature_tag
112
+
113
+ # PROVIDER BUILD
114
+ # fetch pacts to verify
115
+ pacts_for_verification_response = get_pacts_for_verification
116
+ pact_url = wip_pact_url_from(pacts_for_verification_response)
117
+ pact_response = get_pact(pact_url)
118
+
119
+ # verify pact... success!
120
+
121
+ # publish failure verification results
122
+ verification_results_url = verification_results_url_from(pact_response)
123
+ publish_verification_results_with_tag_master(verification_results_url, successful_verification_results)
124
+
125
+
126
+ # ANOTHER PROVIDER BUILD 2
127
+ # get pacts for verification
128
+ # publish successful verification results
129
+ pacts_for_verification_response = get_pacts_for_verification
130
+ # not wip any more
131
+ expect(wip_pacts_from(pacts_for_verification_response).size).to eq 0
132
+ end
133
+ end
134
+
135
+ end
136
+
137
+ end
138
+ end
@@ -29,7 +29,7 @@ module PactBroker
29
29
  context "when Accept includes text/html" do
30
30
  let(:env) { {'HTTP_ACCEPT' => 'text/html'} }
31
31
 
32
- subject { get path, '', env; last_response }
32
+ subject { get(path, '', env) }
33
33
 
34
34
  describe "a request for root" do
35
35
  let(:path) { '/' }
@@ -0,0 +1,90 @@
1
+ require 'pact_broker/api/contracts/verifiable_pacts_json_query_schema'
2
+
3
+ module PactBroker
4
+ module Api
5
+ module Contracts
6
+ describe VerifiablePactsJSONQuerySchema do
7
+ let(:params) do
8
+ {
9
+ providerVersionTags: provider_version_tags,
10
+ consumerVersionSelectors: consumer_version_selectors
11
+ }
12
+ end
13
+
14
+ let(:provider_version_tags) { %w[master] }
15
+
16
+ let(:consumer_version_selectors) do
17
+ [{
18
+ tag: "master",
19
+ latest: true
20
+ }]
21
+ end
22
+
23
+ subject { VerifiablePactsJSONQuerySchema.(params) }
24
+
25
+ context "when the params are valid" do
26
+ it "has no errors" do
27
+ expect(subject).to eq({})
28
+ end
29
+ end
30
+
31
+ context "when providerVersionTags is not an array" do
32
+ let(:provider_version_tags) { true }
33
+
34
+ it { is_expected.to have_key(:providerVersionTags) }
35
+ end
36
+
37
+ context "when consumerVersionSelectors is not an array" do
38
+ let(:consumer_version_selectors) { true }
39
+
40
+ it { is_expected.to have_key(:consumerVersionSelectors) }
41
+ end
42
+
43
+ context "when the consumer_version_selector is missing a tag" do
44
+ let(:consumer_version_selectors) do
45
+ [{}]
46
+ end
47
+
48
+ it "flattens the messages" do
49
+ expect(subject[:consumerVersionSelectors].first).to eq "tag is missing at index 0"
50
+ end
51
+ end
52
+
53
+ context "when the consumerVersionSelectors is missing the latest" do
54
+ let(:consumer_version_selectors) do
55
+ [{
56
+ tag: "master"
57
+ }]
58
+ end
59
+
60
+ it { is_expected.to have_key(:consumerVersionSelectors) }
61
+ end
62
+
63
+ context "when includeWipPactsSince key exists" do
64
+ let(:include_wip_pacts_since) { nil }
65
+ let(:params) do
66
+ {
67
+ includeWipPactsSince: include_wip_pacts_since
68
+ }
69
+ end
70
+
71
+ context "when it is nil" do
72
+ it { is_expected.to have_key(:includeWipPactsSince) }
73
+ end
74
+
75
+ context "when it is not a date" do
76
+ let(:include_wip_pacts_since) { "foo" }
77
+
78
+ it { is_expected.to have_key(:includeWipPactsSince) }
79
+ end
80
+
81
+ context "when it is a valid date" do
82
+ let(:include_wip_pacts_since) { "2013-02-13T20:04:45.000+11:00" }
83
+
84
+ it { is_expected.to_not have_key(:includeWipPactsSince) }
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end
@@ -4,7 +4,6 @@ module PactBroker
4
4
  module Api
5
5
  module Contracts
6
6
  describe VerifiablePactsQuerySchema do
7
-
8
7
  let(:params) do
9
8
  {
10
9
  provider_version_tags: provider_version_tags,
@@ -45,15 +44,38 @@ module PactBroker
45
44
  end
46
45
  end
47
46
 
48
- context "whne the consumer_version_selectors is missing the latest" do
47
+ context "when the consumer_version_selectors is missing the latest" do
49
48
  let(:consumer_version_selectors) do
50
49
  [{
51
50
  tag: "master"
52
51
  }]
53
52
  end
54
53
 
55
- it "has no errors" do
56
- expect(subject).to eq({})
54
+ it { is_expected.to have_key(:consumer_version_selectors) }
55
+ end
56
+
57
+ context "when include_wip_pacts_since key exists" do
58
+ let(:include_wip_pacts_since) { nil }
59
+ let(:params) do
60
+ {
61
+ include_wip_pacts_since: include_wip_pacts_since
62
+ }
63
+ end
64
+
65
+ context "when it is nil" do
66
+ it { is_expected.to have_key(:include_wip_pacts_since) }
67
+ end
68
+
69
+ context "when it is not a date" do
70
+ let(:include_wip_pacts_since) { "foo" }
71
+
72
+ it { is_expected.to have_key(:include_wip_pacts_since) }
73
+ end
74
+
75
+ context "when it is a valid date" do
76
+ let(:include_wip_pacts_since) { "2013-02-13T20:04:45.000+11:00" }
77
+
78
+ it { is_expected.to_not have_key(:include_wip_pacts_since) }
57
79
  end
58
80
  end
59
81
  end
@@ -16,6 +16,8 @@ module PactBroker
16
16
  {
17
17
  consumer_name: "Consumer",
18
18
  consumer_version_number: "1.0.0",
19
+ consumer_version_tags: consumer_version_tags,
20
+ provider_version_tags: provider_version_tags,
19
21
  pact_version_sha: "1234",
20
22
  pact_created_at: pact_created_at,
21
23
  provider_version_number: "4.5.6",
@@ -33,6 +35,7 @@ module PactBroker
33
35
  {
34
36
  consumer_name: "Consumer",
35
37
  consumer_version_number: "1.0.0",
38
+ consumer_version_tags: [],
36
39
  pact_version_sha: "1234",
37
40
  pact_created_at: pact_created_at,
38
41
  provider_version_number: nil,
@@ -59,7 +62,14 @@ module PactBroker
59
62
  self: {
60
63
  href: 'http://example.org/pacticipants/Consumer/versions/1.0.0'
61
64
  }
62
- }
65
+ },
66
+ tags: [
67
+ {
68
+ name: 'prod',
69
+ latest: true
70
+
71
+ }
72
+ ]
63
73
  }
64
74
  }
65
75
  end
@@ -73,7 +83,19 @@ module PactBroker
73
83
  }
74
84
  },
75
85
  version: {
76
- number: '4.5.6'
86
+ number: '4.5.6',
87
+ _links: {
88
+ self: {
89
+ href: 'http://example.org/pacticipants/Provider/versions/4.5.6'
90
+ }
91
+ },
92
+ tags: [
93
+ {
94
+ name: 'master',
95
+ latest: false
96
+ }
97
+ ]
98
+
77
99
  }
78
100
  }
79
101
  end
@@ -101,6 +123,18 @@ module PactBroker
101
123
  }
102
124
  end
103
125
 
126
+ let(:consumer_version_tags) do
127
+ [
128
+ double('tag', name: 'prod', latest?: true)
129
+ ]
130
+ end
131
+
132
+ let(:provider_version_tags) do
133
+ [
134
+ double('tag', name: 'master', latest?: false)
135
+ ]
136
+ end
137
+
104
138
  let(:query_results){ PactBroker::Matrix::QueryResultsWithDeploymentStatusSummary.new([row_1, row_2], selectors, options, resolved_selectors, integrations, deployment_status_summary)}
105
139
  let(:selectors) { nil }
106
140
  let(:integrations){ [] }