pact_broker 2.80.0 → 2.81.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +2 -2
  3. data/CHANGELOG.md +21 -0
  4. data/db/ddl_statements/latest_verifications_for_pact_versions.rb +28 -0
  5. data/db/migrations/20210711_add_consumer_version_order_to_pact_publication.rb +12 -0
  6. data/db/migrations/20210712_add_interaction_count_to_pact_versions.rb +8 -0
  7. data/lib/db.rb +4 -0
  8. data/lib/pact_broker/api.rb +8 -10
  9. data/lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema.rb +25 -5
  10. data/lib/pact_broker/api/contracts/verifiable_pacts_query_schema.rb +0 -1
  11. data/lib/pact_broker/api/decorators/verifiable_pacts_query_decorator.rb +24 -0
  12. data/lib/pact_broker/api/resources/dashboard.rb +4 -1
  13. data/lib/pact_broker/api/resources/deployed_versions_for_version_and_environment.rb +3 -7
  14. data/lib/pact_broker/api/resources/index.rb +10 -12
  15. data/lib/pact_broker/api/resources/latest_provider_pacts.rb +1 -1
  16. data/lib/pact_broker/api/resources/pagination_methods.rb +14 -0
  17. data/lib/pact_broker/api/resources/tag.rb +14 -0
  18. data/lib/pact_broker/configuration.rb +4 -1
  19. data/lib/pact_broker/db/data_migrations/set_consumer_version_order_for_pact_publications.rb +28 -0
  20. data/lib/pact_broker/db/data_migrations/set_interactions_counts.rb +41 -0
  21. data/lib/pact_broker/db/migrate_data.rb +2 -0
  22. data/lib/pact_broker/db/seed_example_data.rb +5 -0
  23. data/lib/pact_broker/deployments/deployed_version_service.rb +13 -9
  24. data/lib/pact_broker/domain/verification.rb +40 -0
  25. data/lib/pact_broker/domain/version.rb +4 -0
  26. data/lib/pact_broker/index/service.rb +4 -5
  27. data/lib/pact_broker/integrations/integration.rb +27 -6
  28. data/lib/pact_broker/logging.rb +10 -0
  29. data/lib/pact_broker/matrix/unresolved_selector.rb +1 -1
  30. data/lib/pact_broker/metrics/service.rb +17 -0
  31. data/lib/pact_broker/pacts/all_pact_publications.rb +4 -2
  32. data/lib/pact_broker/pacts/content.rb +2 -2
  33. data/lib/pact_broker/pacts/metadata.rb +11 -5
  34. data/lib/pact_broker/pacts/pact_publication.rb +41 -6
  35. data/lib/pact_broker/pacts/pact_publication_dataset_module.rb +55 -11
  36. data/lib/pact_broker/pacts/pact_publication_selector_dataset_module.rb +20 -0
  37. data/lib/pact_broker/pacts/pact_version.rb +14 -15
  38. data/lib/pact_broker/pacts/pacts_for_verification_repository.rb +86 -31
  39. data/lib/pact_broker/pacts/parse.rb +1 -0
  40. data/lib/pact_broker/pacts/repository.rb +51 -41
  41. data/lib/pact_broker/pacts/selector.rb +18 -2
  42. data/lib/pact_broker/pacts/service.rb +13 -22
  43. data/lib/pact_broker/pacts/verifiable_pact_messages.rb +11 -0
  44. data/lib/pact_broker/repositories/helpers.rb +4 -0
  45. data/lib/pact_broker/repositories/scopes.rb +15 -0
  46. data/lib/pact_broker/test/test_data_builder.rb +2 -1
  47. data/lib/pact_broker/ui/helpers/matrix_helper.rb +1 -0
  48. data/lib/pact_broker/ui/views/index/show-with-tags.haml +1 -1
  49. data/lib/pact_broker/ui/views/matrix/show.haml +2 -0
  50. data/lib/pact_broker/verifications/latest_verification_for_pact_version.rb +2 -2
  51. data/lib/pact_broker/verifications/repository.rb +9 -10
  52. data/lib/pact_broker/version.rb +1 -1
  53. data/public/javascripts/matrix.js +3 -0
  54. data/spec/features/create_tag_spec.rb +10 -0
  55. data/spec/features/execute_webhook_spec.rb +1 -3
  56. data/spec/features/get_integrations_spec.rb +2 -2
  57. data/spec/features/get_provider_pacts_for_verification_spec.rb +5 -3
  58. data/spec/features/metadata_spec.rb +66 -0
  59. data/spec/features/publish_verification_results_and_version_spec.rb +70 -0
  60. data/spec/fixtures/approvals/get_provider_pacts_for_verification.approved.json +2 -2
  61. data/spec/lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema_combinations_spec.rb +9 -0
  62. data/spec/lib/pact_broker/api/contracts/verifiable_pacts_json_query_schema_spec.rb +15 -0
  63. data/spec/lib/pact_broker/api/decorators/verifiable_pacts_query_decorator_spec.rb +12 -0
  64. data/spec/lib/pact_broker/api/resources/dashboard_spec.rb +23 -2
  65. data/spec/lib/pact_broker/api/resources/latest_provider_pacts_spec.rb +3 -3
  66. data/spec/lib/pact_broker/api/resources/provider_pacts_spec.rb +1 -1
  67. data/spec/lib/pact_broker/api/resources/tag_spec.rb +39 -13
  68. data/spec/lib/pact_broker/db/data_migrations/set_interactions_counts_spec.rb +38 -0
  69. data/spec/lib/pact_broker/deployments/deployed_version_service_spec.rb +42 -0
  70. data/spec/lib/pact_broker/domain/verification_spec.rb +17 -0
  71. data/spec/lib/pact_broker/index/service_spec.rb +28 -16
  72. data/spec/lib/pact_broker/integrations/integration_spec.rb +21 -10
  73. data/spec/lib/pact_broker/metrics/service_spec.rb +25 -0
  74. data/spec/lib/pact_broker/pacts/content_spec.rb +1 -1
  75. data/spec/lib/pact_broker/pacts/metadata_spec.rb +95 -29
  76. data/spec/lib/pact_broker/pacts/pact_publication_selector_dataset_module_spec.rb +39 -0
  77. data/spec/lib/pact_broker/pacts/pact_version_spec.rb +68 -12
  78. data/spec/lib/pact_broker/pacts/repository_find_wip_pact_versions_for_provider_branch_spec.rb +1 -1
  79. data/spec/lib/pact_broker/pacts/repository_find_wip_pact_versions_for_provider_spec.rb +1 -1
  80. data/spec/lib/pact_broker/pacts/repository_spec.rb +59 -52
  81. data/spec/lib/pact_broker/pacts/verifiable_pact_messages_spec.rb +9 -0
  82. data/spec/lib/pact_broker/verifications/latest_verification_for_pact_version_spec.rb +18 -0
  83. data/spec/support/shared_context.rb +0 -1
  84. metadata +20 -3
