pact_broker 2.35.0 → 2.36.0

Sign up to get free protection for your applications and to get access to all the features.
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