pact_broker 2.51.0 → 2.52.0

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