pact_broker-client 1.41.0 → 1.46.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/test.yml +21 -0
  3. data/CHANGELOG.md +57 -0
  4. data/README.md +69 -48
  5. data/doc/pacts/markdown/Pact Broker Client - Pact Broker.md +79 -102
  6. data/doc/pacts/markdown/Pact Broker Client - Pactflow.md +94 -0
  7. data/doc/pacts/markdown/README.md +1 -0
  8. data/lib/pact_broker/client/backports.rb +9 -0
  9. data/lib/pact_broker/client/base_command.rb +98 -0
  10. data/lib/pact_broker/client/can_i_deploy.rb +40 -5
  11. data/lib/pact_broker/client/cli/broker.rb +18 -160
  12. data/lib/pact_broker/client/cli/custom_thor.rb +12 -16
  13. data/lib/pact_broker/client/cli/deployment_commands.rb +94 -0
  14. data/lib/pact_broker/client/cli/environment_commands.rb +70 -0
  15. data/lib/pact_broker/client/cli/pacticipant_commands.rb +53 -0
  16. data/lib/pact_broker/client/cli/webhook_commands.rb +122 -0
  17. data/lib/pact_broker/client/deployments.rb +4 -0
  18. data/lib/pact_broker/client/deployments/record_deployment.rb +38 -0
  19. data/lib/pact_broker/client/deployments/record_release.rb +99 -0
  20. data/lib/pact_broker/client/deployments/record_support_ended.rb +103 -0
  21. data/lib/pact_broker/client/deployments/record_undeployment.rb +127 -0
  22. data/lib/pact_broker/client/describe_text_formatter.rb +23 -0
  23. data/lib/pact_broker/client/environments.rb +6 -0
  24. data/lib/pact_broker/client/environments/create_environment.rb +31 -0
  25. data/lib/pact_broker/client/environments/delete_environment.rb +27 -0
  26. data/lib/pact_broker/client/environments/describe_environment.rb +26 -0
  27. data/lib/pact_broker/client/environments/environment_command.rb +66 -0
  28. data/lib/pact_broker/client/environments/list_environments.rb +30 -0
  29. data/lib/pact_broker/client/environments/text_formatter.rb +30 -0
  30. data/lib/pact_broker/client/environments/update_environment.rb +31 -0
  31. data/lib/pact_broker/client/generate_display_name.rb +27 -0
  32. data/lib/pact_broker/client/hal/entity.rb +31 -6
  33. data/lib/pact_broker/client/hal/http_client.rb +8 -2
  34. data/lib/pact_broker/client/hal/link.rb +8 -0
  35. data/lib/pact_broker/client/hal_client_methods.rb +1 -3
  36. data/lib/pact_broker/client/matrix/text_formatter.rb +21 -13
  37. data/lib/pact_broker/client/pacticipants.rb +6 -0
  38. data/lib/pact_broker/client/pacticipants/create.rb +24 -34
  39. data/lib/pact_broker/client/pacticipants/describe.rb +33 -0
  40. data/lib/pact_broker/client/pacticipants/list.rb +34 -0
  41. data/lib/pact_broker/client/pacticipants/text_formatter.rb +41 -0
  42. data/lib/pact_broker/client/string_refinements.rb +56 -0
  43. data/lib/pact_broker/client/version.rb +1 -1
  44. data/lib/pact_broker/client/versions.rb +4 -1
  45. data/lib/pact_broker/client/versions/describe.rb +3 -1
  46. data/lib/pact_broker/client/versions/formatter.rb +3 -1
  47. data/lib/pact_broker/client/versions/json_formatter.rb +5 -3
  48. data/lib/pact_broker/client/versions/text_formatter.rb +3 -1
  49. data/lib/pact_broker/client/webhooks/create.rb +14 -8
  50. data/pact-broker-client.gemspec +1 -0
  51. data/script/record-deployments-and-releases.sh +18 -0
  52. data/script/webhook-commands.sh +12 -0
  53. data/spec/fixtures/approvals/can_i_deploy_failure_dry_run.approved.txt +7 -0
  54. data/spec/fixtures/approvals/can_i_deploy_success_dry_run.approved.txt +7 -0
  55. data/spec/fixtures/approvals/describe_environment.approved.txt +7 -0
  56. data/spec/fixtures/approvals/describe_pacticipant.approved.txt +2 -0
  57. data/spec/fixtures/approvals/list_environments.approved.txt +3 -0
  58. data/spec/integration/describe_environment_spec.rb +31 -0
  59. data/spec/lib/pact_broker/client/can_i_deploy_spec.rb +62 -2
  60. data/spec/lib/pact_broker/client/cli/broker_can_i_deploy_spec.rb +17 -4
  61. data/spec/lib/pact_broker/client/cli/broker_publish_spec.rb +1 -1
  62. data/spec/lib/pact_broker/client/cli/broker_run_webhook_commands_spec.rb +7 -5
  63. data/spec/lib/pact_broker/client/deployments/record_deployment_spec.rb +204 -0
  64. data/spec/lib/pact_broker/client/deployments/record_support_ended_spec.rb +208 -0
  65. data/spec/lib/pact_broker/client/deployments/record_undeployment_spec.rb +219 -0
  66. data/spec/lib/pact_broker/client/environments/delete_environment_spec.rb +120 -0
  67. data/spec/lib/pact_broker/client/environments/describe_environment_spec.rb +89 -0
  68. data/spec/lib/pact_broker/client/environments/update_environment_spec.rb +167 -0
  69. data/spec/lib/pact_broker/client/generate_display_name_spec.rb +39 -0
  70. data/spec/lib/pact_broker/client/hal/entity_spec.rb +2 -2
  71. data/spec/lib/pact_broker/client/pacticipants/create_spec.rb +2 -2
  72. data/spec/pacts/pact_broker_client-pact_broker.json +88 -108
  73. data/spec/pacts/pact_broker_client-pactflow.json +118 -0
  74. data/spec/service_providers/create_environment_spec.rb +78 -0
  75. data/spec/service_providers/list_environments_spec.rb +77 -0
  76. data/spec/service_providers/pact_broker_client_matrix_ignore_spec.rb +1 -1
  77. data/spec/service_providers/pact_broker_client_register_repository_spec.rb +2 -2
  78. data/spec/service_providers/pact_helper.rb +15 -10
  79. data/spec/service_providers/pactflow_webhooks_create_spec.rb +86 -0
  80. data/spec/service_providers/pacticipants_create_spec.rb +5 -4
  81. data/spec/service_providers/publish_pacts_spec.rb +3 -1
  82. data/spec/service_providers/record_deployment_spec.rb +14 -32
  83. data/spec/service_providers/record_release_spec.rb +132 -0
  84. data/spec/service_providers/record_undeployment_spec.rb +166 -0
  85. data/spec/service_providers/webhooks_create_spec.rb +1 -1
  86. data/spec/spec_helper.rb +15 -2
  87. data/spec/support/approvals.rb +1 -1
  88. data/spec/support/shared_context.rb +2 -1
  89. data/tasks/pact.rake +21 -1
  90. metadata +82 -7
  91. data/lib/pact_broker/client/versions/record_deployment.rb +0 -109
  92. data/lib/pact_broker/client/versions/record_undeployment.rb +0 -102
  93. data/spec/lib/pact_broker/client/versions/record_deployment_spec.rb +0 -82
