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) {