From ddefc1ab8d861498f43b3a8612329cb402ec5f2b Mon Sep 17 00:00:00 2001 From: KaylaBrady <31781298+KaylaBrady@users.noreply.github.com> Date: Wed, 17 Jan 2024 13:14:21 -0500 Subject: [PATCH] refactor(Algolia.Api): use config more consistently for dependency injection Co-authored-by: Melody Horn --- lib/mobile_app_backend/search/algolia/api.ex | 12 ++-- .../search/algolia/api_test.exs | 70 ++++++++++--------- 2 files changed, 45 insertions(+), 37 deletions(-) diff --git a/lib/mobile_app_backend/search/algolia/api.ex b/lib/mobile_app_backend/search/algolia/api.ex index c079890c..26a18382 100644 --- a/lib/mobile_app_backend/search/algolia/api.ex +++ b/lib/mobile_app_backend/search/algolia/api.ex @@ -8,16 +8,18 @@ defmodule MobileAppBackend.Search.Algolia.Api do alias MobileAppBackend.Search.Algolia require Logger - @spec multi_index_search([Algolia.QueryPayload.t()], Keyword.t()) :: + @spec multi_index_search([Algolia.QueryPayload.t()]) :: {:ok, [any()]} | {:error, any} @doc """ Perform the given index queries and return a flattened list of parsed results """ - def multi_index_search(queries, opts \\ []) do + def multi_index_search(queries) do perform_request_fn = - Keyword.get(opts, :perform_request_fn, fn url, body, headers -> - HTTPoison.post(url, body, headers) - end) + Application.get_env( + :mobile_app_backend, + :algolia_perform_request_fn, + &HTTPoison.post/3 + ) body = multi_query_encoded_payload(queries) diff --git a/test/mobile_app_backend/search/algolia/api_test.exs b/test/mobile_app_backend/search/algolia/api_test.exs index a93e99f1..d061a878 100644 --- a/test/mobile_app_backend/search/algolia/api_test.exs +++ b/test/mobile_app_backend/search/algolia/api_test.exs @@ -6,13 +6,13 @@ defmodule MobileAppBackend.Search.Algolia.ApiTest do describe "multi_index_search/2" do test "when request is successful, returns flattened list of parsed results" do + reassign_env(:mobile_app_backend, :algolia_perform_request_fn, &mock_perform_request_fn/3) + assert {:ok, results} = - Api.multi_index_search( - [QueryPayload.for_index(:stop, "1"), QueryPayload.for_index(:route, "1")], - perform_request_fn: fn url, body, headers -> - mock_perform_request_fn(url, body, headers) - end - ) + Api.multi_index_search([ + QueryPayload.for_index(:stop, "1"), + QueryPayload.for_index(:route, "1") + ]) assert [ %StopResult{ @@ -36,6 +36,8 @@ defmodule MobileAppBackend.Search.Algolia.ApiTest do end test "makes requests to the algolia endpoint with expected headers and parameters properly encoded" do + pid = self() + default_env = Application.get_env(:mobile_app_backend, MobileAppBackend.Search.Algolia) reassign_env( @@ -47,15 +49,15 @@ defmodule MobileAppBackend.Search.Algolia.ApiTest do ) ) - pid = self() + reassign_env(:mobile_app_backend, :algolia_perform_request_fn, fn url, body, headers -> + send(pid, %{url: url, body: body, headers: headers}) + {:ok, %{body: "\{\"results\":[]\}"}} + end) - Api.multi_index_search( - [QueryPayload.for_index(:stop, "1"), QueryPayload.for_index(:route, "1")], - perform_request_fn: fn url, body, headers -> - send(pid, %{url: url, body: body, headers: headers}) - {:ok, %{body: "\{\"results\":[]\}"}} - end - ) + Api.multi_index_search([ + QueryPayload.for_index(:stop, "1"), + QueryPayload.for_index(:route, "1") + ]) assert_received(%{url: url, body: body, headers: headers}) @@ -80,36 +82,40 @@ defmodule MobileAppBackend.Search.Algolia.ApiTest do Keyword.merge(default_env, search_key: nil) ) + reassign_env(:mobile_app_backend, :algolia_perform_request_fn, &mock_perform_request_fn/3) + assert {:error, :search_failed} = - Api.multi_index_search( - [QueryPayload.for_index(:stop, "1"), QueryPayload.for_index(:route, "1")], - perform_request_fn: fn url, body, headers -> - mock_perform_request_fn(url, body, headers) - end - ) + Api.multi_index_search([ + QueryPayload.for_index(:stop, "1"), + QueryPayload.for_index(:route, "1") + ]) end @tag capture_log: true test "when invalid json, returns error" do + reassign_env(:mobile_app_backend, :algolia_perform_request_fn, fn _url, _body, _headers -> + {:ok, %{body: "[123 this is not json]"}} + end) + assert {:error, :search_failed} = - Api.multi_index_search( - [QueryPayload.for_index(:stop, "1"), QueryPayload.for_index(:route, "1")], - perform_request_fn: fn _url, _body, _headers -> - {:ok, %{body: "[123 this is not json]"}} - end - ) + Api.multi_index_search([ + QueryPayload.for_index(:stop, "1"), + QueryPayload.for_index(:route, "1") + ]) end @tag capture_log: true test "when request is unsuccessful, returns error" do + reassign_env(:mobile_app_backend, :algolia_perform_request_fn, fn _url, _body, _headers -> + {:error, "oops"} + end) + assert {:error, :search_failed} = - Api.multi_index_search( - [QueryPayload.for_index(:stop, "1"), QueryPayload.for_index(:route, "1")], - perform_request_fn: fn _url, _body, _headers -> - {:error, "oops"} - end - ) + Api.multi_index_search([ + QueryPayload.for_index(:stop, "1"), + QueryPayload.for_index(:route, "1") + ]) end end