From 4b1471d9c3b12050b0375b4b251a3d8231efbce6 Mon Sep 17 00:00:00 2001 From: dhrn <14145706+dhrn@users.noreply.github.com> Date: Wed, 5 Feb 2020 22:19:30 +0530 Subject: [PATCH] =?UTF-8?q?[ADF-5066]=20APS2=20=E2=80=BA=20Process=20List?= =?UTF-8?q?=20test=20need=20to=20be=20automated=20(#5441)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [ADF-5066] APS2 › Process List test need to be automated * fixed spell check error * fixed errors * taskname from resource * fixed e2e * fixed comments * fixed declartions --- cspell.json | 3 +- .../processDetailsCloudDemoPage.ts | 7 +- .../process-services/tasksCloudDemoPage.ts | 5 + .../adf/process-services/processListPage.ts | 4 + .../process-filter-results.e2e.ts | 16 ++- .../process-filter-task.e2e.ts | 135 ++++++++++++++++++ .../process-list-selection-cloud.e2e.ts | 18 +++ .../task-form-cloud-component.e2e.ts | 11 +- .../tasks-custom-filters.e2e.ts | 4 +- .../resources/resources.ts | 3 + 10 files changed, 196 insertions(+), 10 deletions(-) create mode 100644 e2e/process-services-cloud/process-filter-task.e2e.ts diff --git a/cspell.json b/cspell.json index d36373c840..4b546049d8 100644 --- a/cspell.json +++ b/cspell.json @@ -138,7 +138,8 @@ "booleanvisibility", "processparent", "uploadfileform", - "processwithstarteventform" + "processwithstarteventform", + "processstring" ], "dictionaries": [ "html", diff --git a/e2e/pages/adf/demo-shell/process-services-cloud/processDetailsCloudDemoPage.ts b/e2e/pages/adf/demo-shell/process-services-cloud/processDetailsCloudDemoPage.ts index 421e2de00f..005423e180 100644 --- a/e2e/pages/adf/demo-shell/process-services-cloud/processDetailsCloudDemoPage.ts +++ b/e2e/pages/adf/demo-shell/process-services-cloud/processDetailsCloudDemoPage.ts @@ -15,7 +15,8 @@ * limitations under the License. */ -import { DataTableComponentPage } from '@alfresco/adf-testing'; +import { BrowserVisibility, DataTableComponentPage } from '@alfresco/adf-testing'; +import { by, element } from 'protractor'; export class ProcessDetailsCloudDemoPage { @@ -28,4 +29,8 @@ export class ProcessDetailsCloudDemoPage { async selectProcessTaskByName(taskName: string): Promise { await this.dataTable.selectRow('Name', taskName); } + + async checkListedSelectedProcessInstance(processInstanceId: string): Promise { + await BrowserVisibility.waitUntilElementIsPresent(element(by.cssContainingText('div ul', processInstanceId))); + } } diff --git a/e2e/pages/adf/demo-shell/process-services/tasksCloudDemoPage.ts b/e2e/pages/adf/demo-shell/process-services/tasksCloudDemoPage.ts index f65134ef54..e8461c13b2 100644 --- a/e2e/pages/adf/demo-shell/process-services/tasksCloudDemoPage.ts +++ b/e2e/pages/adf/demo-shell/process-services/tasksCloudDemoPage.ts @@ -54,6 +54,7 @@ export class TasksCloudDemoPage { addActionButton: ElementFinder = element(by.cssContainingText('button span', 'Add')); disableCheckbox: ElementFinder = element(by.css(`mat-checkbox[formcontrolname='disabled']`)); visibleCheckbox: ElementFinder = element(by.css(`mat-checkbox[formcontrolname='visible']`)); + filter: ElementFinder = element(by.css(`mat-expansion-panel[data-automation-id='Task Filters']`)); formControllersPage: FormControllersPage = new FormControllersPage(); @@ -83,6 +84,10 @@ export class TasksCloudDemoPage { await this.formControllersPage.enableToggle(this.testingModeToggle); } + async clickOnTaskFilter(): Promise { + await BrowserActions.click(this.filter); + } + taskListCloudComponent(): TaskListCloudComponentPage { return new TaskListCloudComponentPage(); } diff --git a/e2e/pages/adf/process-services/processListPage.ts b/e2e/pages/adf/process-services/processListPage.ts index bb87a9dc79..bd70876c54 100644 --- a/e2e/pages/adf/process-services/processListPage.ts +++ b/e2e/pages/adf/process-services/processListPage.ts @@ -27,6 +27,10 @@ export class ProcessListPage { return BrowserActions.getText(this.processListTitle); } + titleNotPresent(): Promise { + return BrowserVisibility.waitUntilElementIsNotPresent(this.processListTitle); + } + async checkProcessListIsDisplayed(): Promise { await BrowserVisibility.waitUntilElementIsVisible(this.processInstanceList); } diff --git a/e2e/process-services-cloud/process-filter-results.e2e.ts b/e2e/process-services-cloud/process-filter-results.e2e.ts index c0ffd3faae..bffcfe3a97 100644 --- a/e2e/process-services-cloud/process-filter-results.e2e.ts +++ b/e2e/process-services-cloud/process-filter-results.e2e.ts @@ -15,7 +15,20 @@ * limitations under the License. */ -import { ApiService, AppListCloudPage, DateUtil, GroupIdentityService, IdentityService, LocalStorageUtil, LoginSSOPage, ProcessDefinitionsService, ProcessInstancesService, QueryService, StringUtil, TasksService } from '@alfresco/adf-testing'; +import { + ApiService, + AppListCloudPage, + DateUtil, + GroupIdentityService, + IdentityService, + LocalStorageUtil, + LoginSSOPage, + ProcessDefinitionsService, + ProcessInstancesService, + QueryService, + StringUtil, + TasksService +} from '@alfresco/adf-testing'; import { browser } from 'protractor'; import { ProcessCloudDemoPage } from '../pages/adf/demo-shell/process-services/processCloudDemoPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; @@ -324,5 +337,4 @@ describe('Process filters cloud', () => { await processCloudDemoPage.processListCloudComponent().getDataTable().waitTillContentLoaded(); await expect(await processListPage.getDisplayedProcessListTitle()).toEqual('No Processes Found'); }); - }); diff --git a/e2e/process-services-cloud/process-filter-task.e2e.ts b/e2e/process-services-cloud/process-filter-task.e2e.ts new file mode 100644 index 0000000000..b88749e172 --- /dev/null +++ b/e2e/process-services-cloud/process-filter-task.e2e.ts @@ -0,0 +1,135 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * 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 { + ApiService, + AppListCloudPage, + LocalStorageUtil, + LoginSSOPage, + ProcessDefinitionsService, + ProcessInstancesService, + QueryService, + TaskFormCloudComponent, + TaskHeaderCloudPage +} from '@alfresco/adf-testing'; +import { browser, protractor } from 'protractor'; +import { ProcessCloudDemoPage } from '../pages/adf/demo-shell/process-services/processCloudDemoPage'; +import { ProcessDetailsCloudDemoPage } from '../pages/adf/demo-shell/process-services-cloud/processDetailsCloudDemoPage'; +import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; +import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { ProcessListPage } from '../pages/adf/process-services/processListPage'; +import { EditProcessFilterConfiguration } from './config/edit-process-filter.config'; +import { ProcessListCloudConfiguration } from './config/process-list-cloud.config'; +import { ProcessDefinitionCloud, ProcessInstanceCloud, StartTaskCloudResponseModel } from '@alfresco/adf-process-services-cloud'; + +describe('Process filters cloud', () => { + const loginSSOPage = new LoginSSOPage(); + const navigationBarPage = new NavigationBarPage(); + const appListCloudComponent = new AppListCloudPage(); + const processCloudDemoPage = new ProcessCloudDemoPage(); + const tasksCloudDemoPage = new TasksCloudDemoPage(); + const processDetailsCloudDemoPage = new ProcessDetailsCloudDemoPage(); + const taskHeaderCloudPage = new TaskHeaderCloudPage(); + const taskFormCloudComponent = new TaskFormCloudComponent(); + const processListPage = new ProcessListPage(); + const apiService = new ApiService( + browser.params.config.oauth2.clientId, + browser.params.config.bpmHost, browser.params.config.oauth2.host, browser.params.config.providers + ); + + const processListCloudConfigFile = new ProcessListCloudConfiguration().getConfiguration(); + const editProcessFilterConfigFile = new EditProcessFilterConfiguration().getConfiguration(); + + let processDefinitionService: ProcessDefinitionsService; + let processInstancesService: ProcessInstancesService; + let queryService: QueryService; + let simpleProcessDefinition: ProcessDefinitionCloud; + let processInstance: ProcessInstanceCloud; + let taskAssigned: StartTaskCloudResponseModel[]; + let taskName: string; + const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; + + beforeAll(async () => { + await apiService.login(browser.params.testConfig.hrUser.email, browser.params.testConfig.hrUser.password); + processDefinitionService = new ProcessDefinitionsService(apiService); + processInstancesService = new ProcessInstancesService(apiService); + queryService = new QueryService(apiService); + + simpleProcessDefinition = (await processDefinitionService + .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.processes.processstring, simpleApp)).entry; + processInstance = (await processInstancesService.createProcessInstance(simpleProcessDefinition.key, simpleApp)).entry; + taskAssigned = (await queryService.getProcessInstanceTasks(processInstance.id, simpleApp)).list.entries; + taskName = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.tasks.processstring; + + await loginSSOPage.loginSSOIdentityService(browser.params.testConfig.hrUser.email, browser.params.testConfig.hrUser.password); + await LocalStorageUtil.setConfigField('adf-edit-process-filter', JSON.stringify(editProcessFilterConfigFile)); + await LocalStorageUtil.setConfigField('adf-cloud-process-list', JSON.stringify(processListCloudConfigFile)); + }); + + beforeEach(async () => { + await navigationBarPage.navigateToProcessServicesCloudPage(); + await appListCloudComponent.checkApsContainer(); + await appListCloudComponent.goToApp(simpleApp); + await tasksCloudDemoPage.taskListCloudComponent().checkTaskListIsLoaded(); + await processCloudDemoPage.clickOnProcessFilters(); + }); + + it('[C290041] Should be displayed the "No Process Found" message when the process list is empty', async () => { + await processCloudDemoPage.editProcessFilterCloudComponent().openFilter(); + await processCloudDemoPage.editProcessFilterCloudComponent().setAppNameDropDown(simpleApp); + await processCloudDemoPage.editProcessFilterCloudComponent().setStatusFilterDropDown('COMPLETED'); + + await processCloudDemoPage.processListCloudComponent().getDataTable().waitTillContentLoaded(); + await expect(await processCloudDemoPage.processListCloudComponent().getDataTable().contents.count()).toBeGreaterThan(0); + + await processCloudDemoPage.editProcessFilterCloudComponent().setProperty('processInstanceId', 'i_am_fake_id'); + await expect(await processListPage.getDisplayedProcessListTitle()).toEqual('No Processes Found'); + }); + + it('[C315296] Should NOT display "No Process Found" before displaying the process list', async () => { + await processCloudDemoPage.editProcessFilterCloudComponent().openFilter(); + await processCloudDemoPage.editProcessFilterCloudComponent().setAppNameDropDown(simpleApp); + await processCloudDemoPage.editProcessFilterCloudComponent().setStatusFilterDropDown('COMPLETED'); + + await expect(await processListPage.titleNotPresent()).toBeTruthy(); + await expect(await processCloudDemoPage.processListCloudComponent().getDataTable().contents.count()).toBeGreaterThan(0); + + await processCloudDemoPage.editProcessFilterCloudComponent().setProperty('processInstanceId', 'i_am_fake_id'); + await expect(await processListPage.getDisplayedProcessListTitle()).toEqual('No Processes Found'); + }); + + it('[C290040] Should be able to open the Task Details page by clicking on the process name', async () => { + await processCloudDemoPage.editProcessFilterCloudComponent().openFilter(); + await processCloudDemoPage.editProcessFilterCloudComponent().setAppNameDropDown(simpleApp); + await processCloudDemoPage.editProcessFilterCloudComponent().setStatusFilterDropDown('RUNNING'); + await processCloudDemoPage.editProcessFilterCloudComponent().setProperty('processInstanceId', processInstance.id); + + await processCloudDemoPage.processListCloudComponent().getDataTable().selectRow('Id', processInstance.id); + await browser.actions().sendKeys(protractor.Key.ENTER).perform(); + + await processDetailsCloudDemoPage.checkTaskIsDisplayed(taskName); + await browser.navigate().back(); + + await tasksCloudDemoPage.clickOnTaskFilter(); + await tasksCloudDemoPage.editTaskFilterCloudComponent().openFilter(); + await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(taskAssigned[0].entry.name); + await tasksCloudDemoPage.taskListCloudComponent().selectRow(taskAssigned[0].entry.name); + await taskHeaderCloudPage.checkTaskPropertyListIsDisplayed(); + await expect(await taskFormCloudComponent.getFormTitle()).toContain(taskName); + await taskFormCloudComponent.clickCompleteButton(); + }); +}); diff --git a/e2e/process-services-cloud/process-list-selection-cloud.e2e.ts b/e2e/process-services-cloud/process-list-selection-cloud.e2e.ts index e0d2780127..0df7c769c3 100644 --- a/e2e/process-services-cloud/process-list-selection-cloud.e2e.ts +++ b/e2e/process-services-cloud/process-list-selection-cloud.e2e.ts @@ -20,6 +20,7 @@ import { browser } from 'protractor'; import { ProcessCloudDemoPage } from '../pages/adf/demo-shell/process-services/processCloudDemoPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { ProcessDetailsCloudDemoPage } from '../pages/adf/demo-shell/process-services-cloud/processDetailsCloudDemoPage'; describe('Process list cloud', () => { @@ -29,6 +30,7 @@ describe('Process list cloud', () => { const appListCloudComponent = new AppListCloudPage(); const processCloudDemoPage = new ProcessCloudDemoPage(); const tasksCloudDemoPage = new TasksCloudDemoPage(); + const processDetailsCloudDemoPage = new ProcessDetailsCloudDemoPage(); let processDefinitionService: ProcessDefinitionsService; let processInstancesService: ProcessInstancesService; @@ -164,6 +166,22 @@ describe('Process list cloud', () => { await processCloudDemoPage.processListCloudComponent().checkRowIsNotCheckedById(processInstances[2]); }); + it('[C297467] Should be able to see selected processes', async () => { + await tasksCloudDemoPage.clickSettingsButton(); + await tasksCloudDemoPage.enableMultiSelection(); + await tasksCloudDemoPage.enableTestingMode(); + await tasksCloudDemoPage.clickAppButton(); + await processCloudDemoPage.isProcessFiltersListVisible(); + await expect(await processCloudDemoPage.getActiveFilterName()).toEqual('Running Processes'); + + await processCloudDemoPage.processListCloudComponent().checkCheckboxById(processInstances[0]); + await processCloudDemoPage.processListCloudComponent().checkRowIsCheckedById(processInstances[0]); + await processDetailsCloudDemoPage.checkListedSelectedProcessInstance(processInstances[0]); + + await processCloudDemoPage.processListCloudComponent().checkCheckboxById(processInstances[1]); + await processCloudDemoPage.processListCloudComponent().checkRowIsCheckedById(processInstances[1]); + await processDetailsCloudDemoPage.checkListedSelectedProcessInstance(processInstances[1]); + }); }); }); diff --git a/e2e/process-services-cloud/task-form-cloud-component.e2e.ts b/e2e/process-services-cloud/task-form-cloud-component.e2e.ts index bd6761ea22..3c261133e2 100644 --- a/e2e/process-services-cloud/task-form-cloud-component.e2e.ts +++ b/e2e/process-services-cloud/task-form-cloud-component.e2e.ts @@ -17,16 +17,17 @@ import { browser, protractor } from 'protractor'; import { - AppListCloudPage, - StringUtil, ApiService, + AppListCloudPage, LoginSSOPage, - TasksService, + ProcessCloudWidgetPage, ProcessDefinitionsService, ProcessInstancesService, - TaskHeaderCloudPage, + QueryService, + StringUtil, TaskFormCloudComponent, - QueryService, ProcessCloudWidgetPage + TaskHeaderCloudPage, + TasksService } from '@alfresco/adf-testing'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; diff --git a/e2e/process-services-cloud/tasks-custom-filters.e2e.ts b/e2e/process-services-cloud/tasks-custom-filters.e2e.ts index bf8d4f8a0f..27ac569be9 100644 --- a/e2e/process-services-cloud/tasks-custom-filters.e2e.ts +++ b/e2e/process-services-cloud/tasks-custom-filters.e2e.ts @@ -25,7 +25,8 @@ import { ProcessInstancesService, LoginSSOPage, ApiService, - IdentityService, GroupIdentityService, + IdentityService, + GroupIdentityService, AppListCloudPage } from '@alfresco/adf-testing'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; @@ -184,5 +185,6 @@ describe('Task filters cloud', () => { await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(taskAssigned.list.entries[0].entry.name); }); + }); }); diff --git a/lib/testing/src/lib/process-services-cloud/resources/resources.ts b/lib/testing/src/lib/process-services-cloud/resources/resources.ts index 339579df57..26f1b31131 100644 --- a/lib/testing/src/lib/process-services-cloud/resources/resources.ts +++ b/lib/testing/src/lib/process-services-cloud/resources/resources.ts @@ -122,6 +122,9 @@ export const ACTIVITI_CLOUD_APPS: any = { name: 'requirednumbervisibility' } }, + tasks: { + processstring: 'inputtask' + }, security: [ { 'role': 'ACTIVITI_ADMIN', 'groups': [], 'users': ['superadminuser'] }, { 'role': 'ACTIVITI_USER', 'groups': ['hr', 'testgroup'], 'users': ['hruser'] },