@@ -363,29 +363,41 @@ module PactBroker
363
363
  end
364
364
 
365
365
  describe "find_index_items_for_api" do
366
- before do
367
- td.create_pact_with_hierarchy("Foo", "1", "Bar")
368
- .create_consumer_version_tag("feat-x")
369
- .create_verification(provider_version: "1", comment: "latest feat-x verif")
370
- .create_consumer_version("2")
371
- .create_consumer_version_tag("feat-y")
372
- .create_pact
373
- .create_verification(provider_version: "2", comment: "latest feat-y verif")
374
- .create_consumer_version("3")
375
- .create_consumer_version_tag("feat-x")
376
- .create_consumer_version_tag("feat-y")
377
- .create_pact
378
- .create_consumer_version("4")
379
- .create_pact
380
- end
381
-
382
366
  let(:rows) { subject.find_index_items_for_api(consumer_name: td.consumer.name, provider_name: td.provider.name) }
383
367
 
384
368
  context "when the pact has not yet been verified" do
369
+ before do
370
+ td.create_pact_with_hierarchy("Foo", "1", "Bar")
371
+ .create_consumer_version_tag("feat-x")
372
+ .create_verification(provider_version: "1", comment: "latest feat-x verif")
373
+ .create_consumer_version("2")
374
+ .create_consumer_version_tag("feat-y")
375
+ .create_pact
376
+ .create_verification(provider_version: "2", comment: "latest feat-y verif")
377
+ .create_consumer_version("3")
378
+ .create_consumer_version_tag("feat-x")
379
+ .create_consumer_version_tag("feat-y")
380
+ .create_pact
381
+ .create_consumer_version("4")
382
+ .create_pact
383
+ end
385
384
  it "returns the latest verification as nil (unlike the pseudo branch code for the server side rendered UI)" do
