diff --git a/cypress/apiRequests/PermissionGroup.js b/cypress/apiRequests/PermissionGroup.js new file mode 100644 index 000000000..295461cd9 --- /dev/null +++ b/cypress/apiRequests/PermissionGroup.js @@ -0,0 +1,71 @@ +import { getValueWithDefault } from "./utils/Utils"; + +export function getPermissionGroups(first, startsWith) { + const query = `query{ + permissionGroups(first:${first} filter:{ + search:"${startsWith}" + }){ + edges{ + node{ + id + name + } + } + } + }`; + return cy + .sendRequestWithQuery(query) + .then(resp => resp.body.data.permissionGroups.edges); +} + +export function deletePermissionGroup(permissionGroupId) { + const mutation = `mutation{ + permissionGroupDelete(id:"${permissionGroupId}"){ + errors{ + field + message + } + } + }`; + return cy.sendRequestWithQuery(mutation); +} + +export function createPermissionGroup({ + name, + userIdsArray, + permissionsArray +}) { + const users = getValueWithDefault(userIdsArray, `addUsers:${userIdsArray}`); + const mutation = `mutation{ + permissionGroupCreate(input:{ + name:"${name}" + addPermissions:${permissionsArray} + ${users} + }){ + errors{ + field + message + } + group{ + id + name + } + } + }`; + return cy + .sendRequestWithQuery(mutation) + .its("body.data.permissionGroupCreate"); +} + +export function getPermissionGroup(permissionGroupId) { + const query = `query{ + permissionGroup(id:"${permissionGroupId}"){ + id + name + users{ + email + } + } + }`; + return cy.sendRequestWithQuery(query).its("body.data.permissionGroup"); +} diff --git a/cypress/apiRequests/StaffMembers.js b/cypress/apiRequests/StaffMembers.js new file mode 100644 index 000000000..73e9fa7c0 --- /dev/null +++ b/cypress/apiRequests/StaffMembers.js @@ -0,0 +1,15 @@ +export function getStaffMembersStartsWith(startsWith) { + const query = `query{ + staffUsers(first:100 filter:{ + search:"${startsWith}" + }){ + edges{ + node{ + id + email + } + } + } + }`; + return cy.sendRequestWithQuery(query); +} diff --git a/cypress/elements/permissionGroup/permissionGroupDetails.js b/cypress/elements/permissionGroup/permissionGroupDetails.js new file mode 100644 index 000000000..41acd5e13 --- /dev/null +++ b/cypress/elements/permissionGroup/permissionGroupDetails.js @@ -0,0 +1,10 @@ +export const PERMISSION_GROUP_DETAILS = { + nameInput: '[name="name"]', + productsPermissionCheckbox: '[id="MANAGE_PRODUCTS"]', + productsTypesAndAttributesPermissionCheckbox: + '[id="MANAGE_PRODUCT_TYPES_AND_ATTRIBUTES"]', + assignMemberButton: '[data-test-id="assign-members"]', + searchField: '[name="query"]', + removeUserButton: '[data-test-id="removeUser"]', + userRow: '[data-test-id="userRow"]' +}; diff --git a/cypress/elements/permissionGroup/permissionGroupsList.js b/cypress/elements/permissionGroup/permissionGroupsList.js new file mode 100644 index 000000000..d66cc17bf --- /dev/null +++ b/cypress/elements/permissionGroup/permissionGroupsList.js @@ -0,0 +1,4 @@ +export const PERMISSION_GROUP_LIST = { + createPermissionButton: '[data-test-id="createPermissionGroup"]', + permissionGroupRow: '[data-test="id"]' +}; diff --git a/cypress/elements/shared/button-selectors.js b/cypress/elements/shared/button-selectors.js index 0b2102f20..f29392a8f 100644 --- a/cypress/elements/shared/button-selectors.js +++ b/cypress/elements/shared/button-selectors.js @@ -9,5 +9,6 @@ export const BUTTON_SELECTORS = { notSelectedOption: ":not([aria-selected])", deleteButton: '[data-test="button-bar-delete"]', expandIcon: '[data-test-id="expand-icon"]', + deleteIcon: '[data-test-id="deleteIcon"]', showMoreButton: '[data-test-id="showMoreButton"]' }; diff --git a/cypress/integration/allEnv/configuration/permissions.js b/cypress/integration/allEnv/configuration/permissions.js new file mode 100644 index 000000000..d26262b7c --- /dev/null +++ b/cypress/integration/allEnv/configuration/permissions.js @@ -0,0 +1,145 @@ +import faker from "faker"; + +import { + createPermissionGroup, + getPermissionGroup +} from "../../../apiRequests/PermissionGroup.js"; +import { getStaffMembersStartsWith } from "../../../apiRequests/StaffMembers"; +import { USER_WITHOUT_NAME } from "../../../Data/users"; +import { PERMISSION_GROUP_DETAILS } from "../../../elements/permissionGroup/permissionGroupDetails"; +import { PERMISSION_GROUP_LIST } from "../../../elements/permissionGroup/permissionGroupsList"; +import { BUTTON_SELECTORS } from "../../../elements/shared/button-selectors"; +import { SHARED_ELEMENTS } from "../../../elements/shared/sharedElements"; +import { + permissionGroupDetails, + staffMemberDetailsUrl, + urlList +} from "../../../url/urlList"; +import { deletePermissionGroupsStartsWith } from "../../../utils/permissionGroupUtils.js"; + +describe("Permissions groups", () => { + const startsWith = "CyPermissions-"; + + before(() => { + cy.clearSessionData().loginUserViaRequest(); + deletePermissionGroupsStartsWith(startsWith); + }); + + beforeEach(() => { + cy.clearSessionData().loginUserViaRequest(); + }); + + it("should create permission group", () => { + const permissionName = `${startsWith}${faker.datatype.number()}`; + + cy.visit(urlList.permissionsGroups) + .get(PERMISSION_GROUP_LIST.createPermissionButton) + .click() + .get(PERMISSION_GROUP_DETAILS.nameInput) + .type(permissionName) + .get(PERMISSION_GROUP_DETAILS.productsPermissionCheckbox) + .click() + .get( + PERMISSION_GROUP_DETAILS.productsTypesAndAttributesPermissionCheckbox + ) + .click() + .get(BUTTON_SELECTORS.confirm) + .click() + .get(PERMISSION_GROUP_DETAILS.assignMemberButton) + .should("be.visible") + .get(BUTTON_SELECTORS.back) + .click() + .get(SHARED_ELEMENTS.progressBar) + .should("not.exist"); + cy.contains( + PERMISSION_GROUP_LIST.permissionGroupRow, + permissionName + ).should("be.visible"); + }); + + it("should delete permission group", () => { + const permissionName = `${startsWith}${faker.datatype.number()}`; + let staffMember; + getStaffMembersStartsWith(USER_WITHOUT_NAME.email) + .its("body.data.staffUsers.edges") + .then(staffMemberResp => { + staffMember = staffMemberResp[0].node; + createPermissionGroup({ + name: permissionName, + userIdsArray: `["${staffMember.id}"]`, + permissionsArray: "[MANAGE_PRODUCTS]" + }); + cy.visit(urlList.permissionsGroups); + cy.contains(PERMISSION_GROUP_LIST.permissionGroupRow, permissionName) + .should("be.visible") + .find(BUTTON_SELECTORS.deleteIcon) + .click() + .get(BUTTON_SELECTORS.submit) + .click(); + cy.contains(PERMISSION_GROUP_LIST.permissionGroupRow, permissionName) + .should("not.exist") + .visit(staffMemberDetailsUrl(staffMember.id)); + cy.get(SHARED_ELEMENTS.header).should("be.visible"); + cy.contains(permissionName).should("not.exist"); + }); + }); + + it("should add user to permission group", () => { + const permissionName = `${startsWith}${faker.datatype.number()}`; + createPermissionGroup({ + name: permissionName, + permissionsArray: "[MANAGE_PRODUCTS]" + }) + .then(({ group }) => { + cy.visit(permissionGroupDetails(group.id)) + .get(PERMISSION_GROUP_DETAILS.assignMemberButton) + .click() + .get(PERMISSION_GROUP_DETAILS.searchField) + .type(USER_WITHOUT_NAME.email) + .get(PERMISSION_GROUP_DETAILS.userRow) + .should("have.length", 1) + .find(BUTTON_SELECTORS.checkbox) + .click() + .get(BUTTON_SELECTORS.submit) + .click() + .addAliasToGraphRequest("PermissionGroupUpdate") + .get(BUTTON_SELECTORS.confirm) + .click() + .wait("@PermissionGroupUpdate"); + getPermissionGroup(group.id); + }) + .then(resp => { + expect(resp.users).to.have.length(1); + expect(resp.users[0].email).to.be.eq(USER_WITHOUT_NAME.email); + }); + }); + + it("should remove user from permission group", () => { + const permissionName = `${startsWith}${faker.datatype.number()}`; + let staffMember; + getStaffMembersStartsWith(USER_WITHOUT_NAME.email) + .its("body.data.staffUsers.edges") + .then(staffMemberResp => { + staffMember = staffMemberResp[0].node; + createPermissionGroup({ + name: permissionName, + userIdsArray: `["${staffMember.id}"]`, + permissionsArray: "[MANAGE_PRODUCTS]" + }); + }) + .then(({ group }) => { + cy.visit(permissionGroupDetails(group.id)) + .get(PERMISSION_GROUP_DETAILS.removeUserButton) + .click() + .get(BUTTON_SELECTORS.submit) + .click() + .addAliasToGraphRequest("PermissionGroupUpdate") + .get(BUTTON_SELECTORS.confirm) + .click() + .wait("@PermissionGroupUpdate"); + cy.visit(staffMemberDetailsUrl(staffMember.id)); + cy.get(SHARED_ELEMENTS.header).should("be.visible"); + cy.contains(permissionName).should("not.exist"); + }); + }); +}); diff --git a/cypress/url/urlList.js b/cypress/url/urlList.js index cb7e4dcd1..e95136ed2 100644 --- a/cypress/url/urlList.js +++ b/cypress/url/urlList.js @@ -10,6 +10,12 @@ export const urlList = { shippingMethods: "shipping/", sales: "discounts/sales/", collections: "collections/", - vouchers: "discounts/vouchers/" + vouchers: "discounts/vouchers/", + staffMembers: "staff/", + permissionsGroups: "permission-groups/" }; export const productDetailsUrl = productId => `${urlList.products}${productId}`; +export const staffMemberDetailsUrl = staffMemberId => + `${urlList.staffMembers}${staffMemberId}`; +export const permissionGroupDetails = permissionGroupId => + `${urlList.permissionsGroups}${permissionGroupId}`; diff --git a/cypress/utils/permissionGroupUtils.js b/cypress/utils/permissionGroupUtils.js new file mode 100644 index 000000000..f103b964e --- /dev/null +++ b/cypress/utils/permissionGroupUtils.js @@ -0,0 +1,12 @@ +import { + deletePermissionGroup, + getPermissionGroups +} from "../apiRequests/PermissionGroup"; + +export function deletePermissionGroupsStartsWith(startsWith) { + cy.deleteElementsStartsWith( + deletePermissionGroup, + getPermissionGroups, + startsWith + ); +} diff --git a/src/permissionGroups/components/AssignMembersDialog/AssignMembersDialog.tsx b/src/permissionGroups/components/AssignMembersDialog/AssignMembersDialog.tsx index da74a4cdf..09d38fd48 100644 --- a/src/permissionGroups/components/AssignMembersDialog/AssignMembersDialog.tsx +++ b/src/permissionGroups/components/AssignMembersDialog/AssignMembersDialog.tsx @@ -205,7 +205,7 @@ const AssignMembersDialog: React.FC = ({ ); return ( - + = ({ = props => { <> {permissionGroup.userCanManage && ( onDelete(permissionGroup.id) diff --git a/src/permissionGroups/components/PermissionGroupListPage/PermissionGroupListPage.tsx b/src/permissionGroups/components/PermissionGroupListPage/PermissionGroupListPage.tsx index 844a8d59d..948506534 100644 --- a/src/permissionGroups/components/PermissionGroupListPage/PermissionGroupListPage.tsx +++ b/src/permissionGroups/components/PermissionGroupListPage/PermissionGroupListPage.tsx @@ -33,7 +33,12 @@ const PermissionGroupListPage: React.FC = ({ {intl.formatMessage(sectionNames.configuration)} -