gds-api-adapters 59.1.0 → 59.2.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.rb +6 -3
- data/lib/gds_api/base.rb +9 -8
- data/lib/gds_api/rummager.rb +3 -180
- data/lib/gds_api/search.rb +184 -0
- data/lib/gds_api/test_helpers/rummager.rb +42 -150
- data/lib/gds_api/test_helpers/search.rb +192 -0
- data/lib/gds_api/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec24c3b59b3cc1db154edf2b009ef223651a1530067b85931e11201f993276c5
|
4
|
+
data.tar.gz: e3b9c3fa2dab1c6741049a91175290b7277c4630bcc958621ac8f47412f35d12
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cd38630932fd7eee080846734651f34147924e43cbffdf53636e111c9649ff292fe7ee930f0a4496a4a75c341887246cd564c9d6dc4e38754d13e942685a79df
|
7
|
+
data.tar.gz: fb37484a2789b2a2f0c90faf6fa9f1cd1f45f9011ace188980687555f72141cc1fe9f024f73a758a1ad512f3b6796c341f82920747e0e4f120f0d95f47aa6dfe
|
data/lib/gds_api.rb
CHANGED
@@ -14,6 +14,7 @@ require 'gds_api/publishing_api'
|
|
14
14
|
require 'gds_api/publishing_api_v2'
|
15
15
|
require 'gds_api/router'
|
16
16
|
require 'gds_api/rummager'
|
17
|
+
require 'gds_api/search'
|
17
18
|
require 'gds_api/support'
|
18
19
|
require 'gds_api/support_api'
|
19
20
|
require 'gds_api/worldwide'
|
@@ -168,14 +169,16 @@ module GdsApi
|
|
168
169
|
#
|
169
170
|
# @return [GdsApi::Rummager]
|
170
171
|
def self.rummager(options = {})
|
172
|
+
warn "GdsApi.rummager is deprecated. Use GdsApi.search instead."
|
173
|
+
|
171
174
|
GdsApi::Rummager.new(Plek.find('search'), options)
|
172
175
|
end
|
173
176
|
|
174
|
-
# Creates a GdsApi::
|
177
|
+
# Creates a GdsApi::Search adapter to access via a search.* hostname
|
175
178
|
#
|
176
|
-
# @return [GdsApi::
|
179
|
+
# @return [GdsApi::Search]
|
177
180
|
def self.search(options = {})
|
178
|
-
GdsApi::
|
181
|
+
GdsApi::Search.new(Plek.find('search'), options)
|
179
182
|
end
|
180
183
|
|
181
184
|
# Creates a GdsApi::Support adapter
|
data/lib/gds_api/base.rb
CHANGED
@@ -18,14 +18,15 @@ class GdsApi::Base
|
|
18
18
|
GdsApi::JsonClient.new(options)
|
19
19
|
end
|
20
20
|
|
21
|
-
def_delegators :client,
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
21
|
+
def_delegators :client,
|
22
|
+
:get_json,
|
23
|
+
:post_json,
|
24
|
+
:put_json,
|
25
|
+
:patch_json,
|
26
|
+
:delete_json,
|
27
|
+
:get_raw, :get_raw!,
|
28
|
+
:put_multipart,
|
29
|
+
:post_multipart
|
29
30
|
|
30
31
|
attr_reader :options
|
31
32
|
|
data/lib/gds_api/rummager.rb
CHANGED
@@ -1,184 +1,7 @@
|
|
1
|
-
require 'gds_api/
|
2
|
-
require 'rack/utils'
|
1
|
+
require 'gds_api/search'
|
3
2
|
|
4
3
|
module GdsApi
|
5
|
-
|
6
|
-
|
7
|
-
# @api documented
|
8
|
-
class V1 < SimpleDelegator
|
9
|
-
def add_document(type, id, document)
|
10
|
-
post_json(
|
11
|
-
documents_url,
|
12
|
-
document.merge(
|
13
|
-
_type: type,
|
14
|
-
_id: id,
|
15
|
-
)
|
16
|
-
)
|
17
|
-
end
|
18
|
-
|
19
|
-
def delete_document(type, id)
|
20
|
-
delete_json(
|
21
|
-
"#{documents_url}/#{id}",
|
22
|
-
nil,
|
23
|
-
_type: type,
|
24
|
-
)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# @api documented
|
29
|
-
class V2 < SimpleDelegator
|
30
|
-
class InvalidIndex < StandardError; end
|
31
|
-
|
32
|
-
def add_document(id, document, index_name)
|
33
|
-
raise(InvalidIndex, index_name) unless index_name == 'metasearch'
|
34
|
-
|
35
|
-
post_json(
|
36
|
-
"#{base_url}/v2/metasearch/documents",
|
37
|
-
document.merge(
|
38
|
-
_id: id,
|
39
|
-
)
|
40
|
-
)
|
41
|
-
end
|
42
|
-
|
43
|
-
def delete_document(id, index_name)
|
44
|
-
raise(InvalidIndex, index_name) unless index_name == 'metasearch'
|
45
|
-
|
46
|
-
delete_json("#{base_url}/v2/metasearch/documents/#{id}")
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
DEFAULT_API_VERSION = 'V1'.freeze
|
51
|
-
API_VERSIONS = {
|
52
|
-
'V1' => GdsApi::Rummager::V1,
|
53
|
-
'V2' => GdsApi::Rummager::V2,
|
54
|
-
}.freeze
|
55
|
-
class UnknownAPIVersion < StandardError; end
|
56
|
-
|
57
|
-
def initialize(endpoint_url, options = {})
|
58
|
-
super
|
59
|
-
# The API version provides a simple wrapper around this base class so that we
|
60
|
-
# can still access the shared methods present in this class.
|
61
|
-
version = options.fetch(:api_version, DEFAULT_API_VERSION)
|
62
|
-
api_class = API_VERSIONS[version] || raise(UnknownAPIVersion)
|
63
|
-
@api = api_class.new(self)
|
64
|
-
end
|
65
|
-
|
66
|
-
# Perform a search.
|
67
|
-
#
|
68
|
-
# @param args [Hash] A valid search query. See Rummager documentation for options.
|
69
|
-
#
|
70
|
-
# @see https://github.com/alphagov/rummager/blob/master/doc/search-api.md
|
71
|
-
def search(args, additional_headers = {})
|
72
|
-
request_url = "#{base_url}/search.json?#{Rack::Utils.build_nested_query(args)}"
|
73
|
-
get_json(request_url, additional_headers)
|
74
|
-
end
|
75
|
-
|
76
|
-
# Perform a batch search.
|
77
|
-
#
|
78
|
-
# @param searches [Array] An array valid search queries. Maximum of 6. See Rummager documentation for options.
|
79
|
-
#
|
80
|
-
# # @see https://github.com/alphagov/rummager/blob/master/doc/search-api.md
|
81
|
-
def batch_search(searches, additional_headers = {})
|
82
|
-
url_friendly_searches = searches.each_with_index.map do |search, index|
|
83
|
-
{ index => search }
|
84
|
-
end
|
85
|
-
searches_query = { search: url_friendly_searches }
|
86
|
-
request_url = "#{base_url}/batch_search.json?#{Rack::Utils.build_nested_query(searches_query)}"
|
87
|
-
get_json(request_url, additional_headers)
|
88
|
-
end
|
89
|
-
|
90
|
-
# Perform a search, returning the results as an enumerator.
|
91
|
-
#
|
92
|
-
# The enumerator abstracts away rummager's pagination and fetches new pages when
|
93
|
-
# necessary.
|
94
|
-
#
|
95
|
-
# @param args [Hash] A valid search query. See Rummager documentation for options.
|
96
|
-
# @param page_size [Integer] Number of results in each page.
|
97
|
-
#
|
98
|
-
# @see https://github.com/alphagov/rummager/blob/master/doc/search-api.md
|
99
|
-
def search_enum(args, page_size: 100, additional_headers: {})
|
100
|
-
Enumerator.new do |yielder|
|
101
|
-
(0..Float::INFINITY).step(page_size).each do |index|
|
102
|
-
search_params = args.merge(start: index.to_i, count: page_size)
|
103
|
-
results = search(search_params, additional_headers).to_h.fetch('results', [])
|
104
|
-
results.each do |result|
|
105
|
-
yielder << result
|
106
|
-
end
|
107
|
-
if results.count < page_size
|
108
|
-
break
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
# Advanced search.
|
115
|
-
#
|
116
|
-
# @deprecated Only in use by Whitehall. Use the `#search` method.
|
117
|
-
def advanced_search(args)
|
118
|
-
raise ArgumentError.new("Args cannot be blank") if args.nil? || args.empty?
|
119
|
-
|
120
|
-
request_path = "#{base_url}/advanced_search?#{Rack::Utils.build_nested_query(args)}"
|
121
|
-
get_json(request_path)
|
122
|
-
end
|
123
|
-
|
124
|
-
# Add a document to the search index.
|
125
|
-
#
|
126
|
-
# @param type [String] The rummager/elasticsearch document type.
|
127
|
-
# @param id [String] The rummager/elasticsearch id. Typically the same as the `link` field, but this is not strictly enforced.
|
128
|
-
# @param document [Hash] The document to add. Must match the rummager schema matchin the `type` parameter and contain a `link` field.
|
129
|
-
# @param index_name (V2 only) Name of the index to be deleted from on
|
130
|
-
# GOV.UK - we only allow deletion from metasearch
|
131
|
-
# @return [GdsApi::Response] A status code of 202 indicates the document has been successfully queued.
|
132
|
-
#
|
133
|
-
# @see https://github.com/alphagov/rummager/blob/master/doc/documents.md
|
134
|
-
def add_document(*args)
|
135
|
-
@api.add_document(*args)
|
136
|
-
end
|
137
|
-
|
138
|
-
# Delete a content-document from the index by base path.
|
139
|
-
#
|
140
|
-
# Content documents are pages on GOV.UK that have a base path and are
|
141
|
-
# returned in searches. This excludes best bets, recommended-links,
|
142
|
-
# and contacts, which may be deleted with `delete_document`.
|
143
|
-
#
|
144
|
-
# @param base_path Base path of the page on GOV.UK.
|
145
|
-
# @see https://github.com/alphagov/rummager/blob/master/doc/content-api.md
|
146
|
-
def delete_content(base_path)
|
147
|
-
request_url = "#{base_url}/content?link=#{base_path}"
|
148
|
-
delete_json(request_url)
|
149
|
-
end
|
150
|
-
|
151
|
-
# Retrieve a content-document from the index.
|
152
|
-
#
|
153
|
-
# Content documents are pages on GOV.UK that have a base path and are
|
154
|
-
# returned in searches. This excludes best bets, recommended-links,
|
155
|
-
# and contacts.
|
156
|
-
#
|
157
|
-
# @param base_path [String] Base path of the page on GOV.UK.
|
158
|
-
# @see https://github.com/alphagov/rummager/blob/master/doc/content-api.md
|
159
|
-
def get_content(base_path)
|
160
|
-
request_url = "#{base_url}/content?link=#{base_path}"
|
161
|
-
get_json(request_url)
|
162
|
-
end
|
163
|
-
|
164
|
-
# Delete a non-content document from the search index.
|
165
|
-
#
|
166
|
-
# For example, best bets, recommended links, or contacts.
|
167
|
-
#
|
168
|
-
# @param type [String] The rummager/elasticsearch document type.
|
169
|
-
# @param id [String] The rummager/elasticsearch id. Typically the same as the `link` field.
|
170
|
-
# @param index_name (V2 only) Name of the index to be deleted from on
|
171
|
-
# GOV.UK - we only allow deletion from metasearch
|
172
|
-
def delete_document(*args)
|
173
|
-
@api.delete_document(*args)
|
174
|
-
end
|
175
|
-
|
176
|
-
def base_url
|
177
|
-
endpoint
|
178
|
-
end
|
179
|
-
|
180
|
-
def documents_url
|
181
|
-
"#{base_url}/documents"
|
182
|
-
end
|
4
|
+
class Rummager < Search
|
5
|
+
warn "GdsApi::Rummager is deprecated. Use GdsApi::Search instead."
|
183
6
|
end
|
184
7
|
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
require 'gds_api/base'
|
2
|
+
require 'rack/utils'
|
3
|
+
|
4
|
+
module GdsApi
|
5
|
+
# @api documented
|
6
|
+
class Search < Base
|
7
|
+
# @api documented
|
8
|
+
class V1 < SimpleDelegator
|
9
|
+
def add_document(type, id, document)
|
10
|
+
post_json(
|
11
|
+
documents_url,
|
12
|
+
document.merge(
|
13
|
+
_type: type,
|
14
|
+
_id: id,
|
15
|
+
)
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
19
|
+
def delete_document(type, id)
|
20
|
+
delete_json(
|
21
|
+
"#{documents_url}/#{id}",
|
22
|
+
nil,
|
23
|
+
_type: type,
|
24
|
+
)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# @api documented
|
29
|
+
class V2 < SimpleDelegator
|
30
|
+
class InvalidIndex < StandardError; end
|
31
|
+
|
32
|
+
def add_document(id, document, index_name)
|
33
|
+
raise(InvalidIndex, index_name) unless index_name == 'metasearch'
|
34
|
+
|
35
|
+
post_json(
|
36
|
+
"#{base_url}/v2/metasearch/documents",
|
37
|
+
document.merge(
|
38
|
+
_id: id,
|
39
|
+
)
|
40
|
+
)
|
41
|
+
end
|
42
|
+
|
43
|
+
def delete_document(id, index_name)
|
44
|
+
raise(InvalidIndex, index_name) unless index_name == 'metasearch'
|
45
|
+
|
46
|
+
delete_json("#{base_url}/v2/metasearch/documents/#{id}")
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
DEFAULT_API_VERSION = 'V1'.freeze
|
51
|
+
API_VERSIONS = {
|
52
|
+
'V1' => GdsApi::Search::V1,
|
53
|
+
'V2' => GdsApi::Search::V2,
|
54
|
+
}.freeze
|
55
|
+
class UnknownAPIVersion < StandardError; end
|
56
|
+
|
57
|
+
def initialize(endpoint_url, options = {})
|
58
|
+
super
|
59
|
+
# The API version provides a simple wrapper around this base class so that we
|
60
|
+
# can still access the shared methods present in this class.
|
61
|
+
version = options.fetch(:api_version, DEFAULT_API_VERSION)
|
62
|
+
api_class = API_VERSIONS[version] || raise(UnknownAPIVersion)
|
63
|
+
@api = api_class.new(self)
|
64
|
+
end
|
65
|
+
|
66
|
+
# Perform a search.
|
67
|
+
#
|
68
|
+
# @param args [Hash] A valid search query. See search-api documentation for options.
|
69
|
+
#
|
70
|
+
# @see https://github.com/alphagov/search-api/blob/master/doc/search-api.md
|
71
|
+
def search(args, additional_headers = {})
|
72
|
+
request_url = "#{base_url}/search.json?#{Rack::Utils.build_nested_query(args)}"
|
73
|
+
get_json(request_url, additional_headers)
|
74
|
+
end
|
75
|
+
|
76
|
+
# Perform a batch search.
|
77
|
+
#
|
78
|
+
# @param searches [Array] An array valid search queries. Maximum of 6. See search-api documentation for options.
|
79
|
+
#
|
80
|
+
# # @see https://github.com/alphagov/search-api/blob/master/doc/search-api.md
|
81
|
+
def batch_search(searches, additional_headers = {})
|
82
|
+
url_friendly_searches = searches.each_with_index.map do |search, index|
|
83
|
+
{ index => search }
|
84
|
+
end
|
85
|
+
searches_query = { search: url_friendly_searches }
|
86
|
+
request_url = "#{base_url}/batch_search.json?#{Rack::Utils.build_nested_query(searches_query)}"
|
87
|
+
get_json(request_url, additional_headers)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Perform a search, returning the results as an enumerator.
|
91
|
+
#
|
92
|
+
# The enumerator abstracts away search-api's pagination and fetches new pages when
|
93
|
+
# necessary.
|
94
|
+
#
|
95
|
+
# @param args [Hash] A valid search query. See search-api documentation for options.
|
96
|
+
# @param page_size [Integer] Number of results in each page.
|
97
|
+
#
|
98
|
+
# @see https://github.com/alphagov/search-api/blob/master/doc/search-api.md
|
99
|
+
def search_enum(args, page_size: 100, additional_headers: {})
|
100
|
+
Enumerator.new do |yielder|
|
101
|
+
(0..Float::INFINITY).step(page_size).each do |index|
|
102
|
+
search_params = args.merge(start: index.to_i, count: page_size)
|
103
|
+
results = search(search_params, additional_headers).to_h.fetch('results', [])
|
104
|
+
results.each do |result|
|
105
|
+
yielder << result
|
106
|
+
end
|
107
|
+
if results.count < page_size
|
108
|
+
break
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Advanced search.
|
115
|
+
#
|
116
|
+
# @deprecated Only in use by Whitehall. Use the `#search` method.
|
117
|
+
def advanced_search(args)
|
118
|
+
raise ArgumentError.new("Args cannot be blank") if args.nil? || args.empty?
|
119
|
+
|
120
|
+
request_path = "#{base_url}/advanced_search?#{Rack::Utils.build_nested_query(args)}"
|
121
|
+
get_json(request_path)
|
122
|
+
end
|
123
|
+
|
124
|
+
# Add a document to the search index.
|
125
|
+
#
|
126
|
+
# @param type [String] The search-api document type.
|
127
|
+
# @param id [String] The search-api/elasticsearch id. Typically the same as the `link` field, but this is not strictly enforced.
|
128
|
+
# @param document [Hash] The document to add. Must match the search-api schema matching the `type` parameter and contain a `link` field.
|
129
|
+
# @param index_name (V2 only) Name of the index to be deleted from on
|
130
|
+
# GOV.UK - we only allow deletion from metasearch
|
131
|
+
# @return [GdsApi::Response] A status code of 202 indicates the document has been successfully queued.
|
132
|
+
#
|
133
|
+
# @see https://github.com/alphagov/search-api/blob/master/doc/documents.md
|
134
|
+
def add_document(*args)
|
135
|
+
@api.add_document(*args)
|
136
|
+
end
|
137
|
+
|
138
|
+
# Delete a content-document from the index by base path.
|
139
|
+
#
|
140
|
+
# Content documents are pages on GOV.UK that have a base path and are
|
141
|
+
# returned in searches. This excludes best bets, recommended-links,
|
142
|
+
# and contacts, which may be deleted with `delete_document`.
|
143
|
+
#
|
144
|
+
# @param base_path Base path of the page on GOV.UK.
|
145
|
+
# @see https://github.com/alphagov/search-api/blob/master/doc/content-api.md
|
146
|
+
def delete_content(base_path)
|
147
|
+
request_url = "#{base_url}/content?link=#{base_path}"
|
148
|
+
delete_json(request_url)
|
149
|
+
end
|
150
|
+
|
151
|
+
# Retrieve a content-document from the index.
|
152
|
+
#
|
153
|
+
# Content documents are pages on GOV.UK that have a base path and are
|
154
|
+
# returned in searches. This excludes best bets, recommended-links,
|
155
|
+
# and contacts.
|
156
|
+
#
|
157
|
+
# @param base_path [String] Base path of the page on GOV.UK.
|
158
|
+
# @see https://github.com/alphagov/search-api/blob/master/doc/content-api.md
|
159
|
+
def get_content(base_path)
|
160
|
+
request_url = "#{base_url}/content?link=#{base_path}"
|
161
|
+
get_json(request_url)
|
162
|
+
end
|
163
|
+
|
164
|
+
# Delete a non-content document from the search index.
|
165
|
+
#
|
166
|
+
# For example, best bets, recommended links, or contacts.
|
167
|
+
#
|
168
|
+
# @param type [String] The search-api document type.
|
169
|
+
# @param id [String] The search-api/elasticsearch id. Typically the same as the `link` field.
|
170
|
+
# @param index_name (V2 only) Name of the index to be deleted from on
|
171
|
+
# GOV.UK - we only allow deletion from metasearch
|
172
|
+
def delete_document(*args)
|
173
|
+
@api.delete_document(*args)
|
174
|
+
end
|
175
|
+
|
176
|
+
def base_url
|
177
|
+
endpoint
|
178
|
+
end
|
179
|
+
|
180
|
+
def documents_url
|
181
|
+
"#{base_url}/documents"
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|
@@ -1,198 +1,90 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'gds_api/test_helpers/json_client_helper'
|
3
|
+
require 'gds_api/test_helpers/search'
|
3
4
|
|
4
5
|
module GdsApi
|
5
6
|
module TestHelpers
|
6
7
|
module Rummager
|
7
|
-
|
8
|
+
warn "GdsApi::TestHelpers::Rummager is deprecated. Use GdsApi::TestHelpers::Search instead."
|
8
9
|
|
9
|
-
|
10
|
-
if index
|
11
|
-
stub_request(:post, %r{#{RUMMAGER_ENDPOINT}/#{index}/documents})
|
12
|
-
.to_return(status: [202, "Accepted"])
|
13
|
-
else
|
14
|
-
stub_request(:post, %r{#{RUMMAGER_ENDPOINT}/documents})
|
15
|
-
.to_return(status: [202, "Accepted"])
|
16
|
-
end
|
17
|
-
end
|
10
|
+
include GdsApi::TestHelpers::Search
|
18
11
|
|
19
|
-
|
20
|
-
if index
|
21
|
-
url = RUMMAGER_ENDPOINT + "/#{index}/documents"
|
22
|
-
else
|
23
|
-
url = RUMMAGER_ENDPOINT + "/documents"
|
24
|
-
end
|
12
|
+
RUMMAGER_ENDPOINT = SEARCH_ENDPOINT
|
25
13
|
|
26
|
-
|
27
|
-
|
28
|
-
attributes.to_a.all? do |key, value|
|
29
|
-
data[key.to_s] == value
|
30
|
-
end
|
31
|
-
end
|
14
|
+
def stub_any_rummager_post(*args)
|
15
|
+
stub_any_search_post(*args)
|
32
16
|
end
|
33
17
|
|
34
|
-
def
|
35
|
-
|
18
|
+
def assert_rummager_posted_item(*args)
|
19
|
+
assert_search_posted_item(*args)
|
36
20
|
end
|
37
21
|
|
38
|
-
def
|
39
|
-
|
22
|
+
def stub_any_rummager_search(*args)
|
23
|
+
stub_any_search(*args)
|
40
24
|
end
|
41
25
|
|
42
|
-
def
|
43
|
-
|
26
|
+
def stub_any_rummager_search_to_return_no_results(*args)
|
27
|
+
stub_any_search_to_return_no_results(*args)
|
44
28
|
end
|
45
29
|
|
46
|
-
def
|
47
|
-
|
48
|
-
stub_request(:delete, %r{#{RUMMAGER_ENDPOINT}/#{index}/documents/.*})
|
49
|
-
else
|
50
|
-
# use rummager's default index
|
51
|
-
stub_request(:delete, %r{#{RUMMAGER_ENDPOINT}/documents/.*})
|
52
|
-
end
|
30
|
+
def assert_rummager_search(*args)
|
31
|
+
assert_search(*args)
|
53
32
|
end
|
54
33
|
|
55
|
-
def
|
56
|
-
|
34
|
+
def stub_any_rummager_delete(*args)
|
35
|
+
stub_any_search_delete(*args)
|
57
36
|
end
|
58
37
|
|
59
|
-
def
|
60
|
-
|
61
|
-
raise ArgumentError, 'Rummager id must not start with a slash'
|
62
|
-
end
|
63
|
-
|
64
|
-
if index
|
65
|
-
assert_requested(
|
66
|
-
:delete,
|
67
|
-
%r{#{RUMMAGER_ENDPOINT}/#{index}/documents/#{id}},
|
68
|
-
**options
|
69
|
-
)
|
70
|
-
else
|
71
|
-
assert_requested(
|
72
|
-
:delete,
|
73
|
-
%r{#{RUMMAGER_ENDPOINT}/documents/#{id}},
|
74
|
-
**options
|
75
|
-
)
|
76
|
-
end
|
38
|
+
def stub_any_rummager_delete_content(*args)
|
39
|
+
stub_any_search_delete_content(*args)
|
77
40
|
end
|
78
41
|
|
79
|
-
def
|
80
|
-
|
81
|
-
:delete,
|
82
|
-
%r{#{RUMMAGER_ENDPOINT}/content.*#{base_path}},
|
83
|
-
**options
|
84
|
-
)
|
42
|
+
def assert_rummager_deleted_item(*args)
|
43
|
+
assert_search_deleted_item(*args)
|
85
44
|
end
|
86
45
|
|
87
|
-
def
|
88
|
-
|
89
|
-
run_example_query
|
46
|
+
def assert_rummager_deleted_content(*args)
|
47
|
+
assert_search_deleted_content(*args)
|
90
48
|
end
|
91
49
|
|
92
|
-
def
|
93
|
-
|
94
|
-
run_example_query
|
50
|
+
def stub_rummager_has_services_and_info_data_for_organisation(*args)
|
51
|
+
stub_search_has_services_and_info_data_for_organisation(*args)
|
95
52
|
end
|
96
53
|
|
97
|
-
def
|
98
|
-
|
99
|
-
run_example_query
|
54
|
+
def stub_rummager_has_no_services_and_info_data_for_organisation(*args)
|
55
|
+
stub_search_has_no_services_and_info_data_for_organisation(*args)
|
100
56
|
end
|
101
57
|
|
102
|
-
def
|
103
|
-
|
104
|
-
.to_return(body: no_search_results_found)
|
58
|
+
def stub_rummager_has_specialist_sector_organisations(*args)
|
59
|
+
stub_rummager_has_specialist_sector_organisations(*args)
|
105
60
|
end
|
106
61
|
|
107
|
-
def
|
108
|
-
|
109
|
-
stub_request(:get, %r{/search.json.*count=#{options[:count]}.*})
|
110
|
-
.to_return(body: first_n_results(new_policies_results, n: options[:count]))
|
111
|
-
else
|
112
|
-
stub_request(:get, %r{/search.json})
|
113
|
-
.to_return(body: new_policies_results)
|
114
|
-
end
|
62
|
+
def stub_rummager_has_no_policies_for_any_type(*args)
|
63
|
+
stub_search_has_no_policies_for_any_type(*args)
|
115
64
|
end
|
116
65
|
|
117
|
-
|
118
|
-
|
119
|
-
alias_method :rummager_has_no_services_and_info_data_for_organisation, :stub_rummager_has_no_services_and_info_data_for_organisation
|
120
|
-
alias_method :rummager_has_specialist_sector_organisations, :stub_rummager_has_specialist_sector_organisations
|
121
|
-
alias_method :rummager_has_no_policies_for_any_type, :stub_rummager_has_no_policies_for_any_type
|
122
|
-
alias_method :rummager_has_policies_for_every_type, :stub_rummager_has_policies_for_every_type
|
123
|
-
|
124
|
-
private
|
125
|
-
|
126
|
-
def stub_request_for(result_set)
|
127
|
-
stub_request(:get, /example.com\/search/).to_return(body: result_set)
|
66
|
+
def stub_rummager_has_policies_for_every_type(*args)
|
67
|
+
stub_search_has_policies_for_every_type(*args)
|
128
68
|
end
|
129
69
|
|
130
|
-
def
|
131
|
-
|
70
|
+
def rummager_has_services_and_info_data_for_organisation(*args)
|
71
|
+
stub_rummager_has_services_and_info_data_for_organisation(*args)
|
132
72
|
end
|
133
73
|
|
134
|
-
def
|
135
|
-
|
136
|
-
File.expand_path(
|
137
|
-
"../../../test/fixtures/services_and_info_fixture.json",
|
138
|
-
__dir__
|
139
|
-
)
|
140
|
-
)
|
74
|
+
def rummager_has_no_services_and_info_data_for_organisation(*args)
|
75
|
+
stub_rummager_has_no_services_and_info_data_for_organisation(*args)
|
141
76
|
end
|
142
77
|
|
143
|
-
def
|
144
|
-
|
145
|
-
File.expand_path(
|
146
|
-
"../../../test/fixtures/no_services_and_info_data_found_fixture.json",
|
147
|
-
__dir__
|
148
|
-
)
|
149
|
-
)
|
150
|
-
end
|
151
|
-
|
152
|
-
def sub_sector_organisations_results
|
153
|
-
File.read(
|
154
|
-
File.expand_path(
|
155
|
-
"../../../test/fixtures/sub_sector_organisations.json",
|
156
|
-
__dir__
|
157
|
-
)
|
158
|
-
)
|
159
|
-
end
|
160
|
-
|
161
|
-
def new_policies_results
|
162
|
-
File.read(
|
163
|
-
File.expand_path(
|
164
|
-
"../../../test/fixtures/new_policies_for_dwp.json",
|
165
|
-
__dir__
|
166
|
-
)
|
167
|
-
)
|
168
|
-
end
|
169
|
-
|
170
|
-
def old_policies_results
|
171
|
-
File.read(
|
172
|
-
File.expand_path(
|
173
|
-
"../../../test/fixtures/old_policies_for_dwp.json",
|
174
|
-
__dir__
|
175
|
-
)
|
176
|
-
)
|
177
|
-
end
|
178
|
-
|
179
|
-
def first_n_results(results, options)
|
180
|
-
n = options[:n]
|
181
|
-
results = JSON.parse(results)
|
182
|
-
results["results"] = results["results"][0...n]
|
183
|
-
|
184
|
-
results.to_json
|
78
|
+
def rummager_has_specialist_sector_organisations(*args)
|
79
|
+
stub_rummager_has_specialist_sector_organisations(*args)
|
185
80
|
end
|
186
81
|
|
187
|
-
def
|
188
|
-
|
82
|
+
def rummager_has_no_policies_for_any_type(*args)
|
83
|
+
stub_rummager_has_no_policies_for_any_type(*args)
|
189
84
|
end
|
190
85
|
|
191
|
-
def
|
192
|
-
|
193
|
-
filter_organisations: ["an-organisation-slug"],
|
194
|
-
facet_specialist_sectors: "1000,examples:4,example_scope:global,order:value.title"
|
195
|
-
}
|
86
|
+
def rummager_has_policies_for_every_type(*args)
|
87
|
+
stub_rummager_has_policies_for_every_type(*args)
|
196
88
|
end
|
197
89
|
end
|
198
90
|
end
|
@@ -0,0 +1,192 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'gds_api/test_helpers/json_client_helper'
|
3
|
+
|
4
|
+
module GdsApi
|
5
|
+
module TestHelpers
|
6
|
+
module Search
|
7
|
+
SEARCH_ENDPOINT = Plek.current.find('search')
|
8
|
+
|
9
|
+
def stub_any_search_post(index: nil)
|
10
|
+
if index
|
11
|
+
stub_request(:post, %r{#{SEARCH_ENDPOINT}/#{index}/documents})
|
12
|
+
.to_return(status: [202, "Accepted"])
|
13
|
+
else
|
14
|
+
stub_request(:post, %r{#{SEARCH_ENDPOINT}/documents})
|
15
|
+
.to_return(status: [202, "Accepted"])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def assert_search_posted_item(attributes, index: nil, **options)
|
20
|
+
if index
|
21
|
+
url = SEARCH_ENDPOINT + "/#{index}/documents"
|
22
|
+
else
|
23
|
+
url = SEARCH_ENDPOINT + "/documents"
|
24
|
+
end
|
25
|
+
|
26
|
+
assert_requested(:post, url, **options) do |req|
|
27
|
+
data = JSON.parse(req.body)
|
28
|
+
attributes.to_a.all? do |key, value|
|
29
|
+
data[key.to_s] == value
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def stub_any_search
|
35
|
+
stub_request(:get, %r{#{SEARCH_ENDPOINT}/search.json})
|
36
|
+
end
|
37
|
+
|
38
|
+
def stub_any_search_to_return_no_results
|
39
|
+
stub_any_search.to_return(body: { results: [] }.to_json)
|
40
|
+
end
|
41
|
+
|
42
|
+
def assert_search(options)
|
43
|
+
assert_requested :get, "#{SEARCH_ENDPOINT}/search.json", **options
|
44
|
+
end
|
45
|
+
|
46
|
+
def stub_any_search_delete(index: nil)
|
47
|
+
if index
|
48
|
+
stub_request(:delete, %r{#{SEARCH_ENDPOINT}/#{index}/documents/.*})
|
49
|
+
else
|
50
|
+
# use search-api's default index
|
51
|
+
stub_request(:delete, %r{#{SEARCH_ENDPOINT}/documents/.*})
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def stub_any_search_delete_content
|
56
|
+
stub_request(:delete, %r{#{SEARCH_ENDPOINT}/content.*})
|
57
|
+
end
|
58
|
+
|
59
|
+
def assert_search_deleted_item(id, index: nil, **options)
|
60
|
+
if id =~ %r{^/}
|
61
|
+
raise ArgumentError, 'Search id must not start with a slash'
|
62
|
+
end
|
63
|
+
|
64
|
+
if index
|
65
|
+
assert_requested(
|
66
|
+
:delete,
|
67
|
+
%r{#{SEARCH_ENDPOINT}/#{index}/documents/#{id}},
|
68
|
+
**options
|
69
|
+
)
|
70
|
+
else
|
71
|
+
assert_requested(
|
72
|
+
:delete,
|
73
|
+
%r{#{SEARCH_ENDPOINT}/documents/#{id}},
|
74
|
+
**options
|
75
|
+
)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def assert_search_deleted_content(base_path, **options)
|
80
|
+
assert_requested(
|
81
|
+
:delete,
|
82
|
+
%r{#{SEARCH_ENDPOINT}/content.*#{base_path}},
|
83
|
+
**options
|
84
|
+
)
|
85
|
+
end
|
86
|
+
|
87
|
+
def stub_search_has_services_and_info_data_for_organisation
|
88
|
+
stub_request_for(search_results_found)
|
89
|
+
run_example_query
|
90
|
+
end
|
91
|
+
|
92
|
+
def stub_search_has_no_services_and_info_data_for_organisation
|
93
|
+
stub_request_for(no_search_results_found)
|
94
|
+
run_example_query
|
95
|
+
end
|
96
|
+
|
97
|
+
def stub_search_has_specialist_sector_organisations(_sub_sector)
|
98
|
+
stub_request_for(sub_sector_organisations_results)
|
99
|
+
run_example_query
|
100
|
+
end
|
101
|
+
|
102
|
+
def stub_search_has_no_policies_for_any_type
|
103
|
+
stub_request(:get, %r{/search.json})
|
104
|
+
.to_return(body: no_search_results_found)
|
105
|
+
end
|
106
|
+
|
107
|
+
def stub_search_has_policies_for_every_type(options = {})
|
108
|
+
if options[:count]
|
109
|
+
stub_request(:get, %r{/search.json.*count=#{options[:count]}.*})
|
110
|
+
.to_return(body: first_n_results(new_policies_results, n: options[:count]))
|
111
|
+
else
|
112
|
+
stub_request(:get, %r{/search.json})
|
113
|
+
.to_return(body: new_policies_results)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
|
119
|
+
def stub_request_for(result_set)
|
120
|
+
stub_request(:get, /example.com\/search/).to_return(body: result_set)
|
121
|
+
end
|
122
|
+
|
123
|
+
def run_example_query
|
124
|
+
client.search(example_query)
|
125
|
+
end
|
126
|
+
|
127
|
+
def search_results_found
|
128
|
+
File.read(
|
129
|
+
File.expand_path(
|
130
|
+
"../../../test/fixtures/services_and_info_fixture.json",
|
131
|
+
__dir__
|
132
|
+
)
|
133
|
+
)
|
134
|
+
end
|
135
|
+
|
136
|
+
def no_search_results_found
|
137
|
+
File.read(
|
138
|
+
File.expand_path(
|
139
|
+
"../../../test/fixtures/no_services_and_info_data_found_fixture.json",
|
140
|
+
__dir__
|
141
|
+
)
|
142
|
+
)
|
143
|
+
end
|
144
|
+
|
145
|
+
def sub_sector_organisations_results
|
146
|
+
File.read(
|
147
|
+
File.expand_path(
|
148
|
+
"../../../test/fixtures/sub_sector_organisations.json",
|
149
|
+
__dir__
|
150
|
+
)
|
151
|
+
)
|
152
|
+
end
|
153
|
+
|
154
|
+
def new_policies_results
|
155
|
+
File.read(
|
156
|
+
File.expand_path(
|
157
|
+
"../../../test/fixtures/new_policies_for_dwp.json",
|
158
|
+
__dir__
|
159
|
+
)
|
160
|
+
)
|
161
|
+
end
|
162
|
+
|
163
|
+
def old_policies_results
|
164
|
+
File.read(
|
165
|
+
File.expand_path(
|
166
|
+
"../../../test/fixtures/old_policies_for_dwp.json",
|
167
|
+
__dir__
|
168
|
+
)
|
169
|
+
)
|
170
|
+
end
|
171
|
+
|
172
|
+
def first_n_results(results, options)
|
173
|
+
n = options[:n]
|
174
|
+
results = JSON.parse(results)
|
175
|
+
results["results"] = results["results"][0...n]
|
176
|
+
|
177
|
+
results.to_json
|
178
|
+
end
|
179
|
+
|
180
|
+
def client
|
181
|
+
GdsApi::Search.new("http://example.com")
|
182
|
+
end
|
183
|
+
|
184
|
+
def example_query
|
185
|
+
{
|
186
|
+
filter_organisations: ["an-organisation-slug"],
|
187
|
+
facet_specialist_sectors: "1000,examples:4,example_scope:global,order:value.title"
|
188
|
+
}
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
data/lib/gds_api/version.rb
CHANGED
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: 59.
|
4
|
+
version: 59.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- GOV.UK Dev
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
@@ -411,6 +411,7 @@ files:
|
|
411
411
|
- lib/gds_api/response.rb
|
412
412
|
- lib/gds_api/router.rb
|
413
413
|
- lib/gds_api/rummager.rb
|
414
|
+
- lib/gds_api/search.rb
|
414
415
|
- lib/gds_api/support.rb
|
415
416
|
- lib/gds_api/support_api.rb
|
416
417
|
- lib/gds_api/test_helpers/asset_manager.rb
|
@@ -433,6 +434,7 @@ files:
|
|
433
434
|
- lib/gds_api/test_helpers/publishing_api_v2.rb
|
434
435
|
- lib/gds_api/test_helpers/router.rb
|
435
436
|
- lib/gds_api/test_helpers/rummager.rb
|
437
|
+
- lib/gds_api/test_helpers/search.rb
|
436
438
|
- lib/gds_api/test_helpers/support.rb
|
437
439
|
- lib/gds_api/test_helpers/support_api.rb
|
438
440
|
- lib/gds_api/test_helpers/whitehall_admin_api.rb
|
@@ -465,7 +467,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
465
467
|
- !ruby/object:Gem::Version
|
466
468
|
version: '0'
|
467
469
|
requirements: []
|
468
|
-
rubygems_version: 3.0.
|
470
|
+
rubygems_version: 3.0.3
|
469
471
|
signing_key:
|
470
472
|
specification_version: 4
|
471
473
|
summary: Adapters to work with GDS APIs
|