386
385
  expect(rows.last.provider_version_number).to be nil
387
386
  end
388
387
  end
388
+
389
+ context "when a version is currently deployed" do
390
+ before do
391
+ td.create_environment("test")
392
+ .create_pact_with_hierarchy("Foo", "1", "Bar")
393
+ .create_deployed_version_for_consumer_version
394
+ .create_pact_with_hierarchy("Foo", "2", "Bar")
395
+ end
396
+
397
+ it "includes the deployed versions" do
398
+ expect(rows.size).to eq 2
399
+ end
400
+ end
389
401
  end
390
402
  end
391
403
  end
@@ -5,7 +5,9 @@ module PactBroker
5
5
  describe Integration do
6
6
  describe "relationships" do
7
7
  before do
8
- td.set_now(DateTime.new(2019, 1, 1))
8
+ td.set_now(DateTime.new(2018, 1, 7))
9
+ .create_pact_with_hierarchy("Zoo", "1", "Yab")
10
+ .set_now(DateTime.new(2019, 1, 1))
9
11
  .create_pact_with_hierarchy("Foo", "1", "Bar")
10
12
  .set_now(DateTime.new(2019, 1, 2))
11
13
  .create_consumer_version("2")
@@ -16,13 +18,20 @@ module PactBroker
16
18
  .create_verification(provider_version: "4", number: 2)
17
19
  end
18
20
 
19
- it "has a relationship to the latest pact" do
20
- integration = Integration.eager(:latest_pact).all.first
21
- expect(integration.latest_pact.consumer_version_number).to eq "2"
21
+ it "has a relationship to the latest pact (eager)" do
22
+ integrations = Integration.eager(:latest_pact).order(:consumer_name, :provider_name).all
23
+ expect(integrations.first.latest_pact.consumer_version_number).to eq "2"
24
+ expect(integrations.last.latest_pact.consumer_version_number).to eq "1"
25
+ end
26
+
27
+ it "has a relationship to the latest pact (not eager)" do
28
+ integrations = Integration.order(:consumer_name, :provider_name).all
29
+ expect(integrations.first.latest_pact.consumer_version_number).to eq "2"
30
+ expect(integrations.last.latest_pact.consumer_version_number).to eq "1"
22
31
  end
23
32
 
24
33
  it "has a relationship to the latest verification via the latest pact" do
25
- integration = Integration.eager(latest_pact: :latest_verification).all.first
34
+ integration = Integration.eager(latest_pact: :latest_verification).order(:consumer_name, :provider_name).all.first
26
35
  expect(integration.latest_pact.latest_verification.provider_version_number).to eq "4"
27
36
  end
28
37
 
@@ -31,14 +40,16 @@ module PactBroker
31
40
  end
32
41
 
33
42
  it "has a latest verification - this may not be the same as the latest verification for the latest pact" do
