From c26b8e046c47d8fc2e050bfd9f117559028f932c Mon Sep 17 00:00:00 2001 From: Eugenio Romano Date: Thu, 14 May 2020 09:42:40 +0100 Subject: [PATCH] stabilize some e2e cloud (#5701) * stabilize some e2e cloud * Update protractor.conf.ts * Update protractor.conf.ts * improve some other test * fix --- .../people-group-cloud-component.e2e.ts | 13 ++++------- ...people-group-cloud-filter-component.e2e.ts | 6 ++--- .../process-header-cloud.e2e.ts | 4 ++-- .../task-filters-cloud.e2e.ts | 23 +++++++++++++++---- .../task-header-cloud.e2e.ts | 17 +++++++++----- .../src/lib/core/utils/browser-visibility.ts | 7 +++--- .../pages/people-cloud-component.page.ts | 6 ++--- .../task-filters-cloud-component.page.ts | 2 +- protractor.conf.ts | 2 +- 9 files changed, 48 insertions(+), 32 deletions(-) diff --git a/e2e/process-services-cloud/people-group-cloud-component.e2e.ts b/e2e/process-services-cloud/people-group-cloud-component.e2e.ts index fa103d0b21..cc07c08884 100644 --- a/e2e/process-services-cloud/people-group-cloud-component.e2e.ts +++ b/e2e/process-services-cloud/people-group-cloud-component.e2e.ts @@ -125,11 +125,9 @@ describe('People Groups Cloud Component', () => { await peopleCloudComponent.searchAssignee(apsUser.lastName); await peopleCloudComponent.checkUserIsDisplayed(`${apsUser.firstName} ${apsUser.lastName}`); await peopleCloudComponent.searchAssignee(devopsUser.lastName); - await peopleCloudComponent.checkUserIsNotDisplayed(`${devopsUser.firstName} ${devopsUser.lastName}`); - await peopleCloudComponent.checkUserIsNotDisplayed(`${apsUser.firstName} ${apsUser.lastName}`); + await peopleCloudComponent.checkNoResultsFoundError(); await peopleCloudComponent.searchAssignee(noRoleUser.lastName); - await browser.sleep(5000); - await peopleCloudComponent.checkUserIsNotDisplayed(`${noRoleUser.firstName} ${noRoleUser.lastName}`); + await peopleCloudComponent.checkNoResultsFoundError(); }); it('Multiple roles filtering', async () => { @@ -139,8 +137,7 @@ describe('People Groups Cloud Component', () => { await peopleCloudComponent.searchAssignee(testUser.lastName); await peopleCloudComponent.checkUserIsDisplayed(`${testUser.firstName} ${testUser.lastName}`); await peopleCloudComponent.searchAssignee(noRoleUser.lastName); - await peopleCloudComponent.checkUserIsNotDisplayed(`${testUser.firstName} ${testUser.lastName}`); - await peopleCloudComponent.checkUserIsNotDisplayed(`${noRoleUser.firstName} ${noRoleUser.lastName}`); + await peopleCloudComponent.checkNoResultsFoundError(); }); }); @@ -238,8 +235,8 @@ describe('People Groups Cloud Component', () => { await peopleCloudComponent.checkSelectedPeople(`${testUser.firstName} ${testUser.lastName}`); await peopleCloudComponent.checkSelectedPeople(`${noRoleUser.firstName} ${noRoleUser.lastName}`); - await peopleCloudComponent.searchAssigneeToExisting(noRoleUser.lastName); - await peopleCloudComponent.checkUserIsNotDisplayed(`${noRoleUser.firstName} ${noRoleUser.lastName}`); + await peopleCloudComponent.searchAssignee(noRoleUser.lastName); + await peopleCloudComponent.checkNoResultsFoundError(); }); it('[C309677] Should populate the Users without any validation when the Preselect flag is set to false', async () => { diff --git a/e2e/process-services-cloud/people-group-cloud-filter-component.e2e.ts b/e2e/process-services-cloud/people-group-cloud-filter-component.e2e.ts index 292115467d..5eecc25acf 100644 --- a/e2e/process-services-cloud/people-group-cloud-filter-component.e2e.ts +++ b/e2e/process-services-cloud/people-group-cloud-filter-component.e2e.ts @@ -102,13 +102,13 @@ describe('People Groups Cloud Component', () => { await peopleCloudComponent.selectAssigneeFromList(`${testUser.firstName} ${testUser.lastName}`); await peopleCloudComponent.checkSelectedPeople(`${testUser.firstName} ${testUser.lastName}`); - await peopleCloudComponent.searchAssigneeToExisting(apsUser.firstName); + await peopleCloudComponent.searchAssignee(apsUser.firstName); await peopleCloudComponent.checkUserIsDisplayed(`${apsUser.firstName} ${apsUser.lastName}`); await peopleCloudComponent.selectAssigneeFromList(`${apsUser.firstName} ${apsUser.lastName}`); await peopleCloudComponent.checkSelectedPeople(`${apsUser.firstName} ${apsUser.lastName}`); - await peopleCloudComponent.searchAssigneeToExisting(noRoleUser.firstName); - await peopleCloudComponent.checkUserIsNotDisplayed(`${noRoleUser.firstName} ${noRoleUser.lastName}`); + await peopleCloudComponent.searchAssignee(noRoleUser.firstName); + await peopleCloudComponent.checkNoResultsFoundError(); }); it('[C305041] Should filter the Groups Single Selection with the Application name filter', async () => { diff --git a/e2e/process-services-cloud/process-header-cloud.e2e.ts b/e2e/process-services-cloud/process-header-cloud.e2e.ts index 779d5934c9..4d7ea49f07 100644 --- a/e2e/process-services-cloud/process-header-cloud.e2e.ts +++ b/e2e/process-services-cloud/process-header-cloud.e2e.ts @@ -118,7 +118,7 @@ describe('Process Header cloud component', () => { await processCloudDemoPage.processListCloudComponent().selectRow(runningProcess.entry.name); await expect(await processHeaderCloudPage.getId()).toEqual(runningProcess.entry.id); await expect(await processHeaderCloudPage.getName()).toEqual(runningProcess.entry.name); - await expect(await processHeaderCloudPage.getStatus()).toEqual(runningProcess.entry.status); + await expect(await processHeaderCloudPage.getStatus()).toEqual('RUNNING'); await expect(await processHeaderCloudPage.getInitiator()).toEqual(runningProcess.entry.initiator); await expect(await processHeaderCloudPage.getStartDate()).toEqual(runningCreatedDate); await expect(await processHeaderCloudPage.getParentId()).toEqual(CONSTANTS.PROCESS_DETAILS.NO_PARENT); @@ -143,7 +143,7 @@ describe('Process Header cloud component', () => { await expect(await processHeaderCloudPage.getId()).toEqual(childCompleteProcess.entry.id); await expect(await processHeaderCloudPage.getName()).toEqual(CONSTANTS.PROCESS_DETAILS.NO_NAME); - await expect(await processHeaderCloudPage.getStatus()).toEqual(childCompleteProcess.entry.status); + await expect(await processHeaderCloudPage.getStatus()).toEqual('COMPLETED'); await expect(await processHeaderCloudPage.getInitiator()).toEqual(childCompleteProcess.entry.initiator); await expect(await processHeaderCloudPage.getStartDate()).toEqual(completedCreatedDate); await expect(await processHeaderCloudPage.getParentId()).toEqual(childCompleteProcess.entry.parentId); diff --git a/e2e/process-services-cloud/task-filters-cloud.e2e.ts b/e2e/process-services-cloud/task-filters-cloud.e2e.ts index efdf681bcd..b89dd614f4 100644 --- a/e2e/process-services-cloud/task-filters-cloud.e2e.ts +++ b/e2e/process-services-cloud/task-filters-cloud.e2e.ts @@ -16,7 +16,16 @@ */ import { browser } from 'protractor'; -import { LoginSSOPage, TasksService, ApiService, AppListCloudPage, StringUtil, IdentityService, GroupIdentityService } from '@alfresco/adf-testing'; +import { + LoginSSOPage, + TasksService, + ApiService, + AppListCloudPage, + StringUtil, + IdentityService, + GroupIdentityService, + QueryService +} from '@alfresco/adf-testing'; import { NavigationBarPage } from '../pages/adf/navigation-bar.page'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasks-cloud-demo.page'; @@ -27,16 +36,19 @@ describe('Task filters cloud', () => { const navigationBarPage = new NavigationBarPage(); const appListCloudComponent = new AppListCloudPage(); const tasksCloudDemoPage = new TasksCloudDemoPage(); + let tasksService: TasksService; let identityService: IdentityService; let groupIdentityService: GroupIdentityService; + let queryService: QueryService; let testUser, groupInfo; const apiService = new ApiService(browser.params.config.oauth2.clientId, browser.params.config.bpmHost, browser.params.config.oauth2.host, 'BPM'); const newTask = StringUtil.generateRandomString(5), completedTask = StringUtil.generateRandomString(5); const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; - beforeAll(async() => { + beforeAll(async () => { + queryService = new QueryService(apiService); await apiService.login(browser.params.identityAdmin.email, browser.params.identityAdmin.password); identityService = new IdentityService(apiService); @@ -48,11 +60,13 @@ describe('Task filters cloud', () => { await apiService.login(testUser.email, testUser.password); await loginSSOPage.loginSSOIdentityService(testUser.email, testUser.password); + }); - afterAll(async() => { + afterAll(async () => { await apiService.login(browser.params.identityAdmin.email, browser.params.identityAdmin.password); await identityService.deleteIdentityUser(testUser.idIdentityService); + }); beforeEach(async () => { @@ -84,6 +98,7 @@ describe('Task filters cloud', () => { await tasksService.claimTask(toBeCompletedTask.entry.id, simpleApp); await tasksService.completeTask(toBeCompletedTask.entry.id, simpleApp); + await queryService.getTaskByStatus(toBeCompletedTask.entry.name, simpleApp, 'COMPLETED'); await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); await tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(completedTask); @@ -94,5 +109,5 @@ describe('Task filters cloud', () => { await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(completedTask); }); - }); + }); }); diff --git a/e2e/process-services-cloud/task-header-cloud.e2e.ts b/e2e/process-services-cloud/task-header-cloud.e2e.ts index 8fa71d4ea1..9c46d0da7c 100644 --- a/e2e/process-services-cloud/task-header-cloud.e2e.ts +++ b/e2e/process-services-cloud/task-header-cloud.e2e.ts @@ -145,7 +145,7 @@ describe('Task Header cloud component', () => { await expect(await taskHeaderCloudPage.getId()).toEqual(basicCreatedTask.entry.id); await expect(await taskHeaderCloudPage.getDescription()) .toEqual(isValueInvalid(basicCreatedTask.entry.description) ? CONSTANTS.TASK_DETAILS.NO_DESCRIPTION : basicCreatedTask.entry.description); - await expect(await taskHeaderCloudPage.getStatus()).toEqual(basicCreatedTask.entry.status); + await expect(await taskHeaderCloudPage.getStatus()).toEqual('ASSIGNED'); await expect(await taskHeaderCloudPage.getPriority()).toEqual(basicCreatedTask.entry.priority.toString()); await expect(await taskHeaderCloudPage.getCategory()).toEqual(!basicCreatedTask.entry.category ? CONSTANTS.TASK_DETAILS.NO_CATEGORY : basicCreatedTask.entry.category); @@ -165,7 +165,7 @@ describe('Task Header cloud component', () => { await expect(await taskHeaderCloudPage.getId()).toEqual(completedTask.entry.id); await expect(await taskHeaderCloudPage.getDescription()) .toEqual(isValueInvalid(completedTask.entry.description) ? CONSTANTS.TASK_DETAILS.NO_DESCRIPTION : completedTask.entry.description); - await expect(await taskHeaderCloudPage.getStatus()).toEqual(completedTask.entry.status); + await expect(await taskHeaderCloudPage.getStatus()).toEqual('COMPLETED'); await expect(await taskHeaderCloudPage.getPriority()).toEqual(completedTask.entry.priority.toString()); await expect(await taskHeaderCloudPage.getCategory()).toEqual(!completedTask.entry.category ? CONSTANTS.TASK_DETAILS.NO_CATEGORY : completedTask.entry.category); @@ -185,7 +185,7 @@ describe('Task Header cloud component', () => { await expect(await taskHeaderCloudPage.getId()).toEqual(subTask.entry.id); await expect(await taskHeaderCloudPage.getDescription()) .toEqual(isValueInvalid(subTask.entry.description) ? CONSTANTS.TASK_DETAILS.NO_DESCRIPTION : subTask.entry.description); - await expect(await taskHeaderCloudPage.getStatus()).toEqual(subTask.entry.status); + await expect(await taskHeaderCloudPage.getStatus()).toEqual('ASSIGNED'); await expect(await taskHeaderCloudPage.getPriority()).toEqual(subTask.entry.priority.toString()); await expect(await taskHeaderCloudPage.getCategory()).toEqual(!subTask.entry.category ? CONSTANTS.TASK_DETAILS.NO_CATEGORY : subTask.entry.category); @@ -239,12 +239,17 @@ describe('Task Header cloud component', () => { const currentAssignee = await peopleCloudComponentPage.getChipAssignee(); await expect(currentAssignee).toContain(testUser.firstName, 'Invalid Assignee first name set for the new task'); await expect(currentAssignee).toContain(testUser.lastName, 'Invalid Assignee last name set for the new task'); + await peopleCloudComponentPage.searchAssignee('hrUser'); - await peopleCloudComponentPage.checkUserIsDisplayed('HR User'); + await peopleCloudComponentPage.selectAssigneeFromList('HR User'); + await peopleCloudComponentPage.checkSelectedPeople('HR User'); + await peopleCloudComponentPage.searchAssignee('processAdmin'); - await peopleCloudComponentPage.checkUserIsDisplayed('Process Admin User'); + await peopleCloudComponentPage.selectAssigneeFromList('Process Admin User'); + await peopleCloudComponentPage.checkSelectedPeople('Process Admin User'); + await peopleCloudComponentPage.searchAssignee('modeler'); - await peopleCloudComponentPage.checkOptionIsNotDisplayed(); + await peopleCloudComponentPage.checkNoResultsFoundError(); }); describe('Default Date format', () => { diff --git a/lib/testing/src/lib/core/utils/browser-visibility.ts b/lib/testing/src/lib/core/utils/browser-visibility.ts index f74bdfbc32..28448971c6 100644 --- a/lib/testing/src/lib/core/utils/browser-visibility.ts +++ b/lib/testing/src/lib/core/utils/browser-visibility.ts @@ -17,7 +17,8 @@ import { browser, by, element, ElementFinder, protractor } from 'protractor'; -const DEFAULT_TIMEOUT = global['TestConfig'] ? global['TestConfig'].main.timeout : 40000; +const DEFAULT_TIMEOUT = global['TestConfig'] ? global['TestConfig'].main.timeout : 20000; +const NOT_VISIBLE_DEFAULT_TIMEOUT = global['TestConfig'] ? global['TestConfig'].main.timeout : 5000; export class BrowserVisibility { @@ -48,7 +49,7 @@ export class BrowserVisibility { /* * Wait for element to not be visible */ - static async waitUntilElementIsNotVisible(elementToCheck: ElementFinder, waitTimeout: number = DEFAULT_TIMEOUT): Promise { + static async waitUntilElementIsNotVisible(elementToCheck: ElementFinder, waitTimeout: number = NOT_VISIBLE_DEFAULT_TIMEOUT): Promise { return browser.wait(protractor.ExpectedConditions.invisibilityOf(elementToCheck), waitTimeout, 'Element is Visible and it should not' + elementToCheck.locator()); } @@ -59,7 +60,7 @@ export class BrowserVisibility { return browser.wait(protractor.ExpectedConditions.textToBePresentInElementValue(elementToCheck, elementValue), waitTimeout, 'Element doesn\'t have a value ' + elementToCheck.locator()); } - static async waitUntilElementIsNotPresent(elementToCheck: ElementFinder, waitTimeout: number = DEFAULT_TIMEOUT): Promise { + static async waitUntilElementIsNotPresent(elementToCheck: ElementFinder, waitTimeout: number = NOT_VISIBLE_DEFAULT_TIMEOUT): Promise { return browser.wait(protractor.ExpectedConditions.stalenessOf(elementToCheck), waitTimeout, 'Element is present ' + elementToCheck.locator()); } diff --git a/lib/testing/src/lib/process-services-cloud/pages/people-cloud-component.page.ts b/lib/testing/src/lib/process-services-cloud/pages/people-cloud-component.page.ts index ae4d9204b7..b9aa9bd249 100644 --- a/lib/testing/src/lib/process-services-cloud/pages/people-cloud-component.page.ts +++ b/lib/testing/src/lib/process-services-cloud/pages/people-cloud-component.page.ts @@ -24,6 +24,7 @@ export class PeopleCloudComponentPage { peopleCloudSearch: ElementFinder = element(by.css('input[data-automation-id="adf-people-cloud-search-input"]')); assigneeField: ElementFinder = element(by.css('input[data-automation-id="adf-people-cloud-search-input"]')); + selectionReady: ElementFinder = element(by.css('div[data-automation-id="adf-people-cloud-row"]')); formFields: FormFields = new FormFields(); labelLocator: Locator = by.css("label[class*='adf-label']"); inputLocator: Locator = by.css('input'); @@ -48,10 +49,6 @@ export class PeopleCloudComponentPage { await BrowserActions.clearSendKeys(this.peopleCloudSearch, name); } - async searchAssigneeToExisting(name: string): Promise { - await BrowserActions.clearSendKeys(this.peopleCloudSearch, name); - } - async selectAssigneeFromList(name: string): Promise { const assigneeRow = element.all(by.cssContainingText('mat-option span.adf-people-label-name', name)).first(); await BrowserActions.click(assigneeRow); @@ -79,6 +76,7 @@ export class PeopleCloudComponentPage { } async checkUserIsNotDisplayed(name: string): Promise { + await BrowserVisibility.waitUntilElementIsVisible(this.selectionReady); const assigneeRow = element(by.cssContainingText('mat-option span.adf-people-label-name', name)); await BrowserVisibility.waitUntilElementIsNotVisible(assigneeRow); } diff --git a/lib/testing/src/lib/process-services-cloud/pages/task-filters-cloud-component.page.ts b/lib/testing/src/lib/process-services-cloud/pages/task-filters-cloud-component.page.ts index 5277b9e08c..20008ba82d 100644 --- a/lib/testing/src/lib/process-services-cloud/pages/task-filters-cloud-component.page.ts +++ b/lib/testing/src/lib/process-services-cloud/pages/task-filters-cloud-component.page.ts @@ -34,7 +34,7 @@ export class TaskFiltersCloudComponentPage { this.filter = this.getTaskFilterLocatorByFilterName(filterName); await BrowserVisibility.waitUntilElementIsClickable(this.filter); await BrowserActions.click(this.filter); - await browser.sleep(1000); + await browser.sleep(1500); } async checkTaskFilterNotDisplayed(filterName: string): Promise { diff --git a/protractor.conf.ts b/protractor.conf.ts index a35910d710..423db80593 100644 --- a/protractor.conf.ts +++ b/protractor.conf.ts @@ -19,7 +19,7 @@ const projectRoot = path.resolve(__dirname); const width = 1657, height = 1657; let ENV_FILE = process.env.ENV_FILE; -let GROUP_SUFFIX = process.env.PREFIX; +let GROUP_SUFFIX = process.env.PREFIX || 'adf'; RESOURCES.ACTIVITI_CLOUD_APPS = ACTIVITI_CLOUD_APPS; if (ENV_FILE) {