diff --git a/site/src/modules/resources/AgentRow.tsx b/site/src/modules/resources/AgentRow.tsx index f28c9a1670..af4968215b 100644 --- a/site/src/modules/resources/AgentRow.tsx +++ b/site/src/modules/resources/AgentRow.tsx @@ -157,6 +157,7 @@ export const AgentRow: React.FC = ({ agent.display_apps.includes("vscode") || agent.display_apps.includes("vscode_insiders"); const showVSCode = hasVSCodeApp && !browser_only; + const copyLogsLabel = "Copy selected logs"; const hasStartupFeatures = Boolean(agent.logs_length); const runningScriptsCount = agent.scripts.filter( @@ -720,12 +721,11 @@ export const AgentRow: React.FC = ({ ) : ( )} + {copyLogsLabel} - {showCopiedSuccess - ? "Copied!" - : "Copy selected logs"} + {showCopiedSuccess ? "Copied!" : copyLogsLabel} diff --git a/site/src/modules/workspaces/WorkspaceSharingForm/WorkspaceSharingForm.test.tsx b/site/src/modules/workspaces/WorkspaceSharingForm/WorkspaceSharingForm.test.tsx new file mode 100644 index 0000000000..31da80e2bf --- /dev/null +++ b/site/src/modules/workspaces/WorkspaceSharingForm/WorkspaceSharingForm.test.tsx @@ -0,0 +1,89 @@ +import { screen } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { API } from "#/api/api"; +import type { WorkspaceACL } from "#/api/typesGenerated"; +import { + MockGroup, + MockUserMember, + MockWorkspace, +} from "#/testHelpers/entities"; +import { render } from "#/testHelpers/renderHelpers"; +import { RoleSelectField, WorkspaceSharingForm } from "./WorkspaceSharingForm"; + +const mockWorkspaceACL: WorkspaceACL = { + users: [ + { + id: MockUserMember.id, + username: MockUserMember.username, + name: MockUserMember.name, + avatar_url: MockUserMember.avatar_url, + role: "use", + }, + ], + group: [{ ...MockGroup, role: "use" }], +}; + +describe("WorkspaceSharingForm", () => { + afterEach(() => { + vi.restoreAllMocks(); + }); + + it("names each member's role select after the member", async () => { + vi.spyOn(API, "getWorkspaceSharingSettings").mockResolvedValue({ + sharing_disabled: false, + sharing_globally_disabled: false, + shareable_workspace_owners: "everyone", + }); + const onUpdateUser = vi.fn(); + const onUpdateGroup = vi.fn(); + + render( + , + ); + + const user = userEvent.setup(); + await user.click( + await screen.findByRole("combobox", { + name: `Role for ${MockUserMember.username}`, + }), + ); + await user.click(await screen.findByRole("option", { name: /Admin/ })); + expect(onUpdateUser).toHaveBeenCalledWith( + mockWorkspaceACL.users[0], + "admin", + ); + + await user.click( + screen.getByRole("combobox", { + name: `Role for ${MockGroup.display_name || MockGroup.name}`, + }), + ); + await user.click(await screen.findByRole("option", { name: /Admin/ })); + expect(onUpdateGroup).toHaveBeenCalledWith( + mockWorkspaceACL.group[0], + "admin", + ); + }); +}); + +describe("RoleSelectField", () => { + it("has an accessible name", async () => { + const onChange = vi.fn(); + render(); + + const user = userEvent.setup(); + await user.click(await screen.findByRole("combobox", { name: "Role" })); + await user.click(await screen.findByRole("option", { name: "Admin" })); + expect(onChange).toHaveBeenCalledWith("admin"); + }); +}); diff --git a/site/src/modules/workspaces/WorkspaceSharingForm/WorkspaceSharingForm.tsx b/site/src/modules/workspaces/WorkspaceSharingForm/WorkspaceSharingForm.tsx index c2aea94afc..dd42f06546 100644 --- a/site/src/modules/workspaces/WorkspaceSharingForm/WorkspaceSharingForm.tsx +++ b/site/src/modules/workspaces/WorkspaceSharingForm/WorkspaceSharingForm.tsx @@ -41,12 +41,14 @@ import { getGroupSubtitle } from "#/modules/groups"; type RoleSelectProps = { value: WorkspaceRole; + memberOrGroupName: string; disabled?: boolean; onValueChange: (value: WorkspaceRole) => void; }; const RoleSelect: React.FC = ({ value, + memberOrGroupName, disabled, onValueChange, }) => { @@ -58,7 +60,10 @@ const RoleSelect: React.FC = ({ return (