34
- integration = Integration.eager(:latest_verification).all.first
43
+ integration = Integration.eager(:latest_verification).order(:consumer_name, :provider_name).all.first
35
44
  expect(integration.latest_verification.provider_version_number).to eq "4"
36
45
  end
37
46
 
38
47
  describe "latest_pact_or_verification_publication_date" do
48
+ let(:first_integration) { Integration.order(:consumer_name, :provider_name).first }
49
+
39
50
  context "when the last publication is a verification" do
40
51
  it "returns the verification execution date" do
41
- expect(Integration.first.latest_pact_or_verification_publication_date.to_datetime).to eq Integration.first.latest_verification_publication_date.to_datetime
52
+ expect(first_integration.latest_pact_or_verification_publication_date.to_datetime).to eq first_integration.latest_verification_publication_date.to_datetime
42
53
  end
43
54
  end
44
55
 
@@ -51,7 +62,7 @@ module PactBroker
51
62
 
52
63
  it "returns the pact publication date" do
53
64
  date = td.in_utc { DateTime.new(2019, 1, 5) }
54
- expect(Integration.first.latest_pact_or_verification_publication_date.to_datetime).to eq date
65
+ expect(first_integration.latest_pact_or_verification_publication_date.to_datetime).to eq date
55
66
  end
56
67
  end
57
68
  end
@@ -69,7 +80,7 @@ module PactBroker
69
80
  end
70
81
 
71
82
  it "returns a list of triggered webhooks" do
72
- integrations = Integration.eager(:latest_triggered_webhooks).all
83
+ integrations = Integration.eager(:latest_triggered_webhooks).order(:consumer_name, :provider_name).all
73
84
  expect(integrations.first.latest_triggered_webhooks.count).to eq 1
74
85
  end
75
86
  end
@@ -88,7 +99,7 @@ module PactBroker
88
99
  end
89
100
 
90
101
  it "returns all the webhooks" do
91
- integrations = Integration.eager(:webhooks).all
102
+ integrations = Integration.eager(:webhooks).order(:consumer_name, :provider_name).all
92
103
  expect(integrations.first.webhooks.count).to eq 3
93
104
  end
94
105
  end
@@ -6,6 +6,31 @@ module PactBroker
6
6
  describe "#metrics" do
7
7
  subject { Service.metrics }
8
8
 
9
+ describe "interactions latestCount" do
10
+ before do
11
+ td.create_consumer
12
+ .create_provider
13
+ .create_consumer_version
14
+ .create_pact(json_content: { interactions: [1, 2], messages: [1] }.to_json)
15
+ .create_consumer
16
+ .create_provider
17
+ .create_consumer_version
18
+ .create_pact(json_content: { interactions: [1, 2], messages: [1] }.to_json)
19
+ .create_consumer
20
+ .create_provider
21
+ .create_consumer_version
22
+ .create_pact(json_content: { foo: "bar" }.to_json)
23
+ end
24
+
25
+ it "includes a count of the number of interactions in the overall latest pacts" do
26
+ expect(subject[:interactions]).to eq({
27
+ latestInteractionsCount: 4,
28
+ latestMessagesCount: 2,
29
+ latestInteractionsAndMessagesCount: 6
30
+ })
31
+ end
32
+ end
33
+
9
34
  describe "verificationResultsPerPactVersion" do
10
35
  before do
11
36
  td.create_pact_with_hierarchy
@@ -123,7 +123,7 @@ module PactBroker
123
123
  end
124
124
  end
125
125
 
126
- context "with both messages and interactions, even though this should never happen" do
126
+ context "with both messages and interactions (v4)" do
127
127
  let(:pact_hash) do