@@ -0,0 +1,77 @@
1
+ require 'service_providers/pact_helper'
2
+ require 'pact_broker/client/environments/list_environments'
3
+
4
+ RSpec.describe "list environments", pact: true, skip: true do
5
+ include_context "pact broker"
6
+ include PactBrokerPactHelperMethods
7
+
8
+ let(:params) { { output: output } }
9
+ let(:output) { "text" }
10
+ let(:pact_broker_client_options) { {} }
11
+ let(:response_body) do
12
+ {
13
+ _embedded: {
14
+ environments: Pact.each_like(
15
+ {
16
+ uuid: "78e85fb2-9df1-48da-817e-c9bea6294e01",
17
+ name: "test",
18
+ displayName: "Test",
19
+ production: false,
20
+ contacts: [{
21
+ name: "Foo team",
22
+ details: {
23
+ emailAddress: "foo@bar.com"
24
+ }
25
+ }]
26
+ }
27
+ )
28
+ }
29
+ }
30
+ end
31
+
32
+ subject { PactBroker::Client::Environments::ListEnvironments.call(params, broker_base_url, pact_broker_client_options) }
33
+
34
+ def mock_index
35
+ pact_broker
36
+ .given("the pb:environments relation exists in the index resource")
37
+ .upon_receiving("a request for the index resource")
38
+ .with(
39
+ method: "GET",
40
+ path: '/',
41
+ headers: get_request_headers).
42
+ will_respond_with(
43
+ status: 200,
44
+ headers: pact_broker_response_headers,
45
+ body: {
46
+ _links: {
47
+ :'pb:environments' => {
48
+ href: placeholder_url_term("pb:environments")
49
+ }
50
+ }
51
+ }
52
+ )
53
+ end
54
+
55
+ def mock_get_environments
56
+ pact_broker
57
+ .given("an environment exists")
58
+ .upon_receiving("a request to list the environments")
59
+ .with(
60
+ method: "GET",
61
+ path: "/HAL-REL-PLACEHOLDER-PB-ENVIRONMENTS",
62
+ headers: get_request_headers
63
+ )
64
+ .will_respond_with(
65
+ status: 200,
66
+ headers: pact_broker_response_headers,
67
+ body: response_body
68
+ )
69
+ end
70
+
71
+ it "returns a success result" do
72
+ mock_index
73
+ mock_get_environments
74
+ expect(subject.success).to be true
75
+ Approvals.verify(subject.message, :name => "list_environments", format: :txt)
76
+ end
77
+ end
@@ -2,7 +2,7 @@ require_relative 'pact_helper'
2
2
  require 'pact_broker/client/can_i_deploy'
