litellm/tests/proxy_unit_tests/test_aproxy_startup.py
ryan-crabbe-berri e9d40a8f73 test: enforce F811 so a duplicate definition cannot silently replace the first
A name bound twice keeps only the second binding. In `tests/` that is nearly
always a repeated import, harmless but misleading, and the same rule is what
catches the cases that are not harmless: a local that shadows an import the
module still calls, and a second `def test_x` that quietly replaces the first.

311 of the 344 sites were repeated imports and came out with ruff's own fix.
The remaining 33 needed a decision. Four modules imported a name they never
used because a local definition below already shadowed it. Two comprehensions
bound `call` over `unittest.mock.call`, which those modules import and use.
One test rebound the two module handles its nested reload closure had captured.
One class attribute shadowed an unused `status` import.

The load-test fixtures move to a conftest, which is how pytest is meant to share
them, so the test module no longer imports three fixture names it never calls.
The nine `prisma_client` parameters keep a narrow `noqa`: pytest resolves that
fixture by name before the body runs, so the parameter never shadows anything.
2026-08-21 12:06:19 -07:00

96 lines
3.1 KiB
Python

# What this tests
## This tests the proxy server startup
import sys, os, json
import traceback
from dotenv import load_dotenv
load_dotenv()
import io
# this file is to test litellm/proxy
sys.path.insert(
0, os.path.abspath("../..")
) # Adds the parent directory to the system path
import pytest, logging, asyncio
import litellm
from litellm.proxy.proxy_server import (
router,
save_worker_config,
initialize,
proxy_startup_event,
llm_model_list,
proxy_shutdown_event,
)
@pytest.mark.asyncio
async def test_proxy_gunicorn_startup_direct_config():
"""
gunicorn startup requires the config to be passed in via environment variables
We support saving either the config or the dict as an environment variable.
Test both approaches
"""
try:
from litellm._logging import verbose_proxy_logger, verbose_router_logger
import logging
# unset set DATABASE_URL in env for this test
# set prisma client to None
setattr(litellm.proxy.proxy_server, "prisma_client", None)
database_url = os.environ.pop("DATABASE_URL", None)
verbose_proxy_logger.setLevel(level=logging.DEBUG)
verbose_router_logger.setLevel(level=logging.DEBUG)
filepath = os.path.dirname(os.path.abspath(__file__))
# test with worker_config = config yaml
config_fp = f"{filepath}/test_configs/test_config_no_auth.yaml"
os.environ["WORKER_CONFIG"] = config_fp
async with proxy_startup_event(app=None) as _:
pass
except Exception as e:
if "Already connected to the query engine" in str(e):
pass
else:
pytest.fail(f"An exception occurred - {str(e)}")
finally:
# restore DATABASE_URL after the test
if database_url is not None:
os.environ["DATABASE_URL"] = database_url
@pytest.mark.asyncio
async def test_proxy_gunicorn_startup_config_dict():
try:
from litellm._logging import verbose_proxy_logger, verbose_router_logger
import logging
verbose_proxy_logger.setLevel(level=logging.DEBUG)
verbose_router_logger.setLevel(level=logging.DEBUG)
# unset set DATABASE_URL in env for this test
# set prisma client to None
setattr(litellm.proxy.proxy_server, "prisma_client", None)
database_url = os.environ.pop("DATABASE_URL", None)
filepath = os.path.dirname(os.path.abspath(__file__))
# test with worker_config = config yaml
config_fp = f"{filepath}/test_configs/test_config_no_auth.yaml"
# test with worker_config = dict
worker_config = {"config": config_fp}
os.environ["WORKER_CONFIG"] = json.dumps(worker_config)
async with proxy_startup_event(app=None) as _:
pass
except Exception as e:
if "Already connected to the query engine" in str(e):
pass
else:
pytest.fail(f"An exception occurred - {str(e)}")
finally:
# restore DATABASE_URL after the test
if database_url is not None:
os.environ["DATABASE_URL"] = database_url
# test_proxy_gunicorn_startup()