diff --git a/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_resend_email.py b/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_resend_email.py index 8db6d98f13d..1a9bb04dd61 100644 --- a/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_resend_email.py +++ b/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_resend_email.py @@ -9,6 +9,7 @@ sys.path.insert(0, os.path.abspath("../../..")) +import litellm from litellm_enterprise.enterprise_callbacks.send_emails.resend_email import ( ResendEmailLogger, ) @@ -16,6 +17,30 @@ # Test file for Resend email integration +@pytest.fixture(autouse=True) +def disable_aiohttp_transport(): + """ + Disable aiohttp transport so respx can intercept httpx requests. + Also clear the client cache to ensure fresh clients are created. + """ + # Disable aiohttp transport so respx can intercept requests + original_value = getattr(litellm, "disable_aiohttp_transport", None) + litellm.disable_aiohttp_transport = True + + # Clear the client cache to ensure we don't reuse old clients + cache = getattr(litellm, "in_memory_llm_clients_cache", None) + if cache is not None: + cache.flush_cache() + + yield + + # Restore original value + if original_value is not None: + litellm.disable_aiohttp_transport = original_value + elif hasattr(litellm, "disable_aiohttp_transport"): + delattr(litellm, "disable_aiohttp_transport") + + @pytest.fixture def mock_env_vars(): with mock.patch.dict(os.environ, {"RESEND_API_KEY": "test_api_key"}): diff --git a/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_sendgrid_email.py b/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_sendgrid_email.py index 836b717bd6e..97091183239 100644 --- a/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_sendgrid_email.py +++ b/tests/test_litellm/enterprise/enterprise_callbacks/send_emails/test_sendgrid_email.py @@ -9,11 +9,36 @@ sys.path.insert(0, os.path.abspath("../../..")) +import litellm from litellm_enterprise.enterprise_callbacks.send_emails.sendgrid_email import ( SendGridEmailLogger, ) +@pytest.fixture(autouse=True) +def disable_aiohttp_transport(): + """ + Disable aiohttp transport so respx can intercept httpx requests. + Also clear the client cache to ensure fresh clients are created. + """ + # Disable aiohttp transport so respx can intercept requests + original_value = getattr(litellm, "disable_aiohttp_transport", None) + litellm.disable_aiohttp_transport = True + + # Clear the client cache to ensure we don't reuse old clients + cache = getattr(litellm, "in_memory_llm_clients_cache", None) + if cache is not None: + cache.flush_cache() + + yield + + # Restore original value + if original_value is not None: + litellm.disable_aiohttp_transport = original_value + elif hasattr(litellm, "disable_aiohttp_transport"): + delattr(litellm, "disable_aiohttp_transport") + + @pytest.fixture def mock_env_vars(): # Store original values diff --git a/tests/test_litellm/test_main.py b/tests/test_litellm/test_main.py index 80fd9f61298..f32f454eb0f 100644 --- a/tests/test_litellm/test_main.py +++ b/tests/test_litellm/test_main.py @@ -18,6 +18,27 @@ from litellm import main as litellm_main +@pytest.fixture(autouse=True) +def disable_aiohttp_transport(): + """ + Disable aiohttp transport so respx can intercept httpx requests. + Also clear the client cache to ensure fresh clients are created. + """ + original_value = getattr(litellm, "disable_aiohttp_transport", None) + litellm.disable_aiohttp_transport = True + + cache = getattr(litellm, "in_memory_llm_clients_cache", None) + if cache is not None: + cache.flush_cache() + + yield + + if original_value is not None: + litellm.disable_aiohttp_transport = original_value + elif hasattr(litellm, "disable_aiohttp_transport"): + delattr(litellm, "disable_aiohttp_transport") + + @pytest.fixture(autouse=True) def add_api_keys_to_env(monkeypatch): monkeypatch.setenv("ANTHROPIC_API_KEY", "sk-ant-api03-1234567890") diff --git a/tests/test_litellm/vector_stores/test_vector_store_create_provider_logic.py b/tests/test_litellm/vector_stores/test_vector_store_create_provider_logic.py index cca20847f12..08da9b9807f 100644 --- a/tests/test_litellm/vector_stores/test_vector_store_create_provider_logic.py +++ b/tests/test_litellm/vector_stores/test_vector_store_create_provider_logic.py @@ -51,9 +51,10 @@ def test_vector_store_create_with_simple_provider_name(): ) assert vector_store_provider_config is not None, "Should return a config for OpenAI" - assert isinstance( - vector_store_provider_config, OpenAIVectorStoreConfig - ), "Should return OpenAIVectorStoreConfig for OpenAI provider" + # Use type name check instead of isinstance to avoid module identity issues + # caused by sys.path manipulation in test setup + assert type(vector_store_provider_config).__name__ == "OpenAIVectorStoreConfig", \ + f"Should return OpenAIVectorStoreConfig for OpenAI provider, got {type(vector_store_provider_config).__name__}" print("✅ Test passed: Simple provider name 'openai' handled correctly") @@ -97,9 +98,9 @@ def test_vector_store_create_with_provider_api_type(): ) assert vector_store_provider_config is not None, "Should return a config for Vertex AI" - assert isinstance( - vector_store_provider_config, VertexVectorStoreConfig - ), "Should return VertexVectorStoreConfig for vertex_ai provider with rag_api" + # Use type name check instead of isinstance to avoid module identity issues + assert type(vector_store_provider_config).__name__ == "VertexVectorStoreConfig", \ + f"Should return VertexVectorStoreConfig for vertex_ai provider with rag_api, got {type(vector_store_provider_config).__name__}" print("✅ Test passed: Provider with api_type 'vertex_ai/rag_api' handled correctly") @@ -134,9 +135,9 @@ def test_vector_store_create_with_ragflow_provider(): ) assert vector_store_provider_config is not None, "Should return a config for RAGFlow" - assert isinstance( - vector_store_provider_config, RAGFlowVectorStoreConfig - ), "Should return RAGFlowVectorStoreConfig for RAGFlow provider" + # Use type name check instead of isinstance to avoid module identity issues + assert type(vector_store_provider_config).__name__ == "RAGFlowVectorStoreConfig", \ + f"Should return RAGFlowVectorStoreConfig for RAGFlow provider, got {type(vector_store_provider_config).__name__}" print("✅ Test passed: RAGFlow provider handled correctly") diff --git a/tests/test_litellm/vector_stores/test_vector_store_registry.py b/tests/test_litellm/vector_stores/test_vector_store_registry.py index a3af476bc71..98127efc9ee 100644 --- a/tests/test_litellm/vector_stores/test_vector_store_registry.py +++ b/tests/test_litellm/vector_stores/test_vector_store_registry.py @@ -21,6 +21,27 @@ from litellm.vector_stores.vector_store_registry import VectorStoreRegistry +@pytest.fixture(autouse=True) +def disable_aiohttp_transport(): + """ + Disable aiohttp transport so respx can intercept httpx requests. + Also clear the client cache to ensure fresh clients are created. + """ + original_value = getattr(litellm, "disable_aiohttp_transport", None) + litellm.disable_aiohttp_transport = True + + cache = getattr(litellm, "in_memory_llm_clients_cache", None) + if cache is not None: + cache.flush_cache() + + yield + + if original_value is not None: + litellm.disable_aiohttp_transport = original_value + elif hasattr(litellm, "disable_aiohttp_transport"): + delattr(litellm, "disable_aiohttp_transport") + + def test_get_credentials_for_vector_store(): """Test that get_credentials_for_vector_store returns correct credentials""" # Create test vector stores