pact_broker 2.51.0 → 2.52.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 (49) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +26 -0
  3. data/db/migrations/20200318_add_created_at_to_latest_pact_publications.rb +9 -0
  4. data/db/migrations/20200319_add_created_at_to_latest_verifications.rb +9 -0
  5. data/lib/pact_broker/api/contracts/dry_validation_predicates.rb +4 -0
  6. data/lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema.rb +26 -1
  7. data/lib/pact_broker/api/contracts/verifiable_pacts_query_schema.rb +2 -0
  8. data/lib/pact_broker/api/decorators/matrix_text_decorator.rb +1 -1
  9. data/lib/pact_broker/api/decorators/verifiable_pacts_query_decorator.rb +1 -0
  10. data/lib/pact_broker/api/pact_broker_urls.rb +11 -0
  11. data/lib/pact_broker/api/renderers/html_pact_renderer.rb +1 -1
  12. data/lib/pact_broker/db/data_migrations/set_created_at_for_latest_pact_publications.rb +25 -0
  13. data/lib/pact_broker/db/data_migrations/set_created_at_for_latest_verifications.rb +24 -0
  14. data/lib/pact_broker/db/migrate_data.rb +2 -0
  15. data/lib/pact_broker/matrix/every_row.rb +11 -5
  16. data/lib/pact_broker/matrix/parse_query.rb +6 -0
  17. data/lib/pact_broker/matrix/query_builder.rb +28 -16
  18. data/lib/pact_broker/matrix/query_results_with_deployment_status_summary.rb +15 -4
  19. data/lib/pact_broker/matrix/quick_row.rb +49 -65
  20. data/lib/pact_broker/matrix/repository.rb +2 -12
  21. data/lib/pact_broker/matrix/resolved_selector.rb +1 -1
  22. data/lib/pact_broker/matrix/service.rb +1 -1
  23. data/lib/pact_broker/pacts/pact_publication.rb +8 -0
  24. data/lib/pact_broker/pacts/repository.rb +10 -11
  25. data/lib/pact_broker/pacts/selector.rb +21 -0
  26. data/lib/pact_broker/pacts/verifiable_pact_messages.rb +5 -1
  27. data/lib/pact_broker/test/test_data_builder.rb +6 -0
  28. data/lib/pact_broker/ui/view_models/matrix_line.rb +8 -0
  29. data/lib/pact_broker/ui/views/matrix/show.haml +4 -4
  30. data/lib/pact_broker/verifications/repository.rb +2 -1
  31. data/lib/pact_broker/version.rb +1 -1
  32. data/lib/rack/pact_broker/request_target.rb +1 -1
  33. data/pact_broker.gemspec +1 -1
  34. data/public/javascripts/matrix.js +20 -8
  35. data/script/docker/db-restore.sh +1 -1
  36. data/spec/lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema_spec.rb +43 -2
  37. data/spec/lib/pact_broker/api/contracts/verifiable_pacts_query_schema_spec.rb +13 -0
  38. data/spec/lib/pact_broker/api/decorators/matrix_decorator_spec.rb +11 -2
  39. data/spec/lib/pact_broker/api/renderers/html_pact_renderer_spec.rb +2 -1
  40. data/spec/lib/pact_broker/matrix/every_row_spec.rb +0 -10
  41. data/spec/lib/pact_broker/matrix/quick_row_spec.rb +11 -11
  42. data/spec/lib/pact_broker/matrix/repository_dependency_spec.rb +1 -1
  43. data/spec/lib/pact_broker/matrix/repository_spec.rb +9 -9
  44. data/spec/lib/pact_broker/pacts/repository_find_for_verification_spec.rb +43 -1
  45. data/spec/lib/pact_broker/pacts/repository_spec.rb +9 -0
  46. data/spec/lib/pact_broker/pacts/selector_spec.rb +5 -2
  47. data/spec/lib/pact_broker/pacts/verifiable_pact_messages_spec.rb +6 -0
  48. data/spec/lib/pact_broker/verifications/repository_spec.rb +21 -0
  49. metadata +10 -12
@@ -12,7 +12,7 @@ module PactBroker
12
12
  ENV['TZ'] = "Australia/Melbourne"
13
13
  PactBroker.configuration.enable_public_badge_access = true
14
14
  allow(PactBroker::Api::PactBrokerUrls).to receive(:pact_url).with('http://base', pact).and_return(pact_url)