128
128
  {
129
129
  "ignored" => "foo",
@@ -7,7 +7,7 @@ module PactBroker
7
7
  let(:selectors) do
8
8
  Selectors.new([ResolvedSelector.new({ latest: true, consumer: "consumer", tag: "tag" }, consumer_version)])
9
9
  end
10
- let(:consumer_version) { double("version", number: "2") }
10
+ let(:consumer_version) { double("version", number: "2", id: 1) }
11
11
  let(:verifiable_pact) { double("PactBroker::Pacts::VerifiablePact", wip: wip, selectors: selectors) }
12
12
  let(:wip) { false }
13
13
 
@@ -19,7 +19,7 @@ module PactBroker
19
19
  {
20
20
  "l" => true,
21
21
  "t" => "tag",
22
- "cvn" => "2"
22
+ "cv" => 1
23
23
  }
24
24
  ]
25
25
  })
@@ -34,38 +34,104 @@ module PactBroker
34
34
  end
35
35
 
36
36
  describe "parse_metadata" do
37
- let(:incoming_metadata) do
38
- {
39
- "cvn" => "2",
40
- "cvt" => ["tag"],
41
- "w" => true,
42
- "s" => [
43
- {
44
- "l" => true,
45
- "t" => "tag",
46
- "cvn" => "2"
47
- }
48
- ]
49
- }
50
- end
37
+ context "with a consumer version id" do
38
+ before do
39
+ allow(PactBroker::Domain::Version).to receive(:find).with(id: 1).and_return(consumer_version)
40
+ end
41
+
42
+ let(:consumer_version) { double("version", number: "2", id: 1) }
43
+
44
+ let(:incoming_metadata) do
45
+ {
46
+ "cv" => 1,
47
+ "cvt" => ["tag"],
48
+ "w" => true,
49
+ "s" => [
50
+ {
51
+ "l" => true,
52
+ "t" => "tag",
53
+ "cv" => 1
54
+ }
55
+ ]
56
+ }
57
+ end
51
58
 
52
- let(:parsed_metadata) do
53
- {
54
- :consumer_version_number => "2",
55
- :consumer_version_tags => ["tag"],
56
- :wip => true,
57
- :consumer_version_selectors => [
59
+ let(:parsed_metadata) do
60
+ {
61
+ :consumer_version_number => "2",
62
+ :consumer_version_tags => ["tag"],
63
+ :wip => true,
64
+ :consumer_version_selectors => [
65
+ {
66
+ :latest => true,
67
+ :tag => "tag",
68
+ :consumer_version_number => "2"
69
+ }
70
+ ]
71
+ }
72
+ end
73
+
74
+ it "expands the key names" do
75
+ expect(Metadata.parse_metadata(incoming_metadata)).to eq parsed_metadata
76
+ end
77
+
78
+ context "when the version can't be found" do
79
+ let(:consumer_version) { nil }
80
+
81
+ let(:parsed_metadata) do
58
82
  {
59
- :latest => true,
60
- :tag => "tag",
61
- :consumer_version_number => "2"
83
+ :consumer_version_number => nil,
84
+ :consumer_version_tags => ["tag"],
85
+ :wip => true,
86
+ :consumer_version_selectors => [
87
+ {
88
+ :latest => true,
89
+ :tag => "tag",
90
+ :consumer_version_number => nil
91
+ }
92
+ ]
62
93
  }
63
- ]
64
- }
94
+ end
95
+
96
+ it "sets the consumer version number to nil" do
97
+ expect(Metadata.parse_metadata(incoming_metadata)).to eq parsed_metadata
98
+ end
99
+ end
65
100
  end
66
101
 
