pact_broker 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -13
- data/.gitignore +0 -1
- data/.rspec +1 -0
- data/CHANGELOG.md +47 -0
- data/README.md +4 -2
- data/config.ru +3 -5
- data/db/migrations/09_add_timestamps.rb +12 -0
- data/db/migrations/10_populate_timestamps.rb +15 -0
- data/db/migrations/11_made_timestamps_mandatory.rb +20 -0
- data/db/migrations/12_create_webhooks_table.rb +21 -0
- data/db/migrations/13_add_columns_to_webhooks.rb +8 -0
- data/lib/pact_broker/api.rb +14 -0
- data/lib/pact_broker/api/decorators.rb +2 -2
- data/lib/pact_broker/api/decorators/base_decorator.rb +2 -1
- data/lib/pact_broker/api/decorators/basic_pacticipant_decorator.rb +21 -0
- data/lib/pact_broker/api/decorators/decorator_context.rb +20 -0
- data/lib/pact_broker/api/decorators/latest_pact_decorator.rb +2 -2
- data/lib/pact_broker/api/decorators/pact_decorator.rb +12 -5
- data/lib/pact_broker/api/decorators/pact_details_decorator.rb +22 -0
- data/lib/pact_broker/api/decorators/pacticipant_decorator.rb +6 -4
- data/lib/pact_broker/api/decorators/relationships_csv_decorator.rb +25 -3
- data/lib/pact_broker/api/decorators/representable_pact.rb +3 -1
- data/lib/pact_broker/api/decorators/tag_decorator.rb +3 -0
- data/lib/pact_broker/api/decorators/webhook_decorator.rb +52 -0
- data/lib/pact_broker/api/decorators/webhook_execution_result_decorator.rb +58 -0
- data/lib/pact_broker/api/decorators/webhook_request_decorator.rb +18 -0
- data/lib/pact_broker/api/decorators/webhooks_decorator.rb +37 -0
- data/lib/pact_broker/api/pact_broker_urls.rb +16 -0
- data/lib/pact_broker/api/renderers/html_pact_renderer.rb +2 -1
- data/lib/pact_broker/api/resources/base_resource.rb +12 -1
- data/lib/pact_broker/api/resources/group.rb +38 -0
- data/lib/pact_broker/api/resources/index.rb +30 -21
- data/lib/pact_broker/api/resources/latest_pact.rb +1 -1
- data/lib/pact_broker/api/resources/latest_pacts.rb +1 -1
- data/lib/pact_broker/api/resources/pact.rb +18 -2
- data/lib/pact_broker/api/resources/pact_webhooks.rb +87 -0
- data/lib/pact_broker/api/resources/pacticipant.rb +15 -6
- data/lib/pact_broker/api/resources/pacticipants.rb +1 -1
- data/lib/pact_broker/api/resources/tag.rb +2 -2
- data/lib/pact_broker/api/resources/webhook.rb +44 -0
- data/lib/pact_broker/api/resources/webhook_execution.rb +43 -0
- data/lib/pact_broker/api/resources/webhooks.rb +29 -0
- data/lib/pact_broker/app.rb +46 -8
- data/lib/pact_broker/db.rb +10 -0
- data/lib/pact_broker/doc/controllers/app.rb +32 -0
- data/lib/pact_broker/doc/views/latest-pacts.markdown +3 -0
- data/lib/pact_broker/doc/views/layouts/main.haml +5 -0
- data/lib/pact_broker/doc/views/pacticipants.markdown +10 -0
- data/lib/pact_broker/doc/views/self.markdown +8 -0
- data/lib/pact_broker/doc/views/webhooks.markdown +48 -0
- data/lib/pact_broker/functions/groupify.rb +39 -0
- data/lib/pact_broker/jobs/after_pact_save.rb +13 -0
- data/lib/pact_broker/json.rb +4 -0
- data/lib/pact_broker/locale/en.yml +23 -0
- data/lib/pact_broker/messages.rb +18 -0
- data/lib/pact_broker/models/group.rb +21 -0
- data/lib/pact_broker/models/pact.rb +4 -2
- data/lib/pact_broker/models/pacticipant.rb +3 -1
- data/lib/pact_broker/models/relationship.rb +34 -0
- data/lib/pact_broker/models/tag.rb +3 -1
- data/lib/pact_broker/models/version.rb +3 -1
- data/lib/pact_broker/models/webhook.rb +53 -0
- data/lib/pact_broker/models/webhook_execution_result.rb +26 -0
- data/lib/pact_broker/models/webhook_request.rb +107 -0
- data/lib/pact_broker/models/webhook_request_header.rb +13 -0
- data/lib/pact_broker/repositories.rb +6 -0
- data/lib/pact_broker/repositories/pact_repository.rb +25 -7
- data/lib/pact_broker/repositories/pacticipant_repository.rb +4 -0
- data/lib/pact_broker/repositories/webhook_repository.rb +134 -0
- data/lib/pact_broker/services.rb +10 -0
- data/lib/pact_broker/services/group_service.rb +24 -0
- data/lib/pact_broker/services/pact_service.rb +37 -7
- data/lib/pact_broker/services/pacticipant_service.rb +12 -1
- data/lib/pact_broker/services/webhook_service.rb +63 -0
- data/lib/pact_broker/tasks.rb +0 -1
- data/lib/pact_broker/ui/controllers/base_controller.rb +1 -0
- data/lib/pact_broker/ui/controllers/groups.rb +25 -0
- data/lib/pact_broker/ui/controllers/relationships.rb +0 -2
- data/lib/pact_broker/ui/helpers/url_helper.rb +17 -0
- data/lib/pact_broker/ui/view_models/relationship.rb +13 -4
- data/lib/pact_broker/ui/view_models/relationships.rb +1 -1
- data/lib/pact_broker/ui/views/groups/show.html.erb +409 -0
- data/lib/pact_broker/ui/views/relationships/show.haml +4 -2
- data/lib/pact_broker/version.rb +1 -1
- data/pact_broker.gemspec +7 -6
- data/public/{d3.v3.js.pagespeed.ce.dFNRrGTALe.js → javascripts/d3.v3.js.pagespeed.ce.dFNRrGTALe.js} +0 -0
- data/public/stylesheets/relationships.css +4 -0
- data/spec/integration/endpoints/group.rb +22 -0
- data/spec/lib/pact_broker/api/decorators/pact_decorator_spec.rb +49 -0
- data/spec/lib/pact_broker/api/decorators/pacticipant_decorator_spec.rb +25 -0
- data/spec/lib/pact_broker/api/decorators/relationships_csv_decorator_spec.rb +7 -4
- data/spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb +121 -0
- data/spec/lib/pact_broker/api/decorators/webhook_execution_result_decorator_spec.rb +69 -0
- data/spec/lib/pact_broker/api/decorators/webhook_request_decorator_spec.rb +78 -0
- data/spec/lib/pact_broker/api/decorators/webhooks_decorator_spec.rb +46 -0
- data/spec/lib/pact_broker/api/resources/group_spec.rb +80 -0
- data/spec/lib/pact_broker/api/resources/pact_spec.rb +41 -0
- data/spec/lib/pact_broker/api/resources/pact_webhooks_spec.rb +184 -0
- data/spec/lib/pact_broker/api/resources/pacticipant_spec.rb +71 -0
- data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +77 -0
- data/spec/lib/pact_broker/api/resources/webhook_spec.rb +60 -0
- data/spec/lib/pact_broker/api/resources/webhooks_spec.rb +44 -0
- data/spec/lib/pact_broker/doc/controllers/app_spec.rb +51 -0
- data/spec/lib/pact_broker/functions/groupify_spec.rb +50 -0
- data/spec/lib/pact_broker/models/group_spec.rb +26 -0
- data/spec/lib/pact_broker/models/webhook_request_spec.rb +175 -0
- data/spec/lib/pact_broker/models/webhook_spec.rb +59 -0
- data/spec/lib/pact_broker/repositories/pact_repository_spec.rb +40 -0
- data/spec/lib/pact_broker/repositories/webhook_repository_spec.rb +257 -0
- data/spec/lib/pact_broker/services/group_service_spec.rb +52 -0
- data/spec/lib/pact_broker/services/pact_service_spec.rb +49 -0
- data/spec/lib/pact_broker/services/pacticipant_service_spec.rb +50 -0
- data/spec/lib/pact_broker/services/webhook_service_spec.rb +51 -0
- data/spec/lib/pact_broker/ui/view_models/relationship_spec.rb +20 -6
- data/spec/lib/pact_broker/ui/view_models/relationships_spec.rb +33 -0
- data/spec/service_consumers/provider_states_for_pact_broker_client.rb +1 -1
- data/spec/spec_helper.rb +11 -4
- data/spec/support/provider_state_builder.rb +11 -0
- data/spec/support/shared_examples_for_responses.rb +25 -0
- data/vendor/hal-browser/js/hal/views/embedded_resource.js +3 -3
- data/vendor/hal-browser/js/hal/views/resource.js +3 -3
- metadata +174 -80
- data/assets/d3.v3.js +0 -9263
- data/assets/force.csv +0 -29
- data/assets/index.html +0 -186
- data/assets/index2.html +0 -224
- data/assets/relationships +0 -4
- data/assets/stylesheets/github.css +0 -387
- data/lib/pact_broker/tasks/delete.rake +0 -20
- data/public/Network Graph REA.html +0 -48
- data/public/rea.csv +0 -10
data/public/{d3.v3.js.pagespeed.ce.dFNRrGTALe.js → javascripts/d3.v3.js.pagespeed.ce.dFNRrGTALe.js}
RENAMED
File without changes
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "/groups/{pacticipant-name}" do
|
4
|
+
|
5
|
+
let(:app) { PactBroker::API }
|
6
|
+
|
7
|
+
describe "GET" do
|
8
|
+
before do
|
9
|
+
ProviderStateBuilder.new.create_pact_with_hierarchy "Consumer", "1.2.3", "Provider"
|
10
|
+
get "/groups/Consumer"
|
11
|
+
end
|
12
|
+
|
13
|
+
it "returns a success response" do
|
14
|
+
expect(last_response.status).to eq 200
|
15
|
+
end
|
16
|
+
|
17
|
+
it "returns a body" do
|
18
|
+
expect(last_response.body).to_not be_nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact_broker/api/decorators/pact_decorator'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
|
6
|
+
module Api
|
7
|
+
|
8
|
+
module Decorators
|
9
|
+
|
10
|
+
describe PactDecorator do
|
11
|
+
|
12
|
+
let(:json_content) {
|
13
|
+
{
|
14
|
+
'consumer' => {'name' => 'Consumer'},
|
15
|
+
'provider' => {'name' => 'Provider'},
|
16
|
+
'interactions' => [],
|
17
|
+
'metadata' => {}
|
18
|
+
}.to_json
|
19
|
+
}
|
20
|
+
|
21
|
+
let(:base_url) { 'http://example.org' }
|
22
|
+
let(:created_at) { Time.new(2014, 3, 4) }
|
23
|
+
let(:updated_at) { Time.new(2014, 3, 5) }
|
24
|
+
let(:pact) { double('pact', json_content: json_content, created_at: created_at, updated_at: updated_at, consumer: consumer, provider: provider, consumer_version: consumer_version)}
|
25
|
+
let(:consumer) { instance_double(PactBroker::Models::Pacticipant, name: 'Consumer')}
|
26
|
+
let(:provider) { instance_double(PactBroker::Models::Pacticipant, name: 'Provider')}
|
27
|
+
let(:consumer_version) { instance_double(PactBroker::Models::Version, number: '1234')}
|
28
|
+
|
29
|
+
subject { JSON.parse PactDecorator.new(pact).to_json(base_url: base_url), symbolize_names: true}
|
30
|
+
|
31
|
+
describe "#to_json" do
|
32
|
+
|
33
|
+
it "includes the json_content" do
|
34
|
+
expect(subject[:consumer]).to eq name: 'Consumer'
|
35
|
+
end
|
36
|
+
|
37
|
+
it "includes the createdAt date" do
|
38
|
+
expect(subject[:createdAt]).to eq created_at.xmlschema
|
39
|
+
end
|
40
|
+
|
41
|
+
it "includes a link to the webhooks for this pact" do
|
42
|
+
expect(subject[:_links][:'pact-webhooks'][:href]).to eq "http://example.org/webhooks/provider/Provider/consumer/Consumer"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact_broker/api/decorators/pacticipant_decorator'
|
3
|
+
require 'pact_broker/models/pacticipant'
|
4
|
+
|
5
|
+
module PactBroker
|
6
|
+
|
7
|
+
module Api
|
8
|
+
|
9
|
+
module Decorators
|
10
|
+
|
11
|
+
describe PacticipantRepresenter do
|
12
|
+
|
13
|
+
let(:created_at) { Time.new(2014, 3, 4) }
|
14
|
+
let(:updated_at) { Time.new(2014, 3, 5) }
|
15
|
+
let(:pacticipant) { PactBroker::Models::Pacticipant.new(name: 'Name', updated_at: updated_at, created_at: created_at)}
|
16
|
+
|
17
|
+
subject { JSON.parse PacticipantRepresenter.new(pacticipant).to_json, symbolize_names: true }
|
18
|
+
|
19
|
+
it "includes the createdAt timestamp" do
|
20
|
+
expect(subject[:createdAt]).to eq created_at.xmlschema
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -11,15 +11,18 @@ module PactBroker
|
|
11
11
|
|
12
12
|
let(:pact) { ProviderStateBuilder.new.create_pact_with_hierarchy "My Consumer", "1.0", "My Provider"}
|
13
13
|
let(:pacts) { [pact]}
|
14
|
-
|
15
|
-
let(:line_2) { 'My Consumer,My Provider,1' }
|
16
|
-
let(:expected_text) { [line_1, line_2].join("\n") + "\n" }
|
14
|
+
|
17
15
|
|
18
16
|
subject { RelationshipsCsvDecorator.new(pacts) }
|
19
17
|
|
20
18
|
|
21
19
|
describe "#to_csv" do
|
22
|
-
|
20
|
+
|
21
|
+
let(:line_1) { '1,My Consumer,1,3158419,0,1,2,0,0,0,0,0,0,0,0'}
|
22
|
+
let(:line_2) { '2,My Provider,1,3158419,0,2,0,0,0,0,0,0,0,0,0' }
|
23
|
+
let(:expected_text) { [line_1, line_2].join("\n") + "\n" }
|
24
|
+
|
25
|
+
xit "returns the relationships as CSV" do
|
23
26
|
expect(subject.to_csv).to eq expected_text
|
24
27
|
end
|
25
28
|
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'pact_broker/api/decorators/webhook_decorator'
|
2
|
+
require 'pact_broker/models/webhook'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Api
|
6
|
+
module Decorators
|
7
|
+
describe WebhookDecorator do
|
8
|
+
|
9
|
+
let(:headers) { {:'Content-Type' => 'application/json'} }
|
10
|
+
let(:request) do
|
11
|
+
{
|
12
|
+
method: 'POST',
|
13
|
+
url: 'http://example.org/hook',
|
14
|
+
headers: headers,
|
15
|
+
body: { some: 'body' }
|
16
|
+
}
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:webhook_request) do
|
20
|
+
Models::WebhookRequest.new(request)
|
21
|
+
end
|
22
|
+
|
23
|
+
let(:consumer) { Models::Pacticipant.new(name: 'Consumer') }
|
24
|
+
let(:provider) { Models::Pacticipant.new(name: 'Provider') }
|
25
|
+
|
26
|
+
let(:webhook) do
|
27
|
+
Models::Webhook.new(
|
28
|
+
request: webhook_request,
|
29
|
+
uuid: 'some-uuid',
|
30
|
+
consumer: consumer,
|
31
|
+
provider: provider,
|
32
|
+
created_at: DateTime.now,
|
33
|
+
updated_at: DateTime.now)
|
34
|
+
end
|
35
|
+
|
36
|
+
subject { WebhookDecorator.new(webhook) }
|
37
|
+
|
38
|
+
describe "to_json" do
|
39
|
+
|
40
|
+
let(:parsed_json) { JSON.parse(subject.to_json(base_url: 'http://example.org'), symbolize_names: true)}
|
41
|
+
|
42
|
+
it "includes the request" do
|
43
|
+
expect(parsed_json[:request]).to eq request
|
44
|
+
end
|
45
|
+
|
46
|
+
it "includes an embedded consumer" do
|
47
|
+
expect(parsed_json[:_embedded][:consumer]).to eq ({
|
48
|
+
name: 'Consumer',
|
49
|
+
:_links => {
|
50
|
+
:self => {
|
51
|
+
:href=>"http://example.org/pacticipants/Consumer"
|
52
|
+
}
|
53
|
+
}
|
54
|
+
})
|
55
|
+
end
|
56
|
+
|
57
|
+
it "includes an embedded provider" do
|
58
|
+
expect(parsed_json[:_embedded][:provider]).to eq ({
|
59
|
+
name: 'Provider',
|
60
|
+
:_links => {
|
61
|
+
:self => {
|
62
|
+
:href=>"http://example.org/pacticipants/Provider"
|
63
|
+
}
|
64
|
+
}
|
65
|
+
})
|
66
|
+
end
|
67
|
+
|
68
|
+
it "includes a link to itself" do
|
69
|
+
expect(parsed_json[:_links][:self][:href]).to eq 'http://example.org/webhooks/some-uuid'
|
70
|
+
expect(parsed_json[:_links][:self][:title]).to_not be_nil
|
71
|
+
end
|
72
|
+
|
73
|
+
it "includes a link to its parent collection" do
|
74
|
+
expect(parsed_json[:_links][:'pact-webhooks'][:href]).to_not be_nil
|
75
|
+
end
|
76
|
+
|
77
|
+
|
78
|
+
it "includes a link to the webhooks resource" do
|
79
|
+
expect(parsed_json[:_links][:webhooks][:href]).to_not be_nil
|
80
|
+
end
|
81
|
+
|
82
|
+
it "includes a link to execute the webhook directly" do
|
83
|
+
expect(parsed_json[:_links][:execute][:href]).to eq 'http://example.org/webhooks/some-uuid/execute'
|
84
|
+
end
|
85
|
+
|
86
|
+
context "when the headers are empty" do
|
87
|
+
let(:headers) { nil }
|
88
|
+
it "does not include the headers" do
|
89
|
+
expect(parsed_json[:request]).to_not have_key :headers
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
describe "from_json" do
|
96
|
+
let(:hash) { { request: request } }
|
97
|
+
let(:json) { hash.to_json }
|
98
|
+
let(:webhook) { Models::Webhook.new }
|
99
|
+
let(:parsed_object) { subject.from_json(json) }
|
100
|
+
|
101
|
+
it "parses the request method" do
|
102
|
+
expect(parsed_object.request.method).to eq 'POST'
|
103
|
+
end
|
104
|
+
|
105
|
+
it "parses the request URL" do
|
106
|
+
expect(parsed_object.request.url).to eq 'http://example.org/hook'
|
107
|
+
end
|
108
|
+
|
109
|
+
it "parses the request headers" do
|
110
|
+
expect(parsed_object.request.headers).to eq 'Content-Type' => 'application/json'
|
111
|
+
end
|
112
|
+
|
113
|
+
it "parses the request body" do
|
114
|
+
expect(parsed_object.request.body).to eq 'some' => 'body'
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact_broker/api/decorators/webhook_execution_result_decorator'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Api
|
6
|
+
module Decorators
|
7
|
+
describe WebhookExecutionResultDecorator do
|
8
|
+
|
9
|
+
describe "to_json" do
|
10
|
+
|
11
|
+
let(:webhook_execution_result) { PactBroker::Models::WebhookExecutionResult.new(response, error)}
|
12
|
+
let(:headers) { { "Something" => ["blah", "thing"]} }
|
13
|
+
let(:response) { double('http_response', code: '200', body: response_body, to_hash: headers) }
|
14
|
+
let(:response_body) { 'body' }
|
15
|
+
let(:error) { nil }
|
16
|
+
let(:webhook) { instance_double(PactBroker::Models::Webhook, uuid: 'some-uuid')}
|
17
|
+
let(:json) {
|
18
|
+
WebhookExecutionResultDecorator.new(webhook_execution_result)
|
19
|
+
.to_json(base_url: 'http://example.org', webhook: webhook)
|
20
|
+
}
|
21
|
+
|
22
|
+
let(:subject) { JSON.parse(json, symbolize_names: true)}
|
23
|
+
|
24
|
+
it "includes a link to execute the webhook again" do
|
25
|
+
expect(subject[:_links][:'try-again'][:href]).to eq 'http://example.org/webhooks/some-uuid/execute'
|
26
|
+
end
|
27
|
+
|
28
|
+
it "includes a link to the webhook" do
|
29
|
+
expect(subject[:_links][:webhook][:href]).to eq 'http://example.org/webhooks/some-uuid'
|
30
|
+
end
|
31
|
+
|
32
|
+
context "when there is an error" do
|
33
|
+
let(:error) { double('error', message: 'message', backtrace: ['blah','blah']) }
|
34
|
+
|
35
|
+
it "includes the message" do
|
36
|
+
expect(subject[:error][:message]).to eq 'message'
|
37
|
+
end
|
38
|
+
|
39
|
+
it "includes the backtrace" do
|
40
|
+
expect(subject[:error][:backtrace]).to eq ['blah','blah']
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when there is a response" do
|
45
|
+
it "includes the response code" do
|
46
|
+
expect(subject[:response][:status]).to eq 200
|
47
|
+
end
|
48
|
+
|
49
|
+
it "includes the response headers" do
|
50
|
+
expect(subject[:response][:headers]).to eq :'Something' => "blah, thing"
|
51
|
+
end
|
52
|
+
it "includes the response body" do
|
53
|
+
expect(subject[:response][:body]).to eq response_body
|
54
|
+
end
|
55
|
+
|
56
|
+
context "when the response body is JSON" do
|
57
|
+
let(:response_body_hash) { {some: 'json'} }
|
58
|
+
let(:response_body) { response_body_hash.to_json }
|
59
|
+
it "returns the response as JSON" do
|
60
|
+
expect(subject[:response][:body]).to eq response_body_hash
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact_broker/api/decorators/webhook_request_decorator'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module PactBroker
|
6
|
+
module Api
|
7
|
+
module Decorators
|
8
|
+
describe WebhookRequestDecorator do
|
9
|
+
|
10
|
+
let(:username) { 'username' }
|
11
|
+
let(:display_password) { '*****' }
|
12
|
+
let(:webhook_request) do
|
13
|
+
instance_double(
|
14
|
+
PactBroker::Models::WebhookRequest,
|
15
|
+
username: username,
|
16
|
+
display_password: display_password,
|
17
|
+
method: 'POST',
|
18
|
+
url: 'url',
|
19
|
+
body: 'body',
|
20
|
+
headers: {})
|
21
|
+
end
|
22
|
+
|
23
|
+
let(:json) { WebhookRequestDecorator.new(webhook_request).to_json }
|
24
|
+
|
25
|
+
subject { JSON.parse(json, symbolize_names: true)}
|
26
|
+
|
27
|
+
describe "to_json" do
|
28
|
+
|
29
|
+
it "includes the username" do
|
30
|
+
expect(subject[:username]).to eq username
|
31
|
+
end
|
32
|
+
|
33
|
+
it "includes the username starred out" do
|
34
|
+
expect(subject[:password]).to eq display_password
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when there is no password" do
|
38
|
+
|
39
|
+
let(:display_password) { nil }
|
40
|
+
|
41
|
+
it "does not include a password key" do
|
42
|
+
expect(subject).to_not have_key(:password)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "from_json" do
|
48
|
+
let(:password) { 'password' }
|
49
|
+
let(:hash) do
|
50
|
+
{
|
51
|
+
username: username,
|
52
|
+
password: password,
|
53
|
+
method: 'POST',
|
54
|
+
url: 'url',
|
55
|
+
body: 'body',
|
56
|
+
headers: {}
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
let(:json) { hash.to_json }
|
61
|
+
let(:webhook_request) { PactBroker::Models::WebhookRequest.new }
|
62
|
+
|
63
|
+
subject { WebhookRequestDecorator.new(webhook_request).from_json(json) }
|
64
|
+
|
65
|
+
it "reads the username" do
|
66
|
+
expect(subject.username).to eq username
|
67
|
+
end
|
68
|
+
|
69
|
+
it "reads the password" do
|
70
|
+
expect(subject.password).to eq password
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'pact_broker/api/decorators/webhooks_decorator'
|
3
|
+
|
4
|
+
module PactBroker
|
5
|
+
module Api
|
6
|
+
module Decorators
|
7
|
+
describe WebhooksDecorator do
|
8
|
+
|
9
|
+
let(:webhook) do
|
10
|
+
instance_double(Models::Webhook, uuid: 'some-uuid', description: 'description', request_description: 'request description')
|
11
|
+
end
|
12
|
+
let(:base_url) { 'http://example.org' }
|
13
|
+
let(:resource_url) { 'http://example.org/webhooks' }
|
14
|
+
|
15
|
+
let(:decorator_context) do
|
16
|
+
DecoratorContext.new(base_url, resource_url, resource_title: 'Title')
|
17
|
+
end
|
18
|
+
|
19
|
+
let(:webhooks) { [webhook] }
|
20
|
+
|
21
|
+
describe "to_json" do
|
22
|
+
|
23
|
+
let(:json) { WebhooksDecorator.new(webhooks).to_json(decorator_context) }
|
24
|
+
|
25
|
+
subject { JSON.parse(json, symbolize_names: true) }
|
26
|
+
|
27
|
+
it "includes a link to itself with a title" do
|
28
|
+
expect(subject[:_links][:'pb:self'][:href]).to eq resource_url
|
29
|
+
expect(subject[:_links][:'pb:self'][:title]).to eq 'Title'
|
30
|
+
end
|
31
|
+
|
32
|
+
it "includes a list of links to the webhooks" do
|
33
|
+
expect(subject[:_links][:webhooks]).to be_instance_of(Array)
|
34
|
+
expect(subject[:_links][:webhooks].first).to eq title: 'description', name: 'request description', href: 'http://example.org/webhooks/some-uuid'
|
35
|
+
end
|
36
|
+
|
37
|
+
it "includes curies" do
|
38
|
+
expect(subject[:_links][:curies]).to eq [{:name=>"pb", :href=>"http://example.org/doc/webhooks"}]
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|