15
- allow(PactBroker::Api::PactBrokerUrls).to receive(:matrix_for_pacticipant_version_url).with(consumer_version, 'http://base').and_return(matrix_url)
15
+ allow(PactBroker::Api::PactBrokerUrls).to receive(:matrix_for_pact_url).with(pact, 'http://base').and_return(matrix_url)
16
16
  allow_any_instance_of(HtmlPactRenderer).to receive(:logger).and_return(logger)
17
17
 
18
18
  Timecop.freeze(created_at + 3)
@@ -95,6 +95,7 @@ module PactBroker
95
95
  before do
96
96
  allow(pact).to receive(:content_hash).and_return(content_hash)
97
97
  end
98
+
98
99
  let(:json_content) { '[1]' }
99
100
  let(:content_hash) { [1] }
100
101
 
@@ -8,13 +8,6 @@ module PactBroker
8
8
  let(:bar) { PactBroker::Domain::Pacticipant.where(name: "Bar").single_record }
9
9
  let(:wiffle) { PactBroker::Domain::Pacticipant.where(name: "Wiffle").single_record }
10
10
 
11
- describe "ALL_COLUMNS" do
12
- it "has the same first column as QuickRow - this is required so that they both sort the same" do
13
- expect(EveryRow::ALL_COLUMNS.first).to eq QuickRow::LAST_ACTION_DATE
14
- expect(EveryRow::ALL_COLUMNS.first).to eq QuickRow::ALL_COLUMNS.first
15
- end
16
- end
17
-
18
11
  describe "matching_selectors" do
19
12
  before do
20
13
  td.create_pact_with_verification("Foo", "1", "Bar", "2")
@@ -58,7 +51,6 @@ module PactBroker
58
51
  EveryRow
59
52
  .select_all_columns
60
53
  .join_verifications
61
- .join_pacticipants_and_pacticipant_versions
62
54
  .eager_all_the_things
63
55
  .all
64
56
  end
@@ -99,7 +91,6 @@ module PactBroker
99
91
  EveryRow
100
92
  .select_all_columns
101
93
  .join_verifications
102
- .join_pacticipants_and_pacticipant_versions
103
94
  .all
104
95
  end
105
96
 
@@ -129,7 +120,6 @@ module PactBroker
129
120
  EveryRow
130
121
  .select_all_columns
131
122
  .join_verifications_for(query_ids)
132
- .join_pacticipants_and_pacticipant_versions
133
123
  .all
134
124
  end
135
125
 
@@ -38,20 +38,20 @@ module PactBroker
38
38
  before do
39
39
  td.create_consumer("Foo")
40
40
  .create_provider("Bar")
41
- .create_consumer_version("10", created_at: cv_created_at_1)
42
- .create_pact
43
- .create_verification(provider_version: "2", created_at: pv_created_at)
44
- .create_consumer_version("3", created_at: cv_created_at_2)
45
- .create_pact
46
- .create_verification(provider_version: "2")
41
+ .create_consumer_version("10")
42
+ .create_pact(created_at: day_1)
43
+ .create_verification(provider_version: "2", created_at: day_3)
44
+ .create_consumer_version("3")
45
+ .create_pact(created_at: day_2)
46
+ .create_verification(provider_version: "2", created_at: day_3)
47
47
  end
48
48
 
49
- let(:cv_created_at_1) { DateTime.now + 1 }
50
- let(:cv_created_at_2) { DateTime.now + 2 }
51
- let(:pv_created_at) { DateTime.now + 3 }
49
+ let(:day_1) { DateTime.now + 1 }
50
+ let(:day_2) { DateTime.now + 2 }
51
+ let(:day_3) { DateTime.now + 3 }
52
52
 
53
-
54
- it "orders by the consumer version" do
53
+ it "orders by the pact publication id desc" do
54
+ expect(subject.first.last_action_date).to eq subject.last.last_action_date
55
55
  expect(subject.first.consumer_version_number).to eq "3"
56
56
  expect(subject.last.consumer_version_number).to eq "10"
57
57
  end
@@ -7,7 +7,7 @@ module PactBroker
7
7
 
8
8
  def build_selectors(hash)
9
9
  hash.collect do | key, value |
10
- { pacticipant_name: key, pacticipant_version_number: value }
10
+ UnresolvedSelector.new(pacticipant_name: key, pacticipant_version_number: value)
11
11
  end
12
12
  end
13
13
 
@@ -359,8 +359,8 @@ module PactBroker
359
359
 
360
360
  it "returns a row for each verification for that version" do
361
361
  expect(subject.size).to eq 2
