pact_broker 2.0.0.beta.6 → 2.0.0.beta.7
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/README.md +12 -12
- data/db/migrations/08_create_latest_pact_view.rb +4 -4
- data/db/migrations/14_add_timestamps_to_pact_views.rb +5 -4
- data/db/migrations/20_add_pact_version_content_sha_to_all_pacts_view.rb +12 -10
- data/db/migrations/28_create_all_pact_publications.rb +6 -5
- data/lib/pact_broker/api/decorators/verification_decorator.rb +0 -3
- data/lib/pact_broker/api/decorators/verification_summary_decorator.rb +36 -0
- data/lib/pact_broker/api/decorators/versions_decorator.rb +1 -1
- data/lib/pact_broker/api/resources/latest_verifications_for_consumer_version.rb +5 -5
- data/lib/pact_broker/api/resources/versions.rb +1 -1
- data/lib/pact_broker/app.rb +2 -0
- data/lib/pact_broker/configuration.rb +6 -1
- data/lib/pact_broker/domain/order_versions.rb +15 -5
- data/lib/pact_broker/domain/verification.rb +1 -1
- data/lib/pact_broker/domain/webhook.rb +0 -1
- data/lib/pact_broker/domain/webhook_request.rb +6 -4
- data/lib/pact_broker/logging.rb +4 -0
- data/lib/pact_broker/pacticipants/repository.rb +3 -2
- data/lib/pact_broker/pacticipants/service.rb +12 -9
- data/lib/pact_broker/pacts/all_pact_publications.rb +2 -2
- data/lib/pact_broker/pacts/repository.rb +11 -2
- data/lib/pact_broker/pacts/service.rb +4 -0
- data/lib/pact_broker/tags/repository.rb +5 -5
- data/lib/pact_broker/verifications/repository.rb +4 -3
- data/lib/pact_broker/verifications/service.rb +8 -0
- data/lib/pact_broker/verifications/summary_for_consumer_version.rb +41 -0
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/versions/parse_semantic_version.rb +14 -4
- data/lib/pact_broker/versions/repository.rb +1 -1
- data/lib/pact_broker/webhooks/job.rb +46 -0
- data/lib/pact_broker/webhooks/service.rb +9 -8
- data/lib/pact_broker/webhooks/webhook.rb +1 -1
- data/pact_broker.gemspec +4 -3
- data/pact_broker_client-pact_broker.json +4 -4
- data/script/foo-bar.json +22 -0
- data/script/publish-new.sh +7 -0
- data/script/publish.sh +2 -2
- data/script/recreate-pg-db.sh +10 -0
- data/spec/features/get_verifications_for_consumer_version_spec.rb +1 -1
- data/spec/fixtures/a_consumer-a_provider-2.json +1 -1
- data/spec/fixtures/a_consumer-a_provider-3.json +1 -1
- data/spec/fixtures/a_consumer-a_provider-conflict.json +1 -1
- data/spec/fixtures/a_consumer-a_provider-merged.json +2 -2
- data/spec/fixtures/a_consumer-a_provider.json +1 -1
- data/spec/fixtures/consumer-provider.json +1 -1
- data/spec/fixtures/renderer_pact.json +1 -1
- data/spec/lib/pact_broker/api/decorators/{verifications_decorator_spec.rb → verification_summary_decorator_spec.rb} +16 -13
- data/spec/lib/pact_broker/api/resources/latest_verifications_for_consumer_version_spec.rb +5 -5
- data/spec/lib/pact_broker/domain/order_versions_spec.rb +30 -10
- data/spec/lib/pact_broker/domain/webhook_request_spec.rb +3 -1
- data/spec/lib/pact_broker/pacticipants/repository_spec.rb +16 -0
- data/spec/lib/pact_broker/pacticipants/service_spec.rb +74 -24
- data/spec/lib/pact_broker/verifications/summary_for_consumer_version_spec.rb +72 -0
- data/spec/lib/pact_broker/versions/parse_semantic_version_spec.rb +5 -2
- data/spec/lib/pact_broker/webhooks/job_spec.rb +67 -0
- data/spec/lib/pact_broker/webhooks/service_spec.rb +40 -3
- data/spec/support/provider_state_builder.rb +3 -2
- data/tasks/db.rake +3 -2
- metadata +35 -14
- data/lib/pact_broker/api/decorators/verifications_decorator.rb +0 -30
- data/lib/pact_broker/pacts/all_pacts.rb +0 -12
- data/lib/pact_broker/pacts/latest_pacts.rb +0 -12
data/script/publish.sh
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
curl -v -XPUT \-H "Content-Type: application/json" \
|
2
|
-
-d@
|
3
|
-
http://
|
2
|
+
-d@script/foo-bar.json \
|
3
|
+
http://127.0.0.1:9292/pacts/provider/Bar/consumer/Foo/version/1.0.0
|
@@ -0,0 +1,10 @@
|
|
1
|
+
psql postgres -c "drop database pact_broker;"
|
2
|
+
psql postgres -c "create database pact_broker;"
|
3
|
+
psql postgres -c "GRANT ALL PRIVILEGES ON DATABASE pact_broker to pact_broker;"
|
4
|
+
ip=$(ifconfig en0 | sed -n -e '/inet/s/.*inet \([0-9.]*\) netmask .*/\1/p')
|
5
|
+
echo ""
|
6
|
+
echo "run the following command to set your environment variables:"
|
7
|
+
echo "export PACT_BROKER_DATABASE_USERNAME=pact_broker"
|
8
|
+
echo "export PACT_BROKER_DATABASE_PASSWORD=pact_broker"
|
9
|
+
echo "export PACT_BROKER_DATABASE_NAME=pact_broker"
|
10
|
+
echo "export PACT_BROKER_DATABASE_HOST=${ip}"
|
@@ -27,7 +27,7 @@ describe "Get verifications for consumer version" do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
it "returns a list of verifications" do
|
30
|
-
expect(last_response_body[:_embedded][:
|
30
|
+
expect(last_response_body[:_embedded][:verificationResults].size).to eq 2
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
@@ -8,7 +8,7 @@
|
|
8
8
|
"interactions": [
|
9
9
|
{
|
10
10
|
"description" : "a request for something",
|
11
|
-
"
|
11
|
+
"providerState": null,
|
12
12
|
"request": {
|
13
13
|
"method": "get",
|
14
14
|
"path" : "/something"
|
@@ -20,7 +20,7 @@
|
|
20
20
|
},
|
21
21
|
{
|
22
22
|
"description" : "another request for something",
|
23
|
-
"
|
23
|
+
"providerState": null,
|
24
24
|
"request": {
|
25
25
|
"method": "get",
|
26
26
|
"path" : "/something_else"
|
@@ -1,17 +1,21 @@
|
|
1
|
-
require 'pact_broker/api/decorators/
|
1
|
+
require 'pact_broker/api/decorators/verification_summary_decorator'
|
2
2
|
|
3
3
|
module PactBroker
|
4
4
|
module Api
|
5
5
|
module Decorators
|
6
|
-
describe
|
6
|
+
describe VerificationSummaryDecorator do
|
7
|
+
let(:summary) { instance_double("PactBroker::Verification::SummaryForConsumerVersion", verifications: verifications, success: true, provider_summary: provider_summary) }
|
8
|
+
let(:provider_summary) {
|
9
|
+
instance_double("provider summary", successful: ["Successful provider"], failed: ["Failed provider"], unknown: ["Unknown provider"])
|
10
|
+
}
|
7
11
|
let(:verifications) { [verification] }
|
8
12
|
let(:verification) do
|
9
13
|
instance_double("PactBroker::Domain::Verification",
|
10
14
|
success: true, number: 1,
|
11
15
|
provider_version: '4.5.6',
|
12
16
|
build_url: 'http://some-build',
|
13
|
-
provider_name: '
|
14
|
-
consumer_name: '
|
17
|
+
provider_name: 'Provider',
|
18
|
+
consumer_name: 'Consumer',
|
15
19
|
pact_version: pact_version,
|
16
20
|
latest_pact_publication: pact,
|
17
21
|
execution_date: DateTime.now)
|
@@ -19,14 +23,15 @@ module PactBroker
|
|
19
23
|
let(:pact_version) do
|
20
24
|
instance_double("PactBroker::Pacts::PactVersion", sha: '1234', name: 'Name')
|
21
25
|
end
|
26
|
+
|
22
27
|
let(:pact) { instance_double("PactBroker::Domain::Pact", name: "Some pact", consumer_name: "Foo", provider_name: "Bar", consumer_version_number: "1.2.3") }
|
23
28
|
let(:options) { {base_url: 'http://example.org', consumer_name: "Foo", consumer_version_number: "1.2.3", resource_url: "http://self"} }
|
24
29
|
|
25
|
-
subject { JSON.parse
|
30
|
+
subject { JSON.parse VerificationSummaryDecorator.new(summary).to_json(user_options: options), symbolize_names: true }
|
26
31
|
|
27
32
|
it "includes a list of verification results" do
|
28
|
-
expect(subject[:_embedded][:
|
29
|
-
expect(subject[:_embedded][:
|
33
|
+
expect(subject[:_embedded][:verificationResults]).to be_instance_of(Array)
|
34
|
+
expect(subject[:_embedded][:verificationResults].size).to eq 1
|
30
35
|
end
|
31
36
|
|
32
37
|
it "includes a title" do
|
@@ -41,12 +46,10 @@ module PactBroker
|
|
41
46
|
expect(subject[:success]).to be true
|
42
47
|
end
|
43
48
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
expect(subject).to_not have_key(:success)
|
49
|
-
end
|
49
|
+
it "includes a provider summary" do
|
50
|
+
expect(subject[:providerSummary][:successful]).to eq ["Successful provider"]
|
51
|
+
expect(subject[:providerSummary][:failed]).to eq ["Failed provider"]
|
52
|
+
expect(subject[:providerSummary][:unknown]).to eq ["Unknown provider"]
|
50
53
|
end
|
51
54
|
end
|
52
55
|
end
|
@@ -24,23 +24,23 @@ module PactBroker
|
|
24
24
|
|
25
25
|
context "when the consumer version exists" do
|
26
26
|
let(:decorator) { double(:decorator, to_json: json) }
|
27
|
-
let(:
|
27
|
+
let(:summary) { double(:summary) }
|
28
28
|
let(:json) { {some: 'json'}.to_json }
|
29
29
|
|
30
30
|
before do
|
31
|
-
allow(PactBroker::Api::Decorators::
|
32
|
-
allow(PactBroker::Verifications::Service).to receive(:
|
31
|
+
allow(PactBroker::Api::Decorators::VerificationSummaryDecorator).to receive(:new).and_return(decorator)
|
32
|
+
allow(PactBroker::Verifications::Service).to receive(:verification_summary_for_consumer_version).and_return(summary)
|
33
33
|
end
|
34
34
|
|
35
35
|
it { is_expected.to be_a_hal_json_success_response }
|
36
36
|
|
37
37
|
it "finds the latest verifications for the consumer version" do
|
38
|
-
expect(PactBroker::Verifications::Service).to receive(:
|
38
|
+
expect(PactBroker::Verifications::Service).to receive(:verification_summary_for_consumer_version).with(hash_including(consumer_name: 'Consumer', consumer_version_number: '1.2.3'))
|
39
39
|
subject
|
40
40
|
end
|
41
41
|
|
42
42
|
it "serialises the verifications" do
|
43
|
-
expect(PactBroker::Api::Decorators::
|
43
|
+
expect(PactBroker::Api::Decorators::VerificationSummaryDecorator).to receive(:new).with(summary)
|
44
44
|
expect(decorator).to receive(:to_json) do | args |
|
45
45
|
expect(args[:user_options][:consumer_name]).to eq 'Consumer'
|
46
46
|
expect(args[:user_options][:consumer_version_number]).to eq '1.2.3'
|
@@ -4,20 +4,40 @@ require 'pact_broker/domain/order_versions.rb'
|
|
4
4
|
|
5
5
|
describe PactBroker::Domain::OrderVersions do
|
6
6
|
|
7
|
+
context "when order_versions_by_date is false (the default)" do
|
8
|
+
before do
|
9
|
+
ProviderStateBuilder.new
|
10
|
+
.create_condor
|
11
|
+
.create_condor_version('1.3.0')
|
12
|
+
.create_condor_version('1.5.0')
|
13
|
+
.create_condor_version('1.4.0')
|
14
|
+
.create_condor_version('1.6.0')
|
15
|
+
end
|
7
16
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
.
|
13
|
-
|
17
|
+
let(:ordered_versions) { PactBroker::Domain::Version.order(:order).all.collect(&:number) }
|
18
|
+
let(:condor) { PactBroker::Domain::Pacticipant.where(name: 'Condor').single_record }
|
19
|
+
|
20
|
+
it "orders the versions so they can be loaded from the database in order" do
|
21
|
+
expect(ordered_versions).to eq(['1.3.0', '1.4.0', '1.5.0', '1.6.0'])
|
22
|
+
end
|
14
23
|
end
|
15
24
|
|
16
|
-
|
17
|
-
|
25
|
+
context "when order_versions_by_date is true (not recommended)" do
|
26
|
+
before do
|
27
|
+
allow(PactBroker.configuration).to receive(:order_versions_by_date).and_return(true)
|
28
|
+
end
|
29
|
+
let(:consumer) { ProviderStateBuilder.new.create_consumer.and_return(:consumer) }
|
30
|
+
let!(:version_1) { PactBroker::Domain::Version.create(pacticipant_id: consumer.id, number: '2', created_at: DateTime.new(2017)) }
|
31
|
+
let!(:version_2) { PactBroker::Domain::Version.create(pacticipant_id: consumer.id, number: '1', created_at: DateTime.new(2017)) }
|
32
|
+
let!(:version_3) { PactBroker::Domain::Version.create(pacticipant_id: consumer.id, number: '3', created_at: DateTime.new(2016)) }
|
33
|
+
let!(:version_4) { PactBroker::Domain::Version.create(pacticipant_id: consumer.id, number: '4', created_at: DateTime.new(2018)) }
|
34
|
+
|
35
|
+
let(:ordered_versions) { PactBroker::Domain::Version.order(:order).all.collect(&:number) }
|
36
|
+
|
37
|
+
it "orders by date, then id" do
|
38
|
+
expect(ordered_versions).to eq(['3', '2', '1', '4'])
|
39
|
+
end
|
18
40
|
|
19
|
-
it "orders the versions so they can be loaded from the database in order" do
|
20
|
-
expect(ordered_versions).to eq(['1.3.0','1.4.0', '1.5.0'])
|
21
41
|
end
|
22
42
|
|
23
43
|
end
|
@@ -64,7 +64,9 @@ module PactBroker
|
|
64
64
|
|
65
65
|
it "logs the response" do
|
66
66
|
allow(PactBroker.logger).to receive(:info)
|
67
|
-
|
67
|
+
allow(PactBroker.logger).to receive(:debug)
|
68
|
+
expect(PactBroker.logger).to receive(:info).with(/response.*302/)
|
69
|
+
expect(PactBroker.logger).to receive(:debug).with(/respbod/)
|
68
70
|
subject.execute
|
69
71
|
end
|
70
72
|
|
@@ -53,6 +53,22 @@ module PactBroker
|
|
53
53
|
|
54
54
|
end
|
55
55
|
|
56
|
+
describe "#find_all_pacticipant_versions_in_reverse_order" do
|
57
|
+
before do
|
58
|
+
ProviderStateBuilder.new
|
59
|
+
.create_consumer("Foo")
|
60
|
+
.create_consumer_version("1.2.3")
|
61
|
+
.create_consumer_version("4.5.6")
|
62
|
+
.create_consumer("Bar")
|
63
|
+
.create_consumer_version("8.9.0")
|
64
|
+
end
|
65
|
+
|
66
|
+
subject { Repository.new.find_all_pacticipant_versions_in_reverse_order "Foo" }
|
67
|
+
|
68
|
+
it "returns all the application versions for the given consumer" do
|
69
|
+
expect(subject.collect(&:number)).to eq ["4.5.6", "1.2.3"]
|
70
|
+
end
|
71
|
+
end
|
56
72
|
|
57
73
|
end
|
58
74
|
end
|
@@ -90,6 +90,7 @@ module PactBroker
|
|
90
90
|
end
|
91
91
|
|
92
92
|
it "logs the names" do
|
93
|
+
allow(PactBroker.logger).to receive(:info)
|
93
94
|
expect(PactBroker.logger).to receive(:info).with(/pacticipant_name.*Fred, Mary/)
|
94
95
|
subject.find_potential_duplicate_pacticipants pacticipant_name
|
95
96
|
end
|
@@ -126,39 +127,88 @@ module PactBroker
|
|
126
127
|
.create_consumer_version_tag("prod")
|
127
128
|
.create_pact
|
128
129
|
.create_webhook
|
130
|
+
.create_verification
|
129
131
|
end
|
130
132
|
|
131
|
-
let(:
|
133
|
+
let(:delete_consumer) { subject.delete "Consumer" }
|
134
|
+
let(:delete_provider) { subject.delete "Provider" }
|
132
135
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
136
|
+
context "deleting a consumer" do
|
137
|
+
it "deletes the pacticipant" do
|
138
|
+
expect{ delete_consumer }.to change{
|
139
|
+
PactBroker::Domain::Pacticipant.all.count
|
140
|
+
}.by(-1)
|
141
|
+
end
|
138
142
|
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
143
|
+
it "deletes the child versions" do
|
144
|
+
expect{ delete_consumer }.to change{
|
145
|
+
PactBroker::Domain::Version.where(number: "1.2.3").count
|
146
|
+
}.by(-1)
|
147
|
+
end
|
144
148
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
149
|
+
it "deletes the child tags" do
|
150
|
+
expect{ delete_consumer }.to change{
|
151
|
+
PactBroker::Domain::Tag.where(name: "prod").count
|
152
|
+
}.by(-1)
|
153
|
+
end
|
150
154
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
+
it "deletes the webhooks" do
|
156
|
+
expect{ delete_consumer }.to change{
|
157
|
+
PactBroker::Webhooks::Webhook.count
|
158
|
+
}.by(-1)
|
159
|
+
end
|
160
|
+
|
161
|
+
it "deletes the child pacts" do
|
162
|
+
expect{ delete_consumer }.to change{
|
163
|
+
PactBroker::Pacts::PactPublication.count
|
164
|
+
}.by(-2)
|
165
|
+
end
|
166
|
+
|
167
|
+
it "deletes the verifications" do
|
168
|
+
expect{ delete_consumer }.to change{
|
169
|
+
PactBroker::Domain::Verification.count
|
170
|
+
}.by(-1)
|
171
|
+
end
|
155
172
|
end
|
156
173
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
174
|
+
context "deleting a provider" do
|
175
|
+
it "deletes the pacticipant" do
|
176
|
+
expect{ delete_provider }.to change{
|
177
|
+
PactBroker::Domain::Pacticipant.all.count
|
178
|
+
}.by(-1)
|
179
|
+
end
|
180
|
+
|
181
|
+
it "does not delete any versions" do
|
182
|
+
expect{ delete_provider }.to change{
|
183
|
+
PactBroker::Domain::Version.where(number: "1.2.3").count
|
184
|
+
}.by(0)
|
185
|
+
end
|
186
|
+
|
187
|
+
it "deletes the child tags only if there are any" do
|
188
|
+
expect{ delete_provider }.to change{
|
189
|
+
PactBroker::Domain::Tag.where(name: "prod").count
|
190
|
+
}.by(0)
|
191
|
+
end
|
192
|
+
|
193
|
+
it "deletes the webhooks" do
|
194
|
+
expect{ delete_provider }.to change{
|
195
|
+
PactBroker::Webhooks::Webhook.count
|
196
|
+
}.by(-1)
|
197
|
+
end
|
198
|
+
|
199
|
+
it "deletes the child pacts" do
|
200
|
+
expect{ delete_provider }.to change{
|
201
|
+
PactBroker::Pacts::PactPublication.count
|
202
|
+
}.by(-2)
|
203
|
+
end
|
204
|
+
|
205
|
+
it "deletes the verifications" do
|
206
|
+
expect{ delete_provider }.to change{
|
207
|
+
PactBroker::Domain::Verification.count
|
208
|
+
}.by(-1)
|
209
|
+
end
|
161
210
|
end
|
211
|
+
|
162
212
|
end
|
163
213
|
|
164
214
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'pact_broker/verifications/summary_for_consumer_version'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Verifications
|
5
|
+
describe SummaryForConsumerVersion do
|
6
|
+
|
7
|
+
let(:verifications) { [verification_1, verification_2] }
|
8
|
+
let(:verification_1) do
|
9
|
+
instance_double("PactBroker::Domain::Verification",
|
10
|
+
success: true,
|
11
|
+
provider_name: 'Successful Provider'
|
12
|
+
)
|
13
|
+
end
|
14
|
+
let(:verification_2) do
|
15
|
+
instance_double("PactBroker::Domain::Verification",
|
16
|
+
success: false,
|
17
|
+
provider_name: 'Failed Provider'
|
18
|
+
)
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:pact_1) { instance_double("pact", provider_name: 'Successful Provider') }
|
22
|
+
let(:pact_2) { instance_double("pact", provider_name: 'Failed Provider') }
|
23
|
+
let(:pact_3) { instance_double("pact", provider_name: 'Unknown Provider') }
|
24
|
+
|
25
|
+
let(:pacts) do
|
26
|
+
[pact_1, pact_2, pact_3]
|
27
|
+
end
|
28
|
+
|
29
|
+
subject { SummaryForConsumerVersion.new(verifications, pacts)}
|
30
|
+
|
31
|
+
describe "#provider_summary" do
|
32
|
+
it "returns the successful providers" do
|
33
|
+
expect(subject.provider_summary.successful).to eq ["Successful Provider"]
|
34
|
+
end
|
35
|
+
|
36
|
+
it "returns the failed providers" do
|
37
|
+
expect(subject.provider_summary.failed).to eq ["Failed Provider"]
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns the unknown providers" do
|
41
|
+
expect(subject.provider_summary.unknown).to eq ["Unknown Provider"]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe "success" do
|
46
|
+
context "when all pacts have a successful verification" do
|
47
|
+
let(:verifications) { [verification_1] }
|
48
|
+
let(:pacts) { [[pact_1]] }
|
49
|
+
its(:success) { is_expected.to be true }
|
50
|
+
end
|
51
|
+
|
52
|
+
context "when some pacts have not been verified" do
|
53
|
+
let(:verifications) { [] }
|
54
|
+
let(:pacts) { [[pact_1]] }
|
55
|
+
its(:success) { is_expected.to be false }
|
56
|
+
end
|
57
|
+
|
58
|
+
context "when some pacts have failed verification" do
|
59
|
+
let(:verifications) { [verification_2] }
|
60
|
+
let(:pacts) { [[pact_2]] }
|
61
|
+
its(:success) { is_expected.to be false }
|
62
|
+
end
|
63
|
+
|
64
|
+
context "when there are no verifications" do
|
65
|
+
let(:verifications) { [] }
|
66
|
+
let(:pacts) { [[pact_2]] }
|
67
|
+
its(:success) { is_expected.to be false }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|