From ec0fe36974e0240ea837c3e4d9081169d17a2999 Mon Sep 17 00:00:00 2001 From: Yuneng Jiang Date: Fri, 24 Jul 2026 22:43:53 -0700 Subject: [PATCH] test(ui): characterise DefaultUserSettings editable fields before shadcn migration Covers the boolean switch and the teams editor through the save payload, so the behaviour is pinned by assertions that pass against the current antd/Tremor component and are library-agnostic. --- .../_components/DefaultUserSettings.test.tsx | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/ui/litellm-dashboard/src/app/(dashboard)/users/_components/DefaultUserSettings.test.tsx b/ui/litellm-dashboard/src/app/(dashboard)/users/_components/DefaultUserSettings.test.tsx index 06dafcfcffd..7a60dfbcecd 100644 --- a/ui/litellm-dashboard/src/app/(dashboard)/users/_components/DefaultUserSettings.test.tsx +++ b/ui/litellm-dashboard/src/app/(dashboard)/users/_components/DefaultUserSettings.test.tsx @@ -150,4 +150,105 @@ describe("DefaultUserSettings", () => { expect(screen.getByText("Edit Settings")).toBeInTheDocument(); }); + + describe("editable fields", () => { + const editableSettings = { + values: { + sso_enabled: false, + teams: [], + }, + field_schema: { + description: "Default user settings", + properties: { + sso_enabled: { + type: "boolean", + description: "Whether SSO is enabled for new users", + }, + teams: { + type: "array", + description: "Teams", + }, + }, + }, + }; + + const enterEditMode = async () => { + mockGetInternalUserSettings.mockResolvedValue(editableSettings); + mockUpdateInternalUserSettings.mockResolvedValue({ settings: {} }); + + render(); + + await waitFor(() => { + expect(screen.getByText("Edit Settings")).toBeInTheDocument(); + }); + + act(() => { + fireEvent.click(screen.getByText("Edit Settings")); + }); + }; + + const savedPayload = () => mockUpdateInternalUserSettings.mock.calls[0][1] as Record; + + it("sends the toggled value of a boolean field when saving", async () => { + await enterEditMode(); + + act(() => { + fireEvent.click(screen.getByRole("switch")); + }); + act(() => { + fireEvent.click(screen.getByText("Save Changes")); + }); + + await waitFor(() => { + expect(mockUpdateInternalUserSettings).toHaveBeenCalled(); + }); + expect(savedPayload().sso_enabled).toBe(true); + }); + + it("sends a team added through the teams editor when saving", async () => { + await enterEditMode(); + + expect(screen.queryByText("Team 1")).not.toBeInTheDocument(); + + act(() => { + fireEvent.click(screen.getByText("Add Team")); + }); + expect(screen.getByText("Team 1")).toBeInTheDocument(); + + act(() => { + fireEvent.change(screen.getByPlaceholderText("Enter team ID"), { target: { value: "team-abc" } }); + }); + act(() => { + fireEvent.click(screen.getByText("Save Changes")); + }); + + await waitFor(() => { + expect(mockUpdateInternalUserSettings).toHaveBeenCalled(); + }); + expect(savedPayload().teams).toEqual([{ team_id: "team-abc", user_role: "user" }]); + }); + + it("drops a team removed through the teams editor", async () => { + await enterEditMode(); + + act(() => { + fireEvent.click(screen.getByText("Add Team")); + }); + expect(screen.getByText("Team 1")).toBeInTheDocument(); + + act(() => { + fireEvent.click(screen.getByText("Remove")); + }); + expect(screen.queryByText("Team 1")).not.toBeInTheDocument(); + + act(() => { + fireEvent.click(screen.getByText("Save Changes")); + }); + + await waitFor(() => { + expect(mockUpdateInternalUserSettings).toHaveBeenCalled(); + }); + expect(savedPayload().teams).toEqual([]); + }); + }); });