pact_broker 2.22.0 → 2.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +30 -0
  3. data/README.md +1 -0
  4. data/db/migrations/20180611_make_webhook_pacticipant_ids_optional.rb +11 -0
  5. data/example/config.ru +2 -0
  6. data/lib/pact_broker/api.rb +9 -3
  7. data/lib/pact_broker/api/contracts/webhook_contract.rb +36 -0
  8. data/lib/pact_broker/api/decorators/pact_decorator.rb +22 -1
  9. data/lib/pact_broker/api/decorators/pact_webhooks_status_decorator.rb +1 -26
  10. data/lib/pact_broker/api/decorators/triggered_webhook_decorator.rb +33 -0
  11. data/lib/pact_broker/api/decorators/triggered_webhooks_decorator.rb +19 -0
  12. data/lib/pact_broker/api/decorators/verification_decorator.rb +6 -0
  13. data/lib/pact_broker/api/decorators/webhook_decorator.rb +32 -18
  14. data/lib/pact_broker/api/decorators/webhook_execution_result_decorator.rb +27 -0
  15. data/lib/pact_broker/api/decorators/{webhook_request_decorator.rb → webhook_request_template_decorator.rb} +1 -1
  16. data/lib/pact_broker/api/pact_broker_urls.rb +21 -1
  17. data/lib/pact_broker/api/resources/all_webhooks.rb +82 -0
  18. data/lib/pact_broker/api/resources/base_resource.rb +18 -0
  19. data/lib/pact_broker/api/resources/error_handler.rb +5 -1
  20. data/lib/pact_broker/api/resources/pact_triggered_webhooks.rb +41 -0
  21. data/lib/pact_broker/api/resources/pact_webhooks.rb +2 -15
  22. data/lib/pact_broker/api/resources/pact_webhooks_status.rb +1 -1
  23. data/lib/pact_broker/api/resources/verification_triggered_webhooks.rb +45 -0
  24. data/lib/pact_broker/api/resources/webhook_execution.rb +1 -5
  25. data/lib/pact_broker/api/resources/webhooks.rb +69 -6
  26. data/lib/pact_broker/configuration.rb +5 -2
  27. data/lib/pact_broker/doc/controllers/app.rb +1 -2
  28. data/lib/pact_broker/doc/views/pact-webhooks.markdown +3 -0
  29. data/lib/pact_broker/doc/views/webhooks.markdown +53 -33
  30. data/lib/pact_broker/domain/pact.rb +4 -0
  31. data/lib/pact_broker/domain/webhook.rb +19 -3
  32. data/lib/pact_broker/domain/webhook_execution_result.rb +6 -1
  33. data/lib/pact_broker/domain/webhook_request.rb +87 -65
  34. data/lib/pact_broker/locale/en.yml +1 -0
  35. data/lib/pact_broker/matrix/repository.rb +3 -1
  36. data/lib/pact_broker/pacts/placeholder_pact.rb +17 -0
  37. data/lib/pact_broker/pacts/repository.rb +14 -0
  38. data/lib/pact_broker/pacts/service.rb +6 -2
  39. data/lib/pact_broker/ui/view_models/index_item.rb +1 -1
  40. data/lib/pact_broker/verifications/placeholder_verification.rb +23 -0
  41. data/lib/pact_broker/verifications/repository.rb +9 -0
  42. data/lib/pact_broker/verifications/service.rb +5 -1
  43. data/lib/pact_broker/version.rb +1 -1
  44. data/lib/pact_broker/webhooks/repository.rb +54 -4
  45. data/lib/pact_broker/webhooks/service.rb +37 -2
  46. data/lib/pact_broker/webhooks/webhook.rb +4 -3
  47. data/lib/pact_broker/webhooks/webhook_event.rb +8 -0
  48. data/lib/pact_broker/webhooks/webhook_request_template.rb +72 -0
  49. data/pact_broker.gemspec +1 -1
  50. data/script/seed.rb +32 -51
  51. data/spec/features/create_webhook_spec.rb +85 -36
  52. data/spec/features/execute_webhook_spec.rb +9 -18
  53. data/spec/features/get_triggered_webhooks_for_pact_spec.rb +20 -0
  54. data/spec/features/get_triggered_webhooks_for_verification_spec.rb +21 -0
  55. data/spec/fixtures/webhook_valid_with_pacticipants.json +23 -0
  56. data/spec/integration/webhooks/certificate_spec.rb +2 -2
  57. data/spec/lib/pact_broker/api/contracts/webhook_contract_spec.rb +98 -2
  58. data/spec/lib/pact_broker/api/decorators/triggered_webhook_decorator_spec.rb +64 -0
  59. data/spec/lib/pact_broker/api/decorators/triggered_webhooks_decorator_spec.rb +28 -0
  60. data/spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb +8 -0
  61. data/spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb +37 -1
  62. data/spec/lib/pact_broker/api/decorators/webhook_execution_result_decorator_spec.rb +34 -1
  63. data/spec/lib/pact_broker/api/decorators/{webhook_request_decorator_spec.rb → webhook_request_template_decorator_spec.rb} +7 -9
  64. data/spec/lib/pact_broker/api/pact_broker_urls_spec.rb +22 -0
  65. data/spec/lib/pact_broker/api/resources/{pact_webhooks_spec.rb → all_webhooks_spec.rb} +46 -80
  66. data/spec/lib/pact_broker/api/resources/error_handler_spec.rb +34 -0
  67. data/spec/lib/pact_broker/api/resources/pact_triggered_webhooks_spec.rb +54 -0
  68. data/spec/lib/pact_broker/api/resources/pacticipant_spec.rb +1 -6
  69. data/spec/lib/pact_broker/api/resources/tag_spec.rb +1 -6
  70. data/spec/lib/pact_broker/api/resources/verification_triggered_webhooks_spec.rb +68 -0
  71. data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +2 -8
  72. data/spec/lib/pact_broker/api/resources/webhooks_spec.rb +216 -21
  73. data/spec/lib/pact_broker/configuration_spec.rb +30 -0
  74. data/spec/lib/pact_broker/domain/webhook_request_spec.rb +20 -64
  75. data/spec/lib/pact_broker/domain/webhook_spec.rb +40 -11
  76. data/spec/lib/pact_broker/matrix/repository_spec.rb +33 -0
  77. data/spec/lib/pact_broker/pacts/pact_version_spec.rb +1 -0
  78. data/spec/lib/pact_broker/pacts/repository_spec.rb +39 -1
  79. data/spec/lib/pact_broker/ui/view_models/index_item_spec.rb +1 -1
  80. data/spec/lib/pact_broker/verifications/repository_spec.rb +37 -0
  81. data/spec/lib/pact_broker/verifications/service_spec.rb +2 -2
  82. data/spec/lib/pact_broker/webhooks/render_spec.rb +15 -0
  83. data/spec/lib/pact_broker/webhooks/repository_spec.rb +149 -30
  84. data/spec/lib/pact_broker/webhooks/service_spec.rb +84 -7
  85. data/spec/lib/pact_broker/webhooks/webhook_request_template_spec.rb +81 -0
  86. data/spec/service_consumers/pact_helper.rb +2 -0
  87. data/spec/service_consumers/provider_states_for_pact_broker_client.rb +8 -0
  88. data/spec/service_consumers/provider_states_for_pact_ruby.rb +132 -0
  89. data/spec/support/test_data_builder.rb +30 -7
  90. metadata +37 -9
