gds-api-adapters 23.0.0 → 23.1.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.
- 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
|