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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -0
- data/README.md +1 -0
- data/db/migrations/20180611_make_webhook_pacticipant_ids_optional.rb +11 -0
- data/example/config.ru +2 -0
- data/lib/pact_broker/api.rb +9 -3
- data/lib/pact_broker/api/contracts/webhook_contract.rb +36 -0
- data/lib/pact_broker/api/decorators/pact_decorator.rb +22 -1
- data/lib/pact_broker/api/decorators/pact_webhooks_status_decorator.rb +1 -26
- data/lib/pact_broker/api/decorators/triggered_webhook_decorator.rb +33 -0
- data/lib/pact_broker/api/decorators/triggered_webhooks_decorator.rb +19 -0
- data/lib/pact_broker/api/decorators/verification_decorator.rb +6 -0
- data/lib/pact_broker/api/decorators/webhook_decorator.rb +32 -18
- data/lib/pact_broker/api/decorators/webhook_execution_result_decorator.rb +27 -0
- data/lib/pact_broker/api/decorators/{webhook_request_decorator.rb → webhook_request_template_decorator.rb} +1 -1
- data/lib/pact_broker/api/pact_broker_urls.rb +21 -1
- data/lib/pact_broker/api/resources/all_webhooks.rb +82 -0
- data/lib/pact_broker/api/resources/base_resource.rb +18 -0
- data/lib/pact_broker/api/resources/error_handler.rb +5 -1
- data/lib/pact_broker/api/resources/pact_triggered_webhooks.rb +41 -0
- data/lib/pact_broker/api/resources/pact_webhooks.rb +2 -15
- data/lib/pact_broker/api/resources/pact_webhooks_status.rb +1 -1
- data/lib/pact_broker/api/resources/verification_triggered_webhooks.rb +45 -0
- data/lib/pact_broker/api/resources/webhook_execution.rb +1 -5
- data/lib/pact_broker/api/resources/webhooks.rb +69 -6
- data/lib/pact_broker/configuration.rb +5 -2
- data/lib/pact_broker/doc/controllers/app.rb +1 -2
- data/lib/pact_broker/doc/views/pact-webhooks.markdown +3 -0
- data/lib/pact_broker/doc/views/webhooks.markdown +53 -33
- data/lib/pact_broker/domain/pact.rb +4 -0
- data/lib/pact_broker/domain/webhook.rb +19 -3
- data/lib/pact_broker/domain/webhook_execution_result.rb +6 -1
- data/lib/pact_broker/domain/webhook_request.rb +87 -65
- data/lib/pact_broker/locale/en.yml +1 -0
- data/lib/pact_broker/matrix/repository.rb +3 -1
- data/lib/pact_broker/pacts/placeholder_pact.rb +17 -0
- data/lib/pact_broker/pacts/repository.rb +14 -0
- data/lib/pact_broker/pacts/service.rb +6 -2
- data/lib/pact_broker/ui/view_models/index_item.rb +1 -1
- data/lib/pact_broker/verifications/placeholder_verification.rb +23 -0
- data/lib/pact_broker/verifications/repository.rb +9 -0
- data/lib/pact_broker/verifications/service.rb +5 -1
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/webhooks/repository.rb +54 -4
- data/lib/pact_broker/webhooks/service.rb +37 -2
- data/lib/pact_broker/webhooks/webhook.rb +4 -3
- data/lib/pact_broker/webhooks/webhook_event.rb +8 -0
- data/lib/pact_broker/webhooks/webhook_request_template.rb +72 -0
- data/pact_broker.gemspec +1 -1
- data/script/seed.rb +32 -51
- data/spec/features/create_webhook_spec.rb +85 -36
- data/spec/features/execute_webhook_spec.rb +9 -18
- data/spec/features/get_triggered_webhooks_for_pact_spec.rb +20 -0
- data/spec/features/get_triggered_webhooks_for_verification_spec.rb +21 -0
- data/spec/fixtures/webhook_valid_with_pacticipants.json +23 -0
- data/spec/integration/webhooks/certificate_spec.rb +2 -2
- data/spec/lib/pact_broker/api/contracts/webhook_contract_spec.rb +98 -2
- data/spec/lib/pact_broker/api/decorators/triggered_webhook_decorator_spec.rb +64 -0
- data/spec/lib/pact_broker/api/decorators/triggered_webhooks_decorator_spec.rb +28 -0
- data/spec/lib/pact_broker/api/decorators/verification_decorator_spec.rb +8 -0
- data/spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb +37 -1
- data/spec/lib/pact_broker/api/decorators/webhook_execution_result_decorator_spec.rb +34 -1
- data/spec/lib/pact_broker/api/decorators/{webhook_request_decorator_spec.rb → webhook_request_template_decorator_spec.rb} +7 -9
- data/spec/lib/pact_broker/api/pact_broker_urls_spec.rb +22 -0
- data/spec/lib/pact_broker/api/resources/{pact_webhooks_spec.rb → all_webhooks_spec.rb} +46 -80
- data/spec/lib/pact_broker/api/resources/error_handler_spec.rb +34 -0
- data/spec/lib/pact_broker/api/resources/pact_triggered_webhooks_spec.rb +54 -0
- data/spec/lib/pact_broker/api/resources/pacticipant_spec.rb +1 -6
- data/spec/lib/pact_broker/api/resources/tag_spec.rb +1 -6
- data/spec/lib/pact_broker/api/resources/verification_triggered_webhooks_spec.rb +68 -0
- data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +2 -8
- data/spec/lib/pact_broker/api/resources/webhooks_spec.rb +216 -21
- data/spec/lib/pact_broker/configuration_spec.rb +30 -0
- data/spec/lib/pact_broker/domain/webhook_request_spec.rb +20 -64
- data/spec/lib/pact_broker/domain/webhook_spec.rb +40 -11
- data/spec/lib/pact_broker/matrix/repository_spec.rb +33 -0
- data/spec/lib/pact_broker/pacts/pact_version_spec.rb +1 -0
- data/spec/lib/pact_broker/pacts/repository_spec.rb +39 -1
- data/spec/lib/pact_broker/ui/view_models/index_item_spec.rb +1 -1
- data/spec/lib/pact_broker/verifications/repository_spec.rb +37 -0
- data/spec/lib/pact_broker/verifications/service_spec.rb +2 -2
- data/spec/lib/pact_broker/webhooks/render_spec.rb +15 -0
- data/spec/lib/pact_broker/webhooks/repository_spec.rb +149 -30
- data/spec/lib/pact_broker/webhooks/service_spec.rb +84 -7
- data/spec/lib/pact_broker/webhooks/webhook_request_template_spec.rb +81 -0
- data/spec/service_consumers/pact_helper.rb +2 -0
- data/spec/service_consumers/provider_states_for_pact_broker_client.rb +8 -0
- data/spec/service_consumers/provider_states_for_pact_ruby.rb +132 -0
- data/spec/support/test_data_builder.rb +30 -7
- metadata +37 -9
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'pact_broker/api/resources/pact_triggered_webhooks'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Api
|
5
|
+
module Resources
|
6
|
+
describe PactTriggeredWebhooks do
|
7
|
+
describe "GET" do
|
8
|
+
before do
|
9
|
+
allow(Decorators::TriggeredWebhooksDecorator).to receive(:new).and_return(decorator)
|
10
|
+
allow_any_instance_of(PactTriggeredWebhooks).to receive(:webhook_service).and_return(webhook_service)
|
11
|
+
allow_any_instance_of(PactTriggeredWebhooks).to receive(:pact).and_return(pact)
|
12
|
+
allow(webhook_service).to receive(:find_triggered_webhooks_for_pact).and_return(triggered_webhooks)
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:decorator) { instance_double(Decorators::TriggeredWebhooksDecorator, to_json: 'json') }
|
16
|
+
let(:webhook_service) { class_double(PactBroker::Webhooks::Service) }
|
17
|
+
let(:pact) { instance_double(PactBroker::Domain::Pact, name: "The pact") }
|
18
|
+
let(:triggered_webhooks) { double('triggered_webhooks') }
|
19
|
+
let(:path) { "/pacts/provider/bar/consumer/foo/version/1/triggered-webhooks" }
|
20
|
+
|
21
|
+
subject { get path; last_response }
|
22
|
+
|
23
|
+
context "when the pact exists" do
|
24
|
+
it { is_expected.to be_a_hal_json_success_response }
|
25
|
+
|
26
|
+
it "finds the triggered webhooks for the pact" do
|
27
|
+
expect(webhook_service).to receive(:find_triggered_webhooks_for_pact)
|
28
|
+
subject
|
29
|
+
end
|
30
|
+
|
31
|
+
it "generates the JSON response body" do
|
32
|
+
expect(Decorators::TriggeredWebhooksDecorator).to receive(:new).with(triggered_webhooks)
|
33
|
+
expect(decorator).to receive(:to_json) do | options |
|
34
|
+
expect(options[:user_options]).to include(resource_title: "Webhooks triggered by the publication of the the pact")
|
35
|
+
expect(options[:user_options]).to include(resource_url: "http://example.org#{path}")
|
36
|
+
end
|
37
|
+
subject
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns the generated JSON response body" do
|
41
|
+
expect(subject.body).to eq 'json'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
context "when the pact does not exist" do
|
46
|
+
let(:pact) { nil }
|
47
|
+
|
48
|
+
it { is_expected.to be_a_404_response }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -55,12 +55,7 @@ module PactBroker::Api
|
|
55
55
|
|
56
56
|
it "returns an error message" do
|
57
57
|
subject
|
58
|
-
expect(response_body[:message]).to eq "An error"
|
59
|
-
end
|
60
|
-
|
61
|
-
it "returns the backtrace" do
|
62
|
-
subject
|
63
|
-
expect(response_body[:backtrace]).to be_instance_of(Array)
|
58
|
+
expect(response_body[:error][:message]).to eq "An error"
|
64
59
|
end
|
65
60
|
end
|
66
61
|
end
|
@@ -63,12 +63,7 @@ module PactBroker
|
|
63
63
|
|
64
64
|
it "returns an error message" do
|
65
65
|
subject
|
66
|
-
expect(response_body[:message]).to eq "An error"
|
67
|
-
end
|
68
|
-
|
69
|
-
it "returns the backtrace" do
|
70
|
-
subject
|
71
|
-
expect(response_body[:backtrace]).to be_instance_of(Array)
|
66
|
+
expect(response_body[:error][:message]).to eq "An error"
|
72
67
|
end
|
73
68
|
end
|
74
69
|
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'pact_broker/api/resources/verification_triggered_webhooks'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Api
|
5
|
+
module Resources
|
6
|
+
describe VerificationTriggeredWebhooks do
|
7
|
+
describe "GET" do
|
8
|
+
before do
|
9
|
+
allow(Decorators::TriggeredWebhooksDecorator).to receive(:new).and_return(decorator)
|
10
|
+
allow_any_instance_of(VerificationTriggeredWebhooks).to receive(:webhook_service).and_return(webhook_service)
|
11
|
+
allow_any_instance_of(VerificationTriggeredWebhooks).to receive(:verification_service).and_return(verification_service)
|
12
|
+
allow(webhook_service).to receive(:find_triggered_webhooks_for_verification).and_return(triggered_webhooks)
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:decorator) { instance_double(Decorators::TriggeredWebhooksDecorator, to_json: 'json') }
|
16
|
+
let(:webhook_service) { class_double(PactBroker::Webhooks::Service) }
|
17
|
+
let(:verification_service) { class_double(PactBroker::Verifications::Service, find: verification) }
|
18
|
+
let(:verification) { instance_double(PactBroker::Domain::Verification, number: "1") }
|
19
|
+
let(:triggered_webhooks) { double('triggered_webhooks') }
|
20
|
+
let(:path) { "/pacts/provider/bar/consumer/foo/pact-version/1234/verification-results/1/triggered-webhooks" }
|
21
|
+
|
22
|
+
subject { get path; last_response }
|
23
|
+
|
24
|
+
it "searchs for the verification" do
|
25
|
+
expect(verification_service).to receive(:find).with(
|
26
|
+
hash_including(
|
27
|
+
provider_name: "bar",
|
28
|
+
consumer_name: "foo",
|
29
|
+
pact_version_sha: "1234",
|
30
|
+
verification_number: "1"
|
31
|
+
)
|
32
|
+
)
|
33
|
+
subject
|
34
|
+
end
|
35
|
+
|
36
|
+
context "when the verification exists" do
|
37
|
+
|
38
|
+
it "finds the triggered webhooks for the verification" do
|
39
|
+
expect(webhook_service).to receive(:find_triggered_webhooks_for_verification)
|
40
|
+
subject
|
41
|
+
end
|
42
|
+
|
43
|
+
it { is_expected.to be_a_hal_json_success_response }
|
44
|
+
|
45
|
+
it "generates the JSON response body" do
|
46
|
+
expect(Decorators::TriggeredWebhooksDecorator).to receive(:new).with(triggered_webhooks)
|
47
|
+
expect(decorator).to receive(:to_json) do | options |
|
48
|
+
expect(options[:user_options]).to include(resource_title: "Webhooks triggered by the publication of verification result 1")
|
49
|
+
expect(options[:user_options]).to include(resource_url: "http://example.org#{path}")
|
50
|
+
end
|
51
|
+
subject
|
52
|
+
end
|
53
|
+
|
54
|
+
it "returns the generated JSON response body" do
|
55
|
+
expect(subject.body).to eq 'json'
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
context "when the verification does not exist" do
|
60
|
+
let(:verification) { nil }
|
61
|
+
|
62
|
+
it { is_expected.to be_a_404_response }
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
@@ -35,18 +35,12 @@ module PactBroker
|
|
35
35
|
let(:provider_name) { "bar" }
|
36
36
|
|
37
37
|
before do
|
38
|
-
allow(PactBroker::Webhooks::Service).to receive(:
|
38
|
+
allow(PactBroker::Webhooks::Service).to receive(:test_execution).and_return(execution_result)
|
39
39
|
allow(PactBroker::Api::Decorators::WebhookExecutionResultDecorator).to receive(:new).and_return(decorator)
|
40
|
-
allow(PactBroker::Pacts::Service).to receive(:find_latest_pact).and_return(pact)
|
41
|
-
end
|
42
|
-
|
43
|
-
it "finds the latest pact for the webhook" do
|
44
|
-
expect(PactBroker::Pacts::Service).to receive(:find_latest_pact).with(consumer_name: consumer_name, provider_name: provider_name)
|
45
|
-
subject
|
46
40
|
end
|
47
41
|
|
48
42
|
it "executes the webhook" do
|
49
|
-
expect(PactBroker::Webhooks::Service).to receive(:
|
43
|
+
expect(PactBroker::Webhooks::Service).to receive(:test_execution).with(webhook)
|
50
44
|
subject
|
51
45
|
end
|
52
46
|
|
@@ -1,44 +1,239 @@
|
|
1
|
-
require 'spec_helper'
|
2
1
|
require 'pact_broker/api/resources/webhooks'
|
3
2
|
|
4
3
|
module PactBroker::Api
|
5
|
-
|
6
4
|
module Resources
|
7
|
-
|
8
5
|
describe Webhooks do
|
9
6
|
|
10
|
-
|
7
|
+
let(:webhook_service) { PactBroker::Webhooks::Service }
|
8
|
+
let(:uuid) { '1483234k24DKFGJ45K' }
|
9
|
+
let(:path) { "/webhooks/provider/Some%20Provider/consumer/Some%20Consumer" }
|
10
|
+
let(:headers) { {'CONTENT_TYPE' => 'application/json'} }
|
11
|
+
let(:webhook) { double('webhook')}
|
12
|
+
let(:saved_webhook) { double('saved_webhook')}
|
13
|
+
let(:provider) { instance_double(PactBroker::Domain::Pacticipant) }
|
14
|
+
let(:consumer) { instance_double(PactBroker::Domain::Pacticipant) }
|
15
|
+
let(:webhook_decorator) { instance_double(Decorators::WebhookDecorator, from_json: webhook) }
|
11
16
|
|
12
|
-
|
17
|
+
before do
|
18
|
+
allow(PactBroker::Pacticipants::Service).to receive(:find_pacticipant_by_name).with("Some Provider").and_return(provider)
|
19
|
+
allow(PactBroker::Pacticipants::Service).to receive(:find_pacticipant_by_name).with("Some Consumer").and_return(consumer)
|
20
|
+
allow(Decorators::WebhookDecorator).to receive(:new).and_return(webhook_decorator)
|
21
|
+
end
|
13
22
|
|
14
|
-
|
15
|
-
let(:
|
16
|
-
let(:json) { {some: '
|
23
|
+
describe "GET" do
|
24
|
+
let(:webhooks) { double('webhooks') }
|
25
|
+
let(:json) { {some: 'webhooks'}.to_json }
|
26
|
+
let(:decorator) { instance_double(Decorators::WebhooksDecorator, to_json: json) }
|
17
27
|
|
18
28
|
before do
|
29
|
+
allow(webhook_service).to receive(:find_by_consumer_and_provider).and_return(webhooks)
|
19
30
|
allow(Decorators::WebhooksDecorator).to receive(:new).and_return(decorator)
|
20
|
-
allow(PactBroker::Webhooks::Service).to receive(:find_all).and_return(webhooks)
|
21
31
|
end
|
22
32
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
33
|
+
subject { get path }
|
34
|
+
|
35
|
+
describe "for webhooks with a consumer and provider" do
|
36
|
+
it "returns a 200 HAL JSON response" do
|
37
|
+
subject
|
38
|
+
expect(last_response).to be_a_hal_json_success_response
|
39
|
+
end
|
40
|
+
|
41
|
+
it "generates a JSON body" do
|
42
|
+
expect(Decorators::WebhooksDecorator).to receive(:new).with(webhooks)
|
43
|
+
expect(decorator).to receive(:to_json).with(user_options: instance_of(Decorators::DecoratorContext))
|
44
|
+
subject
|
45
|
+
end
|
27
46
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
47
|
+
it "includes the generated JSON in the response body" do
|
48
|
+
subject
|
49
|
+
expect(last_response.body).to eq json
|
50
|
+
end
|
51
|
+
|
52
|
+
context "when the provider does not exist" do
|
53
|
+
context "when the provider does not exist" do
|
54
|
+
let(:provider) { nil }
|
55
|
+
|
56
|
+
it "returns a 404" do
|
57
|
+
expect(subject.status).to eq 404
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context "when the consumer does not exist" do
|
63
|
+
let(:consumer) { nil }
|
64
|
+
|
65
|
+
it "returns a 404" do
|
66
|
+
expect(subject.status).to eq 404
|
67
|
+
end
|
68
|
+
end
|
32
69
|
end
|
33
70
|
|
34
|
-
|
35
|
-
|
36
|
-
|
71
|
+
context "for provider webhooks" do
|
72
|
+
let(:path) { "/webhooks/provider/Some%20Provider" }
|
73
|
+
|
74
|
+
context "when the provider does exist" do
|
75
|
+
it "returns a 200" do
|
76
|
+
expect(subject.status).to eq 200
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
context "when the provider does not exist" do
|
81
|
+
let(:provider) { nil }
|
82
|
+
|
83
|
+
it "returns a 404" do
|
84
|
+
expect(subject.status).to eq 404
|
85
|
+
end
|
86
|
+
end
|
37
87
|
end
|
38
88
|
|
89
|
+
context "for consumer webhooks" do
|
90
|
+
let(:path) { "/webhooks/consumer/Some%20Consumer" }
|
91
|
+
|
92
|
+
context "when the consumer does exist" do
|
93
|
+
it "returns a 200" do
|
94
|
+
expect(subject.status).to eq 200
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "when the consumer does not exist" do
|
99
|
+
let(:consumer) { nil }
|
100
|
+
|
101
|
+
it "returns a 404" do
|
102
|
+
expect(subject.status).to eq 404
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
39
106
|
end
|
40
107
|
|
108
|
+
describe "POST" do
|
109
|
+
let(:webhook_json) do
|
110
|
+
{
|
111
|
+
some: 'json'
|
112
|
+
}.to_json
|
113
|
+
end
|
114
|
+
let(:next_uuid) { '123k2nvkkwjrwk34' }
|
115
|
+
|
116
|
+
let(:valid) { true }
|
117
|
+
let(:errors) { double("errors", empty?: valid, messages: ['messages']) }
|
118
|
+
|
119
|
+
before do
|
120
|
+
allow(webhook_service).to receive(:create).and_return(saved_webhook)
|
121
|
+
allow(webhook_service).to receive(:next_uuid).and_return(next_uuid)
|
122
|
+
allow(webhook_service).to receive(:errors).and_return(errors)
|
123
|
+
allow(PactBroker::Domain::Webhook).to receive(:new).and_return(webhook)
|
124
|
+
end
|
125
|
+
|
126
|
+
subject { post path, webhook_json, headers }
|
127
|
+
|
128
|
+
context "with malformed JSON" do
|
129
|
+
let(:webhook_json) { "{" }
|
130
|
+
|
131
|
+
it "returns a 400 error" do
|
132
|
+
subject
|
133
|
+
expect(last_response.status).to eq 400
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
context "when the provider is not found" do
|
138
|
+
let(:provider) { nil }
|
139
|
+
|
140
|
+
it "returns a 404 status" do
|
141
|
+
subject
|
142
|
+
expect(last_response.status).to eq 404
|
143
|
+
end
|
144
|
+
|
145
|
+
it "returns a JSON content type" do
|
146
|
+
subject
|
147
|
+
expect(last_response.headers['Content-Type']).to eq 'application/hal+json;charset=utf-8'
|
148
|
+
end
|
149
|
+
|
150
|
+
it "returns an error message" do
|
151
|
+
subject
|
152
|
+
expect(JSON.parse(last_response.body, symbolize_names: true)).to eq error: "No provider with name 'Some Provider' found"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
context "when the consumer is not found" do
|
157
|
+
let(:consumer) { nil }
|
158
|
+
it "returns a 404 status" do
|
159
|
+
subject
|
160
|
+
expect(last_response.status).to eq 404
|
161
|
+
end
|
162
|
+
|
163
|
+
it "returns a JSON content type" do
|
164
|
+
subject
|
165
|
+
expect(last_response.headers['Content-Type']).to eq 'application/hal+json;charset=utf-8'
|
166
|
+
end
|
167
|
+
|
168
|
+
it "returns an error message" do
|
169
|
+
subject
|
170
|
+
expect(JSON.parse(last_response.body, symbolize_names: true)).to eq error: "No consumer with name 'Some Consumer' found"
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
|
175
|
+
context "with invalid attributes" do
|
176
|
+
|
177
|
+
let(:valid) { false }
|
178
|
+
|
179
|
+
it "returns a 400" do
|
180
|
+
subject
|
181
|
+
expect(last_response.status).to be 400
|
182
|
+
end
|
183
|
+
|
184
|
+
it "returns a JSON content type" do
|
185
|
+
subject
|
186
|
+
expect(last_response.headers['Content-Type']).to eq 'application/hal+json;charset=utf-8'
|
187
|
+
end
|
188
|
+
|
189
|
+
it "returns the validation errors" do
|
190
|
+
subject
|
191
|
+
expect(JSON.parse(last_response.body, symbolize_names: true)).to eq errors: ['messages']
|
192
|
+
end
|
193
|
+
|
194
|
+
end
|
195
|
+
|
196
|
+
context "with valid attributes" do
|
197
|
+
|
198
|
+
let(:webhook_response_json) { {some: 'webhook'}.to_json }
|
199
|
+
|
200
|
+
before do
|
201
|
+
allow_any_instance_of(Decorators::WebhookDecorator).to receive(:to_json).and_return(webhook_response_json)
|
202
|
+
allow(webhook_decorator).to receive(:to_json).and_return(webhook_response_json)
|
203
|
+
end
|
204
|
+
|
205
|
+
it "saves the webhook" do
|
206
|
+
expect(webhook_service).to receive(:create).with(next_uuid, webhook, consumer, provider)
|
207
|
+
subject
|
208
|
+
end
|
209
|
+
|
210
|
+
it "returns a 201 response" do
|
211
|
+
subject
|
212
|
+
expect(last_response.status).to be 201
|
213
|
+
end
|
214
|
+
|
215
|
+
it "returns the Location header" do
|
216
|
+
subject
|
217
|
+
expect(last_response.headers['Location']).to include(next_uuid)
|
218
|
+
end
|
219
|
+
|
220
|
+
it "returns a JSON content type" do
|
221
|
+
subject
|
222
|
+
expect(last_response.headers['Content-Type']).to eq 'application/hal+json;charset=utf-8'
|
223
|
+
end
|
224
|
+
|
225
|
+
it "generates the JSON response body" do
|
226
|
+
expect(Decorators::WebhookDecorator).to receive(:new).with(saved_webhook).and_return(webhook_decorator)
|
227
|
+
expect(webhook_decorator).to receive(:to_json).with(user_options: { base_url: 'http://example.org' })
|
228
|
+
subject
|
229
|
+
end
|
230
|
+
|
231
|
+
it "returns the JSON representation of the webhook" do
|
232
|
+
subject
|
233
|
+
expect(last_response.body).to eq webhook_response_json
|
234
|
+
end
|
235
|
+
end
|
236
|
+
end
|
41
237
|
end
|
42
238
|
end
|
43
|
-
|
44
239
|
end
|
@@ -6,6 +6,36 @@ require 'pact_broker/config/setting'
|
|
6
6
|
module PactBroker
|
7
7
|
describe Configuration do
|
8
8
|
|
9
|
+
describe "show_backtrace_in_error_response?" do
|
10
|
+
before do
|
11
|
+
allow(ENV).to receive(:[]).and_call_original
|
12
|
+
end
|
13
|
+
|
14
|
+
context "when RACK_ENV is not set" do
|
15
|
+
before do
|
16
|
+
allow(ENV).to receive(:[]).with("RACK_ENV").and_return(nil)
|
17
|
+
end
|
18
|
+
|
19
|
+
its(:show_backtrace_in_error_response?) { is_expected.to be false }
|
20
|
+
end
|
21
|
+
|
22
|
+
context "when RACK_ENV is not production" do
|
23
|
+
before do
|
24
|
+
allow(ENV).to receive(:[]).with("RACK_ENV").and_return('development')
|
25
|
+
end
|
26
|
+
|
27
|
+
its(:show_backtrace_in_error_response?) { is_expected.to be true }
|
28
|
+
end
|
29
|
+
|
30
|
+
context "when RACK_ENV is production" do
|
31
|
+
before do
|
32
|
+
allow(ENV).to receive(:[]).with("RACK_ENV").and_return('production')
|
33
|
+
end
|
34
|
+
|
35
|
+
its(:show_backtrace_in_error_response?) { is_expected.to be false }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
9
39
|
context "default configuration" do
|
10
40
|
describe ".html_pact_renderer" do
|
11
41
|
|