ML-21: Classify API errors as transient vs permanent

This commit is contained in:
Claudio Ortolina
2026-04-24 13:55:00 +01:00
parent be4f4686f8
commit a1c665b490
43 changed files with 1429 additions and 135 deletions
+34 -3
View File
@@ -2,6 +2,7 @@ defmodule BraveSearch.APITest do
use ExUnit.Case, async: true
alias BraveSearch.API
alias BraveSearch.API.ErrorResponse
@config %BraveSearch.Config{
api_key: "test_key",
@@ -52,14 +53,44 @@ defmodule BraveSearch.APITest do
end
@tag :capture_log
test "returns error on non-200 response" do
test "returns a rate-limit ErrorResponse on 429" do
Req.Test.stub(__MODULE__, fn conn ->
conn
|> Plug.Conn.put_status(429)
|> Req.Test.json(%{"error" => "rate limited"})
|> Req.Test.json(%{
"type" => "ErrorResponse",
"error" => %{"status" => 429, "code" => "RATE_LIMITED", "detail" => "Too many requests"}
})
end)
assert {:error, %{"error" => "rate limited"}} = API.search_images("test", [], @config)
assert {:error, %ErrorResponse{} = err} =
API.search_images("test", [], @config)
assert err.status == 429
assert err.code == "RATE_LIMITED"
assert err.kind == :rate_limit
assert ErrorResponse.retryable?(err)
end
@tag :capture_log
test "returns a client-error ErrorResponse on 422" do
Req.Test.stub(__MODULE__, fn conn ->
conn
|> Plug.Conn.put_status(422)
|> Req.Test.json(%{
"type" => "ErrorResponse",
"error" => %{
"status" => 422,
"code" => "SUBSCRIPTION_TOKEN_INVALID",
"detail" => "The provided subscription token is invalid."
}
})
end)
assert {:error, %ErrorResponse{kind: :client_error} = err} =
API.search_images("test", [], @config)
refute ErrorResponse.retryable?(err)
end
test "passes count option as query param" do