diff --git a/web_ui/src/pages/user-management/workspaces/workspace-users-management.test.tsx b/web_ui/src/pages/user-management/workspaces/workspace-users-management.test.tsx deleted file mode 100644 index a70605dbfc..0000000000 --- a/web_ui/src/pages/user-management/workspaces/workspace-users-management.test.tsx +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright (C) 2022-2025 Intel Corporation -// LIMITED EDGE SOFTWARE DISTRIBUTION LICENSE - -describe('Workspace user management tests', () => { - test.todo('tbd'); -}); diff --git a/web_ui/src/pages/user-management/workspaces/workspace-users-toolbar.component.test.tsx b/web_ui/src/pages/user-management/workspaces/workspace-users-toolbar.component.test.tsx new file mode 100644 index 0000000000..b4e8e8bb21 --- /dev/null +++ b/web_ui/src/pages/user-management/workspaces/workspace-users-toolbar.component.test.tsx @@ -0,0 +1,171 @@ +// Copyright (C) 2022-2025 Intel Corporation +// LIMITED EDGE SOFTWARE DISTRIBUTION LICENSE + +import { createInMemoryUsersService } from '@geti/core/src/users/services/in-memory-users-service'; +import { User } from '@geti/core/src/users/users.interface'; +import { createInMemoryApiWorkspacesService } from '@geti/core/src/workspaces/services/in-memory-api-workspaces-service'; +import { screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +import { getMockedAdminUser, getMockedContributorUser } from '../../../test-utils/mocked-items-factory/mocked-users'; +import { getMockedWorkspace } from '../../../test-utils/mocked-items-factory/mocked-workspace'; +import { providersRender } from '../../../test-utils/required-providers-render'; +import { WorkspaceUsersToolbar } from './workspace-users-toolbar.component'; + +const mockUseParams = jest.fn(); +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useParams: (...args: unknown[]) => mockUseParams(...args), +})); + +jest.mock('../../../hooks/use-organization-identifier/use-organization-identifier.hook', () => ({ + useOrganizationIdentifier: () => ({ organizationId: 'org-123' }), +})); + +const workspaces = [ + getMockedWorkspace({ id: 'workspace-1', name: 'Workspace 1' }), + getMockedWorkspace({ id: 'workspace-2', name: 'Workspace 2' }), +]; + +const organizationId = 'org-123'; + +const createUsersServiceWithActiveUser = (activeUser: User) => { + const usersService = createInMemoryUsersService(); + usersService.getActiveUser = jest.fn().mockResolvedValue(activeUser); + + return usersService; +}; + +describe('WorkspaceUsersToolbar', () => { + beforeEach(() => { + mockUseParams.mockReturnValue({ organizationId, workspaceId: workspaces[0].id }); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('renders a tab for each workspace and highlights the selected workspace', async () => { + const workspacesService = createInMemoryApiWorkspacesService(); + workspacesService.getWorkspaces = jest.fn().mockResolvedValue(workspaces); + providersRender( + , + { + featureFlags: { FEATURE_FLAG_WORKSPACE_ACTIONS: false }, + services: { workspacesService }, + } + ); + + const tabs = await screen.findAllByRole('tab'); + expect(tabs).toHaveLength(workspaces.length); + + workspaces.forEach((workspace) => { + expect(screen.getByRole('tab', { name: workspace.name })).toBeInTheDocument(); + }); + + expect(screen.getByRole('tab', { name: workspaces[0].name })).toHaveAttribute('aria-selected', 'true'); + expect(screen.getByRole('tab', { name: workspaces[1].name })).not.toHaveAttribute('aria-selected', 'true'); + }); + + it('hides workspace actions when the feature flag is disabled', async () => { + const workspacesService = createInMemoryApiWorkspacesService(); + workspacesService.getWorkspaces = jest.fn().mockResolvedValue(workspaces); + providersRender( + , + { + featureFlags: { FEATURE_FLAG_WORKSPACE_ACTIONS: false }, + services: { workspacesService }, + } + ); + + await screen.findAllByRole('tab'); + + expect(screen.queryByRole('button', { name: 'Create workspace' })).not.toBeInTheDocument(); + expect(screen.queryByRole('button', { name: /open menu/i })).not.toBeInTheDocument(); + }); + + it('shows workspace actions when flag and permissions allow it', async () => { + const workspacesService = createInMemoryApiWorkspacesService(); + workspacesService.getWorkspaces = jest.fn().mockResolvedValue(workspaces); + mockUseParams.mockReturnValue({ organizationId, workspaceId: workspaces[0].id }); + const adminUser = getMockedAdminUser({}, workspaces[0].id, true, organizationId); + const usersService = createUsersServiceWithActiveUser(adminUser); + + providersRender( + , + { + featureFlags: { FEATURE_FLAG_WORKSPACE_ACTIONS: true }, + services: { workspacesService, usersService }, + } + ); + + await screen.findAllByRole('tab'); + + await waitFor(() => { + expect(screen.getByRole('button', { name: /open menu/i })).toBeVisible(); + }); + + expect(screen.getByRole('button', { name: 'Create workspace' })).toBeVisible(); + }); + + it('renders fallback when permissions fail even with the feature flag enabled', async () => { + const workspacesService = createInMemoryApiWorkspacesService(); + workspacesService.getWorkspaces = jest.fn().mockResolvedValue(workspaces); + const nonAdminUser = getMockedContributorUser({}, workspaces[0].id); + const usersService = createUsersServiceWithActiveUser(nonAdminUser); + + providersRender( + , + { + featureFlags: { FEATURE_FLAG_WORKSPACE_ACTIONS: true }, + services: { workspacesService, usersService }, + } + ); + + await screen.findAllByRole('tab'); + + expect(screen.queryByRole('button', { name: /open menu/i })).not.toBeInTheDocument(); + }); + + it('opens the create workspace dialog when the action button is pressed', async () => { + const workspacesService = createInMemoryApiWorkspacesService(); + workspacesService.getWorkspaces = jest.fn().mockResolvedValue(workspaces); + const adminUser = getMockedAdminUser({}, workspaces[0].id, true, organizationId); + const usersService = createUsersServiceWithActiveUser(adminUser); + + providersRender( + , + { + featureFlags: { FEATURE_FLAG_WORKSPACE_ACTIONS: true }, + services: { workspacesService, usersService }, + } + ); + + await screen.findAllByRole('tab'); + + const createButton = await screen.findByRole('button', { name: 'Create workspace' }); + await userEvent.click(createButton); + + expect(await screen.findByText('Create a new workspace')).toBeInTheDocument(); + }); +});