diff --git a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.activity.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.activity.test.tsx
index ca7adf07941..19c80b5cf6b 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.activity.test.tsx
+++ b/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.activity.test.tsx
@@ -1,6 +1,10 @@
import { fireEvent, render, waitFor } from "@testing-library/react";
import { describe, expect, it, vi } from "vitest";
+vi.mock("@/app/(dashboard)/hooks/useCan", () => ({
+ default: () => true,
+}));
+
const mockUserDailyActivityCall = vi.fn();
vi.mock("@/components/networking", () => ({
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.test.tsx
index c6d5a410418..538f70aa5e0 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.test.tsx
+++ b/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/CostOptimizationView.test.tsx
@@ -1,12 +1,20 @@
import { fireEvent, render } from "@testing-library/react";
import { beforeEach, describe, expect, it, vi } from "vitest";
+import { hasCapability, type Capability } from "@/utils/capabilities";
-const { useAuthorizedMock } = vi.hoisted(() => ({ useAuthorizedMock: vi.fn() }));
+const { useAuthorizedMock, useCanMock } = vi.hoisted(() => ({
+ useAuthorizedMock: vi.fn(),
+ useCanMock: vi.fn(),
+}));
vi.mock("@/app/(dashboard)/hooks/useAuthorized", () => ({
default: useAuthorizedMock,
}));
+vi.mock("@/app/(dashboard)/hooks/useCan", () => ({
+ default: useCanMock,
+}));
+
vi.mock("./UsageTab", () => ({ __esModule: true, default: () =>
}));
vi.mock("./PromptCompressionTab", () => ({ __esModule: true, default: () => }));
vi.mock("./PromptCachingTab", () => ({ __esModule: true, default: () => }));
@@ -19,12 +27,14 @@ import CostOptimizationView from "./CostOptimizationView";
const renderView = (userRole = "Admin") => {
useAuthorizedMock.mockReturnValue({ accessToken: "test-token", userId: "u1", userRole });
+ useCanMock.mockImplementation((capability: Capability) => hasCapability(userRole, capability));
return render();
};
describe("CostOptimizationView", () => {
beforeEach(() => {
useAuthorizedMock.mockReturnValue({ accessToken: "test-token", userId: "u1", userRole: "Admin" });
+ useCanMock.mockImplementation((capability: Capability) => hasCapability("Admin", capability));
});
it("renders the four cost-optimization tabs", () => {
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/UsageTab.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/UsageTab.test.tsx
index ad68111bba7..b06a3c9251c 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/UsageTab.test.tsx
+++ b/ui/litellm-dashboard/src/app/(dashboard)/cost-optimization/_components/UsageTab.test.tsx
@@ -5,14 +5,23 @@ import type { ToolSpendResponse } from "@/components/networking";
import type { DailyData, SpendMetrics } from "@/components/UsagePage/types";
+import { hasCapability, type Capability } from "@/utils/capabilities";
+
const mockGetToolSpend = vi.fn();
-const { useAuthorizedMock } = vi.hoisted(() => ({ useAuthorizedMock: vi.fn() }));
+const { useAuthorizedMock, useCanMock } = vi.hoisted(() => ({
+ useAuthorizedMock: vi.fn(),
+ useCanMock: vi.fn(),
+}));
vi.mock("@/app/(dashboard)/hooks/useAuthorized", () => ({
default: useAuthorizedMock,
}));
+vi.mock("@/app/(dashboard)/hooks/useCan", () => ({
+ default: useCanMock,
+}));
+
vi.mock("@/components/networking", () => ({
getToolSpend: (...args: unknown[]) => mockGetToolSpend(...args),
}));
@@ -106,6 +115,7 @@ const renderWith = (results: DailyData[], options: RenderOptions = {}) => {
} = options;
mockGetToolSpend.mockResolvedValue(toolSpend);
useAuthorizedMock.mockReturnValue({ accessToken: "test-token", userId: "u1", userRole });
+ useCanMock.mockImplementation((capability: Capability) => hasCapability(userRole, capability));
return render(
{
renderAs(userRole);
expect(await screen.findByText("Guardrails Monitor is only available to admin users.")).toBeInTheDocument();
- await waitFor(() => expect(fetchMock).not.toHaveBeenCalled());
- expect(requestedUrls().filter((url) => url.includes("/guardrails/usage"))).toEqual([]);
+ await waitFor(() => expect(requestedUrls().filter((url) => url.includes("/guardrails/usage"))).toEqual([]));
},
);
});
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/memory/page.integration.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/memory/page.integration.test.tsx
index 8d15bb59187..40773381587 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/memory/page.integration.test.tsx
+++ b/ui/litellm-dashboard/src/app/(dashboard)/memory/page.integration.test.tsx
@@ -46,8 +46,7 @@ describe("Memory page access by role", () => {
renderAs(userRole);
expect(await screen.findByText("Memory is only available to admin users.")).toBeInTheDocument();
- await waitFor(() => expect(fetchMock).not.toHaveBeenCalled());
- expect(requestedUrls().filter((url) => url.includes("/v1/memory"))).toEqual([]);
+ await waitFor(() => expect(requestedUrls().filter((url) => url.includes("/v1/memory"))).toEqual([]));
},
);
diff --git a/ui/litellm-dashboard/src/app/(dashboard)/workflows/page.integration.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/workflows/page.integration.test.tsx
index 6b332faf704..5281ba626e1 100644
--- a/ui/litellm-dashboard/src/app/(dashboard)/workflows/page.integration.test.tsx
+++ b/ui/litellm-dashboard/src/app/(dashboard)/workflows/page.integration.test.tsx
@@ -46,8 +46,7 @@ describe("Workflows page access by role", () => {
renderAs(userRole);
expect(await screen.findByText("Workflow Runs is only available to admin users.")).toBeInTheDocument();
- await waitFor(() => expect(fetchMock).not.toHaveBeenCalled());
- expect(requestedUrls().filter((url) => url.includes("/v1/workflows"))).toEqual([]);
+ await waitFor(() => expect(requestedUrls().filter((url) => url.includes("/v1/workflows"))).toEqual([]));
},
);