gds-api-adapters 24.6.0 → 24.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +27 -4
- data/lib/gds_api/publishing_api.rb +8 -0
- data/lib/gds_api/publishing_api_v2.rb +17 -8
- data/lib/gds_api/test_helpers/publishing_api.rb +11 -3
- data/lib/gds_api/version.rb +1 -1
- data/test/asset_manager_test.rb +1 -1
- data/test/publishing_api_test.rb +73 -5
- data/test/publishing_api_v2_test.rb +69 -5
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ef68ae8d9f4be614277bc8a7acb8027f1c07545
|
4
|
+
data.tar.gz: 932afdaf75d50446a826c4f3792457977eebe3c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c09577ea35742649e8614f0c0a274e5604fd416c031f47b1d22853a21724cc8d2826aeafd571f125f690be6b7ba794e9eb8451228c9ec3356f8160b1efe71e31
|
7
|
+
data.tar.gz: 06d0fa4e1ec14347dbb178d57aa011a5b75c188255f2e1cee60ec718aaa614820011c0a2da8a2c1836f1c91e62fb11792c98646e37c9b2dfa7a8fe60cdd17c04
|
data/Rakefile
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
|
-
require "bundler/gem_tasks"
|
4
3
|
require "rdoc/task"
|
5
4
|
require 'rake/testtask'
|
6
5
|
|
@@ -15,11 +14,35 @@ Rake::TestTask.new("test") do |t|
|
|
15
14
|
t.test_files = FileList["test/**/*_test.rb"]
|
16
15
|
t.verbose = true
|
17
16
|
end
|
17
|
+
task :default => :test
|
18
|
+
|
19
|
+
require 'pact_broker/client/tasks'
|
20
|
+
|
21
|
+
def configure_pact_broker_location(task)
|
22
|
+
task.pact_broker_base_url = ENV.fetch("PACT_BROKER_BASE_URL")
|
23
|
+
if ENV['PACT_BROKER_USERNAME']
|
24
|
+
task.pact_broker_basic_auth = { username: ENV['PACT_BROKER_USERNAME'], password: ENV['PACT_BROKER_PASSWORD']}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
PactBroker::Client::PublicationTask.new("branch") do | task |
|
29
|
+
task.consumer_version = ENV.fetch("PACT_TARGET_BRANCH")
|
30
|
+
configure_pact_broker_location(task)
|
31
|
+
end
|
32
|
+
|
33
|
+
PactBroker::Client::PublicationTask.new("released_version") do | task |
|
34
|
+
require 'gds_api/version'
|
35
|
+
task.consumer_version = GdsApi::VERSION
|
36
|
+
configure_pact_broker_location(task)
|
37
|
+
end
|
18
38
|
|
19
39
|
require "gem_publisher"
|
40
|
+
desc "Publish gem to rubygems.org if necessary"
|
20
41
|
task :publish_gem do |t|
|
21
42
|
gem = GemPublisher.publish_if_updated("gds-api-adapters.gemspec", :rubygems)
|
22
|
-
|
23
|
-
|
43
|
+
if gem
|
44
|
+
puts "Published #{gem}"
|
24
45
|
|
25
|
-
|
46
|
+
Rake::Task["pact:publish:released_version"].invoke
|
47
|
+
end
|
48
|
+
end
|
@@ -21,6 +21,10 @@ class GdsApi::PublishingApi < GdsApi::Base
|
|
21
21
|
e
|
22
22
|
end
|
23
23
|
|
24
|
+
def put_path(base_path, payload)
|
25
|
+
put_json!(paths_url(base_path), payload)
|
26
|
+
end
|
27
|
+
|
24
28
|
|
25
29
|
private
|
26
30
|
|
@@ -35,4 +39,8 @@ class GdsApi::PublishingApi < GdsApi::Base
|
|
35
39
|
def intent_url(base_path)
|
36
40
|
"#{endpoint}/publish-intent#{base_path}"
|
37
41
|
end
|
42
|
+
|
43
|
+
def paths_url(base_path)
|
44
|
+
"#{endpoint}/paths#{base_path}"
|
45
|
+
end
|
38
46
|
end
|
@@ -6,14 +6,18 @@ class GdsApi::PublishingApiV2 < GdsApi::Base
|
|
6
6
|
put_json!(content_url(content_id), payload)
|
7
7
|
end
|
8
8
|
|
9
|
-
def get_content(content_id)
|
10
|
-
|
9
|
+
def get_content(content_id, options = {})
|
10
|
+
params = {}
|
11
|
+
params = params.merge(locale: options[:locale]) if options[:locale]
|
12
|
+
|
13
|
+
get_json(content_url(content_id, params))
|
11
14
|
end
|
12
15
|
|
13
|
-
def publish(content_id, update_type)
|
14
|
-
|
15
|
-
|
16
|
-
|
16
|
+
def publish(content_id, update_type, options = {})
|
17
|
+
params = { update_type: update_type }
|
18
|
+
params = params.merge(locale: options[:locale]) if options[:locale]
|
19
|
+
|
20
|
+
post_json!(publish_url(content_id), params)
|
17
21
|
end
|
18
22
|
|
19
23
|
def get_links(content_id)
|
@@ -27,11 +31,16 @@ class GdsApi::PublishingApiV2 < GdsApi::Base
|
|
27
31
|
|
28
32
|
private
|
29
33
|
|
30
|
-
def content_url(content_id)
|
31
|
-
|
34
|
+
def content_url(content_id, params = {})
|
35
|
+
query = query_string(params)
|
36
|
+
"#{endpoint}/v2/content/#{content_id}#{query}"
|
32
37
|
end
|
33
38
|
|
34
39
|
def links_url(content_id)
|
35
40
|
"#{endpoint}/v2/links/#{content_id}"
|
36
41
|
end
|
42
|
+
|
43
|
+
def publish_url(content_id)
|
44
|
+
"#{endpoint}/v2/content/#{content_id}/publish"
|
45
|
+
end
|
37
46
|
end
|
@@ -11,16 +11,16 @@ module GdsApi
|
|
11
11
|
|
12
12
|
PUBLISHING_API_ENDPOINT = Plek.current.find('publishing-api')
|
13
13
|
|
14
|
-
def stub_publishing_api_put_draft_item(base_path, body =
|
14
|
+
def stub_publishing_api_put_draft_item(base_path, body = content_item_for_publishing_api(base_path))
|
15
15
|
stub_publishing_api_put_item(base_path, body, '/draft-content')
|
16
16
|
end
|
17
17
|
|
18
|
-
def stub_publishing_api_put_item(base_path, body =
|
18
|
+
def stub_publishing_api_put_item(base_path, body = content_item_for_publishing_api(base_path), resource_path = '/content')
|
19
19
|
url = PUBLISHING_API_ENDPOINT + resource_path + base_path
|
20
20
|
stub_request(:put, url).with(body: body).to_return(status: 200, body: '{}', headers: {"Content-Type" => "application/json; charset=utf-8"})
|
21
21
|
end
|
22
22
|
|
23
|
-
def stub_publishing_api_put_intent(base_path, body =
|
23
|
+
def stub_publishing_api_put_intent(base_path, body = intent_for_publishing_api(base_path))
|
24
24
|
url = PUBLISHING_API_ENDPOINT + "/publish-intent" + base_path
|
25
25
|
body = body.to_json unless body.is_a?(String)
|
26
26
|
stub_request(:put, url).with(body: body).to_return(status: 200, body: '{}', headers: {"Content-Type" => "application/json; charset=utf-8"})
|
@@ -109,6 +109,14 @@ module GdsApi
|
|
109
109
|
expected_value == actual_value
|
110
110
|
end
|
111
111
|
end
|
112
|
+
|
113
|
+
def content_item_for_publishing_api(base_path, publishing_app="publisher")
|
114
|
+
content_item_for_base_path(base_path).merge("publishing_app" => publishing_app)
|
115
|
+
end
|
116
|
+
|
117
|
+
def intent_for_publishing_api(base_path, publishing_app="publisher")
|
118
|
+
intent_for_base_path(base_path).merge("publishing_app" => publishing_app)
|
119
|
+
end
|
112
120
|
end
|
113
121
|
end
|
114
122
|
end
|
data/lib/gds_api/version.rb
CHANGED
data/test/asset_manager_test.rb
CHANGED
@@ -52,7 +52,7 @@ describe GdsApi::AssetManager do
|
|
52
52
|
let(:asset_id) { "test-id" }
|
53
53
|
|
54
54
|
it "updates an asset with a file" do
|
55
|
-
req = stub_request(:put, "
|
55
|
+
req = stub_request(:put, "#{base_api_url}/assets/test-id").
|
56
56
|
to_return(:body => JSON.dump(asset_manager_response), :status => 200)
|
57
57
|
|
58
58
|
response = api.update_asset(asset_id, :file => file_fixture)
|
data/test/publishing_api_test.rb
CHANGED
@@ -14,7 +14,7 @@ describe GdsApi::PublishingApi do
|
|
14
14
|
describe "#put_content_item" do
|
15
15
|
it "responds with 200 OK if the entry is valid" do
|
16
16
|
base_path = "/test-content-item"
|
17
|
-
content_item =
|
17
|
+
content_item = content_item_for_publishing_api(base_path).merge("update_type" => "major")
|
18
18
|
|
19
19
|
publishing_api
|
20
20
|
.given("both content stores and the url-arbiter are empty")
|
@@ -43,7 +43,7 @@ describe GdsApi::PublishingApi do
|
|
43
43
|
describe "#put_draft_content_item" do
|
44
44
|
it "responds with 200 OK if the entry is valid" do
|
45
45
|
base_path = "/test-draft-content-item"
|
46
|
-
content_item =
|
46
|
+
content_item = content_item_for_publishing_api(base_path).merge("update_type" => "major")
|
47
47
|
|
48
48
|
publishing_api
|
49
49
|
.given("both content stores and the url-arbiter are empty")
|
@@ -72,7 +72,7 @@ describe GdsApi::PublishingApi do
|
|
72
72
|
describe "#put_intent" do
|
73
73
|
it "responds with 200 OK if publish intent is valid" do
|
74
74
|
base_path = "/test-intent"
|
75
|
-
publish_intent =
|
75
|
+
publish_intent = intent_for_publishing_api(base_path)
|
76
76
|
|
77
77
|
publishing_api
|
78
78
|
.given("both content stores and the url-arbiter are empty")
|
@@ -102,7 +102,7 @@ describe GdsApi::PublishingApi do
|
|
102
102
|
it "returns 200 OK if intent existed and was deleted" do
|
103
103
|
base_path = "/test-intent"
|
104
104
|
|
105
|
-
publish_intent =
|
105
|
+
publish_intent = intent_for_publishing_api(base_path)
|
106
106
|
|
107
107
|
publishing_api
|
108
108
|
.given("a publish intent exists at /test-intent in the live content store")
|
@@ -126,7 +126,7 @@ describe GdsApi::PublishingApi do
|
|
126
126
|
it "returns 404 Not found if the intent does not exist" do
|
127
127
|
base_path = "/test-intent"
|
128
128
|
|
129
|
-
publish_intent =
|
129
|
+
publish_intent = intent_for_publishing_api(base_path)
|
130
130
|
|
131
131
|
publishing_api
|
132
132
|
.given("both content stores and the url-arbiter are empty")
|
@@ -147,4 +147,72 @@ describe GdsApi::PublishingApi do
|
|
147
147
|
assert_equal 404, response.code
|
148
148
|
end
|
149
149
|
end
|
150
|
+
|
151
|
+
describe "#put_path" do
|
152
|
+
it "returns 200 if the path was successfully reserved" do
|
153
|
+
base_path = "/test-intent"
|
154
|
+
payload = {
|
155
|
+
publishing_app: "publisher"
|
156
|
+
}
|
157
|
+
|
158
|
+
publishing_api
|
159
|
+
.given("both content stores and the url-arbiter are empty")
|
160
|
+
.upon_receiving("a request to put a path")
|
161
|
+
.with(
|
162
|
+
method: :put,
|
163
|
+
path: "/paths#{base_path}",
|
164
|
+
body: payload,
|
165
|
+
headers: {
|
166
|
+
"Content-Type" => "application/json"
|
167
|
+
},
|
168
|
+
)
|
169
|
+
.will_respond_with(
|
170
|
+
status: 200,
|
171
|
+
body: {},
|
172
|
+
headers: {
|
173
|
+
"Content-Type" => "application/json; charset=utf-8"
|
174
|
+
}
|
175
|
+
)
|
176
|
+
|
177
|
+
response = @api_client.put_path(base_path, payload)
|
178
|
+
assert_equal 200, response.code
|
179
|
+
end
|
180
|
+
|
181
|
+
it "returns 422 if the request is invalid" do
|
182
|
+
base_path = "/test-item"
|
183
|
+
payload = {
|
184
|
+
publishing_app: "whitehall"
|
185
|
+
}
|
186
|
+
|
187
|
+
publishing_api
|
188
|
+
.given("/test-item has been reserved in url-arbiter by the Publisher application")
|
189
|
+
.upon_receiving("a request to change publishing app")
|
190
|
+
.with(
|
191
|
+
method: :put,
|
192
|
+
path: "/paths#{base_path}",
|
193
|
+
body: payload,
|
194
|
+
headers: {
|
195
|
+
"Content-Type" => "application/json"
|
196
|
+
},
|
197
|
+
|
198
|
+
)
|
199
|
+
.will_respond_with(
|
200
|
+
status: 422,
|
201
|
+
body: {
|
202
|
+
"error" => {
|
203
|
+
"code" => 422,
|
204
|
+
"message" => Pact.term(generate: "Unprocessable", matcher:/\S+/),
|
205
|
+
"fields" => {
|
206
|
+
"base_path" => Pact.each_like("has been reserved", :min => 1),
|
207
|
+
},
|
208
|
+
},
|
209
|
+
},
|
210
|
+
)
|
211
|
+
|
212
|
+
error = assert_raises GdsApi::HTTPClientError do
|
213
|
+
@api_client.put_path(base_path, payload)
|
214
|
+
end
|
215
|
+
assert_equal "Unprocessable", error.error_details["error"]["message"]
|
216
|
+
end
|
217
|
+
end
|
150
218
|
end
|
@@ -75,10 +75,10 @@ describe GdsApi::PublishingApiV2 do
|
|
75
75
|
}
|
76
76
|
)
|
77
77
|
.will_respond_with(
|
78
|
-
status:
|
78
|
+
status: 422,
|
79
79
|
body: {
|
80
80
|
"error" => {
|
81
|
-
"code" =>
|
81
|
+
"code" => 422,
|
82
82
|
"message" => Pact.term(generate: "Conflict", matcher:/\S+/),
|
83
83
|
"fields" => {
|
84
84
|
"base_path" => Pact.each_like("is already in use by the 'publisher' app", :min => 1),
|
@@ -91,8 +91,8 @@ describe GdsApi::PublishingApiV2 do
|
|
91
91
|
)
|
92
92
|
end
|
93
93
|
|
94
|
-
it "responds with
|
95
|
-
error = assert_raises GdsApi::
|
94
|
+
it "responds with 422 Unprocessable Entity" do
|
95
|
+
error = assert_raises GdsApi::HTTPClientError do
|
96
96
|
@api_client.put_content(@content_id, @content_item)
|
97
97
|
end
|
98
98
|
assert_equal "Conflict", error.error_details["error"]["message"]
|
@@ -178,6 +178,43 @@ describe GdsApi::PublishingApiV2 do
|
|
178
178
|
end
|
179
179
|
end
|
180
180
|
|
181
|
+
describe "when a content item exists in multiple locales" do
|
182
|
+
before do
|
183
|
+
@content_item = content_item_for_content_id(@content_id)
|
184
|
+
|
185
|
+
publishing_api
|
186
|
+
.given("a content item exists in multiple locales with content_id: #{@content_id}")
|
187
|
+
.upon_receiving("a request to return the content item")
|
188
|
+
.with(
|
189
|
+
method: :get,
|
190
|
+
path: "/v2/content/#{@content_id}",
|
191
|
+
query: "locale=fr",
|
192
|
+
)
|
193
|
+
.will_respond_with(
|
194
|
+
status: 200,
|
195
|
+
body: {
|
196
|
+
"content_id" => @content_id,
|
197
|
+
"format" => Pact.like("special_route"),
|
198
|
+
"publishing_app" => Pact.like("publisher"),
|
199
|
+
"rendering_app" => Pact.like("frontend"),
|
200
|
+
"locale" => "fr",
|
201
|
+
"routes" => Pact.like([{}]),
|
202
|
+
"public_updated_at" => Pact.like("2015-07-30T13:58:11.000Z"),
|
203
|
+
"details" => Pact.like({})
|
204
|
+
},
|
205
|
+
headers: {
|
206
|
+
"Content-Type" => "application/json; charset=utf-8",
|
207
|
+
},
|
208
|
+
)
|
209
|
+
end
|
210
|
+
|
211
|
+
it "responds with 200 and the content item" do
|
212
|
+
response = @api_client.get_content(@content_id, locale: "fr")
|
213
|
+
assert_equal 200, response.code
|
214
|
+
assert_equal response["locale"], "fr"
|
215
|
+
end
|
216
|
+
end
|
217
|
+
|
181
218
|
describe "a non-existent item" do
|
182
219
|
before do
|
183
220
|
publishing_api
|
@@ -237,7 +274,7 @@ describe GdsApi::PublishingApiV2 do
|
|
237
274
|
describe "if the content item does not exist" do
|
238
275
|
before do
|
239
276
|
publishing_api
|
240
|
-
.given("both content stores and url-arbiter empty")
|
277
|
+
.given("both content stores and the url-arbiter are empty")
|
241
278
|
.upon_receiving("a publish request")
|
242
279
|
.with(
|
243
280
|
method: :post,
|
@@ -374,6 +411,33 @@ describe GdsApi::PublishingApiV2 do
|
|
374
411
|
assert_equal "Cannot publish an already published content item", error.error_details["error"]["message"]
|
375
412
|
end
|
376
413
|
end
|
414
|
+
|
415
|
+
describe "if the update information contains a locale" do
|
416
|
+
before do
|
417
|
+
publishing_api
|
418
|
+
.given("a draft content item exists with content_id: #{@content_id} and locale: fr")
|
419
|
+
.upon_receiving("a publish request")
|
420
|
+
.with(
|
421
|
+
method: :post,
|
422
|
+
path: "/v2/content/#{@content_id}/publish",
|
423
|
+
body: {
|
424
|
+
update_type: "major",
|
425
|
+
locale: "fr",
|
426
|
+
},
|
427
|
+
headers: {
|
428
|
+
"Content-Type" => "application/json",
|
429
|
+
},
|
430
|
+
)
|
431
|
+
.will_respond_with(
|
432
|
+
status: 200,
|
433
|
+
)
|
434
|
+
end
|
435
|
+
|
436
|
+
it "responds with 200 if the publish command succeeds" do
|
437
|
+
response = @api_client.publish(@content_id, "major", locale: "fr")
|
438
|
+
assert_equal 200, response.code
|
439
|
+
end
|
440
|
+
end
|
377
441
|
end
|
378
442
|
|
379
443
|
describe "#get_links" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gds-api-adapters
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 24.
|
4
|
+
version: 24.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Stewart
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: plek
|
@@ -290,6 +290,20 @@ dependencies:
|
|
290
290
|
- - "~>"
|
291
291
|
- !ruby/object:Gem::Version
|
292
292
|
version: '1.19'
|
293
|
+
- !ruby/object:Gem::Dependency
|
294
|
+
name: pact_broker-client
|
295
|
+
requirement: !ruby/object:Gem::Requirement
|
296
|
+
requirements:
|
297
|
+
- - "~>"
|
298
|
+
- !ruby/object:Gem::Version
|
299
|
+
version: 1.0.0
|
300
|
+
type: :development
|
301
|
+
prerelease: false
|
302
|
+
version_requirements: !ruby/object:Gem::Requirement
|
303
|
+
requirements:
|
304
|
+
- - "~>"
|
305
|
+
- !ruby/object:Gem::Version
|
306
|
+
version: 1.0.0
|
293
307
|
description: A set of adapters providing easy access to the GDS GOV.UK APIs
|
294
308
|
email:
|
295
309
|
- jystewart@gmail.com
|