362
- expect(subject.collect{|r| r[:consumer_version_number]}.sort).to eq ["1.2.3", "1.2.3"]
363
- expect(subject.collect{|r| r[:provider_version_number]}.sort).to eq ["4.5.6", "6.7.8"]
362
+ expect(subject.collect(&:consumer_version_number).sort).to eq ["1.2.3", "1.2.3"]
363
+ expect(subject.collect(&:provider_version_number).sort).to eq ["4.5.6", "6.7.8"]
364
364
  end
365
365
  end
366
366
 
@@ -376,8 +376,8 @@ module PactBroker
376
376
  let(:selectors) { build_selectors("A" => nil) }
377
377
 
378
378
  it "returns a row for each verification for the pacticipant" do
379
- expect(subject.collect{|r| r[:consumer_name]}.uniq).to eq ["A"]
380
- provider_version_numbers = subject.collect{|r| r[:provider_version_number]}
379
+ expect(subject.collect(&:consumer_name).uniq).to eq ["A"]
380
+ provider_version_numbers = subject.collect(&:provider_version_number)
381
381
  expect(provider_version_numbers).to include nil
382
382
  expect(provider_version_numbers).to include "4.5.6"
383
383
  end
@@ -398,8 +398,8 @@ module PactBroker
398
398
 
399
399
  it "returns a row for each verification for that version" do
400
400
  expect(subject.size).to eq 2
401
- expect(subject.collect{|r| r[:consumer_version_number]}.sort).to eq ["1.2.3", "3.4.5"]
402
- expect(subject.collect{|r| r[:provider_version_number]}.sort).to eq ["4.5.6", "4.5.6"]
401
+ expect(subject.collect(&:consumer_version_number).sort).to eq ["1.2.3", "3.4.5"]
402
+ expect(subject.collect(&:provider_version_number).sort).to eq ["4.5.6", "4.5.6"]
403
403
  end
404
404
  end
405
405
 
@@ -422,8 +422,8 @@ module PactBroker
422
422
 
423
423
  it "returns a row for each verification for that version" do
424
424
  expect(subject.size).to eq 3
425
- expect(subject.collect{|r| r[:consumer_version_number]}.sort).to eq ["1.2.3", "3.4.5", "3.4.5"]
426
- expect(subject.collect{|r| r[:provider_version_number]}.sort).to eq ["4.5.6", "4.5.6", "6.7.8"]
425
+ expect(subject.collect(&:consumer_version_number).sort).to eq ["1.2.3", "3.4.5", "3.4.5"]
426
+ expect(subject.collect(&:provider_version_number).sort).to eq ["4.5.6", "4.5.6", "6.7.8"]
427
427
  end
428
428
  end
429
429
 
@@ -565,7 +565,7 @@ module PactBroker
565
565
 
566
566
  it "returns all matching rows" do
567
567
  # postgres orders differently, and ruby array sort blows up with a nil string
568
- provider_version_numbers = subject.collect{ |r| r[:provider_version_number]}
568
+ provider_version_numbers = subject.collect(&:provider_version_number)
569
569
  expect(provider_version_numbers).to include nil
570
570
  expect(provider_version_numbers).to include "2.0.0"
571
571
  expect(provider_version_numbers.size).to eq 2
@@ -72,6 +72,17 @@ module PactBroker
72
72
  it "sets the latest_consumer_version_tag_names" do
73
73
  expect(find_by_consumer_version_number("foo-latest-prod-version").selectors.collect(&:tag)).to eq ['prod']
74
74
  end
75
+
76
+ context "when a consumer name is specified", pending: "not yet implemented, but will do" do
77
+ let(:consumer_version_selectors) do
78
+ Selectors.new(Selector.all_for_tag_and_consumer('prod', 'Foo'))
79
+ end
80
+
81
+ it "only returns the pacts for that consumer" do
82
+ expect(subject.size).to eq 3
83
+ expect(find_by_consumer_version_number("foo-latest-prod-version").selectors).to eq [Selector.all_for_tag_and_consumer('prod', 'Foo')]
84
+ end
85
+ end
75
86
  end
76
87
 
77
88
  context "when all versions with a given tag are requested" do
@@ -99,7 +110,38 @@ module PactBroker
99
110
  td.create_consumer_version("prod-version-3", tag_names: %w[prod])
100
111
  .republish_same_pact
101
112
  expect(subject.size).to be 2