@@ -0,0 +1,28 @@
1
+ require 'pact_broker/api/decorators/triggered_webhooks_decorator'
2
+ require 'pact_broker/webhooks/triggered_webhook'
3
+
4
+ module PactBroker
5
+ module Api
6
+ module Decorators
7
+ describe TriggeredWebhooksDecorator do
8
+ let(:triggered_webhook) do
9
+ instance_double(PactBroker::Webhooks::TriggeredWebhook).as_null_object
10
+ end
11
+ let(:decorator) { TriggeredWebhooksDecorator.new([triggered_webhook]) }
12
+ let(:user_options) { { resource_title: "Title", resource_url: "http://url" } }
13
+ let(:json) { decorator.to_json(user_options: user_options) }
14
+
15
+ subject { JSON.parse(json) }
16
+
17
+ it "includes a self relation" do
18
+ expect(subject['_links']['self']['title']).to eq "Title"
19
+ expect(subject['_links']['self']['href']).to eq "http://url"
20
+ end
21
+
22
+ it "includes an embedded list of triggered webhooks" do
23
+ expect(subject['_embedded']['triggeredWebhooks']).to be_instance_of(Array)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -4,6 +4,9 @@ module PactBroker
4
4
  module Api
5
5
  module Decorators
6
6
  describe VerificationDecorator do
