From bfdee9a04acec4fe1bcbb1cb0579f525b7ae18cd Mon Sep 17 00:00:00 2001 From: Arya Maddel <84805906+aryamaddel@users.noreply.github.com> Date: Wed, 6 May 2026 12:17:22 +0530 Subject: [PATCH] test: move router_strategy tests to CI-run directory (tests/test_litellm/router_strategy/) --- .../local_testing/test_least_busy_routing.py | 58 -------------- .../local_testing/test_lowest_cost_routing.py | 56 -------------- .../local_testing/test_tpm_rpm_routing_v2.py | 17 ----- .../test_least_busy_logging.py | 76 +++++++++++++++++++ .../test_lowest_cost_logging.py | 62 +++++++++++++++ .../test_lowest_tpm_rpm_logging.py | 20 +++++ 6 files changed, 158 insertions(+), 131 deletions(-) create mode 100644 tests/test_litellm/router_strategy/test_least_busy_logging.py create mode 100644 tests/test_litellm/router_strategy/test_lowest_cost_logging.py create mode 100644 tests/test_litellm/router_strategy/test_lowest_tpm_rpm_logging.py diff --git a/tests/local_testing/test_least_busy_routing.py b/tests/local_testing/test_least_busy_routing.py index 94722eecb0f..0f4f6923a19 100644 --- a/tests/local_testing/test_least_busy_routing.py +++ b/tests/local_testing/test_least_busy_routing.py @@ -26,64 +26,6 @@ from litellm.router_strategy.least_busy import LeastBusyLoggingHandler ### UNIT TESTS FOR LEAST BUSY LOGGING ### -def test_least_busy_sync_success_model_info_none(): - """log_success_event should not crash when model_info is None.""" - logger = LeastBusyLoggingHandler(router_cache=DualCache()) - kwargs = { - "litellm_params": { - "metadata": {"model_group": "gpt-4"}, - "model_info": None, - } - } - logger.log_success_event( - kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() - ) - - -def test_least_busy_sync_failure_model_info_none(): - """log_failure_event should not crash when model_info is None.""" - logger = LeastBusyLoggingHandler(router_cache=DualCache()) - kwargs = { - "litellm_params": { - "metadata": {"model_group": "gpt-4"}, - "model_info": None, - } - } - logger.log_failure_event( - kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() - ) - - -@pytest.mark.asyncio -async def test_least_busy_async_success_model_info_none(): - """async_log_success_event should not crash when model_info is None.""" - logger = LeastBusyLoggingHandler(router_cache=DualCache()) - kwargs = { - "litellm_params": { - "metadata": {"model_group": "gpt-4"}, - "model_info": None, - } - } - await logger.async_log_success_event( - kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() - ) - - -@pytest.mark.asyncio -async def test_least_busy_async_failure_model_info_none(): - """async_log_failure_event should not crash when model_info is None.""" - logger = LeastBusyLoggingHandler(router_cache=DualCache()) - kwargs = { - "litellm_params": { - "metadata": {"model_group": "gpt-4"}, - "model_info": None, - } - } - await logger.async_log_failure_event( - kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() - ) - - def test_model_added(): test_cache = DualCache() least_busy_logger = LeastBusyLoggingHandler(router_cache=test_cache) diff --git a/tests/local_testing/test_lowest_cost_routing.py b/tests/local_testing/test_lowest_cost_routing.py index 573defefcae..4e8b06fb628 100644 --- a/tests/local_testing/test_lowest_cost_routing.py +++ b/tests/local_testing/test_lowest_cost_routing.py @@ -20,62 +20,6 @@ from litellm.caching.caching import DualCache ### UNIT TESTS FOR cost ROUTING ### -def test_lowest_cost_sync_success_model_info_none(): - """log_success_event should not crash when model_info is None.""" - logger = LowestCostLoggingHandler(router_cache=DualCache()) - kwargs = { - "litellm_params": { - "metadata": {"model_group": "gpt-4"}, - "model_info": None, - } - } - logger.log_success_event( - kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() - ) - - -def test_lowest_cost_sync_failure_model_info_none(): - """log_failure_event should not crash when model_info is None.""" - logger = LowestCostLoggingHandler(router_cache=DualCache()) - kwargs = { - "litellm_params": { - "metadata": {"model_group": "gpt-4"}, - "model_info": None, - } - } - logger.log_failure_event( - kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() - ) - - -def test_lowest_cost_sync_success_model_info_missing(): - """log_success_event should not crash when model_info key is missing.""" - logger = LowestCostLoggingHandler(router_cache=DualCache()) - kwargs = { - "litellm_params": { - "metadata": {"model_group": "gpt-4"}, - } - } - logger.log_success_event( - kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() - ) - - -@pytest.mark.asyncio -async def test_lowest_cost_async_success_model_info_none(): - """async_log_success_event should not crash when model_info is None.""" - logger = LowestCostLoggingHandler(router_cache=DualCache()) - kwargs = { - "litellm_params": { - "metadata": {"model_group": "gpt-4"}, - "model_info": None, - } - } - await logger.async_log_success_event( - kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() - ) - - @pytest.mark.asyncio async def test_get_available_deployments(): test_cache = DualCache() diff --git a/tests/local_testing/test_tpm_rpm_routing_v2.py b/tests/local_testing/test_tpm_rpm_routing_v2.py index 0569773cae0..211af566424 100644 --- a/tests/local_testing/test_tpm_rpm_routing_v2.py +++ b/tests/local_testing/test_tpm_rpm_routing_v2.py @@ -27,9 +27,6 @@ from litellm.caching.caching import DualCache from litellm.router_strategy.lowest_tpm_rpm_v2 import ( LowestTPMLoggingHandler_v2 as LowestTPMLoggingHandler, ) -from litellm.router_strategy.lowest_tpm_rpm import ( - LowestTPMLoggingHandler as LowestTPMLoggingHandler_v1, -) from litellm.utils import get_utc_datetime from create_mock_standard_logging_payload import create_standard_logging_payload @@ -40,20 +37,6 @@ from create_mock_standard_logging_payload import create_standard_logging_payload """ -def test_lowest_tpm_rpm_v1_model_info_none(): - """log_success_event should not crash when model_info is None (v1 handler).""" - logger = LowestTPMLoggingHandler_v1(router_cache=DualCache()) - kwargs = { - "litellm_params": { - "metadata": {"model_group": "gpt-4"}, - "model_info": None, - } - } - logger.log_success_event( - kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() - ) - - def test_tpm_rpm_updated(): test_cache = DualCache() lowest_tpm_logger = LowestTPMLoggingHandler(router_cache=test_cache) diff --git a/tests/test_litellm/router_strategy/test_least_busy_logging.py b/tests/test_litellm/router_strategy/test_least_busy_logging.py new file mode 100644 index 00000000000..10eb032b17c --- /dev/null +++ b/tests/test_litellm/router_strategy/test_least_busy_logging.py @@ -0,0 +1,76 @@ +import time + +import pytest + +from litellm.caching.caching import DualCache +from litellm.router_strategy.least_busy import LeastBusyLoggingHandler + + +def test_least_busy_pre_api_call_model_info_none(): + """log_pre_api_call should not crash when model_info is None.""" + logger = LeastBusyLoggingHandler(router_cache=DualCache()) + kwargs = { + "litellm_params": { + "metadata": {"model_group": "gpt-4"}, + "model_info": None, + } + } + logger.log_pre_api_call(model="test-model", messages=[], kwargs=kwargs) + + +def test_least_busy_sync_success_model_info_none(): + """log_success_event should not crash when model_info is None.""" + logger = LeastBusyLoggingHandler(router_cache=DualCache()) + kwargs = { + "litellm_params": { + "metadata": {"model_group": "gpt-4"}, + "model_info": None, + } + } + logger.log_success_event( + kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() + ) + + +def test_least_busy_sync_failure_model_info_none(): + """log_failure_event should not crash when model_info is None.""" + logger = LeastBusyLoggingHandler(router_cache=DualCache()) + kwargs = { + "litellm_params": { + "metadata": {"model_group": "gpt-4"}, + "model_info": None, + } + } + logger.log_failure_event( + kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() + ) + + +@pytest.mark.asyncio +async def test_least_busy_async_success_model_info_none(): + """async_log_success_event should not crash when model_info is None.""" + logger = LeastBusyLoggingHandler(router_cache=DualCache()) + kwargs = { + "litellm_params": { + "metadata": {"model_group": "gpt-4"}, + "model_info": None, + } + } + await logger.async_log_success_event( + kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() + ) + + +@pytest.mark.asyncio +async def test_least_busy_async_failure_model_info_none(): + """async_log_failure_event should not crash when model_info is None.""" + logger = LeastBusyLoggingHandler(router_cache=DualCache()) + kwargs = { + "litellm_params": { + "metadata": {"model_group": "gpt-4"}, + "model_info": None, + } + } + await logger.async_log_failure_event( + kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() + ) diff --git a/tests/test_litellm/router_strategy/test_lowest_cost_logging.py b/tests/test_litellm/router_strategy/test_lowest_cost_logging.py new file mode 100644 index 00000000000..6680bea12fb --- /dev/null +++ b/tests/test_litellm/router_strategy/test_lowest_cost_logging.py @@ -0,0 +1,62 @@ +import time + +import pytest + +from litellm.caching.caching import DualCache +from litellm.router_strategy.lowest_cost import LowestCostLoggingHandler + + +def test_lowest_cost_sync_success_model_info_none(): + """log_success_event should not crash when model_info is None.""" + logger = LowestCostLoggingHandler(router_cache=DualCache()) + kwargs = { + "litellm_params": { + "metadata": {"model_group": "gpt-4"}, + "model_info": None, + } + } + logger.log_success_event( + kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() + ) + + +def test_lowest_cost_sync_failure_model_info_none(): + """log_failure_event should not crash when model_info is None.""" + logger = LowestCostLoggingHandler(router_cache=DualCache()) + kwargs = { + "litellm_params": { + "metadata": {"model_group": "gpt-4"}, + "model_info": None, + } + } + logger.log_failure_event( + kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() + ) + + +def test_lowest_cost_sync_success_model_info_missing(): + """log_success_event should not crash when model_info key is missing.""" + logger = LowestCostLoggingHandler(router_cache=DualCache()) + kwargs = { + "litellm_params": { + "metadata": {"model_group": "gpt-4"}, + } + } + logger.log_success_event( + kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() + ) + + +@pytest.mark.asyncio +async def test_lowest_cost_async_success_model_info_none(): + """async_log_success_event should not crash when model_info is None.""" + logger = LowestCostLoggingHandler(router_cache=DualCache()) + kwargs = { + "litellm_params": { + "metadata": {"model_group": "gpt-4"}, + "model_info": None, + } + } + await logger.async_log_success_event( + kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() + ) diff --git a/tests/test_litellm/router_strategy/test_lowest_tpm_rpm_logging.py b/tests/test_litellm/router_strategy/test_lowest_tpm_rpm_logging.py new file mode 100644 index 00000000000..0d1e775c1d2 --- /dev/null +++ b/tests/test_litellm/router_strategy/test_lowest_tpm_rpm_logging.py @@ -0,0 +1,20 @@ +import time + +from litellm.caching.caching import DualCache +from litellm.router_strategy.lowest_tpm_rpm import ( + LowestTPMLoggingHandler as LowestTPMLoggingHandler_v1, +) + + +def test_lowest_tpm_rpm_v1_model_info_none(): + """log_success_event should not crash when model_info is None (v1 handler).""" + logger = LowestTPMLoggingHandler_v1(router_cache=DualCache()) + kwargs = { + "litellm_params": { + "metadata": {"model_group": "gpt-4"}, + "model_info": None, + } + } + logger.log_success_event( + kwargs=kwargs, response_obj={}, start_time=time.time(), end_time=time.time() + )