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
@@ -0,0 +1,70 @@
1
+ require "pact_broker/domain/verification"
2
+
3
+ describe "Publishing a pact verification and provider version" do
4
+ let(:path) { "/pacts/provider/Provider/consumer/Consumer/pact-version/#{pact.pact_version_sha}/verification-results" }
5
+ let(:verification_content) { load_fixture("verification.json") }
6
+ let(:parsed_response_body) { JSON.parse(subject.body) }
7
+ let(:pact) { td.pact }
8
+ let(:rack_env) do
9
+ {
10
+ "CONTENT_TYPE" => "application/json",
11
+ "HTTP_ACCEPT" => "application/hal+json",
12
+ "pactbroker.database_connector" => lambda { |&block| block.call }
13
+ }
14
+ end
15
+
16
+ subject { post(path, verification_content, rack_env) }
17
+
18
+ before do
19
+ td.create_provider("Provider")
20
+ .create_consumer("Consumer")
21
+ .create_consumer_version("1.0.0")
22
+ .create_pact
23
+ .create_consumer_version("1.2.3")
24
+ .create_pact
25
+ .revise_pact
26
+ end
27
+
28
+ it "Responds with a 201 Created" do
29
+ expect(subject.status).to be 201
30
+ end
31
+
32
+ it "saves new verification" do
33
+ expect { subject }.to change { PactBroker::Domain::Verification.count }.by(1)
34
+ end
35
+
36
+ it "saves the verification against the correct pact" do
37
+ subject
38
+ expect(PactBroker::Domain::Verification.order(:id).last.pact_version_sha).to eq pact.pact_version_sha
39
+ end
40
+
41
+ it "saves the test results" do
42
+ subject
43
+ expect(PactBroker::Domain::Verification.order(:id).last.test_results).to eq("some" => "results")
44
+ end
45
+
46
+ it "returns a link to itself that can be followed" do
47
+ get_verification_link = parsed_response_body["_links"]["self"]["href"]
48
+ get get_verification_link, nil, { "HTTP_ACCEPT" => "application/hal+json" }
49
+ expect(last_response.status).to be 200
50
+ expect(JSON.parse(subject.body)).to include JSON.parse(verification_content)
51
+ end
52
+
53
+ context "with a webhook configured", job: true do
54
+ before do
55
+ td.create_webhook(
56
+ method: "POST",
57
+ url: "http://example.org",
58
+ events: [{ name: PactBroker::Webhooks::WebhookEvent::VERIFICATION_PUBLISHED }]
59
+ )
60
+ end
61
+ let!(:request) do
62
+ stub_request(:post, "http://example.org").to_return(:status => 200)
63
+ end
64
+
65
+ it "executes the webhook" do
66
+ subject
67
+ expect(request).to have_been_made
68
+ end
69
+ end
70
+ end
@@ -22,7 +22,7 @@
22
22
  "status": 200,
23
23
  "headers": {
24
24
  "Content-Type": "application/hal+json;charset=utf-8",
25
- "Content-Length": "815"
25
+ "Content-Length": "808"
26
26
  },