67
- it "expands the key names" do
68
- expect(Metadata.parse_metadata(incoming_metadata)).to eq parsed_metadata
102
+ context "with a consumer version number (support the old format for previously created URLs)" do
103
+ let(:incoming_metadata) do
104
+ {
105
+ "cvn" => "2",
106
+ "cvt" => ["tag"],
107
+ "w" => true,
108
+ "s" => [
109
+ {
110
+ "l" => true,
111
+ "t" => "tag"
112
+ }
113
+ ]
114
+ }
115
+ end
116
+
117
+ let(:parsed_metadata) do
118
+ {
119
+ :consumer_version_number => "2",
120
+ :consumer_version_tags => ["tag"],
121
+ :wip => true,
122
+ :consumer_version_selectors => [
123
+ {
124
+ :latest => true,
125
+ :tag => "tag"
126
+ }
127
+ ]
128
+ }
129
+ end
130
+
131
+ it "expands the key names" do
132
+ expect(Metadata.parse_metadata(incoming_metadata)).to eq parsed_metadata
133
+ end
134
+
69
135
  end
70
136
  end
71
137
  end
@@ -7,6 +7,45 @@ module PactBroker
7
7
 
8
8
  subject { PactPublication.for_provider_and_consumer_version_selector(provider, consumer_version_selector).all }
9
9
 
10
+ context "for main branch" do
11
+ let(:consumer_version_selector) { Selector.for_main_branch }
12
+ let(:provider) { td.find_pacticipant("Bar") }
13
+
14
+ before do
15
+ td.create_provider("Bar")
16
+ .create_consumer("Foo", main_branch: "main")
17
+ .create_consumer_version("1", branch: "main")
18
+ .create_pact
19
+ .create_consumer_version("2", branch: "main")
20
+ .create_pact
21
+ .create_consumer_version("3", branch: "not-main")
22
+ .create_pact
23
+ .create_consumer("Bob", main_branch: "develop")
24
+ .create_consumer_version("3", branch: "develop")
25
+ .create_pact
26
+ .create_consumer_version("5", branch: "develop")
27
+ .create_pact
28
+ .create_consumer_version("6", branch: "not-develop")
29
+ .create_pact
30
+ .create_provider("NotBar")
31
+ .create_pact
32
+ .create_consumer("Waffle")
33
+ .create_consumer_version("7")
34
+ .create_pact
35
+ end
36
+
37
+ it "returns the latest pact for the main branch of every consumer" do
38
+ expect(subject.size).to eq 2
39
+ expect(subject.sort_by(&:id).first.consumer.name).to eq "Foo"
40
+ expect(subject.sort_by(&:id).first.consumer_version.branch).to eq "main"
41
+ expect(subject.sort_by(&:id).first.consumer_version.number).to eq "2"
42
+
43
+ expect(subject.sort_by(&:id).last.consumer.name).to eq "Bob"
44
+ expect(subject.sort_by(&:id).last.consumer_version.branch).to eq "develop"
45
+ expect(subject.sort_by(&:id).last.consumer_version.number).to eq "5"
46
+ end
47
+ end
48
+
10
49
  context "for environment" do
11
50
  before do
12
51
  td.create_environment("test")
@@ -6,8 +6,7 @@ module PactBroker
6
6
 
7
7
  describe "pacticipant names" do
8
8
  subject(:pact_version) do
9
- TestDataBuilder.new
10
- .create_consumer("consumer")
9
+ td.create_consumer("consumer")
11
10
  .create_provider("provider")
12
11
  .create_consumer_version("1.0.1")
13
12
  .create_pact
@@ -18,12 +17,50 @@ module PactBroker
18
17
  its(:provider_name) { is_expected.to eq("provider") }
19
18
  end
20
19
 
21
- describe "#latest_pact_publication" do
20
+ describe "consumer_versions" do
21
+ subject(:pact_version) do
22
+ td.create_consumer("consumer")
23
+ .create_provider("provider")
24
+ .create_consumer_version("1")
25
+ .create_pact
26
+ .create_consumer_version("2")
27
+ .republish_same_pact
28
+ .create_consumer_version("3")
29
+ .create_pact
30
+
31
+ PactVersion.order(:id).first
32
+ end
33
+
34
+ it "returns the consuemr versions" do
35
+ expect(subject.consumer_versions.collect(&:number).sort).to eq ["1", "2"]
36
+ end
37
+ end
38
+
39
+ describe "latest_consumer_version" do
40
+ before do
41
+ td.create_consumer("consumer")
42
+ .create_provider("provider")
43
+ .create_consumer_version("1")
44
+ .create_pact
45
+ .create_consumer_version("2")
46
+ .republish_same_pact
47
+ .create_consumer_version("3")
48
+ .create_pact
49
+ .create_consumer_version("4")
50
+ .republish_same_pact
51
+ end
22
52
 
