litellm/tests/test_litellm/proxy/client/test_client.py
mateo-berri 4d5205c355 fix(proxy): give the remaining CLI clients a request timeout
The keys, credentials, models, model groups, and chat clients still sent
requests with no timeout, so a proxy that accepts the connection and
never answers pinned the caller forever. They now default to the same
30 seconds as their teams and users siblings, with chat on the OpenAI
SDK's 600 second default, and Client wires its timeout through to all of
them. S113 cannot see Session methods, so each client gets a
hanging-server regression test instead.
2026-08-29 13:32:39 -07:00

109 lines
3.4 KiB
Python

import pytest
from litellm.proxy.client import ChatClient, Client, ModelsManagementClient
from litellm.proxy.client.http_client import HTTPClient
from litellm.proxy.client.keys import KeysManagementClient
@pytest.fixture
def base_url():
return "http://localhost:8000"
@pytest.fixture
def api_key():
return "test-api-key"
def test_client_initialization_wires_resource_clients(base_url, api_key):
"""Test that the Client is properly initialized with all resource clients"""
client = Client(base_url=base_url, api_key=api_key)
# Check base properties
assert client._base_url == base_url
assert client._api_key == api_key
# Check resource clients
assert isinstance(client.models, ModelsManagementClient)
assert client.models._base_url == base_url
assert client.models._api_key == api_key
# Check chat client
assert isinstance(client.chat, ChatClient)
assert client.chat._base_url == base_url
assert client.chat._api_key == api_key
# Check keys client
assert isinstance(client.keys, KeysManagementClient)
assert client.keys._base_url == base_url
assert client.keys._api_key == api_key
# Check http client
assert isinstance(client.http, HTTPClient)
assert client.http._base_url == base_url
assert client.http._api_key == api_key
def test_client_initialization_strips_trailing_slash():
"""Test that the client properly strips trailing slashes from base_url during initialization"""
base_url = "http://localhost:8000/////"
client = Client(base_url=base_url)
assert client._base_url == "http://localhost:8000"
assert client.models._base_url == "http://localhost:8000"
assert client.chat._base_url == "http://localhost:8000"
assert client.keys._base_url == "http://localhost:8000"
assert client.http._base_url == "http://localhost:8000"
def test_client_without_api_key_propagates_none_to_resource_clients(base_url):
"""Test that the client works without an API key"""
client = Client(base_url=base_url)
assert client._api_key is None
assert client.models._api_key is None
assert client.chat._api_key is None
assert client.keys._api_key is None
assert client.http._api_key is None
def test_client_initialization():
"""Test that the client is initialized correctly."""
client = Client(
base_url="http://localhost:4000",
api_key="test-key",
timeout=60,
)
# Check that http client is initialized correctly
assert isinstance(client.http, HTTPClient)
assert client.http._base_url == "http://localhost:4000"
assert client.http._api_key == "test-key"
assert client.http._timeout == 60
assert client.teams._timeout == 60
assert client.keys._timeout == 60
assert client.credentials._timeout == 60
assert client.models._timeout == 60
assert client.model_groups._timeout == 60
assert client.chat._timeout == 600
def test_client_default_timeout():
"""Test that the client uses default timeout."""
client = Client(
base_url="http://localhost:4000",
api_key="test-key",
)
assert client.http._timeout == 30
assert client.keys._timeout == 30
assert client.chat._timeout == 600
def test_client_without_api_key():
"""Test that the client works without an API key."""
client = Client(base_url="http://localhost:4000")
assert client.http._api_key is None