102
- expect(subject.collect(&:consumer_version_number)).to eq %w[prod-version-1 prod-version-3]
113
+ expect(subject.collect(&:consumer_version_number).sort).to eq %w[prod-version-1 prod-version-3]
114
+ end
115
+ end
116
+
117
+ context "when all versions with a given tag for a given consumer are requested" do
118
+ before do
119
+ td.create_pact_with_hierarchy("Foo2", "prod-version-1", "Bar2")
120
+ .create_consumer_version_tag("prod")
121
+ .create_consumer_version("not-prod-version", tag_names: %w[master])
122
+ .create_pact
123
+ .create_consumer_version("prod-version-2", tag_names: %w[prod])
124
+ .create_pact
125
+ .create_consumer("Foo3")
126
+ .create_consumer_version("prod-version-3", tag_names: %w[prod])
127
+ .create_pact
128
+ end
129
+
130
+ let(:consumer_version_selectors) { Selectors.new(pact_selector_1) }
131
+ let(:pact_selector_1) { Selector.all_for_tag_and_consumer('prod', "Foo2") }
132
+
133
+ subject { Repository.new.find_for_verification("Bar2", consumer_version_selectors) }
134
+
135
+ it "returns all the versions with the specified tag and consumer" do
136
+ expect(subject.size).to be 2
137
+ expect(find_by_consumer_version_number("prod-version-1")).to_not be nil
138
+ expect(find_by_consumer_version_number("prod-version-2")).to_not be nil
139
+ expect(find_by_consumer_version_number("prod-version-3")).to be nil
140
+ end
141
+
142
+ it "sets the selectors" do
143
+ expect(find_by_consumer_version_number("prod-version-1").selectors.first.tag).to eq 'prod'
144
+ expect(find_by_consumer_version_number("prod-version-1").selectors.first.consumer).to eq 'Foo2'
103
145
  end
104
146
  end
105
147
 
@@ -53,6 +53,15 @@ module PactBroker
53
53
  expect(subject.created_at).to be_datey
54
54
  end
55
55
 
56
+ it "creates a LatestPactPublicationIdForConsumerVersion" do
57
+ expect{ subject }.to change { LatestPactPublicationIdForConsumerVersion.count }.by(1)
58
+ end
59
+
60
+ it "sets the created_at of the LatestPactPublicationIdForConsumerVersion to the same as the consumer version, because that's how pacts are ordered" do
61
+ subject
62
+ expect(LatestPactPublicationIdForConsumerVersion.first.created_at).to eq PactBroker::Domain::Version.find(number: subject.consumer_version_number).created_at
63
+ end
64
+
56
65
  context "when a pact already exists with exactly the same content" do
57
66
  let(:another_version) { Versions::Repository.new.create number: '2.0.0', pacticipant_id: consumer.id }
58
67
 
@@ -8,15 +8,18 @@ module PactBroker
8
8
  let(:overall_latest_2) { Selector.overall_latest }
9
9
  let(:latest_for_tag_prod) { Selector.latest_for_tag('prod') }
10
10
  let(:latest_for_tag_dev) { Selector.latest_for_tag('dev') }
11
+ let(:all_prod_for_consumer_1) { Selector.all_for_tag_and_consumer('prod', 'Foo') }
12
+ let(:all_prod_for_consumer_2) { Selector.all_for_tag_and_consumer('prod', 'Bar') }
13
+ let(:all_dev_for_consumer_1) { Selector.all_for_tag_and_consumer('dev', 'Bar') }
11
14
  let(:all_prod) { Selector.all_for_tag('prod') }
12
15
  let(:all_dev) { Selector.all_for_tag('dev') }
13
16
 
14
17
  let(:unsorted_selectors) do
15
- [all_prod, all_dev, latest_for_tag_prod, overall_latest_1, overall_latest_1, latest_for_tag_dev]
18
+ [all_prod, all_dev, all_dev_for_consumer_1, latest_for_tag_prod, overall_latest_1, overall_latest_1, latest_for_tag_dev, all_prod_for_consumer_2, all_prod_for_consumer_1]
16
19
  end
17
20
 
18
21
  let(:expected_sorted_selectors) do
19
- [overall_latest_1, overall_latest_1, latest_for_tag_dev, latest_for_tag_prod, all_dev, all_prod]
22
+ [overall_latest_1, overall_latest_1, latest_for_tag_dev, latest_for_tag_prod, all_dev_for_consumer_1, all_prod_for_consumer_2, all_prod_for_consumer_1, all_dev, all_prod]
20
23
  end
21
24
 
22
25
  it "sorts the selectors" do
@@ -67,6 +67,12 @@ module PactBroker
67
67
 
