Skip to content

Commit 3014a8b

Browse files
committed
feat(verifications): create and link provider version resource when verification is published
1 parent 1258099 commit 3014a8b

17 files changed

+162
-22
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
Sequel.migration do
2+
change do
3+
alter_table(:verifications) do
4+
add_foreign_key(:provider_version_id, :versions, foreign_key_constraint_name: 'fk_verifications_versions')
5+
end
6+
end
7+
8+
# TODO
9+
# alter_table(:verifications) do
10+
# set_column_not_null(:provider_version_id)
11+
# end
12+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
Sequel.migration do
2+
up do
3+
from(:verifications)
4+
.select(Sequel[:verifications][:id], :provider_version, :provider_id, Sequel[:verifications][:created_at])
5+
.join(:pact_versions, {id: :pact_version_id})
6+
.each do | line |
7+
version = from(:versions)
8+
.where(number: line[:provider_version], pacticipant_id: line[:provider_id]).single_record
9+
version_id = if version
10+
version[:id]
11+
else
12+
from(:versions).insert(
13+
number: line[:provider_version],
14+
pacticipant_id: line[:provider_id],
15+
created_at: line[:created_at],
16+
updated_at: line[:created_at]
17+
)
18+
end
19+
from(:verifications).where(id: line[:id]).update(provider_version_id: version_id)
20+
end
21+
end
22+
23+
down do
24+
end
25+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
Sequel.migration do
2+
change do
3+
alter_table(:verifications) do
4+
set_column_allow_null(:provider_version)
5+
end
6+
end
7+
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Sequel.migration do
2+
up do
3+
create_or_replace_view(:latest_verification_numbers,
4+
"SELECT pact_version_id, MAX(number) latest_number
5+
FROM verifications
6+
GROUP BY pact_version_id")
7+
8+
# The most recent verification for each pact version
9+
# provider_version is DEPRECATED, use provider_version_number
10+
create_or_replace_view(:latest_verifications,
11+
"SELECT v.id, v.number, v.success, s.number as provider_version, v.build_url, v.pact_version_id, v.execution_date, v.created_at, v.provider_version_id, s.number as provider_version_number
12+
FROM verifications v
13+
INNER JOIN latest_verification_numbers lv
14+
ON v.pact_version_id = lv.pact_version_id AND v.number = lv.latest_number
15+
INNER JOIN versions s on v.provider_version_id = s.id"
16+
)
17+
end
18+
end

lib/pact_broker/api/decorators/verification_decorator.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ module Decorators
66
class VerificationDecorator < BaseDecorator
77

88
property :provider_name, as: :providerName, writeable: :false
9-
property :provider_version, as: :providerApplicationVersion
9+
property :provider_version_number, as: :providerApplicationVersion, writeable: false
1010
property :success
1111
property :execution_date, as: :verificationDate
1212
property :build_url, as: :buildUrl

lib/pact_broker/domain/relationship.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ def pact_changed_since_last_verification?
7474
latest_verification.pact_version_sha != latest_pact.pact_version_sha
7575
end
7676

77-
def latest_verification_provider_version
78-
latest_verification.provider_version
77+
def latest_verification_provider_version_number
78+
latest_verification.provider_version.number
7979
end
8080

8181
def pacticipants

lib/pact_broker/domain/verification.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class Verification < Sequel::Model
88

99
set_primary_key :id
1010
associate(:many_to_one, :pact_version, class: "PactBroker::Pacts::PactVersion", key: :pact_version_id, primary_key: :id)
11+
associate(:many_to_one, :provider_version, class: "PactBroker::Domain::Version", key: :provider_version_id, primary_key: :id)
1112

1213
def before_create
1314
super
@@ -78,10 +79,13 @@ def provider
7879
.limit(1).select(:provider_id))
7980
end
8081

82+
def provider_version_number
83+
provider_version.number
84+
end
85+
8186
def latest_pact_publication
8287
pact_version.latest_pact_publication
8388
end
84-
8589
end
8690

8791
Verification.plugin :timestamps

lib/pact_broker/ui/view_models/relationship.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,11 @@ def warning?
9999
def verification_tooltip
100100
case @relationship.verification_status
101101
when :success
102-
"Successfully verified by #{provider_name} (v#{@relationship.latest_verification_provider_version})"
102+
"Successfully verified by #{provider_name} (v#{@relationship.latest_verification_provider_version_number})"
103103
when :stale
104-
"Pact has changed since last successful verification by #{provider_name} (v#{@relationship.latest_verification_provider_version})"
104+
"Pact has changed since last successful verification by #{provider_name} (v#{@relationship.latest_verification_provider_version_number})"
105105
when :failed
106-
"Verification by #{provider_name} (v#{@relationship.latest_verification_provider_version}) failed"
106+
"Verification by #{provider_name} (v#{@relationship.latest_verification_provider_version_number}) failed"
107107
else
108108
nil
109109
end

lib/pact_broker/verifications/repository.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,13 @@ module Verifications
77
class Repository
88

99
include PactBroker::Repositories::Helpers
10+
include PactBroker::Repositories
1011

11-
def create verification, pact
12+
def create verification, provider_version_number, pact
13+
provider = pacticipant_repository.find_by_name(pact.provider_name)
14+
version = version_repository.find_by_pacticipant_id_and_number_or_create(provider.id, provider_version_number)
1215
verification.pact_version_id = pact_version_id_for(pact)
16+
verification.provider_version = version
1317
verification.save
1418
end
1519

lib/pact_broker/verifications/service.rb

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ def next_number_for pact
1919
def create next_verification_number, params, pact
2020
PactBroker.logger.info "Creating verification #{next_verification_number} for pact_id=#{pact.id} from params #{params}"
2121
verification = PactBroker::Domain::Verification.new
22+
provider_version_number = params.fetch('providerApplicationVersion')
2223
PactBroker::Api::Decorators::VerificationDecorator.new(verification).from_hash(params)
2324
verification.number = next_verification_number
24-
verification_repository.create(verification, pact)
25+
verification_repository.create(verification, provider_version_number, pact)
2526
end
2627

2728
def errors params

spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ module Decorators
99
instance_double('PactBroker::Domain::Verification',
1010
number: 1,
1111
success: true,
12-
provider_version: "4.5.6",
12+
provider_version_number: "4.5.6",
1313
provider_name: 'Provider',
1414
consumer_name: 'Consumer',
1515
build_url: 'http://build-url',

spec/lib/pact_broker/api/decorators/verification_summary_decorator_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ module Decorators
1212
let(:verification) do
1313
instance_double("PactBroker::Domain::Verification",
1414
success: true, number: 1,
15-
provider_version: '4.5.6',
15+
provider_version_number: '4.5.6',
1616
build_url: 'http://some-build',
1717
provider_name: 'Provider',
1818
consumer_name: 'Consumer',

spec/lib/pact_broker/ui/view_models/relationship_spec.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ module ViewDomain
2525
instance_double("PactBroker::Domain::Relationship",
2626
verification_status: verification_status,
2727
provider_name: "Foo",
28-
latest_verification_provider_version: "4.5.6")
28+
latest_verification_provider_version_number: "4.5.6")
2929
end
3030
let(:ever_verified) { true }
3131
let(:pact_changed) { false }

spec/lib/pact_broker/verifications/repository_spec.rb

+7-7
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ module Verifications
6161
subject { Repository.new.find "Consumer1", "Provider1", pact.pact_version_sha, 2}
6262

6363
it "finds the latest verifications for the given consumer version" do
64-
expect(subject.provider_version).to eq "3.7.4"
64+
expect(subject.provider_version_number).to eq "3.7.4"
6565
expect(subject.consumer_name).to eq "Consumer1"
6666
expect(subject.provider_name).to eq "Provider1"
6767
expect(subject.pact_version_sha).to eq pact.pact_version_sha
@@ -95,8 +95,8 @@ module Verifications
9595
subject { Repository.new.find_latest_verifications_for_consumer_version("Consumer1", "1.2.3")}
9696

9797
it "finds the latest verifications for the given consumer version" do
98-
expect(subject.first.provider_version).to eq "7.8.9"
99-
expect(subject.last.provider_version).to eq "6.5.4"
98+
expect(subject.first.provider_version_number).to eq "7.8.9"
99+
expect(subject.last.provider_version_number).to eq "6.5.4"
100100
end
101101
end
102102

@@ -116,7 +116,7 @@ module Verifications
116116
subject { Repository.new.find_latest_verification_for("Consumer1", "Provider1")}
117117

118118
it "finds the latest verifications for the given consumer version" do
119-
expect(subject.provider_version).to eq "7.8.9"
119+
expect(subject.provider_version_number).to eq "7.8.9"
120120
end
121121
end
122122

@@ -142,7 +142,7 @@ module Verifications
142142
subject { Repository.new.find_latest_verification_for("Consumer1", "Provider1")}
143143

144144
it "finds the latest verifications for the given consumer version" do
145-
expect(subject.provider_version).to eq "7.8.9"
145+
expect(subject.provider_version_number).to eq "7.8.9"
146146
end
147147
end
148148

@@ -173,7 +173,7 @@ module Verifications
173173
subject { Repository.new.find_latest_verification_for("Consumer1", "Provider1", 'prod')}
174174

175175
it "finds the latest verifications for the given consumer version with the specified tag" do
176-
expect(subject.provider_version).to eq "5.4.3"
176+
expect(subject.provider_version_number).to eq "5.4.3"
177177
end
178178

179179
context "when no verification exists" do
@@ -212,7 +212,7 @@ module Verifications
212212
subject { Repository.new.find_latest_verification_for("Consumer1", "Provider1", :untagged)}
213213

214214
it "finds the latest verifications for the given consumer version with no tag" do
215-
expect(subject.provider_version).to eq "5.4.3"
215+
expect(subject.provider_version_number).to eq "5.4.3"
216216
end
217217
end
218218
end

spec/lib/pact_broker/verifications/service_spec.rb

+6
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@ module Verifications
4343
expect(verification.pact_version_id).to_not be_nil
4444
expect(verification.pact_version).to_not be_nil
4545
end
46+
47+
it "sets the provider version" do
48+
verification = create_verification
49+
expect(verification.provider_version).to_not be nil
50+
expect(verification.provider_version_number).to eq '4.5.6'
51+
end
4652
end
4753

4854
describe "#errors" do
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
describe 'add provider version relationship to verification (migrate 42-44)', migration: true do
2+
before do
3+
PactBroker::Database.migrate(42)
4+
end
5+
6+
let(:now) { DateTime.new(2018, 2, 2) }
7+
let!(:consumer) { create(:pacticipants, {name: 'Consumer', created_at: now, updated_at: now}) }
8+
let!(:provider) { create(:pacticipants, {name: 'Provider', created_at: now, updated_at: now}) }
9+
let!(:provider) { create(:pacticipants, {name: 'Provider', created_at: now, updated_at: now}) }
10+
let!(:consumer_version) { create(:versions, {number: '1.2.3', order: 1, pacticipant_id: consumer[:id], created_at: now, updated_at: now}) }
11+
let!(:pact_version) { create(:pact_versions, {content: {some: 'json'}.to_json, sha: '1234', consumer_id: consumer[:id], provider_id: provider[:id], created_at: now}) }
12+
let!(:pact_publication) do
13+
create(:pact_publications, {
14+
consumer_version_id: consumer_version[:id],
15+
provider_id: provider[:id],
16+
revision_number: 1,
17+
pact_version_id: pact_version[:id],
18+
created_at: (now - 1)
19+
})
20+
end
21+
let!(:verification) do
22+
create(:verifications, {
23+
number: 1,
24+
success: true,
25+
provider_version: '1.2.3',
26+
pact_version_id: pact_version[:id],
27+
execution_date: now,
28+
created_at: now
29+
})
30+
end
31+
32+
subject { PactBroker::Database.migrate(46) }
33+
34+
it "creates a version object" do
35+
expect { subject }.to change { PactBroker::Domain::Version.count }.by(1)
36+
end
37+
38+
it "sets the foreign key to the new version" do
39+
subject
40+
expect(PactBroker::Domain::Verification.first.provider_version.number).to eq '1.2.3'
41+
end
42+
43+
it "sets the created_at date of the new version to the created_at of the verification" do
44+
subject
45+
expect(PactBroker::Domain::Verification.first.provider_version.created_at).to eq now
46+
end
47+
48+
context "when the version already exists" do
49+
let!(:provider_version) { create(:versions, {number: '1.2.3', order: 1, pacticipant_id: provider[:id], created_at: now, updated_at: now}) }
50+
51+
it "does not create a version object" do
52+
expect { subject }.to_not change { PactBroker::Domain::Version.count }
53+
end
54+
55+
it "sets the foreign key to the existing version" do
56+
subject
57+
expect(PactBroker::Domain::Verification.first.provider_version.number).to eq '1.2.3'
58+
end
59+
end
60+
end

spec/support/test_data_builder.rb

+6-3
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,12 @@ def create_deprecated_webhook_execution params = {}
201201
end
202202

203203
def create_verification parameters = {}
204-
default_parameters = {success: true, provider_version: '4.5.6', number: 1}
205-
verification = PactBroker::Domain::Verification.new(default_parameters.merge(parameters))
206-
@verification = PactBroker::Verifications::Repository.new.create(verification, @pact)
204+
provider_version_number = parameters[:provider_version] || '4.5.6'
205+
default_parameters = {success: true, number: 1}
206+
parameters = default_parameters.merge(parameters)
207+
parameters.delete(:provider_version)
208+
verification = PactBroker::Domain::Verification.new(parameters)
209+
@verification = PactBroker::Verifications::Repository.new.create(verification, provider_version_number, @pact)
207210
self
208211
end
209212

0 commit comments

Comments
 (0)