3
3
 
4
4
  module PactBroker::Client
5
- describe Matrix, :pact => true, skip: true do
5
+ describe Matrix, :pact => true do
6
6
 
7
7
  include_context "pact broker"
8
8
 
@@ -14,7 +14,7 @@ module PactBroker::Client
14
14
  with(
15
15
  method: :patch,
16
16
  path: '/pacticipants/Pricing%20Service',
17
- headers: patch_request_headers,
17
+ headers: old_patch_request_headers,
18
18
  body: {repository_url: repository_url} ).
19
19
  will_respond_with(
20
20
  status: 201,
@@ -33,7 +33,7 @@ module PactBroker::Client
33
33
  with(
34
34
  method: :patch,
35
35
  path: '/pacticipants/Pricing%20Service',
36
- headers: patch_request_headers,
36
+ headers: old_patch_request_headers,
37
37
  body: { repository_url: repository_url }).
38
38
  will_respond_with(
39
39
  status: 200,
@@ -8,7 +8,6 @@ Pact.configure do | config |
8
8
  end
9
9
 
10
10
  Pact.service_consumer 'Pact Broker Client' do
11
-
12
11
  has_pact_with "Pact Broker" do
13
12
  mock_service :pact_broker do
14
13
  port 1234
@@ -16,6 +15,12 @@ Pact.service_consumer 'Pact Broker Client' do
16
15
  end
17
16
  end
18
17
 
18
+ has_pact_with "Pactflow" do
19
+ mock_service :pactflow do
20
+ port 1235
21
+ pact_specification_version "2.0"
22
+ end
23
+ end
19
24
  end
20
25
 
21
26
  module PactBrokerPactHelperMethods
@@ -30,22 +35,22 @@ module PactBrokerPactHelperMethods
30
35
  path
31
36
  end
32
37
 
33
- def placeholder_url(relation, params = [])
34
- "#{pact_broker.mock_service_base_url}#{placeholder_path(relation, params)}"
38
+ def placeholder_url(relation, params = [], mock_service = pact_broker)
39
+ "#{mock_service.mock_service_base_url}#{placeholder_path(relation, params)}"
35
40
  end
36
41
 
37
- def placeholder_url_term(relation, params = [])
42
+ def placeholder_url_term(relation, params = [], mock_service = pact_broker)
38
43
  regexp = "http:\/\/.*"
39
44
  if params.any?
40
45
  joined_params_for_regexp = params.collect{ |param| "{#{param}}"}.join(".*")
41
46
  regexp = "#{regexp}#{joined_params_for_regexp}"
42
47
  end
43
48
 
44
- Pact.term(placeholder_url(relation, params), /#{regexp}/)
49
+ Pact.term(placeholder_url(relation, params, mock_service), /#{regexp}/)
45
50
  end
46
51
 
47
- def mock_pact_broker_index(context)
48
- pact_broker
52
+ def mock_pact_broker_index(context, mock_service = pact_broker)
53
+ mock_service
49
54
  .upon_receiving("a request for the index resource")
50
55
  .with(
51
56
  method: :get,
@@ -57,13 +62,13 @@ module PactBrokerPactHelperMethods
57
62
  body: {
58
63
  _links: {
59
64
  :'pb:webhooks' => {
60
- href: placeholder_url_term('pb:webhooks')
65
+ href: placeholder_url_term('pb:webhooks', [], mock_service)
61
66
  },
62
67
  :'pb:pacticipants' => {
63
- href: placeholder_url_term('pb:pacticipants')
68
+ href: placeholder_url_term('pb:pacticipants', [], mock_service)
64
69
  },
65
70
  :'pb:pacticipant' => {
66
- href: placeholder_url_term('pb:pacticipant', ['pacticipant'])
71
+ href: placeholder_url_term('pb:pacticipant', ['pacticipant'], mock_service)
67
72
  }
68
73
  }
69
74
  }
@@ -0,0 +1,86 @@
1
+ require_relative 'pact_helper'
2
+ require 'pact_broker/client/webhooks/create'
3
+
4
+ RSpec.describe "creating a webhook in Pactflow", pact: true do
5
+
6
+ include_context "pact broker"
7
+ include PactBrokerPactHelperMethods
8
+
9
+ let(:params) do
10
+ {
11
+ description: "a webhook",
12
+ events: %w{contract_content_changed},
13
+ http_method: "POST",
14
+ url: "https://webhook",
15
+ headers: { "Foo" => "bar", "Bar" => "foo"},
16
+ body: body,
17
+ team_uuid: "2abbc12a-427d-432a-a521-c870af1739d9"
18
+ }
19
+ end
20
+
21
+ let(:body) { { some: "body" }.to_json }
22
+
23
+ let(:request_body) do
24
+ {
25
+ "description" => "a webhook",
26
+ "events" => [
27
+ "name" => "contract_content_changed"
28
+ ],
29
+ "request" => {
30
+ "url" => "https://webhook",
31
+ "method" => "POST",
32
+ "headers" => {
33
+ "Foo" => "bar",
34
+ "Bar" => "foo"
35
+ },
36
+ "body" => {
37
+ "some" => "body"
38
+ },
39
+ },
40
+ "teamUuid" => "2abbc12a-427d-432a-a521-c870af1739d9"
41
+ }
42
+ end
43
+
44
+ let(:response_status) { 201 }
45
+ let(:success_response) do
46
+ {
47
+ status: response_status,
48
+ headers: pact_broker_response_headers,
49
+ body: {
50
+ description: Pact.like("a webhook"),
51
+ teamUuid: "2abbc12a-427d-432a-a521-c870af1739d9",
52
+ _links: {
53
+ self: {
54
+ href: Pact.term('http://localhost:1234/some-url', %r{http://.*}),
55
+ title: Pact.like("A title")
56
+ }
57
+ }
58
+ }
59
+ }
60
+ end
61
+
62
+ let(:pact_broker_client_options) { {} }
63
+
64
+ subject { PactBroker::Client::Webhooks::Create.call(params, pactflow.mock_service_base_url, pact_broker_client_options) }
65
+
66
+ context "when a valid webhook with a team specified is submitted" do
67
+ before do
68
+ mock_pact_broker_index(self, pactflow)
69
+ pactflow
70
+ .given("a team with UUID 2abbc12a-427d-432a-a521-c870af1739d9 exists")
71
+ .upon_receiving("a request to create a webhook for a team")
72
+ .with(
73
+ method: :post,
74
+ path: '/HAL-REL-PLACEHOLDER-PB-WEBHOOKS',
75
+ headers: post_request_headers,
76
+ body: request_body)
77
+ .will_respond_with(success_response)
78
+ end
79
+
80
+ it "returns a CommandResult with success = true" do
81
+ expect(subject).to be_a PactBroker::Client::CommandResult
82
+ expect(subject.success).to be true
83
+ expect(subject.message).to eq "Webhook \"a webhook\" created"
84
+ end
85
+ end
86
+ end
@@ -54,9 +54,10 @@ RSpec.describe "creating or updating a pacticipant", pact: true do
54
54
  }
55
55
  end
56
56
 
57
- let(:pact_broker_client_options) { {} }
57
+ let(:pact_broker_client_options) { { pact_broker_base_url: broker_base_url} }
58
+ let(:options) { {} }
58
59
 
59
- subject { PactBroker::Client::Pacticipants2::Create.call(params, broker_base_url, pact_broker_client_options) }
60
+ subject { PactBroker::Client::Pacticipants2::Create.call(params, options, pact_broker_client_options) }
60
61
 
61
62
  context "when the pacticipant does not already exist" do
62
63
  before do
@@ -81,7 +82,7 @@ RSpec.describe "creating or updating a pacticipant", pact: true do
81
82
  it "returns a CommandResult with success = true" do
82
83
  expect(subject).to be_a PactBroker::Client::CommandResult
83
84
  expect(subject.success).to be true
84
- expect(subject.message).to eq "Pacticipant \"Foo\" created"
85
+ expect(subject.message).to include "Pacticipant \"Foo\" created"
85
86
  end
86
87
  end
87
88
 
@@ -112,7 +113,7 @@ RSpec.describe "creating or updating a pacticipant", pact: true do
112
113
  it "returns a CommandResult with success = true" do
113
114
  expect(subject).to be_a PactBroker::Client::CommandResult
114
115
  expect(subject.success).to be true
115
- expect(subject.message).to eq "Pacticipant \"Foo\" updated"
116
+ expect(subject.message).to include "Pacticipant \"Foo\" updated"
116
117
  end
117
118
  end
118
119
  end
@@ -1,7 +1,9 @@
1
1
  require 'pact_broker/client/publish_pacts'
2
2
  require 'service_providers/pact_helper'
3
3
 
4
- RSpec.describe "publishing contracts", pact: true do
4
+ publish_contracts_feature_on = ENV.fetch('PACT_BROKER_FEATURES', '').include?("publish_contracts")
5
+
6
+ RSpec.describe "publishing contracts", pact: true, skip: !publish_contracts_feature_on do
5
7
  before do
6
8
  allow_any_instance_of(PactBroker::Client::Hal::HttpClient).to receive(:sleep)
7
9
  allow_any_instance_of(PactBroker::Client::Hal::HttpClient).to receive(:default_max_tries).and_return(1)
@@ -1,7 +1,9 @@
1
1
  require 'service_providers/pact_helper'
2
- require 'pact_broker/client/versions/record_deployment'
2
+ require 'pact_broker/client/deployments/record_deployment'
3
3
 
4
- RSpec.describe "recording a deployment", pact: true, skip: true do
4
+ deployment_feature_on = ENV.fetch('PACT_BROKER_FEATURES', '').include?("deployments")
5
+
6
+ RSpec.describe "recording a deployment", pact: true, skip: !deployment_feature_on do
5
7
  include_context "pact broker"
6
8
  include PactBrokerPactHelperMethods
7
9
 
@@ -15,13 +17,17 @@ RSpec.describe "recording a deployment", pact: true, skip: true do
15
17
  pacticipant_name: pacticipant_name,
16
18
  version_number: version_number,
17
19
  environment_name: environment_name,
18
- target: target,
20
+ target: target
21
+ }
22
+ end
23
+ let(:options) do
24
+ {
19
25
  output: output
20
26
  }
21
27
  end
22
- let(:pact_broker_client_options) { {} }
28
+ let(:pact_broker_client_options) { { pact_broker_base_url: broker_base_url } }
23
29
 
24
- subject { PactBroker::Client::Versions::RecordDeployment.call(params, broker_base_url, pact_broker_client_options) }
30
+ subject { PactBroker::Client::Deployments::RecordDeployment.call(params, options, pact_broker_client_options) }
25
31
 
26
32
  def mock_index
27
33
  pact_broker
@@ -101,18 +107,6 @@ RSpec.describe "recording a deployment", pact: true, skip: true do
101
107
  )
102
108
  end
103
109
 
104
- def mock_pacticipant_version_not_found
105
- pact_broker
106
- .given("version 5556b8149bf8bac76bc30f50a8a2dd4c22c85f30 of pacticipant Foo does not exist")
107
- .upon_receiving("a request for a pacticipant version")
108
- .with(
109
- method: "GET",
110
- path: "/HAL-REL-PLACEHOLDER-PB-PACTICIPANT-VERSION-Foo-5556b8149bf8bac76bc30f50a8a2dd4c22c85f30",
111
- headers: get_request_headers
112
- )
113
- .will_respond_with(status: 404)
114
- end
115
-
116
110
  def mock_environments
117
111
  pact_broker
118
112
  .given("an environment with name test exists")
@@ -168,7 +162,7 @@ RSpec.describe "recording a deployment", pact: true, skip: true do
168
162
 
169
163
  it "returns a success message" do
170
164
  expect(subject.success).to be true
171
- expect(subject.message).to eq "Recorded deployment of Foo version 5556b8149bf8bac76bc30f50a8a2dd4c22c85f30 to test in the Pact Broker. Marked previous deployed version as undeployed."
165
+ expect(subject.message).to include "Recorded deployment of Foo version 5556b8149bf8bac76bc30f50a8a2dd4c22c85f30 to test environment (target blue) in the Pact Broker."
172
166
  end
173
167
 
174
168
  context "when the output is json" do
@@ -180,18 +174,6 @@ RSpec.describe "recording a deployment", pact: true, skip: true do
180
174
  end
181
175
  end
182
176
 
183
- context "when the specified version does not exist" do
184
- before do
185
- mock_index
186
- mock_pacticipant_version_not_found
187
- end
188
-
189
- it "returns an error response" do
190
- expect(subject.success).to be false
191
- expect(subject.message).to include "Foo version 5556b8149bf8bac76bc30f50a8a2dd4c22c85f30 not found"
192
- end
193
- end
194
-
195
177
  context "when the specified environment is not available for recording a deployment" do
196
178
  before do
197
179
  mock_index
@@ -204,14 +186,14 @@ RSpec.describe "recording a deployment", pact: true, skip: true do
204
186
 
205
187
  it "returns an error response" do
206
188
  expect(subject.success).to be false
207
- expect(subject.message).to eq "No environment found with name 'foo'. Available options: test"
189
+ expect(subject.message).to include "No environment found"
208
190
  end
209
191
  end
210
192
 
211
193
  context "when the specified environment does exist" do
212
194
  it "returns an error response" do
213
195
  expect(subject.success).to be false
214
- expect(subject.message).to eq "Environment 'test' is not an available option for recording a deployment of Foo. Available options: prod, dev"
196
+ expect(subject.message).to include "not an available option"
215
197
  end
216
198
  end
217
199
  end
@@ -0,0 +1,132 @@
1
+ require 'service_providers/pact_helper'
2
+ require 'pact_broker/client/deployments/record_deployment'
3
+
4
+ deployment_feature_on = ENV.fetch('PACT_BROKER_FEATURES', '').include?("deployments")
5
+
6
+ RSpec.describe "recording a release", pact: true, skip: !deployment_feature_on do
7
+ include_context "pact broker"
8
+ include PactBrokerPactHelperMethods
9
+
10
+ let(:pacticipant_name) { "Foo" }
11
+ let(:version_number) { "5556b8149bf8bac76bc30f50a8a2dd4c22c85f30" }
12
+ let(:environment_name) { "test" }
13
+ let(:output) { "text" }
14
+ let(:target) { "blue" }
15
+ let(:params) do
16
+ {
17
+ pacticipant_name: pacticipant_name,
18
+ version_number: version_number,
19
+ environment_name: environment_name
20
+ }
21
+ end
22
+ let(:options) do
23
+ {
24
+ output: output
25
+ }
26
+ end
27
+ let(:pact_broker_client_options) { { pact_broker_base_url: broker_base_url } }
28
+
29
+ subject { PactBroker::Client::Deployments::RecordRelease.call(params, options, pact_broker_client_options) }
30
+
31
+ def mock_index
32
+ pact_broker
33
+ .given("the pb:pacticipant-version and pb:environments relations exist in the index resource")
34
+ .upon_receiving("a request for the index resource")
35
+ .with(
36
+ method: "GET",
37
+ path: '/',
38
+ headers: get_request_headers).
39
+ will_respond_with(
40
+ status: 200,
41
+ headers: pact_broker_response_headers,
42
+ body: {
43
+ _links: {
44
+ :'pb:pacticipant-version' => {
45
+ href: placeholder_url_term("pb:pacticipant-version", ["pacticipant", "version"])
46
+ },
47
+ :'pb:environments' => {
48
+ href: placeholder_url_term("pb:environments")
49
+ }
50
+ }
51
+ }
52
+ )
53
+ end
54
+
55
+ def mock_pacticipant_version_with_test_environment_available_for_release
56
+ pact_broker
57
+ .given("version 5556b8149bf8bac76bc30f50a8a2dd4c22c85f30 of pacticipant Foo exists with a test environment available for release")
58
+ .upon_receiving("a request for a pacticipant version")
59
+ .with(
60
+ method: "GET",
61
+ path: "/HAL-REL-PLACEHOLDER-PB-PACTICIPANT-VERSION-Foo-5556b8149bf8bac76bc30f50a8a2dd4c22c85f30",
62
+ headers: get_request_headers
63
+ )
64
+ .will_respond_with(
65
+ status: 200,
66
+ headers: pact_broker_response_headers,
67
+ body: {
68
+ _links: {
69
+ "pb:record-release" => [
70
+ {
71
+ name: "test",
72
+ href: placeholder_url_term("pb:record-release-#{pacticipant_name}-#{version_number}-#{environment_name}")
73
+ }
74
+ ]
75
+ }
76
+ }
77
+ )
78
+ end
79
+
80
+ def mock_environments
81
+ pact_broker
82
+ .given("an environment with name test exists")
83
+ .upon_receiving("a request for the environments")
84
+ .with(
85
+ method: "GET",
86
+ path: "/HAL-REL-PLACEHOLDER-PB-ENVIRONMENTS",
87
+ headers: get_request_headers
88
+ )
89
+ .will_respond_with(
90
+ status: 200,
91
+ headers: pact_broker_response_headers,
92
+ body: {
93
+ _links: {
94
+ "pb:environments" => [
95
+ {
96
+ name: "test",
97
+ href: Pact.like("href")
98
+ }
99
+ ]
100
+ }
101
+ }
102
+ )
103
+ end
104
+
105
+ def mock_record_release
106
+ pact_broker
107
+ .given("version 5556b8149bf8bac76bc30f50a8a2dd4c22c85f30 of pacticipant Foo exists with a test environment available for deployment")
108
+ .upon_receiving("a request to record a release")
109
+ .with(
110
+ method: "POST",
111
+ path: "/HAL-REL-PLACEHOLDER-PB-RECORD-RELEASE-FOO-5556B8149BF8BAC76BC30F50A8A2DD4C22C85F30-TEST",
112
+ headers: post_request_headers
113
+ )
114
+ .will_respond_with(
115
+ status: 201,
116
+ headers: pact_broker_response_headers
117
+ )
118
+ end
119
+
120
+ context "when the deployment is recorded successfully" do
121
+ before do
122
+ mock_index
123
+ mock_pacticipant_version_with_test_environment_available_for_release
124
+ mock_record_release
125
+ end
126
+
127
+ it "returns a success message" do
128
+ expect(subject.success).to be true
129
+ expect(subject.message).to include "Recorded release of Foo version 5556b8149bf8bac76bc30f50a8a2dd4c22c85f30 to test environment in the Pact Broker."
130
+ end
131
+ end
132
+ end