From 240c479f7dc82ba2f7123d2f7db33408367045e5 Mon Sep 17 00:00:00 2001 From: Sachin Chaurasiya Date: Sat, 27 Aug 2022 00:47:44 +0530 Subject: [PATCH] Fix #5140 E2E Testing for Roles and Policies Page (#6962) * Fix #5140 E2E Testing for Roles and Policies Page * Minor change * Fix failing unit tests --- .../integration/Pages/Policies.spec.js | 322 ++++++++++++++++++ .../cypress/integration/Pages/Roles.spec.js | 307 +++++++++++++++++ 2 files changed, 629 insertions(+) create mode 100644 openmetadata-ui/src/main/resources/ui/cypress/integration/Pages/Policies.spec.js create mode 100644 openmetadata-ui/src/main/resources/ui/cypress/integration/Pages/Roles.spec.js diff --git a/openmetadata-ui/src/main/resources/ui/cypress/integration/Pages/Policies.spec.js b/openmetadata-ui/src/main/resources/ui/cypress/integration/Pages/Policies.spec.js new file mode 100644 index 00000000000..cf6c0e54e5a --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/cypress/integration/Pages/Policies.spec.js @@ -0,0 +1,322 @@ +/* + * Copyright 2021 Collate + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { uuid } from '../../common/common'; + +const roles = { + dataConsumer: 'Data Consumer', + dataSteward: 'Data Steward', +}; + +const policies = { + dataConsumerPolicy: 'Data Consumer Policy', + dataStewardPolicy: 'Data Steward Policy', + organizationPolicy: 'Organization Policy', + teamOnlyAccessPolicy: 'Team only access Policy', +}; + +const ruledetails = { + resources: 'All', + operations: 'All', + effect: 'Allow', + condition: 'isOwner()', +}; + +const errormessageValidation = { + lastPolicyCannotBeRemoved: 'At least one policy is required in a role', + lastRuleCannotBeRemoved: 'At least one rule is required in a policy', +}; + +const policyName = `Policy-test-${uuid()}`; +const description = `This is ${policyName} description`; + +const ruleName = `Rule-test-${uuid()}`; +const ruledescription = `This is ${ruleName} description`; +const updatedDescription = 'This is updated description'; + +const newRuleName = `New-Rule-test-${uuid()}`; +const newRuledescription = `This is ${newRuleName} description`; + +const updatedRuleName = `New-Rule-test-${uuid()}-updated`; + +const addRule = (rulename, ruledescription, descriptionIndex) => { + cy.get('[data-testid="rule-name"]').should('be.visible').type(rulename); + //Enter rule description + cy.get('.toastui-editor-md-container > .toastui-editor > .ProseMirror') + .eq(descriptionIndex) + .scrollIntoView() + .type(ruledescription); + //Select resource dropdown + cy.get('[data-testid="resuorces"]') + .scrollIntoView() + .should('be.visible') + .click(); + + //Select All + cy.get('.ant-select-tree-checkbox-inner').should('be.visible').click(); + + //Click on operations dropdown + cy.get('[data-testid="operations"]').should('be.visible').click(); + + cy.get('.ant-select-tree-checkbox-inner').eq(1).should('be.visible').click(); + //Click on condition combobox + cy.get('[id*=rc_select]').scrollIntoView().should('be.visible').click(); + + cy.get(`[title="${ruledetails.condition}"]`).should('be.visible').click(); + cy.get('.ant-card-body').should('be.visible').click(); + cy.wait(500); + //Submit + cy.get('[data-testid="submit-btn"]') + .scrollIntoView() + .should('be.visible') + .click(); +}; + +describe('Roles page should work properly', () => { + beforeEach(() => { + cy.goToHomePage(); + cy.intercept('GET', '*api/v1/policies*').as('getPolicies'); + + cy.get('[data-testid="appbar-item-settings"]').should('be.visible').click(); + + cy.get('[data-menu-id*="policies"]').should('be.visible').click(); + + cy.wait('@getPolicies', { timeout: 15000 }) + .its('response.statusCode') + .should('equal', 200); + + cy.url().should('eq', 'http://localhost:8585/settings/access/policies'); + }); + + it('Default Policies and Roles should be displayed', () => { + //Verifying the default roles and policies are present + + Object.values(policies).forEach((policy) => { + cy.get('[data-testid="policy-name"]') + .should('contain', policy) + .should('be.visible'); + }); + //Validate role is displayed + cy.get('[data-testid="role-link"]') + .should('contain', roles.dataConsumer) + .should('be.visible'); + cy.get('[data-testid="role-link"]') + .should('contain', roles.dataSteward) + .should('be.visible'); + }); + + it('Add new policy', () => { + //Click on add new policy + cy.get('[data-testid="add-policy"]').should('be.visible').click(); + cy.get('[data-testid="inactive-link"]'); + + //Enter policy name + cy.get('[data-testid="policy-name"]').should('be.visible').type(policyName); + + //Enter description + cy.get('.toastui-editor-md-container > .toastui-editor > .ProseMirror') + .eq(0) + .type(description); + //Enter rule name + addRule(ruleName, ruledescription, 1); + + cy.wait(1000); + //Validate the added policy + cy.get('[data-testid="inactive-link"]') + .should('be.visible') + .should('have.text', policyName); + + cy.get('[data-testid="rule-name"]') + .should('be.visible') + .should('contain', ruleName); + + //Verify policy description + cy.get('[data-testid="description"] > [data-testid="viewer-container"]') + .eq(0) + .should('be.visible') + .should('contain', description); + + //verify rule description + cy.get('[data-testid="description"] > [data-testid="viewer-container"]') + .eq(1) + .should('be.visible') + .should('contain', ruledescription); + + //Verify other details + cy.get('[data-testid="rule-name"]').should('be.visible').click(); + + cy.get('[data-testid="resources"]') + .should('be.visible') + .should('contain', ruledetails.resources); + + cy.get('[data-testid="operations"]') + .should('be.visible') + .should('contain', ruledetails.operations); + + cy.get('[data-testid="effect"]') + .should('be.visible') + .should('contain', ruledetails.effect); + + cy.get('[data-testid="condition"]') + .should('be.visible') + .should('contain', ruledetails.condition); + }); + + it('Edit policy description', () => { + //Click on created policy name + cy.get('[data-testid="policy-name"]').contains(policyName).click(); + cy.wait(1000); + cy.get('[data-testid="edit-description"]').should('be.visible').click(); + //Enter updated description + cy.get('.toastui-editor-md-container > .toastui-editor > .ProseMirror') + .should('be.visible') + .clear() + .type(`${updatedDescription}-${policyName}`); + //Click on save + cy.get('[data-testid="save"]').should('be.visible').click(); + + //Validate added description + cy.get('[data-testid="description"] > [data-testid="viewer-container"]') + .should('be.visible') + .should('contain', `${updatedDescription}-${policyName}`); + }); + + it('Add new rule', () => { + //Click on created policy name + cy.get('[data-testid="policy-name"]').contains(policyName).click(); + + //Click on add rule button + cy.get('[data-testid="add-rule"]').should('be.visible').click(); + + cy.wait(1000); + + addRule(newRuleName, newRuledescription, 0); + + //Validate added rule + cy.get('[data-testid="rule-name"]') + .should('be.visible') + .should('contain', ruleName); + + //Verify other details + cy.get('[data-testid="rule-name"]') + .contains(ruleName) + .should('be.visible') + .click(); + + cy.get('[data-testid="resources"]') + .scrollIntoView() + .should('be.visible') + .should('contain', ruledetails.resources); + + cy.get('[data-testid="operations"]') + .scrollIntoView() + .should('be.visible') + .should('contain', ruledetails.operations); + + cy.get('[data-testid="effect"]') + .scrollIntoView() + .should('be.visible') + .should('contain', ruledetails.effect); + + cy.get('[data-testid="condition"]') + .scrollIntoView() + .should('be.visible') + .should('contain', ruledetails.condition); + }); + + it('Edit rule name for created Rule', () => { + //Click on created policy name + cy.get('[data-testid="policy-name"]').contains(policyName).click(); + + cy.wait(2000); + + //Click on new rule manage button + cy.get(`[data-testid="manage-button-${newRuleName}"]`) + .should('be.visible') + .click(); + + cy.get('[data-testid="edit-rule"]').should('be.visible').click(); + + cy.wait(1000); + //Enter new name + cy.get('[data-testid="rule-name"]').clear().type(updatedRuleName); + cy.get('[data-testid="submit-btn"]') + .scrollIntoView() + .should('be.visible') + .click(); + cy.wait(1000); + cy.reload(); + + cy.url().should('include', policyName); + + cy.get('[data-testid="rule-name"]').should( + 'contain', + updatedRuleName + ); + }); + + it('Delete new rule', () => { + //Click on created policy name + cy.get('[data-testid="policy-name"]').contains(policyName).click(); + + cy.wait(1000); + + //Click on new rule manage button + cy.get(`[data-testid="manage-button-${updatedRuleName}"]`) + .should('be.visible') + .click(); + + cy.get('[data-testid="delete-rule"]').should('be.visible').click(); + + //Validate the deleted rule + cy.get('[data-testid="rule-name"]') + .should('be.visible') + .should('not.contain', updatedRuleName); + }); + + it('Delete last rule and validate', () => { + //Click on created policy name + cy.get('[data-testid="policy-name"]').contains(policyName).click(); + + cy.wait(1000); + + //Click on new rule manage button + cy.get(`[data-testid="manage-button-${ruleName}"]`) + .should('be.visible') + .click(); + + cy.get('[data-testid="delete-rule"]').should('be.visible').click(); + + cy.wait(1000); + + cy.get('.Toastify__toast-body') + .should('be.visible') + .should('contain', errormessageValidation.lastRuleCannotBeRemoved); + }); + + it('Delete created policy', () => { + cy.get(`[data-testid="delete-action-${policyName}"]`) + .should('exist') + .should('be.visible') + .click(); + + cy.get('[data-testid="confirmation-text-input"]') + .should('be.visible') + .type('DELETE'); + + cy.get('[data-testid="confirm-button"]').should('be.visible').click(); + + //Validate deleted policy + cy.get('[data-testid="policy-name"]').should('not.contain', policyName); + }); +}); diff --git a/openmetadata-ui/src/main/resources/ui/cypress/integration/Pages/Roles.spec.js b/openmetadata-ui/src/main/resources/ui/cypress/integration/Pages/Roles.spec.js new file mode 100644 index 00000000000..90a1a97c76e --- /dev/null +++ b/openmetadata-ui/src/main/resources/ui/cypress/integration/Pages/Roles.spec.js @@ -0,0 +1,307 @@ +/* + * Copyright 2021 Collate + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { uuid } from '../../common/common'; + +const roles = { + dataConsumer: 'Data Consumer', + dataSteward: 'Data Steward', +}; + +const policies = { + dataConsumerPolicy: 'Data Consumer Policy', + dataStewardPolicy: 'Data Steward Policy', + organizationPolicy: 'Organization Policy', +}; + +const errormessageValidation = { + ifPolicyNotSelected: 'At least one policy is required!', + ifNameNotEntered: 'invalid name', + lastPolicyCannotBeRemoved: 'At least one policy is required in a role', +}; + +const roleName = `Role-test-${uuid()}`; +const description = `This is ${roleName} description`; + +const removePolicyFromRole = (policyName) => { + //Clicking on remove action for added policy + cy.get(`[data-testid="remove-action-${policyName}"]`) + .should('be.visible') + .click(); + + cy.get('.ant-modal-body') + .should('be.visible') + .should( + 'have.text', + `Are you sure you want to remove the ${policyName} from ${roleName}?` + ); + + cy.get('[type="button"]').contains('Confirm').should('be.visible').click(); +}; + +describe('Roles page should work properly', () => { + beforeEach(() => { + cy.goToHomePage(); + cy.intercept('GET', '*api/v1/roles*').as('getRoles'); + + cy.get('[data-testid="appbar-item-settings"]').should('be.visible').click(); + + cy.get('[data-menu-id*="roles"]').should('be.visible').click(); + + cy.wait('@getRoles', { timeout: 15000 }) + .its('response.statusCode') + .should('equal', 200); + + cy.url().should('eq', 'http://localhost:8585/settings/access/roles'); + }); + + it('Default Role and Policies should be displayed', () => { + //Verifying the default roles and policies are present + + Object.values(roles).forEach((role) => { + cy.get('[data-testid="role-name"]') + .should('contain', role) + .should('be.visible'); + }); + + //Validate policy + cy.get('[data-testid="policy-link"]') + .should('contain', policies.dataConsumerPolicy) + .should('be.visible'); + cy.get('[data-testid="policy-link"]') + .should('contain', policies.dataStewardPolicy) + .should('be.visible'); + }); + + it('Add new role', () => { + cy.get('button').contains('Add Role').should('be.visible').click(); + + //Asserting navigation + cy.get('[data-testid="inactive-link"]') + .should('contain', 'Add New Role') + .should('be.visible'); + //Entering name + cy.get('#name').should('be.visible').type(roleName); + //Entering descrription + cy.get( + '.toastui-editor-md-container > .toastui-editor > .ProseMirror' + ).type(description); + //Select the policies + cy.get('.ant-select').should('be.visible').click(); + + cy.get('[title="Data Consumer Policy"]') + .scrollIntoView() + .should('be.visible') + .click(); + + cy.get('[title="Data Steward Policy"]') + .scrollIntoView() + .should('be.visible') + .click(); + //Clicking outside to close the dropdown + cy.get('.ant-card-body').click(); + //Save the role + cy.get('[data-testid="submit-btn"]') + .scrollIntoView() + .should('be.visible') + .click(); + + //Verify the role is added successfully + cy.url().should( + 'eq', + `http://localhost:8585/settings/access/roles/${roleName}` + ); + cy.get('[data-testid="inactive-link"]').should('contain', roleName); + //Verifying the added policies + cy.get('.ant-table-cell') + .should('contain', policies.dataConsumerPolicy) + .should('be.visible') + .and('contain', policies.dataStewardPolicy) + .should('be.visible'); + //Verify added description + cy.get('[data-testid="description"] > [data-testid="viewer-container"]') + .should('be.visible') + .should('contain', description); + + //Navigating to roles tab to verify the added role + cy.get('[data-testid="breadcrumb-link"]').first().click(); + cy.get('table').should('be.visible').should('contain', roleName); + }); + + it('Add new role without selecting data', () => { + cy.get('button').contains('Add Role').should('be.visible').click(); + + //Asserting navigation + cy.get('[data-testid="inactive-link"]') + .should('contain', 'Add New Role') + .should('be.visible'); + //Entering name + cy.get('#name').should('be.visible').type(roleName); + //Entering descrription + cy.get( + '.toastui-editor-md-container > .toastui-editor > .ProseMirror' + ).type(description); + //Do not Select the policies + //Save the role + cy.get('[data-testid="submit-btn"]').scrollIntoView().click(); + + //Verify the error message that is displayed + cy.get('[role="alert"]').should( + 'contain', + errormessageValidation.ifPolicyNotSelected + ); + }); + + it('Verify Teams and Users naviagtion', () => { + cy.get('[data-testid="role-name"]') + .contains(roleName) + .should('be.visible') + .click(); + //Asserting navigation + cy.get('[data-testid="inactive-link"]') + .should('contain', roleName) + .should('be.visible'); + + //Click on Teams tab + cy.get('[role="tab"]').contains('Teams').should('be.visible').click(); + + cy.get('.ant-table-tbody').should('be.visible'); + //Click on Users tab + cy.get('[role="tab"]').contains('Users').should('be.visible').click(); + + cy.get('.ant-table-tbody').should('be.visible'); + }); + + it('Edit created rule', () => { + //Edit description + cy.get('[data-testid="role-name"]') + .contains(roleName) + .should('be.visible') + .click(); + cy.get('[data-testid="edit-description"]').should('be.visible').click(); + + cy.get('.toastui-editor-md-container > .toastui-editor > .ProseMirror') + .clear() + .type(`${description}-updated`); + cy.get('[data-testid="save"]').should('be.visible').click(); + + cy.get('[data-testid="inactive-link"]').should('be.visible'); + //Asserting updated description + cy.get('[data-testid="description"] > [data-testid="viewer-container"]') + .should('be.visible') + .should('contain', `${description}-updated`); + + //Edit policies, teams and users later + }); + + it('Add policy to created role', () => { + cy.get('[data-testid="role-name"]') + .contains(roleName) + .should('be.visible') + .click(); + //Asserting navigation + cy.get('[data-testid="inactive-link"]') + .should('contain', roleName) + .should('be.visible'); + + cy.get('[data-testid="add-policy"]').should('be.visible').click(); + //Checking the added policy is selected in the add policy modal + cy.get('[data-testid="policy-row"]') + .should('contain', policies.dataConsumerPolicy) + .should('have.class', 'selected'); + cy.get('[data-testid="policy-row"]') + .should('contain', policies.dataStewardPolicy) + .should('have.class', 'selected'); + + //Add policy + cy.get('[data-testid="policy-row"]') + .contains(policies.organizationPolicy) + .click(); + + cy.get('[data-testid="policy-row"]') + .should('contain', policies.organizationPolicy) + .should('have.class', 'selected'); + + cy.get('[type="button"]').contains('Submit').should('be.visible').click(); + + cy.get('[data-testid="entity-name"]') + .should('contain', policies.organizationPolicy) + .should('be.visible'); + }); + + it('Remove added policy from created role', () => { + cy.get('[data-testid="role-name"]') + .contains(roleName) + .should('be.visible') + .click(); + //Asserting navigation + cy.get('[data-testid="inactive-link"]') + .should('contain', roleName) + .should('be.visible'); + + removePolicyFromRole(policies.organizationPolicy); + + //Validating if the policy is removed successfully + cy.get('[data-testid="entity-name"]').should( + 'not.contain', + policies.organizationPolicy + ); + }); + + it('Check if last policy is not removed', () => { + cy.get('[data-testid="role-name"]') + .contains(roleName) + .should('be.visible') + .click(); + //Asserting navigation + cy.get('[data-testid="inactive-link"]') + .should('contain', roleName) + .should('be.visible'); + + //Removing second policy from the role + removePolicyFromRole(policies.dataStewardPolicy); + + //Validating if the policy is removed successfully + cy.get('[data-testid="entity-name"]').should( + 'not.contain', + policies.dataStewardPolicy + ); + + //Removing the last policy and validating the error message + removePolicyFromRole(policies.dataConsumerPolicy); + + cy.get('.Toastify__toast-body') + .should('be.visible') + .should('contain', errormessageValidation.lastPolicyCannotBeRemoved); + + cy.get('[data-testid="entity-name"]').should( + 'contain', + policies.dataConsumerPolicy + ); + }); + + it('Delete created Role', () => { + cy.get(`[data-testid="delete-action-${roleName}"]`) + .should('be.visible') + .click(); + + cy.get('[data-testid="confirmation-text-input"]') + .should('be.visible') + .type('DELETE'); + + cy.get('[data-testid="confirm-button"]').should('be.visible').click(); + + //Validate deleted role + cy.get('[data-testid="role-name"]').should('not.contain', roleName); + }); +});