Files
bDS2/test/bds/ai/openai_compatible_runtime_test.exs
2026-06-11 16:18:09 +02:00

71 lines
1.9 KiB
Elixir

defmodule BDS.AI.OpenAICompatibleRuntimeTest do
use ExUnit.Case, async: false
alias BDS.AI.HttpClient
alias BDS.AI.OpenAICompatibleRuntime
defmodule SlowPlug do
import Plug.Conn
def init(opts), do: opts
def call(conn, _opts) do
Process.sleep(1_000)
send_resp(conn, 200, ~s({"choices":[],"data":[]}))
end
end
setup do
:ok = Ecto.Adapters.SQL.Sandbox.checkout(BDS.Repo)
original_config = Application.fetch_env(:bds, HttpClient)
Application.put_env(:bds, HttpClient,
receive_timeout_ms: 100,
get_max_retries: 0,
retry_delay_ms: 10
)
on_exit(fn ->
case original_config do
{:ok, value} -> Application.put_env(:bds, HttpClient, value)
:error -> Application.delete_env(:bds, HttpClient)
end
end)
server = start_supervised!({Bandit, plug: SlowPlug, port: 0, startup_log: false})
{:ok, {_address, port}} = ThousandIsland.listener_info(server)
{:ok, url: "http://127.0.0.1:#{port}/v1"}
end
test "generate returns a structured timeout error within the configured budget", %{url: url} do
endpoint = %{url: url, api_key: "sk-test"}
request = %{
operation: :chat,
model: "gpt-test",
max_output_tokens: 16,
messages: [%{"role" => "user", "content" => "hello"}]
}
started_at = System.monotonic_time(:millisecond)
assert {:error, %{kind: :http_error, reason: :timeout}} =
OpenAICompatibleRuntime.generate(endpoint, request, [])
assert System.monotonic_time(:millisecond) - started_at < 2_000
end
test "list_models returns a structured timeout error within the configured budget", %{url: url} do
endpoint = %{url: url, api_key: "sk-test"}
started_at = System.monotonic_time(:millisecond)
assert {:error, %{kind: :http_error, reason: :timeout}} =
OpenAICompatibleRuntime.list_models(endpoint)
assert System.monotonic_time(:millisecond) - started_at < 2_000
end
end