Skip to content

Commit

Permalink
Merge pull request #1210 from alphagov/search-api-v2
Browse files Browse the repository at this point in the history
Add an adapter for `search-api-v2`
  • Loading branch information
csutter authored Sep 7, 2023
2 parents 7a05363 + fe9103b commit 28e4ef3
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 0 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
* BREAKING: Remove Account API `get_email_subscription` method and helpers
* BREAKING: Remove Account API `put_email_subscription` method and helpers
* BREAKING: Remove Account API `delete_email_subscription` method and helpers
* Add a basic adapter for the new `search-api-v2` service, intially with a `#search` method along
the lines of the existing adapter for `search-api` for consistency
* Note: These are no longer used by any apps, so should not be breaking in practice.

# 90.0.0
Expand Down
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 28e4ef3

Please sign in to comment.