Skip to content

Commit

Permalink
Add an adapter for search-api-v2
Browse files Browse the repository at this point in the history
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
mlk-kc committed Sep 6, 2023
1 parent 7a05363 commit 9139b99
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/gds_api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
require "gds_api/publishing_api"
require "gds_api/router"
require "gds_api/search"
require "gds_api/search_api_v2"
require "gds_api/support"
require "gds_api/support_api"
require "gds_api/worldwide"
Expand Down
8 changes: 8 additions & 0 deletions lib/gds_api/search_api_v2.rb
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
80 changes: 80 additions & 0 deletions test/search_api_v2_test.rb
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

0 comments on commit 9139b99

Please sign in to comment.