diff --git a/ui/litellm-dashboard/src/app/(dashboard)/hooks/healthReadiness/useHealthReadinessDetails.ts b/ui/litellm-dashboard/src/app/(dashboard)/hooks/healthReadiness/useHealthReadinessDetails.ts index f89858bc0e9..5838dbd0ee6 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/hooks/healthReadiness/useHealthReadinessDetails.ts +++ b/ui/litellm-dashboard/src/app/(dashboard)/hooks/healthReadiness/useHealthReadinessDetails.ts @@ -54,5 +54,8 @@ export const useHealthReadinessDetails = ( queryFn: () => fetchHealthReadinessDetails(accessToken!), enabled: Boolean(accessToken), staleTime: 5 * 60 * 1000, + // The response feeds a passive navbar tag and a debug banner — a failed + // call (e.g. expired token → 401) shouldn't fan out into three retries. + retry: false, }); }; diff --git a/ui/litellm-dashboard/src/components/navbar.test.tsx b/ui/litellm-dashboard/src/components/navbar.test.tsx index d2f3465d015..2e122164969 100644 --- a/ui/litellm-dashboard/src/components/navbar.test.tsx +++ b/ui/litellm-dashboard/src/components/navbar.test.tsx @@ -99,12 +99,17 @@ let mockUseAuthorizedImpl = () => ({ premiumUser: false, }); +const useHealthReadinessDetailsSpy = vi.hoisted(() => vi.fn()); + vi.mock("@/contexts/ThemeContext", () => ({ useTheme: () => mockUseThemeImpl(), })); vi.mock("@/app/(dashboard)/hooks/healthReadiness/useHealthReadinessDetails", () => ({ - useHealthReadinessDetails: () => mockUseHealthReadinessDetailsImpl(), + useHealthReadinessDetails: (accessToken: string | null | undefined) => { + useHealthReadinessDetailsSpy(accessToken); + return mockUseHealthReadinessDetailsImpl(); + }, })); vi.mock("@/app/(dashboard)/hooks/useAuthorized", () => ({ @@ -214,6 +219,22 @@ describe("Navbar", () => { mockUseHealthReadinessDetailsImpl = () => ({ data: null }); }); + it("should forward accessToken to the readiness hook", () => { + useHealthReadinessDetailsSpy.mockClear(); + + renderWithProviders(); + + expect(useHealthReadinessDetailsSpy).toHaveBeenCalledWith("my-token"); + }); + + it("should forward a null accessToken to the readiness hook (disables the hook)", () => { + useHealthReadinessDetailsSpy.mockClear(); + + renderWithProviders(); + + expect(useHealthReadinessDetailsSpy).toHaveBeenCalledWith(null); + }); + it("should use custom logo from theme context", () => { mockUseThemeImpl = () => ({ logoUrl: "https://example.com/custom-logo.png" });