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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +19 -0
  3. data/db/migrations/000029_create_latest_tagged_pact_publications.rb +2 -0
  4. data/lib/pact_broker/api.rb +3 -0
  5. data/lib/pact_broker/api/decorators/extended_pact_decorator.rb +42 -0
  6. data/lib/pact_broker/api/decorators/extended_verification_decorator.rb +16 -0
  7. data/lib/pact_broker/api/decorators/pact_decorator.rb +6 -3
  8. data/lib/pact_broker/api/decorators/verification_decorator.rb +4 -0
  9. data/lib/pact_broker/api/pact_broker_urls.rb +12 -0
  10. data/lib/pact_broker/api/resources/dashboard.rb +1 -3
  11. data/lib/pact_broker/api/resources/index.rb +5 -0
  12. data/lib/pact_broker/api/resources/latest_verification_for_pact.rb +19 -0
  13. data/lib/pact_broker/api/resources/latest_verifications_for_consumer_version.rb +0 -1
  14. data/lib/pact_broker/api/resources/metrics.rb +21 -0
  15. data/lib/pact_broker/api/resources/pact.rb +8 -1
  16. data/lib/pact_broker/api/resources/pact_versions.rb +0 -1
  17. data/lib/pact_broker/api/resources/verification.rb +14 -1
  18. data/lib/pact_broker/domain/pact.rb +1 -2
  19. data/lib/pact_broker/domain/verification.rb +5 -3
  20. data/lib/pact_broker/index/service.rb +16 -1
  21. data/lib/pact_broker/matrix/aggregated_row.rb +14 -1
  22. data/lib/pact_broker/matrix/repository.rb +29 -25
  23. data/lib/pact_broker/matrix/resolved_selector.rb +3 -1
  24. data/lib/pact_broker/matrix/row.rb +6 -2
  25. data/lib/pact_broker/metrics/service.rb +56 -0
  26. data/lib/pact_broker/pacts/all_pact_publications.rb +8 -1
  27. data/lib/pact_broker/pacts/pact_publication.rb +9 -2
  28. data/lib/pact_broker/services.rb +5 -0
  29. data/lib/pact_broker/ui/views/index/show-with-tags.haml +2 -2
  30. data/lib/pact_broker/ui/views/matrix/show.haml +2 -2
  31. data/lib/pact_broker/verifications/repository.rb +4 -0
  32. data/lib/pact_broker/verifications/service.rb +4 -0
  33. data/lib/pact_broker/version.rb +1 -1
  34. data/public/javascripts/clipboard.js +2 -2
  35. data/spec/features/get_latest_verification_for_pact_spec.rb +42 -0
  36. data/spec/features/get_pact_versions_spec.rb +0 -5
  37. data/spec/features/metrics_spec.rb +23 -0
  38. data/spec/lib/pact_broker/api/decorators/extended_pact_decorator_spec.rb +61 -0
  39. data/spec/lib/pact_broker/api/decorators/pact_decorator_spec.rb +2 -1
  40. data/spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb +4 -1
  41. data/spec/lib/pact_broker/api/decorators/verification_summary_decorator_spec.rb +3 -1
  42. data/spec/lib/pact_broker/index/service_spec.rb +29 -4
  43. data/spec/lib/pact_broker/matrix/aggregated_row_spec.rb +23 -2
  44. data/spec/lib/pact_broker/matrix/deployment_status_summary_spec.rb +2 -0
  45. data/spec/lib/pact_broker/matrix/repository_query_limit_spec.rb +44 -0
  46. data/spec/lib/pact_broker/pacts/pact_publication_spec.rb +21 -3
  47. metadata +15 -2
@@ -5,7 +5,6 @@ module PactBroker
5
5
  module Api
6
6
  module Decorators
7
7
  describe PactDecorator do
8
-
9
8
  before do
10
9
  allow(decorator).to receive(:templated_diff_url).and_return('templated-diff-url')
11
10
  allow(decorator).to receive(:verification_publication_url).and_return('verification-publication-url')
@@ -25,7 +24,9 @@ module PactBroker
25
24
  content_hash: content_hash,
26
25
  created_at: created_at,
27
26
  consumer: consumer,
27
+ consumer_name: consumer.name,
28
28
  provider: provider,
29
+ provider_name: provider.name,
29
30
  consumer_version: consumer_version,
30
31
  consumer_version_number: '1234',
31
32
  pact_version_sha: '9999',
@@ -19,7 +19,8 @@ module PactBroker
19
19
  build_url: 'http://build-url',
20
20
  pact_version_sha: '1234',
21
21
  latest_pact_publication: pact_publication,
22
- execution_date: DateTime.now)
22
+ execution_date: DateTime.now,
23
+ provider_version_tags: provider_version_tags)
23
24
  end
24
25
 
25
26
  let(:pact_publication) do
@@ -31,6 +32,8 @@ module PactBroker
31
32
  )
32
33
  end
33
34
 
35
+ let(:provider_version_tags) { [instance_double(PactBroker::Tags::TagWithLatestFlag, name: 'prod', latest?: true)] }
36
+
34
37
  let(:options) { { user_options: { base_url: 'http://example.org' } } }
35
38
 
36
39
  let(:json) { VerificationDecorator.new(verification).to_json(options) }
@@ -20,12 +20,14 @@ module PactBroker
20
20
  pact_version_sha: '1234',
21
21
  latest_pact_publication: pact,
22
22
  test_results: nil,
23
- execution_date: DateTime.now)
23
+ execution_date: DateTime.now,
24
+ provider_version_tags: provider_version_tags)
24
25
  end
25
26
  let(:pact_version) do
26
27
  instance_double("PactBroker::Pacts::PactVersion", name: 'Name')
27
28
  end
28
29
 
30
+ let(:provider_version_tags) { [instance_double(PactBroker::Tags::TagWithLatestFlag, name: 'prod', latest?: true)] }
29
31
  let(:pact) { instance_double("PactBroker::Domain::Pact", name: "Some pact", consumer_name: "Foo", provider_name: "Bar", consumer_version_number: "1.2.3") }
30
32
  let(:options) { {base_url: 'http://example.org', consumer_name: "Foo", consumer_version_number: "1.2.3", resource_url: "http://self"} }
31
33
 
@@ -233,10 +233,35 @@ module PactBroker
233
233
 
234
234
  let(:options) { { tags: true } }
235
235
 
236
- it "returns the latest of the feat-x and feat-y verifications" do
237
- expect(rows.last.consumer_version_number).to eq "3"
238
- expect(rows.last.tag_names.sort).to eq ["feat-x", "feat-y"]
239
- expect(rows.last.provider_version_number).to eq "2"
236
+ context "with tags=true" do
237
+ it "returns the tags for the pacts" do
238
+ expect(rows.last.tag_names.sort).to eq ["feat-x", "feat-y"]
239
+ end
240
+ end
241
+
242
+ context "with tags=false" do
243
+ let(:options) { { tags: false } }
244
+
245
+ it "does not return the tags for the pacts" do
246
+ expect(rows.last.tag_names.sort).to eq []
247
+ end
248
+ end
249
+
250
+ context "with dashboard=true" do
251
+ let(:options) { { dashboard: true } }
252
+
253
+ it "returns the latest verification as nil as the pact version itself has not been verified" do
254
+ expect(rows.last.provider_version_number).to be nil
255
+ end
256
+ end
257
+
258
+ context "with dashboard=false" do
259
+ let(:options) { { } }
260
+
261
+ it "returns the latest of the feat-x and feat-y verifications because we are summarising the entire integration (backwards compat for OSS index)" do
262
+ expect(rows.last.consumer_version_number).to eq "4"
263
+ expect(rows.last.provider_version_number).to eq "2"
264
+ end
240
265
  end
241
266
  end
242
267
  end
@@ -3,7 +3,7 @@ require 'pact_broker/matrix/aggregated_row'
3
3
  module PactBroker
4
4
  module Matrix
5
5
  describe AggregatedRow do
6
- describe "latest_verification" do
6
+ describe "latest_verification_for_pseudo_branch" do
7
7
  let(:row_1) do
8
8
  instance_double('PactBroker::Matrix::HeadRow',
9
9
  consumer_name: "Foo",
@@ -27,7 +27,7 @@ module PactBroker
27
27
  let(:rows) { [row_1, row_2] }
28
28
  let(:aggregated_row) { AggregatedRow.new(rows) }
29
29
 
30
- subject { aggregated_row.latest_verification }
30
+ subject { aggregated_row.latest_verification_for_pseudo_branch }
31
31
 
32
32
  context "when the rows have verifications" do
33
33
  it "returns the verification with the largest id" do
@@ -74,6 +74,27 @@ module PactBroker
74
74
  end
75
75
  end
76
76
  end
77
+
78
+ describe "latest_verification_for_pact_version" do
79
+ let(:row_1) do
80
+ instance_double('PactBroker::Matrix::HeadRow',
81
+ verification: verification_1)
82
+ end
83
+ let(:row_2) do
84
+ instance_double('PactBroker::Matrix::HeadRow',
85
+ verification: verification_2)
86
+ end
87
+ let(:verification_1) { instance_double('PactBroker::Domain::Verification', id: 2) }
88
+ let(:verification_2) { instance_double('PactBroker::Domain::Verification', id: 1) }
89
+ let(:rows) { [row_1, row_2] }
90
+ let(:aggregated_row) { AggregatedRow.new(rows) }
91
+
92
+ subject { aggregated_row.latest_verification_for_pact_version }
93
+
94
+ it "returns the verification with the largest id" do
95
+ expect(subject.id).to eq 2
96
+ end
97
+ end
77
98
  end
78
99
  end
79
100
  end
@@ -190,6 +190,8 @@ module PactBroker
190
190
  pacticipant_name: "Bar",
191
191
  pacticipant_version_id: 10,
192
192
  pacticipant_version_number: "14131c5da3abf323ccf410b1b619edac76231243",
193
+ pact_publication_ids: [],
194
+ verification_ids: [],
193
195
  latest: nil,
194
196
  tag: nil,
195
197
  type: :inferred
@@ -0,0 +1,44 @@
1
+ require 'pact_broker/matrix/repository'
2
+
3
+ module PactBroker
4
+ module Matrix
5
+ describe Repository do
6
+ # See https://github.com/pact-foundation/pact_broker-client/issues/53
7
+ # The problem occurs when a pact has so many verifications for the same provider
8
+ # version that relevant rows do get returned in the result set because the specified limit
9
+ # causes them to be truncated.
10
+ # The most elegant solution is to create views have the data already grouped by
11
+ # consumer version/provider version, consumer version/provider, and consumer/provider,
12
+ # however, I don't have the time to work out how to make that view query efficient - I suspect
13
+ # it will require lots of full table scans, as it will have to work out the latest pact revision
14
+ # and latest verification for each pact publication and I'm not sure if it will have to do it
15
+ # for the entire table, or whether it will apply the consumer/provider filters...
16
+ # The quick and dirty solution is to do a pre-query to get the latest pact revision and latest
17
+ # verifications for the pact versions before we do the matrix query.
18
+ describe "Querying for can-i-deploy when there are more matrix rows than the specified query limit" do
19
+ before do
20
+ td.create_consumer("Foo")
21
+ .create_provider("Bar")
22
+ .create_consumer_version("1")
23
+ .create_pact
24
+ .create_verification(number: 1, provider_version: "2", tag_names: ['staging'])
25
+ .create_verification(number: 2, provider_version: "2")
26
+ .create_verification(number: 3, provider_version: "2")
27
+ .create_verification(number: 4, provider_version: "2")
28
+ .create_verification(number: 5, provider_version: "3")
29
+ .create_provider("Wiffle")
30
+ .create_pact
31
+ .create_verification(number: 1, provider_version: "6", tag_names: ['staging'])
32
+ end
33
+
34
+ let(:path) { "/matrix?q[][pacticipant]=Foo&q[][version]=1&tag=staging&latestby=cvp&limit=2" }
35
+
36
+ subject { get(path) }
37
+
38
+ it "does not remove relevant rows from the query due to the specified limit" do
39
+ expect(JSON.parse(subject.body)['summary']['deployable']).to be true
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -64,7 +64,25 @@ module PactBroker
64
64
  end
65
65
  end
66
66
 
67
- describe "#latest_tag_names" do
67
+ describe "#consumer_version_tags" do
68
+ before do
69
+ td.create_pact_with_hierarchy("Foo", "1.2.3", "Bar")
70
+ .create_consumer_version_tag("no")
71
+ .create_consumer_version("3.4.5")
72
+ .create_consumer_version_tag("yes")
73
+ .create_pact
74
+ .create_consumer_version("5.6.7")
75
+ .create_consumer_version_tag("no")
76
+ end
77
+
78
+ let(:pact_publication) { PactPublication.find(id: td.pact.id) }
79
+
80
+ it "" do
81
+ expect(pact_publication.consumer_version_tags.collect(&:name)).to eq ["yes"]
82
+ end
83
+ end
84
+
85
+ describe "#head_tag_names" do
68
86
  before do
69
87
  td.create_pact_with_hierarchy("Foo", "1.2.3", "Bar")
70
88
  .create_consumer_version_tag("no")
@@ -80,13 +98,13 @@ module PactBroker
80
98
 
81
99
  context "when the pact is the latest for a tag" do
82
100
  it "returns the relevant tag names" do
83
- expect(pact_publication.latest_tag_names).to eq ["yes"]
101
+ expect(pact_publication.head_tag_names).to eq ["yes"]
84
102
  end
85
103
  end
86
104
 
87
105
  context "when the pact is not the latest for a tag" do
88
106
  it "returns the relevant tag names" do
89
- expect(pact_publication.latest_tag_names).to eq ["yes"]
107
+ expect(pact_publication.head_tag_names).to eq ["yes"]
90
108
  end
91
109
  end
92
110
  end
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.35.0
4
+ version: 2.36.0
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: 2019-08-08 00:00:00.000000000 Z
13
+ date: 2019-08-29 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -784,6 +784,8 @@ files:
784
784
  - lib/pact_broker/api/decorators/embedded_label_decorator.rb
785
785
  - lib/pact_broker/api/decorators/embedded_tag_decorator.rb
786
786
  - lib/pact_broker/api/decorators/embedded_version_decorator.rb
787
+ - lib/pact_broker/api/decorators/extended_pact_decorator.rb
788
+ - lib/pact_broker/api/decorators/extended_verification_decorator.rb
787
789
  - lib/pact_broker/api/decorators/format_date_time.rb
788
790
  - lib/pact_broker/api/decorators/integration_decorator.rb
789
791
  - lib/pact_broker/api/decorators/integrations_decorator.rb
@@ -838,10 +840,12 @@ files:
838
840
  - lib/pact_broker/api/resources/latest_pact.rb
839
841
  - lib/pact_broker/api/resources/latest_pacts.rb
840
842
  - lib/pact_broker/api/resources/latest_provider_pacts.rb
843
+ - lib/pact_broker/api/resources/latest_verification_for_pact.rb
841
844
  - lib/pact_broker/api/resources/latest_verifications_for_consumer_version.rb
842
845
  - lib/pact_broker/api/resources/matrix.rb
843
846
  - lib/pact_broker/api/resources/matrix_badge.rb
844
847
  - lib/pact_broker/api/resources/matrix_for_consumer_and_provider.rb
848
+ - lib/pact_broker/api/resources/metrics.rb
845
849
  - lib/pact_broker/api/resources/pact.rb
846
850
  - lib/pact_broker/api/resources/pact_content_diff.rb
847
851
  - lib/pact_broker/api/resources/pact_triggered_webhooks.rb
@@ -974,6 +978,7 @@ files:
974
978
  - lib/pact_broker/matrix/row.rb
975
979
  - lib/pact_broker/matrix/service.rb
976
980
  - lib/pact_broker/messages.rb
981
+ - lib/pact_broker/metrics/service.rb
977
982
  - lib/pact_broker/pacticipants/find_potential_duplicate_pacticipant_names.rb
978
983
  - lib/pact_broker/pacticipants/repository.rb
979
984
  - lib/pact_broker/pacticipants/service.rb
@@ -1194,6 +1199,7 @@ files:
1194
1199
  - spec/features/get_latest_tagged_pact_spec.rb
1195
1200
  - spec/features/get_latest_untagged_pact_badge_spec.rb
1196
1201
  - spec/features/get_latest_untagged_pact_spec.rb
1202
+ - spec/features/get_latest_verification_for_pact_spec.rb
1197
1203
  - spec/features/get_matrix_badge_spec.rb
1198
1204
  - spec/features/get_matrix_for_consumer_and_provider_spec.rb
1199
1205
  - spec/features/get_matrix_spec.rb
@@ -1213,6 +1219,7 @@ files:
1213
1219
  - spec/features/get_wip_provider_pacts_spec.rb
1214
1220
  - spec/features/label_pacticipant_spec.rb
1215
1221
  - spec/features/merge_pact_spec.rb
1222
+ - spec/features/metrics_spec.rb
1216
1223
  - spec/features/publish_not_a_pact_spec.rb
1217
1224
  - spec/features/publish_pact_spec.rb
1218
1225
  - spec/features/publish_verification_spec.rb
@@ -1256,6 +1263,7 @@ files:
1256
1263
  - spec/lib/pact_broker/api/decorators/embedded_label_decorator_spec.rb
1257
1264
  - spec/lib/pact_broker/api/decorators/embedded_tag_decorator_spec.rb
1258
1265
  - spec/lib/pact_broker/api/decorators/embedded_version_decorator_spec.rb
1266
+ - spec/lib/pact_broker/api/decorators/extended_pact_decorator_spec.rb
1259
1267
  - spec/lib/pact_broker/api/decorators/integration_decorator_spec.rb
1260
1268
  - spec/lib/pact_broker/api/decorators/integrations_decorator_spec.rb
1261
1269
  - spec/lib/pact_broker/api/decorators/label_decorator_spec.rb
@@ -1353,6 +1361,7 @@ files:
1353
1361
  - spec/lib/pact_broker/matrix/integration_spec.rb
1354
1362
  - spec/lib/pact_broker/matrix/parse_query_spec.rb
1355
1363
  - spec/lib/pact_broker/matrix/repository_dependency_spec.rb
1364
+ - spec/lib/pact_broker/matrix/repository_query_limit_spec.rb
1356
1365
  - spec/lib/pact_broker/matrix/repository_spec.rb
1357
1366
  - spec/lib/pact_broker/matrix/row_spec.rb
1358
1367
  - spec/lib/pact_broker/matrix/service_spec.rb
@@ -1546,6 +1555,7 @@ test_files:
1546
1555
  - spec/features/get_latest_tagged_pact_spec.rb
1547
1556
  - spec/features/get_latest_untagged_pact_badge_spec.rb
1548
1557
  - spec/features/get_latest_untagged_pact_spec.rb
1558
+ - spec/features/get_latest_verification_for_pact_spec.rb
1549
1559
  - spec/features/get_matrix_badge_spec.rb
1550
1560
  - spec/features/get_matrix_for_consumer_and_provider_spec.rb
1551
1561
  - spec/features/get_matrix_spec.rb
@@ -1565,6 +1575,7 @@ test_files:
1565
1575
  - spec/features/get_wip_provider_pacts_spec.rb
1566
1576
  - spec/features/label_pacticipant_spec.rb
1567
1577
  - spec/features/merge_pact_spec.rb
1578
+ - spec/features/metrics_spec.rb
1568
1579
  - spec/features/publish_not_a_pact_spec.rb
1569
1580
  - spec/features/publish_pact_spec.rb
1570
1581
  - spec/features/publish_verification_spec.rb
@@ -1608,6 +1619,7 @@ test_files:
1608
1619
  - spec/lib/pact_broker/api/decorators/embedded_label_decorator_spec.rb
1609
1620
  - spec/lib/pact_broker/api/decorators/embedded_tag_decorator_spec.rb
1610
1621
  - spec/lib/pact_broker/api/decorators/embedded_version_decorator_spec.rb
1622
+ - spec/lib/pact_broker/api/decorators/extended_pact_decorator_spec.rb
1611
1623
  - spec/lib/pact_broker/api/decorators/integration_decorator_spec.rb
1612
1624
  - spec/lib/pact_broker/api/decorators/integrations_decorator_spec.rb
1613
1625
  - spec/lib/pact_broker/api/decorators/label_decorator_spec.rb
@@ -1705,6 +1717,7 @@ test_files:
1705
1717
  - spec/lib/pact_broker/matrix/integration_spec.rb
1706
1718
  - spec/lib/pact_broker/matrix/parse_query_spec.rb
1707
1719
  - spec/lib/pact_broker/matrix/repository_dependency_spec.rb
1720
+ - spec/lib/pact_broker/matrix/repository_query_limit_spec.rb
1708
1721
  - spec/lib/pact_broker/matrix/repository_spec.rb
1709
1722
  - spec/lib/pact_broker/matrix/row_spec.rb
1710
1723
  - spec/lib/pact_broker/matrix/service_spec.rb