diff --git a/web_ui/src/pages/user-management/users/users-tab.component.tsx b/web_ui/src/pages/user-management/users/users-tab.component.tsx index af38993ea4..b96e60decd 100644 --- a/web_ui/src/pages/user-management/users/users-tab.component.tsx +++ b/web_ui/src/pages/user-management/users/users-tab.component.tsx @@ -4,6 +4,7 @@ import { RESOURCE_TYPE, User } from '@geti/core/src/users/users.interface'; import { Flex, Text } from '@geti/ui'; +import { useOrganization } from '../../../intel-admin-app/pages/organization/hooks/organization.hook'; import { OrganizationUserActions } from './actions/organization-user-actions.component'; import { Users } from './users.component'; @@ -12,6 +13,8 @@ interface UsersTabProps { } export const UsersTab = ({ activeUser }: UsersTabProps) => { + const { organizationId } = useOrganization(); + if (!activeUser) return <>; return ( @@ -24,8 +27,8 @@ export const UsersTab = ({ activeUser }: UsersTabProps) => { diff --git a/web_ui/src/pages/user-management/users/users-table/user-role-cell.component.tsx b/web_ui/src/pages/user-management/users/users-table/user-role-cell.component.tsx index 51225b1444..c2a99dc27e 100644 --- a/web_ui/src/pages/user-management/users/users-table/user-role-cell.component.tsx +++ b/web_ui/src/pages/user-management/users/users-table/user-role-cell.component.tsx @@ -43,9 +43,7 @@ export const UserRoleCell = ({ ); } - const workspaceRole = - roles.find((role) => role.resourceType === RESOURCE_TYPE.WORKSPACE && role.resourceId === resourceId)?.role ?? - 'N/A'; + const workspaceRole = roles.find((role) => role.resourceId === resourceId)?.role ?? 'N/A'; return ( 0 : resourceType === undefined; + const enableCreation = usersTableType === RESOURCE_TYPE.ORGANIZATION; const shouldShowAddUserButton = enableCreation && !isSaasEnvironment && productInfo?.isSmtpDefined === false; const shouldShowInviteUserButton = enableCreation && (isSaasEnvironment || productInfo?.isSmtpDefined === true); diff --git a/web_ui/tests/e2e/daily/members-management.spec.ts b/web_ui/tests/e2e/daily/members-management.spec.ts index dfa90a8812..e5fadc249d 100644 --- a/web_ui/tests/e2e/daily/members-management.spec.ts +++ b/web_ui/tests/e2e/daily/members-management.spec.ts @@ -3,51 +3,63 @@ import { v4 as uuid } from 'uuid'; -import { USER_ROLE, WorkspaceRole } from '../../../packages/core/src/users/users.interface'; +import { USER_ROLE } from '../../../packages/core/src/users/users.interface'; import { expect } from '../../fixtures/base-test'; import { MembersPage } from '../../fixtures/page-objects/members-page'; import { test } from '../fixtures'; const expectMemberToBeVisible = async ( membersPage: MembersPage, - member: { email: string; firstName: string; lastName: string; role: WorkspaceRole['role'] } + member: { + email: string; + firstName: string; + lastName: string; + organizationRole: USER_ROLE.ORGANIZATION_ADMIN | USER_ROLE.ORGANIZATION_CONTRIBUTOR; + } ) => { const memberRow = membersPage.getMemberRow(member.email); await expect(membersPage.getEmailCell(member.email, memberRow)).toBeVisible(); await expect(membersPage.getNameCell(member.firstName, member.lastName, memberRow)).toBeVisible(); - await expect(membersPage.getRoleCell(member.role, memberRow)).toBeVisible(); + await expect(membersPage.getRoleCell(member.organizationRole, memberRow)).toBeVisible(); }; const expectMemberNotToBeVisible = async ( membersPage: MembersPage, - member: { email: string; firstName: string; lastName: string; role: WorkspaceRole['role'] } + member: { + email: string; + firstName: string; + lastName: string; + organizationRole: USER_ROLE.ORGANIZATION_ADMIN | USER_ROLE.ORGANIZATION_CONTRIBUTOR; + } ) => { await expect(membersPage.getMemberRow(member.email)).toBeHidden(); }; test.describe('Members management suite', () => { - const workspaceAdminMember = { + const organizationAdminMember = { email: `test-admin-${uuid()}@intel.com`, firstName: 'Test', lastName: 'Admin', password: 'Test1234', - role: USER_ROLE.WORKSPACE_ADMIN, + workspaceRole: USER_ROLE.WORKSPACE_ADMIN, + organizationRole: USER_ROLE.ORGANIZATION_ADMIN, } as const; - const workspaceContributorMember = { + const organizationContributorMember = { email: `test-contributor-${uuid()}@intel.com`, firstName: 'Test', lastName: 'Contributor', password: 'Test1234', - role: USER_ROLE.WORKSPACE_CONTRIBUTOR, + workspaceRole: USER_ROLE.WORKSPACE_CONTRIBUTOR, + organizationRole: USER_ROLE.ORGANIZATION_CONTRIBUTOR, } as const; test.afterEach(async ({ membersPage }, testInfo) => { if (testInfo.status !== 'passed') { console.info('Cleanup'); - await membersPage.removeMember(workspaceAdminMember.email); - await membersPage.removeMember(workspaceContributorMember.email); + await membersPage.removeMember(organizationAdminMember.email); + await membersPage.removeMember(organizationContributorMember.email); } }); @@ -65,52 +77,52 @@ test.describe('Members management suite', () => { await membersPage.open(); - await test.step('Creates new workspace admin and workspace contributor member', async () => { - await membersPage.addMember(workspaceContributorMember); + await test.step('Creates new organization admin and organization contributor members', async () => { + await membersPage.addMember(organizationContributorMember); - await expectMemberToBeVisible(membersPage, workspaceContributorMember); + await expectMemberToBeVisible(membersPage, organizationContributorMember); - await membersPage.addMember(workspaceAdminMember); + await membersPage.addMember(organizationAdminMember); - await expectMemberToBeVisible(membersPage, workspaceAdminMember); + await expectMemberToBeVisible(membersPage, organizationAdminMember); }); - await test.step('Filters by workspace admin and workspace contributor role', async () => { - await membersPage.filterByRole(USER_ROLE.WORKSPACE_ADMIN); + await test.step('Filters by organization admin and organization contributor role', async () => { + await membersPage.filterByRole(USER_ROLE.ORGANIZATION_ADMIN); - await expectMemberToBeVisible(membersPage, workspaceAdminMember); - await expectMemberNotToBeVisible(membersPage, workspaceContributorMember); + await expectMemberToBeVisible(membersPage, organizationAdminMember); + await expectMemberNotToBeVisible(membersPage, organizationContributorMember); - await membersPage.filterByRole(USER_ROLE.WORKSPACE_CONTRIBUTOR); + await membersPage.filterByRole(USER_ROLE.ORGANIZATION_CONTRIBUTOR); - await expectMemberToBeVisible(membersPage, workspaceContributorMember); - await expectMemberNotToBeVisible(membersPage, workspaceAdminMember); + await expectMemberToBeVisible(membersPage, organizationContributorMember); + await expectMemberNotToBeVisible(membersPage, organizationAdminMember); await membersPage.filterByRole('All role'); - await expectMemberToBeVisible(membersPage, workspaceAdminMember); - await expectMemberToBeVisible(membersPage, workspaceContributorMember); + await expectMemberToBeVisible(membersPage, organizationAdminMember); + await expectMemberToBeVisible(membersPage, organizationContributorMember); }); await test.step("Filters by member's name and email", async () => { - await membersPage.filterByNameOrEmail(workspaceAdminMember.email); + await membersPage.filterByNameOrEmail(organizationAdminMember.email); - await expectMemberToBeVisible(membersPage, workspaceAdminMember); - await expectMemberNotToBeVisible(membersPage, workspaceContributorMember); + await expectMemberToBeVisible(membersPage, organizationAdminMember); + await expectMemberNotToBeVisible(membersPage, organizationContributorMember); - await membersPage.filterByNameOrEmail(workspaceContributorMember.lastName); + await membersPage.filterByNameOrEmail(organizationContributorMember.lastName); - await expectMemberToBeVisible(membersPage, workspaceContributorMember); - await expectMemberNotToBeVisible(membersPage, workspaceAdminMember); + await expectMemberToBeVisible(membersPage, organizationContributorMember); + await expectMemberNotToBeVisible(membersPage, organizationAdminMember); await membersPage.resetSearchFilter(); }); await test.step('Edits workspace admin and workspace contributor member', async () => { const updatedWorkspaceAdminMember = { - ...workspaceAdminMember, + ...organizationAdminMember, firstName: 'Updated', lastName: 'Old Admin', - role: USER_ROLE.WORKSPACE_CONTRIBUTOR, + role: USER_ROLE.ORGANIZATION_CONTRIBUTOR, } as const; await membersPage.editMember(updatedWorkspaceAdminMember); @@ -118,10 +130,10 @@ test.describe('Members management suite', () => { await expectMemberToBeVisible(membersPage, updatedWorkspaceAdminMember); const updatedWorkspaceContributorMember = { - ...workspaceContributorMember, + ...organizationContributorMember, firstName: 'Updated', lastName: 'Old Contributor', - role: USER_ROLE.WORKSPACE_ADMIN, + role: USER_ROLE.ORGANIZATION_ADMIN, } as const; await membersPage.editMember(updatedWorkspaceContributorMember); @@ -130,13 +142,13 @@ test.describe('Members management suite', () => { }); await test.step('Removes workspace admin and workspace contributor member', async () => { - await membersPage.removeMember(workspaceContributorMember.email); + await membersPage.removeMember(organizationContributorMember.email); - await expectMemberNotToBeVisible(membersPage, workspaceContributorMember); + await expectMemberNotToBeVisible(membersPage, organizationContributorMember); - await membersPage.removeMember(workspaceAdminMember.email); + await membersPage.removeMember(organizationAdminMember.email); - await expectMemberNotToBeVisible(membersPage, workspaceAdminMember); + await expectMemberNotToBeVisible(membersPage, organizationAdminMember); }); }); }); diff --git a/web_ui/tests/features/profile-page/members.spec.ts b/web_ui/tests/features/profile-page/members.spec.ts index 0f0840489a..30140b1f83 100644 --- a/web_ui/tests/features/profile-page/members.spec.ts +++ b/web_ui/tests/features/profile-page/members.spec.ts @@ -25,12 +25,12 @@ const expectMembersToBeVisible = async ( await expect(membersPage.getEmailCell(member.email, row)).toBeVisible(); await expect(membersPage.getNameCell(member.firstName, member.secondName, row)).toBeVisible(); - const workspaceRole = member.roles.find((role) => role.resourceType === ResourceTypeDTO.WORKSPACE); - if (workspaceRole === undefined) { - throw new Error(`${member} does not have workspace role`); + const organizationRole = member.roles.find((role) => role.resourceType === ResourceTypeDTO.ORGANIZATION); + if (organizationRole === undefined) { + throw new Error(`${member} does not have organization role`); } - await expect(membersPage.getRoleCell(USER_ROLE_MAPPING[workspaceRole.role], row)).toBeVisible(); + await expect(membersPage.getRoleCell(USER_ROLE_MAPPING[organizationRole.role], row)).toBeVisible(); } }; @@ -57,14 +57,19 @@ test.describe('Members page', () => { }); }); - // TODO: need to fix it in a separate PR - test.skip('Creates a workspace admin member', async ({ page, membersPage, registerApiResponse, openApi }) => { + test('Creates an organization admin - workspace admin member', async ({ + page, + membersPage, + registerApiResponse, + openApi, + }) => { const member = { firstName: 'Yet another', lastName: 'User', email: 'test50@intel.com', password: 'Test1234', - role: USER_ROLE.WORKSPACE_ADMIN, + workspaceRole: USER_ROLE.WORKSPACE_ADMIN, + organizationRole: USER_ROLE.ORGANIZATION_ADMIN, } as const; const members = registerApiMembers({ registerApiResponse, openApi }); @@ -96,6 +101,57 @@ test.describe('Members page', () => { resourceType: 'organization', resourceId: '5b1f89f3-aba5-4a5f-84ab-de9abb8e0633', }, + ], + }); + + await expect(membersPage.membersTableCount).toHaveCount(members.get().length); + await expectMembersToBeVisible(membersPage, members.get()); + }); + + test('Creates an organization contributor - workspace admin member', async ({ + page, + membersPage, + registerApiResponse, + openApi, + }) => { + const member = { + firstName: 'Yet another', + lastName: 'User', + email: 'test50@intel.com', + password: 'Test1234', + workspaceRole: USER_ROLE.WORKSPACE_ADMIN, + organizationRole: USER_ROLE.ORGANIZATION_CONTRIBUTOR, + } as const; + + const members = registerApiMembers({ registerApiResponse, openApi }); + + await membersPage.openByURL(organizationId); + + await expect(membersPage.addMemberButton).toBeVisible(); + + await expect(membersPage.membersTableCount).toHaveCount(members.get().length); + await expectMembersToBeVisible(membersPage, members.get()); + + const addUserRequestPromise = page.waitForRequest((req) => { + return req.method() === 'POST' && req.url().includes('/users/create'); + }); + + await membersPage.addMember(member); + + const addUserRequest = await addUserRequestPromise; + const addUserRequestPayload = JSON.parse(addUserRequest.postData() ?? ''); + + expect(addUserRequestPayload).toEqual({ + email: member.email, + firstName: member.firstName, + secondName: member.lastName, + password: expect.any(String), + roles: [ + { + role: 'organization_contributor', + resourceType: 'organization', + resourceId: '5b1f89f3-aba5-4a5f-84ab-de9abb8e0633', + }, { role: 'workspace_admin', resourceType: 'workspace', @@ -108,14 +164,19 @@ test.describe('Members page', () => { await expectMembersToBeVisible(membersPage, members.get()); }); - // TODO: need to fix it in a separate PR - test.skip('Creates a workspace contributor member', async ({ page, membersPage, openApi, registerApiResponse }) => { + test('Creates an organization contributor - workspace contributor member', async ({ + page, + membersPage, + openApi, + registerApiResponse, + }) => { const member = { firstName: 'Test', lastName: 'User', email: 'tes@intel.com', password: 'Test1234', - role: USER_ROLE.WORKSPACE_CONTRIBUTOR, + workspaceRole: USER_ROLE.WORKSPACE_CONTRIBUTOR, + organizationRole: USER_ROLE.ORGANIZATION_CONTRIBUTOR, } as const; const members = registerApiMembers({ registerApiResponse, openApi }); @@ -158,8 +219,7 @@ test.describe('Members page', () => { await expectMembersToBeVisible(membersPage, members.get()); }); - // TODO: reenable this after users tab merge - test.skip('Removes a workspace admin member', async ({ page, membersPage, registerApiResponse }) => { + test('Removes a workspace admin member', async ({ page, membersPage, registerApiResponse }) => { const members = registerApiMembers({ registerApiResponse }); await membersPage.openByURL(organizationId); @@ -187,8 +247,7 @@ test.describe('Members page', () => { await expect(membersPage.getEmailCell(workspaceAdmin2.email)).toBeHidden(); }); - // TODO: reenable this after users tab merge - test.skip('Removes a workspace contributor member', async ({ page, membersPage, registerApiResponse }) => { + test('Removes a workspace contributor member', async ({ page, membersPage, registerApiResponse }) => { const members = registerApiMembers({ registerApiResponse }); await membersPage.openByURL(organizationId); @@ -216,8 +275,7 @@ test.describe('Members page', () => { await expect(membersPage.getEmailCell(workspaceContributor.email)).toBeHidden(); }); - // TODO: need to fix it in a separate PR - test.skip('Filters by workspace admin or contributor role', async ({ page, membersPage, registerApiResponse }) => { + test('Filters by organization admin or contributor role', async ({ page, membersPage, registerApiResponse }) => { const members = registerApiMembers({ registerApiResponse }); await membersPage.openByURL(organizationId); @@ -230,12 +288,11 @@ test.describe('Members page', () => { return req.method() === 'GET' && req.url().includes(`/users`); }); - await membersPage.filterByRole(USER_ROLE.WORKSPACE_ADMIN); + await membersPage.filterByRole(USER_ROLE.ORGANIZATION_ADMIN); const filterMembersRequest = await filterMembersRequestPromise; - expect(filterMembersRequest.url()).toContain(`role=${UserRoleDTO.WORKSPACE_ADMIN}`); - + expect(filterMembersRequest.url()).toContain(`role=${UserRoleDTO.ORGANIZATION_ADMIN}`); await expect(membersPage.membersTableCount).toHaveCount(members.get().length); await expectMembersToBeVisible(membersPage, members.get()); await expect(membersPage.getEmailCell(workspaceContributor.email)).toBeHidden(); @@ -244,11 +301,11 @@ test.describe('Members page', () => { return req.method() === 'GET' && req.url().includes(`/users`); }); - await membersPage.filterByRole(USER_ROLE.WORKSPACE_CONTRIBUTOR); + await membersPage.filterByRole(USER_ROLE.ORGANIZATION_CONTRIBUTOR); const filterContributorMembersRequest = await filterContributorMembersRequestPromise; - expect(filterContributorMembersRequest.url()).toContain(`role=${UserRoleDTO.WORKSPACE_CONTRIBUTOR}`); + expect(filterContributorMembersRequest.url()).toContain(`role=${UserRoleDTO.ORGANIZATION_CONTRIBUTOR}`); await expect(membersPage.membersTableCount).toHaveCount(members.get().length); await expectMembersToBeVisible(membersPage, members.get()); @@ -256,8 +313,7 @@ test.describe('Members page', () => { await expect(membersPage.getEmailCell(workspaceAdmin2.email)).toBeHidden(); }); - // TODO: need to fix it in a separate PR - test.skip("Filters by member's name", async ({ page, membersPage, registerApiResponse }) => { + test("Filters by member's name", async ({ page, membersPage, registerApiResponse }) => { const members = registerApiMembers({ registerApiResponse }); await membersPage.openByURL(organizationId); @@ -284,18 +340,22 @@ test.describe('Members page', () => { test.describe('FEATURE_FLAG_MANAGE_USERS_ROLES: on', () => { test.use({ featureFlags: { FEATURE_FLAG_MANAGE_USERS_ROLES: true } }); - // TODO: need to fix it in a separate PR - test.skip('Edits workspace admin user', async ({ page, membersPage, registerApiResponse, openApi }) => { - const editedWorkspaceAdmin2 = getMockedMember({ + test('Edits organization admin user', async ({ page, membersPage, registerApiResponse, openApi }) => { + const editedOrganizationAdmin = getMockedMember({ ...workspaceAdmin2, firstName: 'Edit Test', secondName: 'User', roles: [ { - role: UserRoleDTO.ORGANIZATION_CONTRIBUTOR, + role: UserRoleDTO.ORGANIZATION_ADMIN, resourceType: ResourceTypeDTO.ORGANIZATION, resourceId: organizationId, }, + { + resourceId: workspace.id, + resourceType: ResourceTypeDTO.WORKSPACE, + role: UserRoleDTO.WORKSPACE_ADMIN, + }, ], }); @@ -314,12 +374,11 @@ test.describe('Members page', () => { }); const editedMember = { - email: editedWorkspaceAdmin2.email, - firstName: editedWorkspaceAdmin2.firstName, - lastName: editedWorkspaceAdmin2.secondName, - role: USER_ROLE.WORKSPACE_CONTRIBUTOR, + email: editedOrganizationAdmin.email, + firstName: editedOrganizationAdmin.firstName, + lastName: editedOrganizationAdmin.secondName, + role: USER_ROLE.ORGANIZATION_CONTRIBUTOR, } as const; - await membersPage.editMember(editedMember); const editMemberRequest = await editMemberRequestPromise; @@ -332,24 +391,28 @@ test.describe('Members page', () => { role: UserRoleDTO.ORGANIZATION_CONTRIBUTOR, resourceId: organizationId, }); - expect(editMemberRequestPayload).toEqual(editedWorkspaceAdmin2); + expect(editMemberRequestPayload).toEqual(editedOrganizationAdmin); await expectMembersToBeVisible(membersPage, members.get()); await expect(membersPage.getNameCell(workspaceAdmin2.firstName, workspaceAdmin2.secondName)).toBeHidden(); }); - // TODO: need to fix it in a separate PR - test.skip('Edits workspace contributor user', async ({ page, membersPage, registerApiResponse, openApi }) => { - const editedWorkspaceContributor = getMockedMember({ + test('Edits workspace contributor user', async ({ page, membersPage, registerApiResponse, openApi }) => { + const editedOrganizationContributor = getMockedMember({ ...workspaceContributor, - firstName: 'Test', - secondName: 'User', + firstName: 'Edited First Name', + secondName: 'Edited Second Name', roles: [ { - role: UserRoleDTO.ORGANIZATION_ADMIN, + role: UserRoleDTO.ORGANIZATION_CONTRIBUTOR, resourceType: ResourceTypeDTO.ORGANIZATION, resourceId: organizationId, }, + { + resourceId: workspace.id, + resourceType: ResourceTypeDTO.WORKSPACE, + role: UserRoleDTO.WORKSPACE_CONTRIBUTOR, + }, ], }); @@ -368,12 +431,16 @@ test.describe('Members page', () => { }); const editedMember = { - email: editedWorkspaceContributor.email, - firstName: editedWorkspaceContributor.firstName, - lastName: editedWorkspaceContributor.secondName, - role: USER_ROLE.WORKSPACE_ADMIN, + email: editedOrganizationContributor.email, + firstName: editedOrganizationContributor.firstName, + lastName: editedOrganizationContributor.secondName, + role: USER_ROLE.ORGANIZATION_ADMIN, } as const; + await expect( + membersPage.getNameCell(workspaceContributor.firstName, workspaceContributor.secondName) + ).toBeVisible(); + await membersPage.editMember(editedMember); const editMemberRequest = await editMemberRequestPromise; @@ -386,9 +453,15 @@ test.describe('Members page', () => { role: UserRoleDTO.ORGANIZATION_ADMIN, resourceId: organizationId, }); - expect(editMemberRequestPayload).toEqual(editedWorkspaceContributor); + expect(editMemberRequestPayload).toEqual(editedOrganizationContributor); await expectMembersToBeVisible(membersPage, members.get()); + await expect( + membersPage.getNameCell( + editedOrganizationContributor.firstName, + editedOrganizationContributor.secondName + ) + ).toBeVisible(); await expect( membersPage.getNameCell(workspaceContributor.firstName, workspaceContributor.secondName) ).toBeHidden(); @@ -398,17 +471,21 @@ test.describe('Members page', () => { test.describe('FEATURE_FLAG_MANAGE_USERS_ROLES: off', () => { test.use({ featureFlags: { FEATURE_FLAG_MANAGE_USERS_ROLES: false } }); - // TODO: need to fix it in a separate PR - test.skip('Edits workspace admin user', async ({ page, membersPage, registerApiResponse }) => { + test('Edits organization admin user', async ({ page, membersPage, registerApiResponse }) => { const editedWorkspaceAdmin2 = getMockedMember({ ...workspaceAdmin2, - firstName: 'EditedTest', - secondName: 'User', + firstName: 'EditedFirstName', + secondName: 'EditedSecondName', roles: [ { - role: UserRoleDTO.WORKSPACE_CONTRIBUTOR, - resourceType: ResourceTypeDTO.WORKSPACE, + role: UserRoleDTO.ORGANIZATION_ADMIN, + resourceType: ResourceTypeDTO.ORGANIZATION, + resourceId: organizationId, + }, + { resourceId: workspace.id, + resourceType: ResourceTypeDTO.WORKSPACE, + role: UserRoleDTO.WORKSPACE_ADMIN, }, ], }); @@ -431,7 +508,7 @@ test.describe('Members page', () => { email: editedWorkspaceAdmin2.email, firstName: editedWorkspaceAdmin2.firstName, lastName: editedWorkspaceAdmin2.secondName, - role: USER_ROLE.WORKSPACE_CONTRIBUTOR, + role: USER_ROLE.ORGANIZATION_CONTRIBUTOR, } as const; await membersPage.editMember(editedMember); @@ -447,17 +524,17 @@ test.describe('Members page', () => { { operation: 'DELETE', role: { - role: UserRoleDTO.WORKSPACE_ADMIN, - resourceType: ResourceTypeDTO.WORKSPACE, - resourceId: workspace.id, + role: UserRoleDTO.ORGANIZATION_ADMIN, + resourceType: ResourceTypeDTO.ORGANIZATION, + resourceId: organizationId, }, }, { operation: 'CREATE', role: { - role: UserRoleDTO.WORKSPACE_CONTRIBUTOR, - resourceType: ResourceTypeDTO.WORKSPACE, - resourceId: workspace.id, + role: UserRoleDTO.ORGANIZATION_CONTRIBUTOR, + resourceType: ResourceTypeDTO.ORGANIZATION, + resourceId: organizationId, }, }, ], @@ -468,15 +545,19 @@ test.describe('Members page', () => { await expect(membersPage.getNameCell(workspaceAdmin2.firstName, workspaceAdmin2.secondName)).toBeHidden(); }); - // TODO: need to fix it in a separate PR - test.skip('Edits workspace contributor user', async ({ page, membersPage, registerApiResponse }) => { - const editedWorkspaceContributor = getMockedMember({ + test('Edits workspace contributor user', async ({ page, membersPage, registerApiResponse }) => { + const editedOrganizationContributor = getMockedMember({ ...workspaceContributor, firstName: 'Test', secondName: 'User', roles: [ { - role: UserRoleDTO.WORKSPACE_ADMIN, + role: UserRoleDTO.ORGANIZATION_CONTRIBUTOR, + resourceType: ResourceTypeDTO.ORGANIZATION, + resourceId: organizationId, + }, + { + role: UserRoleDTO.WORKSPACE_CONTRIBUTOR, resourceType: ResourceTypeDTO.WORKSPACE, resourceId: workspace.id, }, @@ -498,10 +579,10 @@ test.describe('Members page', () => { }); const editedMember = { - email: editedWorkspaceContributor.email, - firstName: editedWorkspaceContributor.firstName, - lastName: editedWorkspaceContributor.secondName, - role: USER_ROLE.WORKSPACE_ADMIN, + email: editedOrganizationContributor.email, + firstName: editedOrganizationContributor.firstName, + lastName: editedOrganizationContributor.secondName, + role: USER_ROLE.ORGANIZATION_ADMIN, } as const; await membersPage.editMember(editedMember); @@ -517,22 +598,22 @@ test.describe('Members page', () => { { operation: 'DELETE', role: { - role: UserRoleDTO.WORKSPACE_CONTRIBUTOR, - resourceType: ResourceTypeDTO.WORKSPACE, - resourceId: workspace.id, + role: UserRoleDTO.ORGANIZATION_CONTRIBUTOR, + resourceType: ResourceTypeDTO.ORGANIZATION, + resourceId: organizationId, }, }, { operation: 'CREATE', role: { - role: UserRoleDTO.WORKSPACE_ADMIN, - resourceType: ResourceTypeDTO.WORKSPACE, - resourceId: workspace.id, + role: UserRoleDTO.ORGANIZATION_ADMIN, + resourceType: ResourceTypeDTO.ORGANIZATION, + resourceId: organizationId, }, }, ], }); - expect(editMemberRequestPayload).toEqual(editedWorkspaceContributor); + expect(editMemberRequestPayload).toEqual(editedOrganizationContributor); await expectMembersToBeVisible(membersPage, members.get()); await expect( diff --git a/web_ui/tests/fixtures/page-objects/members-page.ts b/web_ui/tests/fixtures/page-objects/members-page.ts index e41ef60133..6631796f82 100644 --- a/web_ui/tests/fixtures/page-objects/members-page.ts +++ b/web_ui/tests/fixtures/page-objects/members-page.ts @@ -2,9 +2,10 @@ // LIMITED EDGE SOFTWARE DISTRIBUTION LICENSE import { paths } from '@geti/core'; -import { USER_ROLE } from '@geti/core/src/users/users.interface'; import { expect, Locator, Page } from '@playwright/test'; +import { USER_ROLE } from '../../../packages/core/src/users/users.interface'; + export class MembersPage { constructor(private page: Page) {} @@ -41,7 +42,8 @@ export class MembersPage { email: string; firstName: string; lastName: string; - role: USER_ROLE.WORKSPACE_ADMIN | USER_ROLE.WORKSPACE_CONTRIBUTOR; + workspaceRole: USER_ROLE.WORKSPACE_ADMIN | USER_ROLE.WORKSPACE_CONTRIBUTOR; + organizationRole: USER_ROLE.ORGANIZATION_ADMIN | USER_ROLE.ORGANIZATION_CONTRIBUTOR; password: string; }) { await this.addMemberButton.click(); @@ -51,9 +53,16 @@ export class MembersPage { await this.page.getByRole('textbox', { name: /email address/i }).fill(member.email); await this.page.getByRole('textbox', { name: /first name/i }).fill(member.firstName); await this.page.getByRole('textbox', { name: /last name/i }).fill(member.lastName); + await this.page.getByRole('button', { name: /Organization contributor/i }).click(); + await this.page.getByRole('option', { name: member.organizationRole }).click(); + + if (member.organizationRole === USER_ROLE.ORGANIZATION_CONTRIBUTOR) { + await this.page.getByRole('button', { name: 'Default workspace Workspace' }).click(); + await this.page.getByRole('option', { name: 'Default workspace' }).locator('div').click(); + await this.page.getByRole('button', { name: 'Workspace contributor' }).click(); + await this.page.getByRole('option', { name: member.workspaceRole }).locator('div').click(); + } - await this.page.getByRole('button', { name: /select a role/i }).click(); - await this.page.getByRole('option', { name: member.role }).click(); await this.page.getByLabel('Password', { exact: true }).fill(member.password); await this.page.getByLabel('Confirm password').fill(member.password); @@ -61,7 +70,7 @@ export class MembersPage { } private getActionMenuButton(email: string) { - return this.page.getByRole('button', { name: new RegExp(`${email} action menu`) }); + return this.page.getByRole('button', { name: new RegExp(`${email} organization user action menu`) }); } async removeMember(email: string) {