From efca8f51837de12539979a13a40d58b628c77f2d Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Tue, 14 Jul 2026 05:10:10 +0000 Subject: [PATCH] test(ui): cover internal viewer model access --- .../internal-viewer/internalViewer.spec.ts | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/ui/litellm-dashboard/e2e_tests/tests/internal-viewer/internalViewer.spec.ts b/ui/litellm-dashboard/e2e_tests/tests/internal-viewer/internalViewer.spec.ts index 4de86c46398..06dcbcc2ce8 100644 --- a/ui/litellm-dashboard/e2e_tests/tests/internal-viewer/internalViewer.spec.ts +++ b/ui/litellm-dashboard/e2e_tests/tests/internal-viewer/internalViewer.spec.ts @@ -32,6 +32,7 @@ test.describe("Internal Viewer", () => { "Usage", "Logs", "Teams", + "Models + Endpoints", "API Reference", "AI Hub", ]; @@ -43,7 +44,7 @@ test.describe("Internal Viewer", () => { } // Items that must NOT be visible (admin-only surface) - const expectedHidden = ["Internal Users", "Organizations", "Models + Endpoints"]; + const expectedHidden = ["Internal Users", "Organizations"]; for (const label of expectedHidden) { await expect( nav.getByRole("link", { name: label, exact: true }), @@ -70,6 +71,23 @@ test.describe("Internal Viewer", () => { await expect(page.getByRole("button", { name: "Delete Key" })).toHaveCount(0); }); + test("Models page lists allowed models without management controls", async ({ page }) => { + await navigateToPage(page, Page.Models); + + await expect(page.getByText("fake-openai-gpt-4", { exact: true }).first()).toBeVisible({ timeout: 10_000 }); + await expect(page.getByRole("tab", { name: "Add Model" })).toHaveCount(0); + await expect(page.getByTitle("Model Settings")).toHaveCount(0); + + const modelRow = page.locator("tr", { hasText: "fake-openai-gpt-4" }).first(); + await modelRow.click(); + + await expect(page.getByText("Back to Models").first()).toBeVisible({ timeout: 10_000 }); + await expect(page.getByRole("button", { name: /test connection/i })).toBeDisabled(); + await expect(page.getByRole("button", { name: /update api key/i })).toBeDisabled(); + await expect(page.getByRole("button", { name: /delete model/i })).toBeDisabled(); + await expect(page.getByRole("button", { name: /edit settings/i })).toHaveCount(0); + }); + test("Team info page omits Members and Settings tabs for an Internal Viewer", async ({ page }) => { await navigateToPage(page, Page.Teams);