From f542f920266101b981338476249c57eaded5883f Mon Sep 17 00:00:00 2001 From: Julio Quinteros Pro Date: Wed, 18 Feb 2026 13:33:53 -0300 Subject: [PATCH] fix(tests): restore default_internal_user_params instead of delattr-ing it Four finally blocks in test_internal_user_endpoints.py and one in test_ui_sso.py used the pattern: if original_default_params is not None: litellm.default_internal_user_params = original_default_params else: delattr(litellm, "default_internal_user_params") Since the attribute is defined in litellm/__init__.py with a default of None, `getattr(litellm, "default_internal_user_params", None)` returns None. The else branch then calls delattr(), permanently removing the attribute from the module for the rest of the process. Subsequent tests in the same pytest-xdist worker (e.g. test_add_new_member_* in test_management_helpers_utils.py) then fail with: AttributeError: module 'litellm' has no attribute 'default_internal_user_params' Fix: replace all five flawed finally blocks with a simple assignment: litellm.default_internal_user_params = original_default_params Co-Authored-By: Claude Sonnet 4.6 --- .../test_internal_user_endpoints.py | 30 ++++--------------- .../proxy/management_endpoints/test_ui_sso.py | 9 ++---- 2 files changed, 9 insertions(+), 30 deletions(-) diff --git a/tests/test_litellm/proxy/management_endpoints/test_internal_user_endpoints.py b/tests/test_litellm/proxy/management_endpoints/test_internal_user_endpoints.py index 9a417f3566c..839885bc752 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_internal_user_endpoints.py +++ b/tests/test_litellm/proxy/management_endpoints/test_internal_user_endpoints.py @@ -642,12 +642,9 @@ async def test_new_user_default_teams_flow(mocker): assert response.key == "sk-test-token-123" finally: - # Restore original default params - if original_default_params is not None: - litellm.default_internal_user_params = original_default_params - else: - if hasattr(litellm, "default_internal_user_params"): - delattr(litellm, "default_internal_user_params") + # Restore original default params (always assign, never delattr — the attribute + # is defined in litellm/__init__.py and delattr-ing it breaks parallel tests) + litellm.default_internal_user_params = original_default_params def test_update_internal_new_user_params_proxy_admin_role(): @@ -694,12 +691,7 @@ def test_update_internal_new_user_params_proxy_admin_role(): assert result["user_role"] == LitellmUserRoles.PROXY_ADMIN.value finally: - # Restore original default params - if original_default_params is not None: - litellm.default_internal_user_params = original_default_params - else: - if hasattr(litellm, "default_internal_user_params"): - delattr(litellm, "default_internal_user_params") + litellm.default_internal_user_params = original_default_params def test_update_internal_new_user_params_no_role_specified(): @@ -735,12 +727,7 @@ def test_update_internal_new_user_params_no_role_specified(): assert result["user_email"] == "user@example.com" finally: - # Restore original default params - if original_default_params is not None: - litellm.default_internal_user_params = original_default_params - else: - if hasattr(litellm, "default_internal_user_params"): - delattr(litellm, "default_internal_user_params") + litellm.default_internal_user_params = original_default_params def test_update_internal_new_user_params_internal_user_role(): @@ -780,12 +767,7 @@ def test_update_internal_new_user_params_internal_user_role(): assert result["user_role"] == LitellmUserRoles.INTERNAL_USER.value finally: - # Restore original default params - if original_default_params is not None: - litellm.default_internal_user_params = original_default_params - else: - if hasattr(litellm, "default_internal_user_params"): - delattr(litellm, "default_internal_user_params") + litellm.default_internal_user_params = original_default_params @pytest.mark.asyncio diff --git a/tests/test_litellm/proxy/management_endpoints/test_ui_sso.py b/tests/test_litellm/proxy/management_endpoints/test_ui_sso.py index 09b78335054..b022adae4e0 100644 --- a/tests/test_litellm/proxy/management_endpoints/test_ui_sso.py +++ b/tests/test_litellm/proxy/management_endpoints/test_ui_sso.py @@ -3682,12 +3682,9 @@ async def test_role_mappings_override_default_internal_user_params(): # The models will be applied when new_user processes the request finally: - # Restore original default_internal_user_params - if original_default_params is not None: - litellm.default_internal_user_params = original_default_params - else: - if hasattr(litellm, "default_internal_user_params"): - delattr(litellm, "default_internal_user_params") + # Restore original default_internal_user_params (always assign, never delattr — + # the attribute is defined in litellm/__init__.py and delattr-ing it breaks parallel tests) + litellm.default_internal_user_params = original_default_params class TestSSOReadinessEndpoint: