diff --git a/tests/litellm_utils_tests/test_secret_manager.py b/tests/litellm_utils_tests/test_secret_manager.py index 7099f6e13d..da9c9d548a 100644 --- a/tests/litellm_utils_tests/test_secret_manager.py +++ b/tests/litellm_utils_tests/test_secret_manager.py @@ -133,9 +133,8 @@ def test_oidc_circleci_v2(): print(f"secret_val: {redact_oidc_signature(secret_val)}") -@pytest.mark.skipif( - os.environ.get("CIRCLE_OIDC_TOKEN") is None, - reason="Cannot run without being in CircleCI Runner", +@pytest.mark.skip( + reason="Quarantined: Flaky test - fails with 401 Unauthorized from Azure OAuth. TODO: Switch to our own Azure account or fix authentication" ) def test_oidc_circleci_with_azure(): # TODO: Switch to our own Azure account, currently using ai.moda's account diff --git a/tests/proxy_unit_tests/test_response_polling_handler.py b/tests/proxy_unit_tests/test_response_polling_handler.py index 5d9b83969f..cb4cd0efe5 100644 --- a/tests/proxy_unit_tests/test_response_polling_handler.py +++ b/tests/proxy_unit_tests/test_response_polling_handler.py @@ -519,6 +519,13 @@ class TestResponsePollingHandler: # init_async_client is a sync method that returns an async client mock_redis.init_async_client = Mock(return_value=mock_async_client) + # Mock async_delete_cache to actually call init_async_client and delete + async def mock_async_delete_cache(key): + client = mock_redis.init_async_client() + await client.delete(key) + + mock_redis.async_delete_cache = mock_async_delete_cache + handler = ResponsePollingHandler(redis_cache=mock_redis) result = await handler.delete_polling("litellm_poll_test") diff --git a/ui/litellm-dashboard/src/components/add_model/add_model_tab.test.tsx b/ui/litellm-dashboard/src/components/add_model/add_model_tab.test.tsx index 5f165bb7f8..0c35362165 100644 --- a/ui/litellm-dashboard/src/components/add_model/add_model_tab.test.tsx +++ b/ui/litellm-dashboard/src/components/add_model/add_model_tab.test.tsx @@ -1,5 +1,5 @@ import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; -import { render, renderHook, screen } from "@testing-library/react"; +import { render, renderHook, screen, waitFor } from "@testing-library/react"; import { Form } from "antd"; import type { UploadProps } from "antd/es/upload"; import { describe, expect, it, vi } from "vitest"; @@ -37,6 +37,22 @@ vi.mock("../networking", async () => { }; }); +vi.mock("@/app/(dashboard)/hooks/providers/useProviderFields", () => ({ + useProviderFields: vi.fn().mockReturnValue({ + data: [ + { + provider: "OpenAI", + provider_display_name: "OpenAI", + litellm_provider: "openai", + default_model_placeholder: "gpt-3.5-turbo", + credential_fields: [], + }, + ], + isLoading: false, + error: null, + }), +})); + const createQueryClient = () => new QueryClient({ defaultOptions: { @@ -231,8 +247,15 @@ describe("Add Model Tab", () => { , ); - const testConnectButtons = await screen.findAllByRole("button", { name: "Test Connect" }); - expect(testConnectButtons.length).toBeGreaterThan(0); - expect(await screen.findByRole("button", { name: "Add Model" })).toBeInTheDocument(); - }, 10000); // 10 seconds timeout for complex logic + // Wait for async operations to complete and buttons to appear + await waitFor( + async () => { + const testConnectButtons = await screen.findAllByRole("button", { name: "Test Connect" }); + expect(testConnectButtons.length).toBeGreaterThan(0); + const addModelButton = await screen.findByRole("button", { name: "Add Model" }); + expect(addModelButton).toBeInTheDocument(); + }, + { timeout: 10000 }, + ); + }, 15000); // 15 second timeout to allow waitFor to complete });