pact_broker-client 1.70.0 → 1.72.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/release_gem.yml +17 -2
- data/.github/workflows/test.yml +4 -1
- data/CHANGELOG.md +14 -0
- data/Gemfile +8 -1
- data/README.md +64 -16
- data/doc/pacts/markdown/Pact Broker Client - Pactflow.md +98 -4
- data/doc/pacts/markdown/README.md +1 -1
- data/lib/pact_broker/client/cli/matrix_commands.rb +1 -2
- data/lib/pact_broker/client/version.rb +1 -1
- data/lib/pactflow/client/cli/provider_contract_commands.rb +2 -1
- data/lib/pactflow/client/provider_contracts/publish.rb +48 -56
- data/lib/pactflow/client/provider_contracts/publish_the_old_way.rb +104 -0
- data/pact-broker-client.gemspec +0 -8
- data/script/ci/record-release.sh +7 -0
- data/script/foo-bar.json +81 -0
- data/script/publish-pact.sh +8 -10
- data/script/publish-provider-contract.sh +1 -1
- data/script/update-cli-usage-in-readme.rb +1 -1
- data/spec/fixtures/approvals/publish_provider_contract.approved.txt +2 -0
- data/spec/integration/publish_provider_contract_spec.rb +53 -0
- data/spec/lib/pactflow/client/provider_contracts/publish_spec.rb +178 -0
- data/spec/pacts/pact_broker_client-pactflow.json +105 -3
- data/spec/service_providers/pact_helper.rb +16 -2
- data/spec/service_providers/pactflow_publish_provider_contract_spec.rb +62 -52
- data/spec/service_providers/pactflow_publish_provider_contract_the_old_way_spec.rb +129 -0
- data/spec/spec_helper.rb +4 -0
- data/tasks/pact.rake +29 -8
- metadata +13 -100
@@ -0,0 +1,104 @@
|
|
1
|
+
require "pact_broker/client/base_command"
|
2
|
+
require "pact_broker/client/versions/create"
|
3
|
+
require 'pact_broker/client/colorize_notices'
|
4
|
+
require "base64"
|
5
|
+
|
6
|
+
module Pactflow
|
7
|
+
module Client
|
8
|
+
module ProviderContracts
|
9
|
+
class PublishTheOldWay < PactBroker::Client::BaseCommand
|
10
|
+
attr_reader :branch_name, :tags, :provider_name, :provider_version_number, :contract, :verification_results
|
11
|
+
|
12
|
+
def initialize(params, options, pact_broker_client_options)
|
13
|
+
super
|
14
|
+
@provider_name = params[:provider_name]
|
15
|
+
@provider_version_number = params[:provider_version_number]
|
16
|
+
@branch_name = params[:branch_name]
|
17
|
+
@tags = params[:tags] || []
|
18
|
+
@contract = params[:contract]
|
19
|
+
@verification_results = params[:verification_results]
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def do_call
|
25
|
+
create_branch_version_and_tags
|
26
|
+
render_response(create_contract)
|
27
|
+
end
|
28
|
+
|
29
|
+
def render_response(res)
|
30
|
+
notices = [
|
31
|
+
{ type: 'success', text: "Successfully published provider contract for #{provider_name} version #{provider_version_number} to PactFlow"},
|
32
|
+
]
|
33
|
+
if res.body && res.body['_links'] && res.body['_links']['pf:ui']['href']
|
34
|
+
notices.concat([{ text: "View the uploaded contract at #{res.body['_links']['pf:ui']['href']}" }])
|
35
|
+
end
|
36
|
+
notices.concat(next_steps)
|
37
|
+
PactBroker::Client::CommandResult.new(true, PactBroker::Client::ColorizeNotices.call(notices.collect do |n|
|
38
|
+
OpenStruct.new(n)
|
39
|
+
end).join("\n"))
|
40
|
+
end
|
41
|
+
|
42
|
+
def next_steps
|
43
|
+
[
|
44
|
+
{ type: 'prompt', text: 'Next steps:' },
|
45
|
+
{ type: 'prompt',
|
46
|
+
text: ' * Check your application is safe to deploy - https://docs.pact.io/can_i_deploy' },
|
47
|
+
{ text: " pact-broker can-i-deploy --pacticipant #{provider_name} --version #{provider_version_number} --to-environment <your environment name>" },
|
48
|
+
{ type: 'prompt',
|
49
|
+
text: ' * Record deployment or release to specified environment (choose one) - https://docs.pact.io/go/record-deployment' },
|
50
|
+
{ text: " pact-broker record-deployment --pacticipant #{provider_name} --version #{provider_version_number} --environment <your environment name>" },
|
51
|
+
{ text: " pact-broker record-release --pacticipant #{provider_name} --version #{provider_version_number} --environment <your environment name>" }
|
52
|
+
]
|
53
|
+
end
|
54
|
+
|
55
|
+
def create_branch_version_and_tags
|
56
|
+
if branch_name || tags.any?
|
57
|
+
pacticipant_version_params = {
|
58
|
+
pacticipant_name: provider_name,
|
59
|
+
version_number: provider_version_number,
|
60
|
+
branch_name: branch_name,
|
61
|
+
tags: tags
|
62
|
+
}
|
63
|
+
result = PactBroker::Client::Versions::Create.call(pacticipant_version_params, options, pact_broker_client_options)
|
64
|
+
if !result.success
|
65
|
+
raise PactBroker::Client::Error.new(result.message)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def create_contract
|
71
|
+
contract_path = "#{pact_broker_base_url}/contracts/provider/{provider}/version/{version}"
|
72
|
+
entrypoint = create_entry_point(contract_path, pact_broker_client_options)
|
73
|
+
entrypoint.expand(provider: provider_name, version: provider_version_number).put!(contract_params).response
|
74
|
+
end
|
75
|
+
|
76
|
+
def contract_params
|
77
|
+
verification_results_params = {
|
78
|
+
success: verification_results[:success],
|
79
|
+
content: verification_results[:content] ? encode_content(verification_results[:content]) : nil,
|
80
|
+
contentType: verification_results[:content_type],
|
81
|
+
format: verification_results[:format],
|
82
|
+
verifier: verification_results[:verifier],
|
83
|
+
verifierVersion: verification_results[:verifier_version]
|
84
|
+
}.compact
|
85
|
+
|
86
|
+
body_params = {
|
87
|
+
content: encode_content(contract[:content]),
|
88
|
+
contractType: contract[:specification],
|
89
|
+
contentType: contract[:content_type],
|
90
|
+
}.compact
|
91
|
+
|
92
|
+
if verification_results_params.any?
|
93
|
+
body_params[:verificationResults] = verification_results_params
|
94
|
+
end
|
95
|
+
body_params
|
96
|
+
end
|
97
|
+
|
98
|
+
def encode_content oas
|
99
|
+
Base64.strict_encode64(oas)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
data/pact-broker-client.gemspec
CHANGED
@@ -27,12 +27,4 @@ Gem::Specification.new do |gem|
|
|
27
27
|
gem.add_runtime_dependency 'thor', '>= 0.20', '< 2.0'
|
28
28
|
gem.add_runtime_dependency 'rake', '~> 13.0' #For FileList
|
29
29
|
gem.add_runtime_dependency 'dig_rb', '~> 1.0'
|
30
|
-
|
31
|
-
gem.add_development_dependency 'fakefs', '~> 2.4'
|
32
|
-
gem.add_development_dependency 'webmock', '~> 3.0'
|
33
|
-
gem.add_development_dependency 'conventional-changelog', '~>1.3'
|
34
|
-
gem.add_development_dependency 'pact', '~> 1.16'
|
35
|
-
gem.add_development_dependency 'pact-support', '~> 1.16'
|
36
|
-
gem.add_development_dependency 'approvals', '0.0.26'
|
37
|
-
gem.add_development_dependency 'rspec-its', '~> 1.3'
|
38
30
|
end
|
data/script/foo-bar.json
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
{
|
2
|
+
"consumer": {
|
3
|
+
"name": "Foo"
|
4
|
+
},
|
5
|
+
"provider": {
|
6
|
+
"name": "Bar"
|
7
|
+
},
|
8
|
+
"interactions": [
|
9
|
+
{
|
10
|
+
"description": "a request to list the latest pacts",
|
11
|
+
"providerState": "a pact between Condor and the Pricing Service exists",
|
12
|
+
"request": {
|
13
|
+
"method": "get",
|
14
|
+
"path": "/pacts/latest",
|
15
|
+
"headers": {
|
16
|
+
}
|
17
|
+
},
|
18
|
+
"response": {
|
19
|
+
"status": 200,
|
20
|
+
"headers": {
|
21
|
+
"Content-Type": "application/hal+json"
|
22
|
+
},
|
23
|
+
"body": {
|
24
|
+
"_links": {
|
25
|
+
"self": {
|
26
|
+
"href": "http://example.org/pacts/latest"
|
27
|
+
}
|
28
|
+
},
|
29
|
+
"pacts": [
|
30
|
+
{
|
31
|
+
"_links": {
|
32
|
+
"self": [
|
33
|
+
{
|
34
|
+
"href": "http://example.org/pacts/provider/Pricing%20Service/consumer/Condor/latest"
|
35
|
+
},
|
36
|
+
{
|
37
|
+
"href": "http://example.org/pacts/provider/Pricing%20Service/consumer/Condor/version/1.3.0"
|
38
|
+
}
|
39
|
+
]
|
40
|
+
},
|
41
|
+
"_embedded": {
|
42
|
+
"consumer": {
|
43
|
+
"name": "Condor",
|
44
|
+
"_links": {
|
45
|
+
"self": {
|
46
|
+
"href": "http://example.org/pacticipants/Condor"
|
47
|
+
}
|
48
|
+
},
|
49
|
+
"_embedded": {
|
50
|
+
"version": {
|
51
|
+
"number": "1.3.0"
|
52
|
+
}
|
53
|
+
}
|
54
|
+
},
|
55
|
+
"provider": {
|
56
|
+
"_links": {
|
57
|
+
"self": {
|
58
|
+
"href": "http://example.org/pacticipants/Pricing%20Service"
|
59
|
+
}
|
60
|
+
},
|
61
|
+
"name": "Pricing Service"
|
62
|
+
}
|
63
|
+
}
|
64
|
+
}
|
65
|
+
]
|
66
|
+
},
|
67
|
+
"matchingRules": {
|
68
|
+
"$.headers.Content-Type": {
|
69
|
+
"match": "regex",
|
70
|
+
"regex": "application\\/hal\\+json"
|
71
|
+
}
|
72
|
+
}
|
73
|
+
}
|
74
|
+
}
|
75
|
+
],
|
76
|
+
"metadata": {
|
77
|
+
"pactSpecification": {
|
78
|
+
"version": "2.0.0"
|
79
|
+
}
|
80
|
+
}
|
81
|
+
}
|
data/script/publish-pact.sh
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
export PACT_BROKER_BASE_URL
|
2
|
-
export PACT_BROKER_TOKEN
|
1
|
+
export PACT_BROKER_BASE_URL=${PACT_BROKER_BASE_URL:-"http://localhost:9292"}
|
2
|
+
export PACT_BROKER_TOKEN=${PACT_BROKER_TOKEN:-"localhost"}
|
3
3
|
#export PACT_BROKER_FEATURES=publish_pacts_using_old_api
|
4
4
|
|
5
5
|
# bundle exec bin/pact-broker create-or-update-webhook http://localhost:9393 \
|
@@ -8,11 +8,11 @@ export PACT_BROKER_TOKEN="localhost"
|
|
8
8
|
# --description "foo webhook" \
|
9
9
|
# --contract-published
|
10
10
|
|
11
|
-
bundle exec bin/pact-broker create-or-update-webhook http://localhost:9393 \
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
# bundle exec bin/pact-broker create-or-update-webhook http://localhost:9393 \
|
12
|
+
# --uuid d40f38c3-aaa3-47f5-9161-95csfadfsd7 \
|
13
|
+
# --description "This is quite a long description for a webhook that I hope will be truncated" \
|
14
|
+
# --request POST \
|
15
|
+
# --contract-published
|
16
16
|
|
17
17
|
# bundle exec bin/pact-broker publish spec/pacts/pact_broker_client-pact_broker.json spec/fixtures/foo-bar.json \
|
18
18
|
# --consumer-app-version 1.2.12 \
|
@@ -29,10 +29,8 @@ bundle exec bin/pact-broker create-or-update-webhook http://localhost:9393 \
|
|
29
29
|
# --contract-published
|
30
30
|
|
31
31
|
|
32
|
-
bundle exec bin/pact-broker publish
|
32
|
+
bundle exec bin/pact-broker publish scripts/foo-bar.json \
|
33
33
|
--consumer-app-version 1.2.26 \
|
34
|
-
--broker-base-url http://localhost:9292 \
|
35
|
-
--broker-token localhost \
|
36
34
|
--auto-detect-version-properties \
|
37
35
|
--build-url http://mybuild \
|
38
36
|
--branch master --tag foo5 --tag foo6
|
@@ -1,7 +1,7 @@
|
|
1
1
|
export PACT_BROKER_BASE_URL=${PACT_BROKER_BASE_URL:-"http://localhost:9292"}
|
2
2
|
bundle exec bin/pactflow publish-provider-contract \
|
3
3
|
script/oas.yml \
|
4
|
-
--provider
|
4
|
+
--provider Bar \
|
5
5
|
--provider-app-version 1013b5650d61214e19f10558f97fb5a3bb082d44 \
|
6
6
|
--branch main \
|
7
7
|
--tag dev \
|
@@ -13,7 +13,7 @@ PACT_BROKER_COMMAND_GROUPS = [
|
|
13
13
|
[PactBroker::Client::CLI::Broker, "Environments", %w[create-environment update-environment describe-environment delete-environment list-environments]],
|
14
14
|
[PactBroker::Client::CLI::Broker, "Deployments", %w[record-deployment record-undeployment]],
|
15
15
|
[PactBroker::Client::CLI::Broker, "Releases", %w[record-release record-support-ended]],
|
16
|
-
[PactBroker::Client::CLI::Broker, "Matrix", %w[can-i-deploy]],
|
16
|
+
[PactBroker::Client::CLI::Broker, "Matrix", %w[can-i-deploy can-i-merge]],
|
17
17
|
[PactBroker::Client::CLI::Broker, "Pacticipants", %w[create-or-update-pacticipant describe-pacticipant list-pacticipants]],
|
18
18
|
[PactBroker::Client::CLI::Broker, "Webhooks", %w[create-webhook create-or-update-webhook test-webhook]],
|
19
19
|
[PactBroker::Client::CLI::Broker, "Tags", %w[create-version-tag]],
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require "pactflow/client/cli/pactflow"
|
2
|
+
|
3
|
+
RSpec.describe "publish-provider-contract" do
|
4
|
+
let(:index_body_hash) do
|
5
|
+
{
|
6
|
+
_links: {
|
7
|
+
"pf:publish-provider-contract" => {
|
8
|
+
href: "http://broker/some-publish/{provider}"
|
9
|
+
}
|
10
|
+
}
|
11
|
+
}
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:post_response_body) do
|
15
|
+
{
|
16
|
+
"notices"=>[{"text"=>"some notice", "type"=>"info"}, {"text"=>"some other notice", "type"=>"info"}]
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
let!(:index_request) do
|
21
|
+
stub_request(:get, "http://broker").to_return(status: 200, body: index_body_hash.to_json, headers: { "Content-Type" => "application/hal+json" } )
|
22
|
+
end
|
23
|
+
|
24
|
+
let!(:publish_request) do
|
25
|
+
stub_request(:post, "http://broker/some-publish/Bar").to_return(status: 200, body: post_response_body.to_json, headers: { "Content-Type" => "application/hal+json" } )
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:parameters) do
|
29
|
+
%w{
|
30
|
+
publish-provider-contract
|
31
|
+
script/oas.yml
|
32
|
+
--provider Bar
|
33
|
+
--broker-base-url http://broker
|
34
|
+
--provider-app-version 1013b5650d61214e19f10558f97fb5a3bb082d44
|
35
|
+
--branch main
|
36
|
+
--tag dev
|
37
|
+
--specification oas
|
38
|
+
--content-type application/yml
|
39
|
+
--verification-exit-code 0
|
40
|
+
--verification-results script/verification-results.txt
|
41
|
+
--verification-results-content-type text/plain
|
42
|
+
--verification-results-format text
|
43
|
+
--verifier my-custom-tool
|
44
|
+
--verifier-version "1.0"
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
subject { capture(:stdout) { Pactflow::Client::CLI::Pactflow.start(parameters) } }
|
49
|
+
|
50
|
+
it "prints the notices" do
|
51
|
+
Approvals.verify(subject, :name => "publish_provider_contract", format: :txt)
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,178 @@
|
|
1
|
+
require "pactflow/client/provider_contracts/publish"
|
2
|
+
|
3
|
+
module Pactflow
|
4
|
+
module Client
|
5
|
+
module ProviderContracts
|
6
|
+
describe Publish do
|
7
|
+
before do
|
8
|
+
allow_any_instance_of(PactBroker::Client::Hal::HttpClient).to receive(:sleep)
|
9
|
+
allow_any_instance_of(PactBroker::Client::Hal::HttpClient).to receive(:default_max_tries).and_return(1)
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:command_params) do
|
13
|
+
{
|
14
|
+
provider_name: "Bar",
|
15
|
+
provider_version_number: "1",
|
16
|
+
branch_name: "main",
|
17
|
+
tags: ["dev"],
|
18
|
+
build_url: "http://build",
|
19
|
+
contract: {
|
20
|
+
content: { "some" => "contract" }.to_yaml,
|
21
|
+
content_type: "application/yaml",
|
22
|
+
specification: "oas"
|
23
|
+
},
|
24
|
+
verification_results: {
|
25
|
+
success: true,
|
26
|
+
content: "some results",
|
27
|
+
content_type: "text/plain",
|
28
|
+
format: "text",
|
29
|
+
verifier: "my custom tool",
|
30
|
+
verifier_version: "1.0"
|
31
|
+
}
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
let(:options) do
|
36
|
+
{
|
37
|
+
verbose: false
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
let(:pact_broker_client_options) do
|
42
|
+
{ pact_broker_base_url: "http://pactflow" }
|
43
|
+
end
|
44
|
+
|
45
|
+
let(:index_body_hash) do
|
46
|
+
{
|
47
|
+
_links: {
|
48
|
+
"pf:publish-provider-contract" => {
|
49
|
+
href: "http://pactflow/some-publish/{provider}"
|
50
|
+
}
|
51
|
+
}
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
let(:post_response_body) do
|
56
|
+
{
|
57
|
+
"notices"=>[{"text"=>"some notice", "type"=>"info"}]
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
let!(:index_request) do
|
62
|
+
stub_request(:get, "http://pactflow")
|
63
|
+
.to_return(
|
64
|
+
status: index_status,
|
65
|
+
body: index_body_hash.to_json,
|
66
|
+
headers: { "Content-Type" => "application/hal+json" }
|
67
|
+
)
|
68
|
+
end
|
69
|
+
let(:index_status) { 200 }
|
70
|
+
|
71
|
+
let!(:publish_request) do
|
72
|
+
stub_request(:post, "http://pactflow/some-publish/Bar")
|
73
|
+
.to_return(
|
74
|
+
status: publish_status,
|
75
|
+
body: post_response_body.to_json,
|
76
|
+
headers: { "Content-Type" => "application/hal+json" }
|
77
|
+
)
|
78
|
+
end
|
79
|
+
let(:publish_status) { 200 }
|
80
|
+
|
81
|
+
subject { Publish.call(command_params, options, pact_broker_client_options) }
|
82
|
+
|
83
|
+
context "when there is no relation pf:publish-provider-contract" do
|
84
|
+
before do
|
85
|
+
allow(PublishTheOldWay).to receive(:call).with(command_params, options, pact_broker_client_options).and_return(instance_double(PactBroker::Client::CommandResult))
|
86
|
+
end
|
87
|
+
|
88
|
+
let(:index_body_hash) do
|
89
|
+
{
|
90
|
+
_links: {}
|
91
|
+
}
|
92
|
+
end
|
93
|
+
|
94
|
+
it "publishes the provider contracts the old way" do
|
95
|
+
expect(PublishTheOldWay).to receive(:call).with(command_params, options, pact_broker_client_options)
|
96
|
+
subject
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
context "when the feature is disabled" do
|
101
|
+
before do
|
102
|
+
allow(ENV).to receive(:fetch).and_call_original
|
103
|
+
allow(ENV).to receive(:fetch).with("PACTFLOW_FEATURES", "").and_return("publish_provider_contracts_using_old_api")
|
104
|
+
end
|
105
|
+
|
106
|
+
it "publishes the provider contracts the old way" do
|
107
|
+
expect(PublishTheOldWay).to receive(:call).with(command_params, options, pact_broker_client_options)
|
108
|
+
subject
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
it "returns a result and message" do
|
113
|
+
expect(subject.success).to be true
|
114
|
+
expect(subject.message).to include("some notice")
|
115
|
+
end
|
116
|
+
|
117
|
+
it "colourises the notices" do
|
118
|
+
expect(PactBroker::Client::ColorizeNotices).to receive(:call).with([OpenStruct.new(text: "some notice", type: "info")]).and_return("coloured notices")
|
119
|
+
expect(subject.message).to eq "coloured notices"
|
120
|
+
end
|
121
|
+
|
122
|
+
context "when the output is json" do
|
123
|
+
let(:options) { { output: "json" } }
|
124
|
+
|
125
|
+
it "returns the raw response" do
|
126
|
+
expect(subject.message).to eq post_response_body.to_json
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
context "when there is an error retrieving the index" do
|
131
|
+
let(:index_status) { 500 }
|
132
|
+
let(:index_body_hash) { { "some" => "error" }}
|
133
|
+
|
134
|
+
it "returns an error result with the response body" do
|
135
|
+
expect(subject.success).to be false
|
136
|
+
expect(subject.message).to match(/some.*error/)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context "when there is an error response from publishing" do
|
141
|
+
let(:publish_status) { 400 }
|
142
|
+
let(:post_response_body) do
|
143
|
+
{
|
144
|
+
"some" => "error"
|
145
|
+
}
|
146
|
+
end
|
147
|
+
|
148
|
+
it "returns an error result with the response body" do
|
149
|
+
expect(subject.success).to be false
|
150
|
+
expect(subject.message).to match(/some.*error/)
|
151
|
+
end
|
152
|
+
|
153
|
+
context "when the output is json" do
|
154
|
+
let(:options) { { output: "json" } }
|
155
|
+
|
156
|
+
it "returns the raw response" do
|
157
|
+
expect(subject.message).to eq post_response_body.to_json
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context "when there is an error response from publishing" do
|
163
|
+
let(:publish_status) { 400 }
|
164
|
+
let(:post_response_body) do
|
165
|
+
{
|
166
|
+
"some" => "error"
|
167
|
+
}
|
168
|
+
end
|
169
|
+
|
170
|
+
it "returns an error result with the response body" do
|
171
|
+
expect(subject.success).to be false
|
172
|
+
expect(subject.message).to match(/some.*error/)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
@@ -6,6 +6,103 @@
|
|
6
6
|
"name": "PactFlow"
|
7
7
|
},
|
8
8
|
"interactions": [
|
9
|
+
{
|
10
|
+
"description": "a request for the index resource",
|
11
|
+
"providerState": "the pb:publish-provider-contract relation exists in the index resource",
|
12
|
+
"request": {
|
13
|
+
"method": "GET",
|
14
|
+
"path": "/",
|
15
|
+
"headers": {
|
16
|
+
"Accept": "application/hal+json"
|
17
|
+
}
|
18
|
+
},
|
19
|
+
"response": {
|
20
|
+
"status": 200,
|
21
|
+
"headers": {
|
22
|
+
"Content-Type": "application/hal+json;charset=utf-8"
|
23
|
+
},
|
24
|
+
"body": {
|
25
|
+
"_links": {
|
26
|
+
"pf:publish-provider-contract": {
|
27
|
+
"href": "http://localhost:1235/HAL-REL-PLACEHOLDER-PF-PUBLISH-PROVIDER-CONTRACT-{provider}"
|
28
|
+
}
|
29
|
+
}
|
30
|
+
},
|
31
|
+
"matchingRules": {
|
32
|
+
"$.body._links.pf:publish-provider-contract.href": {
|
33
|
+
"match": "regex",
|
34
|
+
"regex": "http:\\/\\/.*{provider}"
|
35
|
+
}
|
36
|
+
}
|
37
|
+
}
|
38
|
+
},
|
39
|
+
{
|
40
|
+
"description": "a request to publish a provider contract",
|
41
|
+
"request": {
|
42
|
+
"method": "post",
|
43
|
+
"path": "/HAL-REL-PLACEHOLDER-PF-PUBLISH-PROVIDER-CONTRACT-Bar",
|
44
|
+
"headers": {
|
45
|
+
"Content-Type": "application/json",
|
46
|
+
"Accept": "application/hal+json"
|
47
|
+
},
|
48
|
+
"body": {
|
49
|
+
"pacticipantVersionNumber": "1",
|
50
|
+
"tags": [
|
51
|
+
"dev"
|
52
|
+
],
|
53
|
+
"branch": "main",
|
54
|
+
"buildUrl": "http://build",
|
55
|
+
"contract": {
|
56
|
+
"content": "LS0tCnNvbWU6IGNvbnRyYWN0Cg==",
|
57
|
+
"contentType": "application/yaml",
|
58
|
+
"specification": "oas",
|
59
|
+
"selfVerificationResults": {
|
60
|
+
"success": true,
|
61
|
+
"content": "c29tZSByZXN1bHRz",
|
62
|
+
"contentType": "text/plain",
|
63
|
+
"format": "text",
|
64
|
+
"verifier": "my custom tool",
|
65
|
+
"verifierVersion": "1.0"
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
},
|
70
|
+
"response": {
|
71
|
+
"status": 200,
|
72
|
+
"headers": {
|
73
|
+
"Content-Type": "application/hal+json;charset=utf-8"
|
74
|
+
},
|
75
|
+
"body": {
|
76
|
+
"notices": [
|
77
|
+
{
|
78
|
+
"text": "some notice",
|
79
|
+
"type": "info"
|
80
|
+
}
|
81
|
+
],
|
82
|
+
"_embedded": {
|
83
|
+
"version": {
|
84
|
+
"number": "1"
|
85
|
+
}
|
86
|
+
},
|
87
|
+
"_links": {
|
88
|
+
"pb:pacticipant-version-tags": [
|
89
|
+
{
|
90
|
+
}
|
91
|
+
],
|
92
|
+
"pb:branch-version": {
|
93
|
+
}
|
94
|
+
}
|
95
|
+
},
|
96
|
+
"matchingRules": {
|
97
|
+
"$.body.notices": {
|
98
|
+
"min": 1
|
99
|
+
},
|
100
|
+
"$.body.notices[*].*": {
|
101
|
+
"match": "type"
|
102
|
+
}
|
103
|
+
}
|
104
|
+
}
|
105
|
+
},
|
9
106
|
{
|
10
107
|
"description": "a request to create a provider contract",
|
11
108
|
"request": {
|
@@ -16,7 +113,7 @@
|
|
16
113
|
"Accept": "application/hal+json"
|
17
114
|
},
|
18
115
|
"body": {
|
19
|
-
"content": "
|
116
|
+
"content": "LS0tCnNvbWU6IGNvbnRyYWN0Cg==",
|
20
117
|
"contractType": "oas",
|
21
118
|
"contentType": "application/yaml",
|
22
119
|
"verificationResults": {
|
@@ -47,7 +144,7 @@
|
|
47
144
|
"Accept": "application/hal+json"
|
48
145
|
},
|
49
146
|
"body": {
|
50
|
-
"content": "
|
147
|
+
"content": "LS0tCnNvbWU6IGNvbnRyYWN0Cg==",
|
51
148
|
"contractType": "oas",
|
52
149
|
"contentType": "application/yaml",
|
53
150
|
"verificationResults": {
|
@@ -68,9 +165,14 @@
|
|
68
165
|
"body": {
|
69
166
|
"_links": {
|
70
167
|
"pf:ui": {
|
71
|
-
"href": "
|
168
|
+
"href": "some-url"
|
72
169
|
}
|
73
170
|
}
|
171
|
+
},
|
172
|
+
"matchingRules": {
|
173
|
+
"$.body._links.pf:ui.href": {
|
174
|
+
"match": "type"
|
175
|
+
}
|
74
176
|
}
|
75
177
|
}
|
76
178
|
},
|
@@ -25,10 +25,12 @@ end
|
|
25
25
|
|
26
26
|
module PactBrokerPactHelperMethods
|
27
27
|
|
28
|
+
# @param [String] relation eg "pb:pacticipant"
|
29
|
+
# @param [Array<String>] params eg ["Foo"]
|
28
30
|
def placeholder_path(relation, params = [])
|
29
31
|
path = "/HAL-REL-PLACEHOLDER-#{relation.gsub(':', '-').upcase}"
|
30
32
|
if params.any?
|
31
|
-
joined_params = params.
|
33
|
+
joined_params = params.join("-")
|
32
34
|
path = "#{path}-#{joined_params}"
|
33
35
|
end
|
34
36
|
|
@@ -36,7 +38,19 @@ module PactBrokerPactHelperMethods
|
|
36
38
|
end
|
37
39
|
|
38
40
|
def placeholder_url(relation, params = [], mock_service = pact_broker)
|
39
|
-
"#{mock_service.mock_service_base_url}#{
|
41
|
+
"#{mock_service.mock_service_base_url}#{placeholder_path_for_term(relation, params)}"
|
42
|
+
end
|
43
|
+
|
44
|
+
# @param [String] relation eg "pb:pacticipants"
|
45
|
+
# @param [Array<String>] params eg ["pacticipant"]
|
46
|
+
def placeholder_path_for_term(relation, params = [])
|
47
|
+
path = "/HAL-REL-PLACEHOLDER-#{relation.gsub(':', '-').upcase}"
|
48
|
+
if params.any?
|
49
|
+
joined_params = params.collect{ |param| "{#{param}}"}.join("-")
|
50
|
+
path = "#{path}-#{joined_params}"
|
51
|
+
end
|
52
|
+
|
53
|
+
path
|
40
54
|
end
|
41
55
|
|
42
56
|
def placeholder_url_term(relation, params = [], mock_service = pact_broker)
|