53
+ it "does not work eager loading because the Version needs a latest_by_pact_version method, but we don't need it for now", skip: true do
54
+ pact_versions = PactVersion.eager(:latest_consumer_version).order(:id).all
55
+ expect(pact_versions.first.latest_consumer_version.number).to eq 2
56
+ expect(pact_versions.last.latest_consumer_version.number).to eq 4
57
+ end
58
+ end
59
+
60
+ describe "#latest_pact_publication" do
23
61
  context "when the latest pact publication is not an overwritten one" do
24
62
  before do
25
- TestDataBuilder.new
26
- .create_provider("Bar")
63
+ td.create_provider("Bar")
27
64
  .create_consumer("Foo")
28
65
  .create_consumer_version("1.2.100")
29
66
  .create_pact
@@ -48,7 +85,6 @@ module PactBroker
48
85
  end
49
86
 
50
87
  context "when the only pact publication with the given sha is an overwritten one" do
51
- let(:td) { TestDataBuilder.new }
52
88
  let!(:first_version) do
53
89
  td.create_provider("Bar")
54
90
  .create_consumer("Foo")
@@ -64,6 +100,7 @@ module PactBroker
64
100
  pact_version = PactBroker::Pacts::PactVersion.find(sha: first_version.pact_version_sha)
65
101
  latest_pact_publication = pact_version.latest_pact_publication
66
102
  expect(latest_pact_publication.revision_number).to eq 1
103
+ expect(latest_pact_publication.id).to eq PactBroker::Pacts::PactPublication.order(:id).first.id
67
104
  end
68
105
  end
69
106
  end
@@ -96,16 +133,35 @@ module PactBroker
96
133
  describe "#latest_verification" do
97
134
  before do
98
135
  td.create_pact_with_hierarchy
136
+ .create_verification(provider_version: "4", number: 1)
137
+ .create_verification(provider_version: "5", number: 2)
138
+ .create_verification(provider_version: "6", number: 3)
139
+ .create_pact_with_hierarchy
99
140
  .create_verification
100
- .create_verification(number: 2)
101
- .create_verification(number: 3)
141
+ .create_verification(provider_version: "1", number: 2)
142
+ .create_verification(provider_version: "2", number: 3)
102
143
  end
103
- let(:pact_version) { PactVersion.last }
104
144
 
105
- subject { pact_version.latest_verification }
145
+ describe "lazy loading" do
146
+ let(:pact_version) { PactVersion.last }
147
+
148
+ subject { pact_version.latest_verification }
106
149
 
107
- it "returns the latest verification by execution date" do
108
- expect(subject.number).to eq 3
150
+ it "returns the latest verification by verification id" do
151
+ expect(subject.number).to eq 3
152
+ end
153
+ end
154
+
155
+ describe "eager loading" do
156
+ let(:first_pact_latest_verification) { PactVersion.eager(:latest_verification).order(:id).all.first.associations[:latest_verification] }
157
+ let(:last_pact_latest_verification) { PactVersion.eager(:latest_verification).order(:id).all.last.associations[:latest_verification] }
158
+
159
+ it "returns the latest verification by verification id" do
160
+ expect(first_pact_latest_verification.number).to eq 3
161
+ expect(first_pact_latest_verification.provider_version_number).to eq "6"
162
+ expect(last_pact_latest_verification.number).to eq 3
163
+ expect(last_pact_latest_verification.provider_version_number).to eq "2"
164
+ end
109
165
  end
110
166
  end
111
167