68
68
  its(:inclusion_reason) { is_expected.to include "The pact at http://pact is being verified because it matches the following configured selection criterion: pacts for all consumer versions tagged 'prod'"}
69
69
  end
70
+
71
+ context "when the pact is one of all versions for a tag and consumer" do
72
+ let(:selectors) { Selectors.new(Selector.all_for_tag_and_consumer('prod', 'Foo')) }
73
+
74
+ its(:inclusion_reason) { is_expected.to include "The pact at http://pact is being verified because it matches the following configured selection criterion: pacts for all Foo versions tagged 'prod'"}
75
+ end
70
76
  end
71
77
 
72
78
  describe "#pending_reason" do
@@ -3,6 +3,27 @@ require 'pact_broker/verifications/repository'
3
3
  module PactBroker
4
4
  module Verifications
5
5
  describe Repository do
6
+ describe "#create" do
7
+ let(:verification) do
8
+ PactBroker::Domain::Verification.new(success: true)
9
+ end
10
+
11
+ let(:provider_version_number) { "2" }
12
+ let(:pact) do
13
+ td.create_pact_with_hierarchy("Foo", "1", "Bar").and_return(:pact)
14
+ end
15
+
16
+ subject { Repository.new.create verification, provider_version_number, pact}
17
+
18
+ it "creates a LatestVerificationIdForPactVersionAndProviderVersion" do
19
+ expect { subject }.to change { LatestVerificationIdForPactVersionAndProviderVersion.count }.by(1)
20
+ end
21
+
22
+ it "sets the created_at of the LatestVerificationIdForPactVersionAndProviderVersion to the same as the verification" do
23
+ expect(subject.created_at).to eq LatestVerificationIdForPactVersionAndProviderVersion.first.created_at
24
+ end
25
+ end
26
+
6
27
  describe "#find" do
7
28
  let!(:pact) do
8
29
  builder = TestDataBuilder.new
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.51.0
4
+ version: 2.52.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: 2020-03-10 00:00:00.000000000 Z
13
+ date: 2020-03-25 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -30,22 +30,16 @@ dependencies:
30
30
  name: json
31
31
  requirement: !ruby/object:Gem::Requirement
32
32
  requirements:
33
- - - ">"
34
- - !ruby/object:Gem::Version
35
- version: '1.8'
36
- - - "<"
33
+ - - "~>"
37
34
  - !ruby/object:Gem::Version
38
- version: '3.0'
35
+ version: '2.3'
39
36
  type: :runtime
40
37
  prerelease: false
41
38
  version_requirements: !ruby/object:Gem::Requirement
42
39
  requirements:
43
- - - ">"
44
- - !ruby/object:Gem::Version
45
- version: '1.8'
46
- - - "<"
40
+ - - "~>"
47
41
  - !ruby/object:Gem::Version
48
- version: '3.0'
42
+ version: '2.3'
49
43
  - !ruby/object:Gem::Dependency
50
44
  name: roar
51
45
  requirement: !ruby/object:Gem::Requirement
@@ -765,6 +759,8 @@ files:
765
759
  - db/migrations/20191030_optimise_latest_pact_publications_by_consumer_versions_.rb
766
760
  - db/migrations/20191031_optimise_latest_verification_ids_for_consumer_version_tags.rb
767
761
  - db/migrations/20191101_create_head_pact_tags.rb
762
+ - db/migrations/20200318_add_created_at_to_latest_pact_publications.rb
763
+ - db/migrations/20200319_add_created_at_to_latest_verifications.rb
768
764
  - db/migrations/migration_helper.rb
769
765
  - db/test/backwards_compatibility/.rspec
770
766
  - db/test/backwards_compatibility/Appraisals
@@ -952,6 +948,8 @@ files:
952
948
  - lib/pact_broker/db/data_migrations/helpers.rb
953
949
  - lib/pact_broker/db/data_migrations/migrate_webhook_headers.rb
954
950
  - lib/pact_broker/db/data_migrations/set_consumer_ids_for_pact_publications.rb
951
+ - lib/pact_broker/db/data_migrations/set_created_at_for_latest_pact_publications.rb
952
+ - lib/pact_broker/db/data_migrations/set_created_at_for_latest_verifications.rb
955
953
  - lib/pact_broker/db/data_migrations/set_latest_version_sequence_value.rb
956
954
  - lib/pact_broker/db/data_migrations/set_pacticipant_ids_for_verifications.rb
957
955
  - lib/pact_broker/db/data_migrations/set_webhooks_enabled.rb