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.
Files changed (131) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +0 -1
  3. data/.rspec +1 -0
  4. data/CHANGELOG.md +47 -0
  5. data/README.md +4 -2
  6. data/config.ru +3 -5
  7. data/db/migrations/09_add_timestamps.rb +12 -0
  8. data/db/migrations/10_populate_timestamps.rb +15 -0
  9. data/db/migrations/11_made_timestamps_mandatory.rb +20 -0
  10. data/db/migrations/12_create_webhooks_table.rb +21 -0
  11. data/db/migrations/13_add_columns_to_webhooks.rb +8 -0
  12. data/lib/pact_broker/api.rb +14 -0
  13. data/lib/pact_broker/api/decorators.rb +2 -2
  14. data/lib/pact_broker/api/decorators/base_decorator.rb +2 -1
  15. data/lib/pact_broker/api/decorators/basic_pacticipant_decorator.rb +21 -0
  16. data/lib/pact_broker/api/decorators/decorator_context.rb +20 -0
  17. data/lib/pact_broker/api/decorators/latest_pact_decorator.rb +2 -2
  18. data/lib/pact_broker/api/decorators/pact_decorator.rb +12 -5
  19. data/lib/pact_broker/api/decorators/pact_details_decorator.rb +22 -0
  20. data/lib/pact_broker/api/decorators/pacticipant_decorator.rb +6 -4
  21. data/lib/pact_broker/api/decorators/relationships_csv_decorator.rb +25 -3
  22. data/lib/pact_broker/api/decorators/representable_pact.rb +3 -1
  23. data/lib/pact_broker/api/decorators/tag_decorator.rb +3 -0
  24. data/lib/pact_broker/api/decorators/webhook_decorator.rb +52 -0
  25. data/lib/pact_broker/api/decorators/webhook_execution_result_decorator.rb +58 -0
  26. data/lib/pact_broker/api/decorators/webhook_request_decorator.rb +18 -0
  27. data/lib/pact_broker/api/decorators/webhooks_decorator.rb +37 -0
  28. data/lib/pact_broker/api/pact_broker_urls.rb +16 -0
  29. data/lib/pact_broker/api/renderers/html_pact_renderer.rb +2 -1
  30. data/lib/pact_broker/api/resources/base_resource.rb +12 -1
  31. data/lib/pact_broker/api/resources/group.rb +38 -0
  32. data/lib/pact_broker/api/resources/index.rb +30 -21
  33. data/lib/pact_broker/api/resources/latest_pact.rb +1 -1
  34. data/lib/pact_broker/api/resources/latest_pacts.rb +1 -1
  35. data/lib/pact_broker/api/resources/pact.rb +18 -2
  36. data/lib/pact_broker/api/resources/pact_webhooks.rb +87 -0
  37. data/lib/pact_broker/api/resources/pacticipant.rb +15 -6
  38. data/lib/pact_broker/api/resources/pacticipants.rb +1 -1
  39. data/lib/pact_broker/api/resources/tag.rb +2 -2
  40. data/lib/pact_broker/api/resources/webhook.rb +44 -0
  41. data/lib/pact_broker/api/resources/webhook_execution.rb +43 -0
  42. data/lib/pact_broker/api/resources/webhooks.rb +29 -0
  43. data/lib/pact_broker/app.rb +46 -8
  44. data/lib/pact_broker/db.rb +10 -0
  45. data/lib/pact_broker/doc/controllers/app.rb +32 -0
  46. data/lib/pact_broker/doc/views/latest-pacts.markdown +3 -0
  47. data/lib/pact_broker/doc/views/layouts/main.haml +5 -0
  48. data/lib/pact_broker/doc/views/pacticipants.markdown +10 -0
  49. data/lib/pact_broker/doc/views/self.markdown +8 -0
  50. data/lib/pact_broker/doc/views/webhooks.markdown +48 -0
  51. data/lib/pact_broker/functions/groupify.rb +39 -0
  52. data/lib/pact_broker/jobs/after_pact_save.rb +13 -0
  53. data/lib/pact_broker/json.rb +4 -0
  54. data/lib/pact_broker/locale/en.yml +23 -0
  55. data/lib/pact_broker/messages.rb +18 -0
  56. data/lib/pact_broker/models/group.rb +21 -0
  57. data/lib/pact_broker/models/pact.rb +4 -2
  58. data/lib/pact_broker/models/pacticipant.rb +3 -1
  59. data/lib/pact_broker/models/relationship.rb +34 -0
  60. data/lib/pact_broker/models/tag.rb +3 -1
  61. data/lib/pact_broker/models/version.rb +3 -1
  62. data/lib/pact_broker/models/webhook.rb +53 -0
  63. data/lib/pact_broker/models/webhook_execution_result.rb +26 -0
  64. data/lib/pact_broker/models/webhook_request.rb +107 -0
  65. data/lib/pact_broker/models/webhook_request_header.rb +13 -0
  66. data/lib/pact_broker/repositories.rb +6 -0
  67. data/lib/pact_broker/repositories/pact_repository.rb +25 -7
  68. data/lib/pact_broker/repositories/pacticipant_repository.rb +4 -0
  69. data/lib/pact_broker/repositories/webhook_repository.rb +134 -0
  70. data/lib/pact_broker/services.rb +10 -0
  71. data/lib/pact_broker/services/group_service.rb +24 -0
  72. data/lib/pact_broker/services/pact_service.rb +37 -7
  73. data/lib/pact_broker/services/pacticipant_service.rb +12 -1
  74. data/lib/pact_broker/services/webhook_service.rb +63 -0
  75. data/lib/pact_broker/tasks.rb +0 -1
  76. data/lib/pact_broker/ui/controllers/base_controller.rb +1 -0
  77. data/lib/pact_broker/ui/controllers/groups.rb +25 -0
  78. data/lib/pact_broker/ui/controllers/relationships.rb +0 -2
  79. data/lib/pact_broker/ui/helpers/url_helper.rb +17 -0
  80. data/lib/pact_broker/ui/view_models/relationship.rb +13 -4
  81. data/lib/pact_broker/ui/view_models/relationships.rb +1 -1
  82. data/lib/pact_broker/ui/views/groups/show.html.erb +409 -0
  83. data/lib/pact_broker/ui/views/relationships/show.haml +4 -2
  84. data/lib/pact_broker/version.rb +1 -1
  85. data/pact_broker.gemspec +7 -6
  86. data/public/{d3.v3.js.pagespeed.ce.dFNRrGTALe.js → javascripts/d3.v3.js.pagespeed.ce.dFNRrGTALe.js} +0 -0
  87. data/public/stylesheets/relationships.css +4 -0
  88. data/spec/integration/endpoints/group.rb +22 -0
  89. data/spec/lib/pact_broker/api/decorators/pact_decorator_spec.rb +49 -0
  90. data/spec/lib/pact_broker/api/decorators/pacticipant_decorator_spec.rb +25 -0
  91. data/spec/lib/pact_broker/api/decorators/relationships_csv_decorator_spec.rb +7 -4
  92. data/spec/lib/pact_broker/api/decorators/webhook_decorator_spec.rb +121 -0
  93. data/spec/lib/pact_broker/api/decorators/webhook_execution_result_decorator_spec.rb +69 -0
  94. data/spec/lib/pact_broker/api/decorators/webhook_request_decorator_spec.rb +78 -0
  95. data/spec/lib/pact_broker/api/decorators/webhooks_decorator_spec.rb +46 -0
  96. data/spec/lib/pact_broker/api/resources/group_spec.rb +80 -0
  97. data/spec/lib/pact_broker/api/resources/pact_spec.rb +41 -0
  98. data/spec/lib/pact_broker/api/resources/pact_webhooks_spec.rb +184 -0
  99. data/spec/lib/pact_broker/api/resources/pacticipant_spec.rb +71 -0
  100. data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +77 -0
  101. data/spec/lib/pact_broker/api/resources/webhook_spec.rb +60 -0
  102. data/spec/lib/pact_broker/api/resources/webhooks_spec.rb +44 -0
  103. data/spec/lib/pact_broker/doc/controllers/app_spec.rb +51 -0
  104. data/spec/lib/pact_broker/functions/groupify_spec.rb +50 -0
  105. data/spec/lib/pact_broker/models/group_spec.rb +26 -0
  106. data/spec/lib/pact_broker/models/webhook_request_spec.rb +175 -0
  107. data/spec/lib/pact_broker/models/webhook_spec.rb +59 -0
  108. data/spec/lib/pact_broker/repositories/pact_repository_spec.rb +40 -0
  109. data/spec/lib/pact_broker/repositories/webhook_repository_spec.rb +257 -0
  110. data/spec/lib/pact_broker/services/group_service_spec.rb +52 -0
  111. data/spec/lib/pact_broker/services/pact_service_spec.rb +49 -0
  112. data/spec/lib/pact_broker/services/pacticipant_service_spec.rb +50 -0
  113. data/spec/lib/pact_broker/services/webhook_service_spec.rb +51 -0
  114. data/spec/lib/pact_broker/ui/view_models/relationship_spec.rb +20 -6
  115. data/spec/lib/pact_broker/ui/view_models/relationships_spec.rb +33 -0
  116. data/spec/service_consumers/provider_states_for_pact_broker_client.rb +1 -1
  117. data/spec/spec_helper.rb +11 -4
  118. data/spec/support/provider_state_builder.rb +11 -0
  119. data/spec/support/shared_examples_for_responses.rb +25 -0
  120. data/vendor/hal-browser/js/hal/views/embedded_resource.js +3 -3
  121. data/vendor/hal-browser/js/hal/views/resource.js +3 -3
  122. metadata +174 -80
  123. data/assets/d3.v3.js +0 -9263
  124. data/assets/force.csv +0 -29
  125. data/assets/index.html +0 -186
  126. data/assets/index2.html +0 -224
  127. data/assets/relationships +0 -4
  128. data/assets/stylesheets/github.css +0 -387
  129. data/lib/pact_broker/tasks/delete.rake +0 -20
  130. data/public/Network Graph REA.html +0 -48
  131. data/public/rea.csv +0 -10
@@ -15,4 +15,8 @@
15
15
  padding-left:10px;
16
16
  }
17
17
 
18
+ .hack {
19
+ padding-right: 20px;
20
+ }
21
+
18
22
  body { padding-top: 10px; }
@@ -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
- let(:line_1) { 'source,target,weight'}
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
- it "returns the relationships as CSV" do
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