27
27
  "body": {
28
28
  "_embedded": {
@@ -39,7 +39,7 @@
39
39
  },
40
40
  "_links": {
41
41
  "self": {
42
- "href": "http://example.org/pacts/provider/Provider/consumer/Consumer%202/pact-version/0f22f551a422b027066db7635cad8bd8a59ac869/metadata/c1tdW3RdPXByb2Qmc1tdW2xdPXRydWUmc1tdW2N2bl09NC41LjY",
42
+ "href": "http://example.org/pacts/provider/Provider/consumer/Consumer%202/pact-version/0f22f551a422b027066db7635cad8bd8a59ac869/metadata/c1tdW3RdPXByb2Qmc1tdW2xdPXRydWUmc1tdW2N2XT0y",
43
43
  "name": "Pact between Consumer 2 (4.5.6) and Provider"
44
44
  }
45
45
  }
@@ -5,6 +5,7 @@ module PactBroker
5
5
  module Contracts
6
6
  describe VerifiablePactsJSONQuerySchema do
7
7
  ALL_PROPERTIES = {
8
+ mainBranch: true,
8
9
  tag: "tag",
9
10
  branch: "branch",
10
11
  latest: true,
@@ -13,10 +14,12 @@ module PactBroker
13
14
  environment: "environment",
14
15
  deployed: true,
15
16
  released: true,
17
+ deployedOrReleased: true,
16
18
  consumer: "consumer"
17
19
  }
18
20
 
19
21
  VALID_KEY_COMBINATIONS = [
22
+ [:mainBranch],
20
23
  [:tag],
21
24
  [:tag, :latest],
22
25
  [:tag, :latest, :fallbackTag],
@@ -29,12 +32,18 @@ module PactBroker
29
32
  [:environment, :released],
30
33
  [:deployed],
31
34
  [:released],
35
+ [:deployedOrReleased],
36
+ [:environment, :deployedOrReleased]
32
37
  ]
33
38
 
34
39
  VALID_KEY_COMBINATIONS.each do | valid_key_combination |
35
40
  selector = ALL_PROPERTIES.slice(*valid_key_combination)
36
41
 
37
42
  describe "with #{selector}" do
43
+ before do
44
+ allow(PactBroker::Deployments::EnvironmentService).to receive(:find_by_name).and_return(double("environment"))
45
+ end
46
+
38
47
  it "is valid" do
39
48
  params = { consumerVersionSelectors: [selector] }
40
49
  expect(VerifiablePactsJSONQuerySchema.(params)).to be_empty
@@ -4,6 +4,11 @@ module PactBroker
4
4
  module Api
5
5
  module Contracts
6
6
  describe VerifiablePactsJSONQuerySchema do
7
+ before do
8
+ allow(PactBroker::Deployments::EnvironmentService).to receive(:find_by_name).and_return(environment)
9
+ end
10
+ let(:environment) { double("environment") }
11
+
7
12
  let(:params) do
8
13
  {
9
14
  providerVersionTags: provider_version_tags,
@@ -327,6 +332,16 @@ module PactBroker
327
332
 
328
333
  its([:consumerVersionSelectors, 0]) { is_expected.to eq "cannot specify a branch with latest=false (at index 0)" }
329
334
  end
335
+
336
+ context "when the environment does not exist" do
337
+ let(:environment) { nil }
338
+
339
+ let(:consumer_version_selectors) do
340
+ [{ environment: "prod" }]
341
+ end
342
+
343
+ its([:consumerVersionSelectors, 0]) { is_expected.to eq "environment with name 'prod' does not exist at index 0" }
344
+ end
330
345
  end
331
346
  end
332
347
  end
@@ -113,6 +113,18 @@ module PactBroker
113
113
  expect(subject.consumer_version_selectors.first.currently_deployed).to be true
114
114
  end
115
115
  end
116
+
117
+ context "when deployedOrReleased is set to true" do
118
+ let(:consumer_version_selectors) do
119
+ [{ "deployedOrReleased" => true }]
120
+ end
121
+
122
+ it "creates two selectors - one for deployed and one for released" do
123
+ expect(subject.consumer_version_selectors.size).to eq 2
124
+ expect(subject.consumer_version_selectors.first).to eq PactBroker::Pacts::Selector.for_currently_deployed
125
+ expect(subject.consumer_version_selectors.last).to eq PactBroker::Pacts::Selector.for_currently_supported
126
+ end
127
+ end
116
128
  end
117
129
 
118
130
  context "when parsing query string params" do
@@ -3,12 +3,33 @@ require "pact_broker/api/resources/dashboard"
3
3
  module PactBroker
4
4
  module Api
5
5
  module Resources
6
-
7
6
  describe Dashboard do
7
+ before do
8
+ td.create_pact_with_verification("Foo1", "1", "Bar", "2")
9
+ .create_pact_with_verification("Foo2", "1", "Bar", "2")
10
+ .create_pact_with_verification("Foo3", "1", "Bar", "2")
11
+ .create_pact_with_verification("Foo4", "1", "Bar", "2")
12
+ end
13
+
14
+ let(:response_body_hash) { JSON.parse(subject.body) }
8
15
 
9
16
  let(:path) { "/dashboard" }
10
- subject { get path; last_response }
11
17
 
18
+ subject { get(path) }
19
+
20
+ it { is_expected.to be_a_hal_json_success_response }
21
+
22
+ it "returns a list of items" do
23
+ expect(response_body_hash["items"]).to be_a(Array)
24
+ end
25
+
26
+ context "with pagination" do
27
+ subject { get(path, { pageNumber: 1, pageSize: 1 }) }
28
+
29
+ it "only returns the items for the page" do
30
+ expect(response_body_hash["items"].size).to eq 1
31
+ end
32
+ end
12
33
  end
13
34
  end
14
35
  end
@@ -5,7 +5,7 @@ module PactBroker
5
5
  module Resources
6
6
  describe LatestProviderPacts do
7
7
  before do
8
- allow(PactBroker::Pacts::Service).to receive(:find_latest_pact_versions_for_provider).and_return(pacts)
8
+ allow(PactBroker::Pacts::Service).to receive(:find_latest_pacts_for_provider).and_return(pacts)
9
9
  allow(PactBroker::Api::Decorators::ProviderPactsDecorator).to receive(:new).and_return(decorator)
10
10
  allow_any_instance_of(LatestProviderPacts).to receive(:resource_exists?).and_return(provider)
11
11
  end
@@ -19,7 +19,7 @@ module PactBroker
19
19
 
20
20
  context "with no tag" do
21
21
  it "finds the pacts" do
22
- expect(PactBroker::Pacts::Service).to receive(:find_latest_pact_versions_for_provider).with("Bar", tag: nil)
22
+ expect(PactBroker::Pacts::Service).to receive(:find_latest_pacts_for_provider).with("Bar", tag: nil)
23
23
  subject
24
24
  end
25
25
 
@@ -35,7 +35,7 @@ module PactBroker
35
35
  let(:path) { "/pacts/provider/Bar/latest/prod" }
36
36
 
37
37
  it "finds the pacts with a tag" do
38
- expect(PactBroker::Pacts::Service).to receive(:find_latest_pact_versions_for_provider).with("Bar", tag: "prod")
38
+ expect(PactBroker::Pacts::Service).to receive(:find_latest_pacts_for_provider).with("Bar", tag: "prod")
39
39
  subject
40
40
  end
41
41
 
@@ -5,7 +5,7 @@ module PactBroker
5
5
  module Resources
6
6
  describe ProviderPacts do
7
7
  before do
8
- allow(PactBroker::Pacts::Service).to receive(:find_latest_pact_versions_for_provider).and_return(pacts)
8
+ allow(PactBroker::Pacts::Service).to receive(:find_latest_pacts_for_provider).and_return(pacts)
9
9
  allow(PactBroker::Api::Decorators::ProviderPactsDecorator).to receive(:new).and_return(decorator)
10
10
  allow(PactBroker::Pacticipants::Service).to receive(:find_pacticipant_by_name).and_return(provider)
11
11
  end
@@ -1,13 +1,9 @@
1
- require "spec_helper"
2
1
  require "pact_broker/api/resources/tag"
3
2
 
4
3
  module PactBroker
5
4
  module Api
6
-
7
5
  module Resources
8
-
9
6
  describe Tag do
10
-
11
7
  let(:tag) { double("PactBroker::Domain::Tag") }
12
8
  let(:tag_decorator) { instance_double("PactBroker::Api::Decorators::TagDecorator", :to_json => tag_json) }
13
9
  let(:tag_json) { {"some" => "tag"}.to_json }
@@ -40,7 +36,6 @@ module PactBroker
40
36
  end
41
37
 
42
38
  context "when the tag doesn't exist" do
43
-
44
39
  let(:tag) { nil }
45
40
 
46
41
  it "returns a 404 Not Found" do
@@ -87,7 +82,6 @@ module PactBroker
87
82
  subject
88
83
  expect(last_response).to be_successful
89
84
  end
90
-
91
85
  end
92
86
 
93
87
  context "when the tag does not exist" do
@@ -101,15 +95,16 @@ module PactBroker
101
95
  end
102
96
 
103
97
  describe "PUT" do
104
-
105
- let(:tag_url) { "http://example.org/tag/url"}
106
-
107
98
  before do
108
99
  allow_any_instance_of(PactBroker::Api::Resources::Tag).to receive(:tag_url).and_return(tag_url)
109
100
  allow(Tags::Service).to receive(:find).and_return(tag)
110
101
  allow(PactBroker::Api::Decorators::TagDecorator).to receive(:new).and_return(tag_decorator)
102
+ allow_any_instance_of(described_class).to receive(:create_deployed_versions_for_tags?).and_return(create_deployed_versions_for_tags)
111
103
  end
112
104
 
105
+ let(:tag_url) { "http://example.org/tag/url"}
106
+ let(:create_deployed_versions_for_tags) { false }
107
+
113
108
  subject { put("/pacticipants/Condor/versions/1.3.0/tags/prod", nil, "CONTENT_LENGTH" => "0", "CONTENT_TYPE" => "application/json") }
114
109
 
115
110
  it "returns a success response" do
@@ -118,7 +113,6 @@ module PactBroker
118
113
  end
119
114
 
120
115
  context "when the tag already exists" do
121
-
122
116
  it "returns a 200" do
123
117
  subject
124
118
  expect(last_response.status).to be 200
@@ -153,13 +147,45 @@ module PactBroker
153
147
  subject
154
148
  expect(last_response.body).to eq tag_json
155
149
  end
156
-
157
150
  end
158
151
 
159
- end
152
+ context "when create_deployed_versions_for_tags is true" do
153
+ before do
154
+ allow_any_instance_of(described_class).to receive(:environment_service).and_return(environment_service)
155
+ allow_any_instance_of(described_class).to receive(:deployed_version_service).and_return(deployed_version_service)
156
+ allow(environment_service).to receive(:find_by_name).and_return(environment)
157
+ allow(deployed_version_service).to receive(:next_uuid).and_return("uuid")
158
+ allow(tag).to receive(:version).and_return(version)
159
+ end
160
+ let(:environment_service) { class_double("PactBroker::Environments::Service").as_stubbed_const }
161
+ let(:deployed_version_service) { class_double("PactBroker::Deployments::DeployedVersionService").as_stubbed_const }
162
+ let(:environment) { nil }
163
+ let(:create_deployed_versions_for_tags) { true }
164
+ let(:version) { double("version") }
165
+
166
+ it "looks for a matching environment" do
167
+ expect(environment_service).to receive(:find_by_name).with("prod")
168
+ subject
169
+ end
160
170
 
161
- end
171
+ context "when the tag name matches an existing environment" do
172
+ let(:environment) { double("environment") }
162
173
 
174
+ it "creates a deployed version" do
175
+ expect(deployed_version_service).to receive(:find_or_create).with(anything, version, environment, nil)
176
+ subject
177
+ end
178
+ end
179
+
180
+ context "when the tag name does not match an existing environment" do
181
+ it "does not create a deployed version" do
182
+ expect_any_instance_of(described_class).to_not receive(:deployed_version_service)
183
+ subject
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
163
189
  end
164
190
  end
165
191
  end
@@ -0,0 +1,38 @@
1
+ require "pact_broker/db/data_migrations/set_interactions_counts"
2
+
3
+ module PactBroker
4
+ module DB
5
+ module DataMigrations
6
+ describe SetInteractionsCounts do
7
+ describe ".call" do
8
+ before do
9
+ td.create_consumer("Foo")
10
+ .create_provider("Bar")
11
+ .create_consumer_version("1")
12
+ .create_pact(json_content: { interactions: [1, 2] }.to_json )
13
+ .create_consumer_version("2")
14
+ .create_pact(json_content: { interactions: [1, 2, 3] }.to_json )
15
+ .create_provider("Bop")
16
+ .create_pact(json_content: { messages: [1] }.to_json )
17
+ PactBroker::Pacts::PactVersion.dataset.update(interactions_count: nil, messages_count: nil)
18
+ end
19
+
20
+ subject { SetInteractionsCounts.call(PactBroker::Pacts::PactVersion.db) }
21
+
22
+ it "sets the interactions and messages counts" do
23
+ subject
24
+ pact_versions = PactBroker::Pacts::PactVersion.order(:id).all
25
+ expect(pact_versions[0].interactions_count).to eq nil
26
+ expect(pact_versions[0].messages_count).to eq nil
27
+
28
+ expect(pact_versions[1].interactions_count).to eq 3
29
+ expect(pact_versions[1].messages_count).to eq 0
30
+
31
+ expect(pact_versions[2].interactions_count).to eq 0
32
+ expect(pact_versions[2].messages_count).to eq 1
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,42 @@
1
+ require "pact_broker/deployments/deployed_version_service"
2
+
3
+ module PactBroker
4
+ module Deployments
5
+ describe DeployedVersionService do
6
+ describe ".create" do
7
+ before do
8
+ td.create_environment("test")
9
+ .create_consumer("foo")
10
+ .create_consumer_version("1")
11
+ end
12
+
13
+ let(:version) { td.and_return(:consumer_version) }
14
+ let(:environment) { td.and_return(:environment) }
15
+
16
+ context "when the version is already currently deployed" do
17
+ it "returns the existing deployed version object" do
18
+ deployed_version_1 = DeployedVersionService.find_or_create("1234", version, environment, nil)
19
+ deployed_version_2 = DeployedVersionService.find_or_create("4321", version, environment, nil)
20
+ expect(deployed_version_1.uuid).to eq deployed_version_2.uuid
21
+ end
22
+ end
23
+
24
+ context "when the version was previously deployed, but there was another version deployed in the meantime" do
25
+ before do
26
+ td.create_consumer_version("2")
27
+ end
28
+
29
+ let(:version_1) { PactBroker::Domain::Version.order(:id).first }
30
+ let(:version_2) { PactBroker::Domain::Version.order(:id).last }
31
+
32
+ it "returns a new deployed version object" do
33
+ deployed_version_1 = DeployedVersionService.find_or_create("1234", version_1, environment, nil)
34
+ DeployedVersionService.find_or_create("4321", version_2, environment, nil)
35
+ deployed_version_3 = DeployedVersionService.find_or_create("4545", version_1, environment, nil)
36
+ expect(deployed_version_1.uuid).to_not eq deployed_version_3.uuid
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -4,6 +4,23 @@ module PactBroker
4
4
 
5
5
  module Domain
6
6
  describe Verification do
7
+ describe "latest_by_pact_version" do
8
+ before do
9
+ td.create_pact_with_hierarchy("Foo", "10", "Bar")
10
+ .create_verification(provider_version: "3", number: 1)
11
+ .create_verification(provider_version: "4", number: 2)
12
+ .create_pact_with_hierarchy("Foo2", "10", "Bar2")
13
+ .create_verification(provider_version: "30", number: 1)
14
+ .create_verification(provider_version: "31", number: 2)
15
+ end
16
+
17
+ subject { Verification.latest_by_pact_version.order(:id).all }
18
+
19
+ it "returns the latest by pact version" do
20
+ expect(subject.size).to eq 2
21
+ expect(subject.collect(&:provider_version_number).sort).to eq ["31", "4"]
22
+ end
23
+ end
7
24
  describe "latest_verifications_for_all_consumer_version_tags" do
8
25
  before do
9
26
  td.create_pact_with_verification_and_tags("Foo", "1", ["fmain"], "Bar", "2")