src/test-e2e/cloud-foundry/users-removal-e2e.helper.ts
import { browser, by, element, promise } from 'protractor';import { protractor } from 'protractor/built/ptor'; import { CfUser } from '../../frontend/packages/cloud-foundry/src/store/types/cf-user.types';import { APIResource } from '../../frontend/packages/store/src/types/api.types';import { e2e } from '../e2e';import { CFHelpers } from '../helpers/cf-e2e-helpers';import { ConsoleUserType, E2EHelpers } from '../helpers/e2e-helpers';import { UaaHelpers } from '../helpers/uaa-helpers';import { CFUsersListComponent } from '../po/cf-users-list.po';import { StepperComponent } from '../po/stepper.po';import { RemoveUsersPage } from './remove-users-page.po';import { setUpTestOrgSpaceE2eTest } from './users-list-e2e.helper'; export enum CfUserRemovalTestLevel { Cf = 1, Org = 2, Space = 3} export enum CfRolesRemovalLevel { OrgsSpaces = 1, Spaces = 2} const customOrgSpacesLabel = E2EHelpers.e2eItemPrefix + (process.env.CUSTOM_APP_LABEL || process.env.USER) + '-remove-users'; // Use the same helper to avoid fetching the token multiple timesconst uaaHelpers = new UaaHelpers(); Function `setupCfUserRemovalTests` has 189 lines of code (exceeds 25 allowed). Consider refactoring.export function setupCfUserRemovalTests( cfLevel: CfUserRemovalTestLevel, removalLevel: CfRolesRemovalLevel, navToUserTableFn: (cfGuid: string, orgGuid: string, spaceGuid: string) => promise.Promise<any>) { const uniqueName = E2EHelpers.createCustomName(customOrgSpacesLabel); const orgName = uniqueName; const spaceName = uniqueName; const userName = uniqueName; let removeUsersPage: RemoveUsersPage; let removeUsersStepper: StepperComponent; let cfHelper: CFHelpers; let cfGuid: string; let orgGuid: string; let spaceGuid: string; let userGuid: string; let uaaUserGuid: string; beforeAll(() => { const e2eSetup = e2e.setup(ConsoleUserType.admin) .clearAllEndpoints() .registerDefaultCloudFoundry() .connectAllEndpoints(ConsoleUserType.admin) .loginAs(ConsoleUserType.admin) .getInfo(ConsoleUserType.admin); cfHelper = new CFHelpers(e2eSetup);Similar blocks of code found in 2 locations. Consider refactoring. return uaaHelpers.setup() .then(() => e2e.log(`Creating User: ${userName}`)) .then(() => uaaHelpers.createUser(userName)) .then(newUser => { uaaUserGuid = newUser.id; e2e.log(`Created UAA User: ${newUser.userName}. Guid: ${uaaUserGuid}`); const defaultCf = e2e.secrets.getDefaultCFEndpoint(); cfGuid = e2e.helper.getEndpointGuid(e2e.info, defaultCf.name); }) .then(() => cfHelper.createUser(cfGuid, uaaUserGuid)) .then(cfUser => { expect(cfUser).toBeTruthy(); expect(cfUser.entity.username).toBeTruthy(); expect(cfUser.metadata.guid).toBeTruthy(); e2e.log(`Created Cf User: ${cfUser.entity.username}. Guid: ${cfUser.metadata.guid}`); userGuid = cfUser.metadata.guid; return setUpTestOrgSpaceE2eTest(orgName, spaceName, userName, true, e2eSetup); }) .then(res => { cfGuid = res.cfGuid; orgGuid = res.orgGuid; spaceGuid = res.spaceGuid; }) // Ensure that cf responds with the user we've just created, otherwise it won't appear in the ui .then(() => cfHelper.cfRequestHelper.chain<APIResource<CfUser>>( null, () => cfHelper.fetchUser(cfGuid, userName), 10, (user: APIResource<CfUser>) => !!user, 0 )) .then(cfUser => { expect(cfUser).toBeTruthy(); expect(cfUser.entity.username).toBeTruthy(); expect(cfUser.metadata.guid).toBe(userGuid); }) .then(() => { removeUsersPage = new RemoveUsersPage(cfGuid, orgGuid, spaceGuid, userGuid); return protractor.promise.controlFlow().execute(() => { return navToUserTableFn(cfGuid, orgGuid, spaceGuid); }); }) .then(() => e2e.log(`Nav'd to user table`)); }, 75000); it('Clicks on remove menu option', () => { const usersTable = new CFUsersListComponent(); usersTable.header.setSearchText(userName); usersTable.waitForTotalResultsToBe(1, 10000, `Failed to find user in table: ${userName}`); if (removalLevel === CfRolesRemovalLevel.OrgsSpaces) { usersTable.table.openRowActionMenuByIndex(0).clickItem('Remove from org'); } else { usersTable.table.openRowActionMenuByIndex(0).clickItem('Remove from space'); } removeUsersStepper = removeUsersPage.stepper; removeUsersStepper.waitUntilShown('Remove Users Stepper'); // ... check button state expect(removeUsersStepper.canPrevious()).toBeFalsy('Previous button should not be visible'); expect(removeUsersStepper.canCancel()).toBeTruthy('Cancel button should be visible and enabled'); expect(removeUsersStepper.canNext()).toBeTruthy('Next button should be visible and enabled'); }); it('Confirm roles removal', () => { // confirm step const confirmStep = removeUsersPage.confirmStep; const orgTarget = `Org: ${orgName}`; const spaceTarget = `Space: ${spaceName}`; // ... initial action table state let actionTableDate: any[]; if (cfLevel === CfUserRemovalTestLevel.Cf) { actionTableDate = [ ...createActionTableDate(orgTarget, spaceTarget) ]; } else { actionTableDate = createActionTableDate(orgTarget, spaceTarget); } expect(confirmStep.actionTable.table.getTableData()).toEqual(actionTableDate, 'Table data did not match expected content'); expect(removeUsersStepper.canPrevious()).toBeFalsy('Previous button should not be visible'); expect(removeUsersStepper.canCancel()).toBeTruthy('Cancel button should be visible and enabled'); expect(removeUsersStepper.canNext()).toBeTruthy('Next button should be visible and enabled'); // apply roles removal changes removeUsersStepper.next(); confirmStep.actionTable.table.waitUntilNotBusy('Failed to wait for busy state'); // Wait until all of the spinners have gone const spinners = element.all(by.tagName('mat-progress-spinner')); browser.wait(() => spinners.isPresent().then((present) => !present)); // ... action table state after submit if (cfLevel === CfUserRemovalTestLevel.Cf) { actionTableDate = [ ...createActionTableDate(orgTarget, spaceTarget, 'done') ]; } else { actionTableDate = createActionTableDate(orgTarget, spaceTarget, 'done'); } expect(confirmStep.actionTable.table.getTableData()).toEqual(actionTableDate, 'Table data did not match expected content'); expect(removeUsersStepper.canPrevious()).toBeFalsy('Previous button should not be visible'); expect(removeUsersStepper.canCancel()).toBeFalsy('Cancel button should not be visible//enabled'); expect(removeUsersStepper.canNext()).toBeTruthy('Next button should be visible and enabled'); // close removeUsersStepper.next(); removeUsersStepper.waitUntilNotShown(); }); if (cfLevel !== CfUserRemovalTestLevel.Space && removalLevel === CfRolesRemovalLevel.Spaces) { it('Shows user with org roles only', () => { // user was removed from space level const usersTable = new CFUsersListComponent(); usersTable.header.setSearchText(userName); expect(usersTable.getTotalResults()).toBe(1); expect(usersTable.getPermissions(0, false).getChipElements().count()).toBe(0); }); } else { it(`Doesn't show user with roles any more`, () => { const usersTable = new CFUsersListComponent(); usersTable.header.setSearchText(userName); expect(usersTable.getTotalResults()).toBe(0); }); } Function `createActionTableDate` has 53 lines of code (exceeds 25 allowed). Consider refactoring. function createActionTableDate(orgTarget, spaceTarget, stateIcon = '') { const orgActions = [ { user: userName, action: 'remove_circle\nRemove', role: 'Manager', target: orgTarget, 'column-4': stateIcon }, { user: userName, action: 'remove_circle\nRemove', role: 'Auditor', target: orgTarget, 'column-4': stateIcon }, { user: userName, action: 'remove_circle\nRemove', role: 'User', target: orgTarget, 'column-4': stateIcon } ]; const spaceActions = [ { user: userName, action: 'remove_circle\nRemove', role: 'Manager', target: spaceTarget, 'column-4': stateIcon }, { user: userName, action: 'remove_circle\nRemove', role: 'Developer', target: spaceTarget, 'column-4': stateIcon }, { user: userName, action: 'remove_circle\nRemove', role: 'Auditor', target: spaceTarget, 'column-4': stateIcon } ]; if (removalLevel === CfRolesRemovalLevel.OrgsSpaces) { return [ ...orgActions, ...spaceActions ]; } return spaceActions; } afterAll(() => { const deleteUser = uaaUserGuid ? cfHelper.deleteUser(cfGuid, userGuid, userName, uaaUserGuid) : promise.fullyResolved(true); return promise.all([ deleteUser.then(() => e2e.log(`Deleted Cf user ${userGuid} & UAA user ${uaaUserGuid}`)), cfHelper.deleteOrgIfExisting(cfGuid, orgName).then(() => e2e.log(`Deleted Org: ${orgName}`)) ]); });}