gds-api-adapters 7.11.0 → 7.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -203,6 +203,23 @@ module GdsApi
203
203
  # Return either a Time object representing the expiry time of the response
204
204
  # or nil if no cache information is provided
205
205
  def response_cache_time(response)
206
+ if response.headers[:cache_control]
207
+ # The Cache-control header is composed of a comma-separated string
208
+ # so split this apart before we look for particular values
209
+ cache_parts = response.headers[:cache_control].split(',').map(&:strip)
210
+
211
+ # If no-cache is present, this takes precedent over any other value
212
+ # in this header
213
+ return Time.now.utc if cache_parts.include?("no-cache")
214
+
215
+ # Otherwise, look for a 'max-age=123' value, which is the number of
216
+ # seconds for which to cache the response.
217
+ max_age = cache_parts.map {|x| x.match(/max-age=(\d+)/) }.compact.first
218
+ if max_age
219
+ return Time.now.utc + max_age[1].to_i
220
+ end
221
+ end
222
+
206
223
  if response.headers[:expires]
207
224
  Time.httpdate response.headers[:expires]
208
225
  end
@@ -20,7 +20,7 @@ module GdsApi
20
20
 
21
21
  # Pass calls to `self.each` to the `results` sub-object, so we can iterate
22
22
  # over the response directly
23
- def_delegator :results, :each
23
+ def_delegators :results, :each, :to_ary
24
24
 
25
25
  def has_next_page?
26
26
  ! page_link("next").nil?
@@ -2,6 +2,10 @@ require_relative 'base'
2
2
 
3
3
  class GdsApi::NeedApi < GdsApi::Base
4
4
 
5
+ def needs
6
+ get_list!("#{endpoint}/needs")
7
+ end
8
+
5
9
  def create_need(need)
6
10
  post_json!("#{endpoint}/needs", need)
7
11
  end
@@ -21,6 +21,15 @@ module GdsApi
21
21
  )
22
22
  stub_request(:get, url).to_return(status: 200, body: body.to_json, headers: {})
23
23
  end
24
+
25
+ def need_api_has_needs(needs)
26
+ url = NEED_API_ENDPOINT + "/needs"
27
+
28
+ body = response_base.merge(
29
+ "results" => needs
30
+ )
31
+ stub_request(:get, url).to_return(status: 200, body: body.to_json, headers: {})
32
+ end
24
33
  end
25
34
  end
26
35
  end
@@ -1,3 +1,3 @@
1
1
  module GdsApi
2
- VERSION = '7.11.0'
2
+ VERSION = '7.12.0'
3
3
  end
@@ -202,6 +202,114 @@ class JsonClientTest < MiniTest::Spec
202
202
  end
203
203
  end
204
204
 
205
+ def test_should_respect_cache_control_headers_with_max_age
206
+ url = "http://some.endpoint/max_age.json"
207
+ result = {"foo" => "bar"}
208
+ stub_request(:get, url).to_return(
209
+ :body => JSON.dump(result),
210
+ :status => 200,
211
+ :headers => { "Cache-Control" => "max-age=420, public" } # 6 minutes
212
+ )
213
+
214
+ response_a = GdsApi::JsonClient.new.get_json(url)
215
+
216
+ Timecop.travel( 7 * 60 - 30) do # now + 6 mins 30 secs
217
+ response_b = GdsApi::JsonClient.new.get_json(url)
218
+
219
+ assert_requested :get, url, times: 1
220
+ assert_equal response_a.to_hash, response_b.to_hash
221
+ end
222
+
223
+ Timecop.travel( 7 * 60 + 30) do # now + 7 mins 30 secs
224
+ response_c = GdsApi::JsonClient.new.get_json(url)
225
+
226
+ assert_requested :get, url, times: 2
227
+ assert_equal response_a.to_hash, response_c.to_hash
228
+ end
229
+ end
230
+
231
+ def test_should_respect_cache_control_headers_with_no_cache
232
+ url = "http://some.endpoint/no_cache.json"
233
+ result = {"foo" => "bar"}
234
+ stub_request(:get, url).to_return(
235
+ :body => JSON.dump(result),
236
+ :status => 200,
237
+ :headers => { "Cache-Control" => "no-cache, public" }
238
+ )
239
+
240
+ response_a = GdsApi::JsonClient.new.get_json(url)
241
+
242
+ Timecop.travel( 7 * 60 - 30) do # now + 6 mins 30 secs
243
+ response_b = GdsApi::JsonClient.new.get_json(url)
244
+
245
+ assert_requested :get, url, times: 2
246
+ assert_equal response_a.to_hash, response_b.to_hash
247
+ end
248
+ end
249
+
250
+ def test_should_respect_cache_control_headers_with_no_cache_and_max_age
251
+ url = "http://some.endpoint/no_cache_and_max_age.json"
252
+ result = {"foo" => "bar"}
253
+ stub_request(:get, url).to_return(
254
+ :body => JSON.dump(result),
255
+ :status => 200,
256
+ :headers => { "Cache-Control" => "max-age=600, no-cache, public" }
257
+ )
258
+
259
+ response_a = GdsApi::JsonClient.new.get_json(url)
260
+
261
+ Timecop.travel( 7 * 60 - 30) do # now + 6 mins 30 secs
262
+ response_b = GdsApi::JsonClient.new.get_json(url)
263
+
264
+ assert_requested :get, url, times: 2
265
+ assert_equal response_a.to_hash, response_b.to_hash
266
+ end
267
+ end
268
+
269
+ def test_should_use_cache_control_headers_over_expires_headers
270
+ url = "http://some.endpoint/url.json"
271
+ result = {"foo" => "bar"}
272
+ stub_request(:get, url).to_return(
273
+ :body => JSON.dump(result),
274
+ :status => 200,
275
+ :headers => {
276
+ "Cache-Control" => "no-cache",
277
+ "Expires" => (Time.now + 7 * 60).utc.httpdate
278
+ }
279
+ )
280
+
281
+ response_a = GdsApi::JsonClient.new.get_json(url)
282
+
283
+ Timecop.travel( 7 * 60 - 30) do # now + 6 mins 30 secs
284
+ response_b = GdsApi::JsonClient.new.get_json(url)
285
+
286
+ assert_requested :get, url, times: 2
287
+ assert_equal response_a.to_hash, response_b.to_hash
288
+ end
289
+ end
290
+
291
+ def test_should_fallback_to_expires_headers_if_cache_control_is_malformed
292
+ url = "http://some.endpoint/url.json"
293
+ result = {"foo" => "bar"}
294
+ stub_request(:get, url).to_return(
295
+ :body => JSON.dump(result),
296
+ :status => 200,
297
+ :headers => {
298
+ "Cache-Control" => "foo, bar, baz",
299
+ "Expires" => (Time.now + 7 * 60).utc.httpdate
300
+ }
301
+ )
302
+
303
+ response_a = GdsApi::JsonClient.new.get_json(url)
304
+
305
+ Timecop.travel( 7 * 60 - 30) do # now + 6 mins 30 secs
306
+ response_b = GdsApi::JsonClient.new.get_json(url)
307
+
308
+ assert_requested :get, url, times: 1
309
+ assert_equal response_a.to_hash, response_b.to_hash
310
+ end
311
+ end
312
+
205
313
  def test_should_raise_http_not_found_if_404_returned_from_endpoint
