gds-api-adapters 23.0.0 → 23.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/gds_api/test_helpers/publishing_api.rb +50 -15
- data/lib/gds_api/version.rb +1 -1
- data/test/test_helpers/publishing_api_test.rb +158 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd7b1a091da260080fb3bed10086d31c84e1708d
|
4
|
+
data.tar.gz: 1d82d8b9d6d16adae35fe3aa6dd602330a237f5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72c4bab7cb84d20997f1c1739c55939f113590a7d357721127d68df77fcc99568a37068edbebf4c56f381fd2e2018d4e2d1276b5a530fb30713ca923e27184af
|
7
|
+
data.tar.gz: 05b9bc994f6f69880135f722e67930673a2ad47735cff4d4aa1d1409f0732d94bc84acb089ced7049eadb78bd130dcb500dfd3d13126e5bf0e0f73a0caceb18c
|
@@ -43,37 +43,72 @@ module GdsApi
|
|
43
43
|
stub_request(:put, %r{\A#{PUBLISHING_API_ENDPOINT}/publish-intent})
|
44
44
|
end
|
45
45
|
|
46
|
-
def assert_publishing_api_put_item(base_path,
|
46
|
+
def assert_publishing_api_put_item(base_path, attributes_or_matcher = {}, times = 1)
|
47
47
|
url = PUBLISHING_API_ENDPOINT + "/content" + base_path
|
48
|
-
assert_publishing_api_put(url,
|
48
|
+
assert_publishing_api_put(url, attributes_or_matcher, times)
|
49
49
|
end
|
50
50
|
|
51
|
-
def assert_publishing_api_put_draft_item(base_path,
|
51
|
+
def assert_publishing_api_put_draft_item(base_path, attributes_or_matcher = {}, times = 1)
|
52
52
|
url = PUBLISHING_API_ENDPOINT + "/draft-content" + base_path
|
53
|
-
assert_publishing_api_put(url,
|
53
|
+
assert_publishing_api_put(url, attributes_or_matcher, times)
|
54
54
|
end
|
55
55
|
|
56
|
-
def assert_publishing_api_put_intent(base_path,
|
56
|
+
def assert_publishing_api_put_intent(base_path, attributes_or_matcher = {}, times = 1)
|
57
57
|
url = PUBLISHING_API_ENDPOINT + "/publish-intent" + base_path
|
58
|
-
assert_publishing_api_put(url,
|
58
|
+
assert_publishing_api_put(url, attributes_or_matcher, times)
|
59
59
|
end
|
60
60
|
|
61
|
-
def assert_publishing_api_put(url,
|
62
|
-
if
|
63
|
-
|
61
|
+
def assert_publishing_api_put(url, attributes_or_matcher = {}, times = 1)
|
62
|
+
if attributes_or_matcher.is_a?(Hash)
|
63
|
+
matcher = attributes_or_matcher.empty? ? nil : request_json_matching(attributes_or_matcher)
|
64
64
|
else
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
65
|
+
matcher = attributes_or_matcher
|
66
|
+
end
|
67
|
+
|
68
|
+
if matcher
|
69
|
+
assert_requested(:put, url, times: times, &matcher)
|
70
|
+
else
|
71
|
+
assert_requested(:put, url, times: times)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def request_json_matching(required_attributes)
|
76
|
+
->(request) do
|
77
|
+
data = JSON.parse(request.body)
|
78
|
+
required_attributes.to_a.all? { |key, value| data[key.to_s] == value }
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def request_json_including(required_attributes)
|
83
|
+
->(request) do
|
84
|
+
data = JSON.parse(request.body)
|
85
|
+
values_match_recursively(required_attributes, data)
|
71
86
|
end
|
72
87
|
end
|
73
88
|
|
74
89
|
def publishing_api_isnt_available
|
75
90
|
stub_request(:any, /#{PUBLISHING_API_ENDPOINT}\/.*/).to_return(:status => 503)
|
76
91
|
end
|
92
|
+
|
93
|
+
private
|
94
|
+
def values_match_recursively(expected_value, actual_value)
|
95
|
+
case expected_value
|
96
|
+
when Hash
|
97
|
+
return false unless actual_value.is_a?(Hash)
|
98
|
+
expected_value.all? do |expected_sub_key, expected_sub_value|
|
99
|
+
actual_value.has_key?(expected_sub_key.to_s) &&
|
100
|
+
values_match_recursively(expected_sub_value, actual_value[expected_sub_key.to_s])
|
101
|
+
end
|
102
|
+
when Array
|
103
|
+
return false unless actual_value.is_a?(Array)
|
104
|
+
return false unless actual_value.size == expected_value.size
|
105
|
+
expected_value.each.with_index.all? do |expected_sub_value, i|
|
106
|
+
values_match_recursively(expected_sub_value, actual_value[i])
|
107
|
+
end
|
108
|
+
else
|
109
|
+
expected_value == actual_value
|
110
|
+
end
|
111
|
+
end
|
77
112
|
end
|
78
113
|
end
|
79
114
|
end
|
data/lib/gds_api/version.rb
CHANGED
@@ -0,0 +1,158 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'gds_api/publishing_api'
|
3
|
+
require 'gds_api/test_helpers/publishing_api'
|
4
|
+
|
5
|
+
describe GdsApi::TestHelpers::PublishingApi do
|
6
|
+
include GdsApi::TestHelpers::PublishingApi
|
7
|
+
let(:base_api_url) { Plek.current.find("publishing-api") }
|
8
|
+
let(:publishing_api) { GdsApi::PublishingApi.new(base_api_url) }
|
9
|
+
|
10
|
+
describe "#assert_publishing_api_put_item" do
|
11
|
+
before { stub_default_publishing_api_put }
|
12
|
+
let(:base_path) { "/example" }
|
13
|
+
|
14
|
+
it "matches a put request with any empty attributes by default" do
|
15
|
+
publishing_api.put_content_item(base_path, {})
|
16
|
+
assert_publishing_api_put_item(base_path)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "matches a put request with any arbitrary attributes by default" do
|
20
|
+
random_attributes = Hash[10.times.map {|n| [Random.rand * 1_000_000_000_000, Random.rand * 1_000_000_000_000]}]
|
21
|
+
publishing_api.put_content_item(base_path, random_attributes)
|
22
|
+
assert_publishing_api_put_item(base_path)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "if attributes are specified, matches a request with at least those attributes" do
|
26
|
+
publishing_api.put_content_item(base_path, {"required_attribute" => 1, "extra_attrbibute" => 1})
|
27
|
+
assert_publishing_api_put_item(base_path, {"required_attribute" => 1})
|
28
|
+
end
|
29
|
+
|
30
|
+
it "matches using a custom request matcher" do
|
31
|
+
publishing_api.put_content_item(base_path, {})
|
32
|
+
matcher_was_called = false
|
33
|
+
matcher = ->(request) { matcher_was_called = true; true }
|
34
|
+
assert_publishing_api_put_item(base_path, matcher)
|
35
|
+
assert matcher_was_called, "matcher should have been called"
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#request_json_matching predicate' do
|
40
|
+
describe "nested required attribute" do
|
41
|
+
let(:matcher) { request_json_matching({"a" => {"b" => 1}}) }
|
42
|
+
|
43
|
+
it "matches a body with exact same nested hash strucure" do
|
44
|
+
assert matcher.call(stub("request", body: '{"a": {"b": 1}}'))
|
45
|
+
end
|
46
|
+
|
47
|
+
it "matches a body with exact same nested hash strucure and an extra attribute at the top level" do
|
48
|
+
assert matcher.call(stub("request", body: '{"a": {"b": 1}, "c": 3}'))
|
49
|
+
end
|
50
|
+
|
51
|
+
it "does not match a body where the inner hash has the required attribute and an extra one" do
|
52
|
+
refute matcher.call(stub("request", body: '{"a": {"b": 1, "c": 2}}'))
|
53
|
+
end
|
54
|
+
|
55
|
+
it "does not match a body where the inner hash has the required attribute with the wrong value" do
|
56
|
+
refute matcher.call(stub("request", body: '{"a": {"b": 0}}'))
|
57
|
+
end
|
58
|
+
|
59
|
+
it "does not match a body where the inner hash lacks the required attribute" do
|
60
|
+
refute matcher.call(stub("request", body: '{"a": {"c": 1}}'))
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "hash to match uses symbol keys" do
|
65
|
+
let(:matcher) { request_json_matching({a: 1}) }
|
66
|
+
|
67
|
+
it "matches a json body" do
|
68
|
+
assert matcher.call(stub("request", body: '{"a": 1}'))
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe '#request_json_including predicate' do
|
74
|
+
describe "no required attributes" do
|
75
|
+
let(:matcher) { request_json_including({}) }
|
76
|
+
|
77
|
+
it "matches an empty body" do
|
78
|
+
assert matcher.call(stub("request", body: "{}"))
|
79
|
+
end
|
80
|
+
|
81
|
+
it "matches a body with some attributes" do
|
82
|
+
assert matcher.call(stub("request", body: '{"a": 1}'))
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "one required attribute" do
|
87
|
+
let(:matcher) { request_json_including({"a" => 1}) }
|
88
|
+
|
89
|
+
it "does not match an empty body" do
|
90
|
+
refute matcher.call(stub("request", body: "{}"))
|
91
|
+
end
|
92
|
+
|
93
|
+
it "does not match a body with the required attribute if the value is different" do
|
94
|
+
refute matcher.call(stub("request", body: '{"a": 2}'))
|
95
|
+
end
|
96
|
+
|
97
|
+
it "matches a body with the required attribute and value" do
|
98
|
+
assert matcher.call(stub("request", body: '{"a": 1}'))
|
99
|
+
end
|
100
|
+
|
101
|
+
it "matches a body with the required attribute and value and extra attributes" do
|
102
|
+
assert matcher.call(stub("request", body: '{"a": 1, "b": 2}'))
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
describe "nested required attribute" do
|
107
|
+
let(:matcher) { request_json_including({"a" => {"b" => 1}}) }
|
108
|
+
|
109
|
+
it "matches a body with exact same nested hash strucure" do
|
110
|
+
assert matcher.call(stub("request", body: '{"a": {"b": 1}}'))
|
111
|
+
end
|
112
|
+
|
113
|
+
it "matches a body where the inner hash has the required attribute and an extra one" do
|
114
|
+
assert matcher.call(stub("request", body: '{"a": {"b": 1, "c": 2}}'))
|
115
|
+
end
|
116
|
+
|
117
|
+
it "does not match a body where the inner hash has the required attribute with the wrong value" do
|
118
|
+
refute matcher.call(stub("request", body: '{"a": {"b": 0}}'))
|
119
|
+
end
|
120
|
+
|
121
|
+
it "does not match a body where the inner hash lacks the required attribute" do
|
122
|
+
refute matcher.call(stub("request", body: '{"a": {"c": 1}}'))
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe "hash to match uses symbol keys" do
|
127
|
+
let(:matcher) { request_json_including({a: {b: 1}}) }
|
128
|
+
|
129
|
+
it "matches a json body" do
|
130
|
+
assert matcher.call(stub("request", body: '{"a": {"b": 1}}'))
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
describe "nested arrays" do
|
135
|
+
let(:matcher) { request_json_including({"a" => [1]}) }
|
136
|
+
|
137
|
+
it "matches a body with exact same inner array" do
|
138
|
+
assert matcher.call(stub("request", body: '{"a": [1]}'))
|
139
|
+
end
|
140
|
+
|
141
|
+
it "does not match a body with an array with extra elements" do
|
142
|
+
refute matcher.call(stub("request", body: '{"a": [1, 2]}'))
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe "hashes in nested arrays" do
|
147
|
+
let(:matcher) { request_json_including({"a" => [{"b" => 1}, 2]}) }
|
148
|
+
|
149
|
+
it "matches a body with exact same inner array" do
|
150
|
+
assert matcher.call(stub("request", body: '{"a": [{"b": 1}, 2]}'))
|
151
|
+
end
|
152
|
+
|
153
|
+
it "matches a body with an inner hash with extra elements" do
|
154
|
+
assert matcher.call(stub("request", body: '{"a": [{"b": 1, "c": 3}, 2]}'))
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
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: 23.
|
4
|
+
version: 23.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Stewart
|
@@ -381,6 +381,7 @@ files:
|
|
381
381
|
- test/support_test.rb
|
382
382
|
- test/test_helper.rb
|
383
383
|
- test/test_helpers/panopticon_test.rb
|
384
|
+
- test/test_helpers/publishing_api_test.rb
|
384
385
|
- test/whitehall_admin_api_test.rb
|
385
386
|
- test/worldwide_api_test.rb
|
386
387
|
homepage: http://github.com/alphagov/gds-api-adapters
|
@@ -418,6 +419,7 @@ test_files:
|
|
418
419
|
- test/support_test.rb
|
419
420
|
- test/content_register_test.rb
|
420
421
|
- test/fact_cave_test.rb
|
422
|
+
- test/test_helpers/publishing_api_test.rb
|
421
423
|
- test/test_helpers/panopticon_test.rb
|
422
424
|
- test/licence_application_api_test.rb
|
423
425
|
- test/gov_uk_delivery_test.rb
|