-
Notifications
You must be signed in to change notification settings - Fork 14
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
In the short-term, `search-api-v2` will exist alongside the current `search-api` service. `search-api-v2` provides a compatible API for pure search (GET requests) so the adapter is almost equivalent to `search-api`. The reasoning for this is so that, from a consuming service's perspective, the search interface is the same.
- Loading branch information
Showing
3 changed files
with
89 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
module GdsApi | ||
class SearchApiV2 < Base | ||
def search(args, additional_headers = {}) | ||
request_url = "#{endpoint}/search.json?#{Rack::Utils.build_nested_query(args)}" | ||
get_json(request_url, additional_headers) | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,80 @@ | ||
require "test_helper" | ||
require "gds_api/search_api_v2" | ||
|
||
describe GdsApi::SearchApiV2 do | ||
before(:each) do | ||
stub_request(:get, /example.com\/search/).to_return(body: "[]") | ||
end | ||
|
||
it "#search should raise an exception if the service at the search URI returns a 500" do | ||
stub_request(:get, /example.com\/search.json/).to_return(status: [500, "Internal Server Error"]) | ||
assert_raises(GdsApi::HTTPServerError) do | ||
GdsApi::SearchApiV2.new("http://example.com").search(q: "query") | ||
end | ||
end | ||
|
||
it "#search should raise an exception if the service at the search URI returns a 404" do | ||
stub_request(:get, /example.com\/search/).to_return(status: [404, "Not Found"]) | ||
assert_raises(GdsApi::HTTPNotFound) do | ||
GdsApi::SearchApiV2.new("http://example.com").search(q: "query") | ||
end | ||
end | ||
|
||
it "#search should raise an exception if the service at the search URI returns a 400" do | ||
stub_request(:get, /example.com\/search/).to_return( | ||
status: [400, "Bad Request"], | ||
body: '"error":"Filtering by \"coffee\" is not allowed"', | ||
) | ||
assert_raises(GdsApi::HTTPClientError) do | ||
GdsApi::SearchApiV2.new("http://example.com").search(q: "query", filter_coffee: "tea") | ||
end | ||
end | ||
|
||
it "#search should raise an exception if the service at the search URI returns a 422" do | ||
stub_request(:get, /example.com\/search/).to_return( | ||
status: [422, "Bad Request"], | ||
body: '"error":"Filtering by \"coffee\" is not allowed"', | ||
) | ||
assert_raises(GdsApi::HTTPUnprocessableEntity) do | ||
GdsApi::SearchApiV2.new("http://example.com").search(q: "query", filter_coffee: "tea") | ||
end | ||
end | ||
|
||
it "#search should raise an exception if the service at the search URI times out" do | ||
stub_request(:get, /example.com\/search/).to_timeout | ||
assert_raises(GdsApi::TimedOutException) do | ||
GdsApi::SearchApiV2.new("http://example.com").search(q: "query") | ||
end | ||
end | ||
|
||
it "#search should return the search deserialized from json" do | ||
search_results = [{ "title" => "document-title" }] | ||
stub_request(:get, /example.com\/search/).to_return(body: search_results.to_json) | ||
results = GdsApi::SearchApiV2.new("http://example.com").search(q: "query") | ||
assert_equal search_results, results.to_hash | ||
end | ||
|
||
it "#search should request the search results in JSON format" do | ||
GdsApi::SearchApiV2.new("http://example.com").search(q: "query") | ||
|
||
assert_requested :get, /.*/, headers: { "Accept" => "application/json" } | ||
end | ||
|
||
it "#search should issue a request for all the params supplied" do | ||
GdsApi::SearchApiV2.new("http://example.com").search( | ||
q: "query & stuff", | ||
filter_topics: %w[1 2], | ||
order: "-public_timestamp", | ||
) | ||
|
||
assert_requested :get, /q=query%20%26%20stuff/ | ||
assert_requested :get, /filter_topics\[\]=1&filter_topics\[\]=2/ | ||
assert_requested :get, /order=-public_timestamp/ | ||
end | ||
|
||
it "#search can pass additional headers" do | ||
GdsApi::SearchApiV2.new("http://example.com").search({ q: "query" }, "authorization" => "token") | ||
|
||
assert_requested :get, /.*/, headers: { "authorization" => "token" } | ||
end | ||
end |