206
314
  url = "http://some.endpoint/some.json"
207
315
  stub_request(:get, url).to_return(:body => "{}", :status => 404)
@@ -10,6 +10,65 @@ describe GdsApi::NeedApi do
10
10
  @api = GdsApi::NeedApi.new(@base_api_url)
11
11
  end
12
12
 
13
+ describe "requesting needs" do
14
+ it "should return a list of all needs" do
15
+ req = need_api_has_needs([
16
+ {
17
+ "role" => "parent",
18
+ "goal" => "apply for a primary school place",
19
+ "benefit" => "my child can start school",
20
+ "organisation_ids" => ["department-for-education"],
21
+ "organisations" => [
22
+ {
23
+ "id" => "department-for-education",
24
+ "name" => "Department for Education",
25
+ }
26
+ ],
27
+ "justifications" => [
28
+ "it's something only government does",
29
+ "the government is legally obliged to provide it"
30
+ ],
31
+ "impact" => "Has serious consequences for the day-to-day lives of your users",
32
+ "met_when" => [
33
+ "The user applies for a school place"
34
+ ]
35
+ },
36
+ {
37
+ "role" => "user",
38
+ "goal" => "find out about becoming a British citizen",
39
+ "benefit" => "i can take the correct steps to apply for citizenship",
40
+ "organisation_ids" => ["home-office"],
41
+ "organisations" => [
42
+ {
43
+ "id" => "home-office",
44
+ "name" => "Home Office",
45
+ }
46
+ ],
47
+ "justifications" => [
48
+ "it's something only government does",
49
+ "the government is legally obliged to provide it"
50
+ ],
51
+ "impact" => "Has serious consequences for the day-to-day lives of your users",
52
+ "met_when" => [
53
+ "The user finds information about the citizenship test and the next steps"
54
+ ]
55
+ }
56
+ ])
57
+
58
+ needs = @api.needs
59
+
60
+ assert_requested(req)
61
+ assert_equal 2, needs.count
62
+
63
+ assert_equal ["parent", "user"], needs.map(&:role)
64
+ assert_equal ["apply for a primary school place", "find out about becoming a British citizen"], needs.map(&:goal)
65
+ assert_equal ["my child can start school", "i can take the correct steps to apply for citizenship"], needs.map(&:benefit)
66
+
67
+ assert_equal "department-for-education", needs.first.organisations.first.id
68
+ assert_equal "Department for Education", needs.first.organisations.first.name
69
+ end
70
+ end
71
+
13
72
  describe "creating needs" do
14
73
  it "should post to the right endpoint" do
15
74
  request_stub = stub_request(:post, @base_api_url + "/needs").with(
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gds-api-adapters
3
3
  version: !ruby/object:Gem::Version
4
- version: 7.11.0
4
+ version: 7.12.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-10-15 00:00:00.000000000 Z
12
+ date: 2013-10-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: plek
@@ -338,7 +338,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
338
338
  version: '0'
339
339
  segments:
340
340
  - 0
341
- hash: 759002302188755468
341
+ hash: -2562720960350177720
342
342
  required_rubygems_version: !ruby/object:Gem::Requirement
343
343
  none: false
344
344
  requirements:
@@ -347,7 +347,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
347
347
  version: '0'
348
348
  segments:
349
349
  - 0
350
- hash: 759002302188755468
350
+ hash: -2562720960350177720
351
351
  requirements: []
352
352
  rubyforge_project:
353
353
  rubygems_version: 1.8.23