7
+ before do
8
+ allow_any_instance_of(VerificationDecorator).to receive(:verification_triggered_webhooks_url).and_return("http://triggered-webhooks")
9
+ end
7
10
 
8
11
  let(:verification) do
9
12
  instance_double('PactBroker::Domain::Verification',
@@ -30,6 +33,7 @@ module PactBroker
30
33
 
31
34
  let(:options) { { user_options: { base_url: 'http://example.org' } } }
32
35
 
36
+
33
37
  subject { JSON.parse VerificationDecorator.new(verification).to_json(options), symbolize_names: true }
34
38
 
35
39
  it "includes the success status" do
@@ -55,6 +59,10 @@ module PactBroker
55
59
  it "includes a link to its pact" do
56
60
  expect(subject[:_links][:'pb:pact-version'][:href]).to match %r{http://example.org/pacts/}
57
61
  end
62
+
63
+ it "includes a link to the triggered webhooks" do
64
+ expect(subject[:_links][:'pb:triggered-webhooks'][:href]).to eq "http://triggered-webhooks"
65
+ end
58
66
  end
59
67
  end
60
68
  end
@@ -16,7 +16,7 @@ module PactBroker
16
16
  end
17
17
 
18
18
  let(:webhook_request) do
19
- Domain::WebhookRequest.new(request)
19
+ Webhooks::WebhookRequestTemplate.new(request)
20
20
  end
21
21
 
22
22
  let(:consumer) { Domain::Pacticipant.new(name: 'Consumer') }
@@ -46,6 +46,14 @@ module PactBroker
46
46
  expect(parsed_json[:request]).to eq request
47
47
  end
48
48
 
49
+ it 'includes the consumer' do
50
+ expect(parsed_json[:consumer]).to eq name: "Consumer"
51
+ end
52
+
53
+ it 'includes the provider' do
54
+ expect(parsed_json[:provider]).to eq name: "Provider"
55
+ end
56
+
49
57
  it 'includes a link to the consumer' do
50
58
  expect(parsed_json[:_links][:'pb:consumer'][:name]).to eq 'Consumer'
51
59
  expect(parsed_json[:_links][:'pb:consumer'][:href]).to eq 'http://example.org/pacticipants/Consumer'
@@ -89,6 +97,34 @@ module PactBroker
89
97
  end
90
98
  end
91
99
 
100
+ context 'when there is no consumer' do
101
+ before do
102
+ webhook.consumer = nil
103
+ end
104
+
105
+ it 'does not include the consumer relation' do
106
+ expect(parsed_json[:_links][:'pb:consumer']).to be nil
107
+ end
108
+
109
+ it 'does not include the pact webhooks relation' do
110
+ expect(parsed_json[:_links][:'pb:pact-webhooks']).to be nil
111
+ end
112
+ end
113
+
114
+ context 'when there is no provider' do
115
+ before do
116
+ webhook.provider = nil
117
+ end
118
+
119
+ it 'does not include the provider relation' do
120
+ expect(parsed_json[:_links][:'pb:provider']).to be nil
121
+ end
122
+
123
+ it 'does not include the pact webhooks relation' do
124
+ expect(parsed_json[:_links][:'pb:pact-webhooks']).to be nil
125
+ end
126
+ end
127
+
92
128
  context 'when the headers contain sensitve information' do
93
129
  let(:headers) { { 'Authorization' => 'foo' } }
94
130
  it 'redacts them' do
@@ -8,9 +8,15 @@ module PactBroker
8
8
 
9
9
  describe "to_json" do
10
10
 
11
- let(:webhook_execution_result) { PactBroker::Domain::WebhookExecutionResult.new(response, logs, error)}
11
+ let(:webhook_execution_result) { PactBroker::Domain::WebhookExecutionResult.new(request, response, logs, error)}
12
12
  let(:logs) { "logs" }
13
13
  let(:headers) { { "Something" => ["blah", "thing"]} }
14
+ let(:request) do
15
+ req = Net::HTTP::Get.new("http://example.org?foo=bar")
16
+ req['Foo'] = ['bar', 'wiffle']
17
+ req.body = { foo: 'bar' }.to_json
18
+ req
19
+ end
14
20
  let(:response) { double('http_response', code: '200', body: response_body, to_hash: headers) }
15
21
  let(:response_body) { 'body' }
16
22
  let(:error) { nil }
@@ -43,6 +49,32 @@ module PactBroker
43
49
  end
44
50
  end
45
51
 
52
+ context "when there is a request" do
53
+ it "includes the request URL" do
54
+ expect(subject[:request][:url]).to eq "http://example.org?foo=bar"
55
+ end
56
+
57
+ it "includes the request headers" do
58
+ expect(subject[:request][:headers][:'foo']).to eq "bar, wiffle"
59
+ end
60
+
61
+ context "when the request body is JSON" do
62
+ it "includes the request body as JSON" do
63
+ expect(subject[:request][:body]).to include( foo: 'bar' )
64
+ end
65
+ end
66
+
67
+ context "when the request body is not json" do
68
+ before do
69
+ request.body = "<xml></xml>"
70
+ end
71
+
72
+ it "includes the request body as a String" do
73
+ expect(subject[:request][:body]).to eq "<xml></xml>"
74
+ end
75
+ end
76
+ end
77
+
46
78
  context "when there is a response" do
47
79
  it "includes the response code" do
48
80
  expect(subject[:response][:status]).to eq 200
@@ -51,6 +83,7 @@ module PactBroker
51
83
  it "includes the response headers" do
52
84
  expect(subject[:response][:headers]).to eq :'Something' => "blah, thing"
53
85
  end
86
+
54
87
  it "includes the response body" do
55
88
  expect(subject[:response][:body]).to eq response_body
56
89
  end
@@ -1,17 +1,17 @@
1
1
  require 'spec_helper'
2
- require 'pact_broker/api/decorators/webhook_request_decorator'
2
+ require 'pact_broker/api/decorators/webhook_request_template_decorator'
3
3
  require 'json'
4
4
 
5
5
  module PactBroker
6
6
  module Api
7
7
  module Decorators
8
- describe WebhookRequestDecorator do
8
+ describe WebhookRequestTemplateDecorator do
9
9
 
10
10
  let(:username) { 'username' }
11
11
  let(:display_password) { '*****' }
12
12
  let(:webhook_request) do
13
13
  instance_double(
14
- PactBroker::Domain::WebhookRequest,
14
+ PactBroker::Webhooks::WebhookRequestTemplate,
15
15
  username: username,
16
16
  display_password: display_password,
17
17
  method: 'POST',
@@ -20,7 +20,7 @@ module PactBroker
20
20
  headers: {})
21
21
  end
22
22
 
23
- let(:json) { WebhookRequestDecorator.new(webhook_request).to_json }
23
+ let(:json) { WebhookRequestTemplateDecorator.new(webhook_request).to_json }
24
24
 
25
25
  subject { JSON.parse(json, symbolize_names: true)}
26
26
 
@@ -58,9 +58,9 @@ module PactBroker
58
58
  end
59
59
 
60
60
  let(:json) { hash.to_json }
61
- let(:webhook_request) { PactBroker::Domain::WebhookRequest.new }
61
+ let(:webhook_request) { PactBroker::Webhooks::WebhookRequestTemplate.new }
62
62
 
63
- subject { WebhookRequestDecorator.new(webhook_request).from_json(json) }
63
+ subject { WebhookRequestTemplateDecorator.new(webhook_request).from_json(json) }
64
64
 
65
65
  it "reads the username" do
66
66
  expect(subject.username).to eq username
@@ -69,10 +69,8 @@ module PactBroker
69
69
  it "reads the password" do
70
70
  expect(subject.password).to eq password
71
71
  end
72
-
73
72
  end
74
-
75
73
  end
76
74
  end
77
75
  end
78
- end
76
+ end
@@ -5,12 +5,34 @@ module PactBroker
5
5
  describe PactBrokerUrls do
6
6
 
7
7
  let(:base_url) { "http://example.org" }
8
+ let(:pact) { double('pact', consumer: consumer, provider: provider, consumer_version_number: "123") }
9
+ let(:consumer) { double('pacticipant', name: "Foo") }
10
+ let(:provider) { double('pacticipant', name: "Bar") }
11
+ let(:verification) do
12
+ instance_double(PactBroker::Domain::Verification,
13
+ consumer_name: "Foo",
14
+ provider_name: "Bar",
15
+ pact_version_sha: "1234",
16
+ number: "1")
17
+ end
8
18
 
9
19
  describe "templated_tag_url_for_pacticipant" do
10
20
  subject { PactBrokerUrls.templated_tag_url_for_pacticipant("Bar", base_url) }
11
21
 
12
22
  it { is_expected.to eq "http://example.org/pacticipants/Bar/versions/{version}/tags/{tag}" }
13
23
  end
24
+
25
+ describe "pact_triggered_webhooks_url" do
26
+ subject { PactBrokerUrls.pact_triggered_webhooks_url(pact, base_url) }
27
+
28
+ it { is_expected.to eq "http://example.org/pacts/provider/Bar/consumer/Foo/version/123/triggered-webhooks" }
29
+ end
30
+
31
+ describe "verification_triggered_webhooks_url" do
32
+ subject { PactBrokerUrls.verification_triggered_webhooks_url(verification, base_url) }
33
+
34
+ it { is_expected.to eq "http://example.org/pacts/provider/Bar/consumer/Foo/pact-version/1234/verification-results/1/triggered-webhooks" }
35
+ end
14
36
  end
15
37
  end
16
38
  end
@@ -1,20 +1,22 @@
1
- require 'pact_broker/api/resources/pact_webhooks'
1
+ require 'spec_helper'
2
+ require 'pact_broker/api/resources/all_webhooks'
2
3
 
3
4
  module PactBroker::Api
4
5
 
5
6
  module Resources
6
7
 
7
- describe PactWebhooks do
8
-
8
+ describe AllWebhooks do
9
9
 
10
10
  let(:webhook_service) { PactBroker::Webhooks::Service }
11
11
  let(:uuid) { '1483234k24DKFGJ45K' }
12
- let(:path) { "/webhooks/provider/Some%20Provider/consumer/Some%20Consumer" }
12
+ let(:path) { "/webhooks" }
13
13
  let(:headers) { {'CONTENT_TYPE' => 'application/json'} }
14
- let(:webhook) { double('webhook')}
14
+ let(:webhook) { double('webhook', consumer: parsed_consumer, provider: parsed_provider) }
15
+ let(:parsed_provider) { instance_double(PactBroker::Domain::Pacticipant, name: "Some Provider") }
16
+ let(:parsed_consumer) { instance_double(PactBroker::Domain::Pacticipant, name: "Some Consumer") }
17
+ let(:consumer) { double('consumer', name: "Some Consumer") }
18
+ let(:provider) { double('provider', name: "Some Provider") }
15
19
  let(:saved_webhook) { double('saved_webhook')}
16
- let(:provider) { instance_double(PactBroker::Domain::Pacticipant) }
17
- let(:consumer) { instance_double(PactBroker::Domain::Pacticipant) }
18
20
  let(:webhook_decorator) { instance_double(Decorators::WebhookDecorator, from_json: webhook) }
19
21
 
20
22
  before do
@@ -23,45 +25,14 @@ module PactBroker::Api
23
25
  allow(Decorators::WebhookDecorator).to receive(:new).and_return(webhook_decorator)
24
26
  end
25
27
 
26
- describe "GET" do
27
- let(:webhooks) { double('webhooks') }
28
- let(:json) { {some: 'webhooks'}.to_json }
29
- let(:decorator) { instance_double(Decorators::WebhooksDecorator, to_json: json) }
30
-
31
- before do
32
- allow(webhook_service).to receive(:find_by_consumer_and_provider).and_return(webhooks)
33
- allow(Decorators::WebhooksDecorator).to receive(:new).and_return(decorator)
34
- end
35
-
36
- subject { get path }
37
-
38
- it "returns a 200 HAL JSON response" do
39
- subject
40
- expect(last_response).to be_a_hal_json_success_response
41
- end
42
-
43
- it "generates a JSON body" do
44
- expect(Decorators::WebhooksDecorator).to receive(:new).with(webhooks)
45
- expect(decorator).to receive(:to_json).with(user_options: instance_of(Decorators::DecoratorContext))
46
- subject
47
- end
48
-
49
- it "includes the generated JSON in the response body" do
50
- subject
51
- expect(last_response.body).to eq json
52
- end
53
-
54
-
55
- end
56
-
57
28
  describe "POST" do
58
29
  let(:webhook_json) do
59
30
  {
60
31
  some: 'json'
61
32
  }.to_json
62
33
  end
63
- let(:next_uuid) { '123k2nvkkwjrwk34' }
64
34
 
35
+ let(:next_uuid) { '123k2nvkkwjrwk34' }
65
36
  let(:valid) { true }
66
37
  let(:errors) { double("errors", empty?: valid, messages: ['messages']) }
67
38
 
@@ -83,44 +54,6 @@ module PactBroker::Api
83
54
  end
84
55
  end
85
56
 
86
- context "when the provider is not found" do
87
- let(:provider) { nil }
88
-
89
- it "returns a 404 status" do
90
- subject
91
- expect(last_response.status).to eq 404
92
- end
93
-
94
- it "returns a JSON content type" do
95
- subject
96
- expect(last_response.headers['Content-Type']).to eq 'application/hal+json;charset=utf-8'
97
- end
98
-
99
- it "returns an error message" do
100
- subject
101
- expect(JSON.parse(last_response.body, symbolize_names: true)).to eq error: "No provider with name 'Some Provider' found"
102
- end
103
- end
104
-
105
- context "when the consumer is not found" do
106
- let(:consumer) { nil }
107
- it "returns a 404 status" do
108
- subject
109
- expect(last_response.status).to eq 404
110
- end
111
-
112
- it "returns a JSON content type" do
113
- subject
114
- expect(last_response.headers['Content-Type']).to eq 'application/hal+json;charset=utf-8'
115
- end
116
-
117
- it "returns an error message" do
118
- subject
119
- expect(JSON.parse(last_response.body, symbolize_names: true)).to eq error: "No consumer with name 'Some Consumer' found"
120
- end
121
- end
122
-
123
-
124
57
  context "with invalid attributes" do
125
58
 
126
59
  let(:valid) { false }
@@ -130,7 +63,7 @@ module PactBroker::Api
130
63
  expect(last_response.status).to be 400
131
64
  end
132
65
 
133
- it "returns a JSON content type" do
66
+ it "returns a HAL JSON content type" do
134
67
  subject
135
68
  expect(last_response.headers['Content-Type']).to eq 'application/hal+json;charset=utf-8'
136
69
  end
@@ -144,7 +77,7 @@ module PactBroker::Api
144
77
 
145
78
  context "with valid attributes" do
146
79
 
147
- let(:webhook_response_json) { {some: 'webhook'}.to_json }
80
+ let(:webhook_response_json) { { some: 'webhook' }.to_json }
148
81
 
149
82
  before do
150
83
  allow_any_instance_of(Decorators::WebhookDecorator).to receive(:to_json).and_return(webhook_response_json)
@@ -166,7 +99,7 @@ module PactBroker::Api
166
99
  expect(last_response.headers['Location']).to include(next_uuid)
167
100
  end
168
101
 
169
- it "returns a JSON content type" do
102
+ it "returns a HAL JSON content type" do
170
103
  subject
171
104
  expect(last_response.headers['Content-Type']).to eq 'application/hal+json;charset=utf-8'
172
105
  end
@@ -183,6 +116,39 @@ module PactBroker::Api
183
116
  end
184
117
  end
185
118
  end
119
+
120
+ describe "GET" do
121
+
122
+ subject { get "/webhooks" }
123
+
124
+ let(:webhooks) { [double('webhook')]}
125
+ let(:decorator) { double(Decorators::WebhooksDecorator, to_json: json)}
126
+ let(:json) { {some: 'json'}.to_json }
127
+
128
+ before do
129
+ allow(Decorators::WebhooksDecorator).to receive(:new).and_return(decorator)
130
+ allow(PactBroker::Webhooks::Service).to receive(:find_all).and_return(webhooks)
131
+ end
132
+
133
+ it "returns a 200 HAL JSON response" do
134
+ subject
135
+ expect(last_response).to be_a_hal_json_success_response
136
+ end
137
+
138
+ it "generates a JSON representation of the webhook" do
139
+ expect(Decorators::WebhooksDecorator).to receive(:new).with(webhooks)
140
+ expect(decorator).to receive(:to_json).with(user_options: instance_of(Decorators::DecoratorContext))
141
+ subject
142
+ end
143
+
144
+ it "includes the JSON representation in the response body" do
145
+ subject
146
+ expect(last_response.body).to eq json
147
+ end
148
+
149
+ end
150
+
186
151
  end
187
152
  end
153
+
188
154
  end
@@ -40,6 +40,40 @@ module PactBroker
40
40
  end
41
41
  end
42
42
 
43
+ it "creates a json error response body" do
44
+ expect(response).to receive(:body=) do | body |
45
+ expect(JSON.parse(body)['error']).to include 'message' => 'test error'
46
+ end
47
+ subject
48
+ end
49
+
50
+
51
+ context "when show_backtrace_in_error_response? is true" do
52
+ before do
53
+ allow(PactBroker.configuration).to receive(:show_backtrace_in_error_response?).and_return(true)
54
+ end
55
+
56
+ it "includes the backtrace in the error response" do
57
+ expect(response).to receive(:body=) do | body |
58
+ expect(body).to include("backtrace")
59
+ end
60
+ subject
61
+ end
62
+ end
63
+
64
+ context "when show_backtrace_in_error_response? is false" do
65
+ before do
66
+ allow(PactBroker.configuration).to receive(:show_backtrace_in_error_response?).and_return(false)
67
+ end
68
+
69
+ it "does not include the backtrace in the error response" do
70
+ expect(response).to receive(:body=) do | body |
71
+ expect(body).to_not include("backtrace")
72
+ end
73
+ subject
74
+ end
75
+ end
76
+
43
77
  context "when the error is a PactBroker::TestError" do
44
78
  let(:error) { PactBroker::TestError.new('test error') }
45
79