From 83cb98f4356320fcd94ba33cf8e2988ebef18107 Mon Sep 17 00:00:00 2001 From: cristinaj Date: Thu, 25 Apr 2019 02:27:45 +0300 Subject: [PATCH] Add complete task tests (#4639) --- .../taskDetailsCloudDemoPage.ts | 17 ++ .../task-form-cloud-component.e2e.ts | 151 ++++++++++++++++++ .../pages/public-api.ts | 1 + .../pages/task-form-cloud-component.page.ts | 48 ++++++ 4 files changed, 217 insertions(+) create mode 100644 e2e/process-services-cloud/task-form-cloud-component.e2e.ts create mode 100644 lib/testing/src/lib/process-services-cloud/pages/task-form-cloud-component.page.ts diff --git a/e2e/pages/adf/demo-shell/process-services/taskDetailsCloudDemoPage.ts b/e2e/pages/adf/demo-shell/process-services/taskDetailsCloudDemoPage.ts index 0fa41b9f3e..a25e38c8dc 100644 --- a/e2e/pages/adf/demo-shell/process-services/taskDetailsCloudDemoPage.ts +++ b/e2e/pages/adf/demo-shell/process-services/taskDetailsCloudDemoPage.ts @@ -17,12 +17,29 @@ import { BrowserVisibility } from '@alfresco/adf-testing'; import { element, by } from 'protractor'; +import { TaskHeaderCloudPage, TaskFormCloudComponent } from '@alfresco/adf-testing'; export class TaskDetailsCloudDemoPage { + taskHeaderCloudPage = new TaskHeaderCloudPage(); + taskFormCloudPage = new TaskFormCloudComponent(); + taskDetailsHeader = element(by.css(`h4[data-automation-id='task-details-header']`)); releaseButton = element(by.css('button[adf-cloud-unclaim-task]')); + taskHeaderCloud() { + return this.taskHeaderCloudPage; + } + + taskFormCloud() { + return this.taskFormCloudPage; + } + + checkTaskDetailsHeaderIsDisplayed() { + BrowserVisibility.waitUntilElementIsVisible(this.taskDetailsHeader); + return this; + } + getTaskDetailsHeader() { BrowserVisibility.waitUntilElementIsVisible(this.taskDetailsHeader); return this.taskDetailsHeader.getText(); diff --git a/e2e/process-services-cloud/task-form-cloud-component.e2e.ts b/e2e/process-services-cloud/task-form-cloud-component.e2e.ts new file mode 100644 index 0000000000..bb69850445 --- /dev/null +++ b/e2e/process-services-cloud/task-form-cloud-component.e2e.ts @@ -0,0 +1,151 @@ +/*! + * @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 TestConfig = require('../test.config'); + +import { AppListCloudPage, StringUtil, ApiService, LoginSSOPage, SettingsPage, TasksService, QueryService, + ProcessDefinitionsService, ProcessInstancesService } from '@alfresco/adf-testing'; +import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; +import { TaskDetailsCloudDemoPage } from '../pages/adf/demo-shell/process-services/taskDetailsCloudDemoPage'; + +import resources = require('../util/resources'); + +describe('Complete task - cloud directive', () => { + + const settingsPage = new SettingsPage(); + const loginSSOPage = new LoginSSOPage(); + const navigationBarPage = new NavigationBarPage(); + const appListCloudComponent = new AppListCloudPage(); + const tasksCloudDemoPage = new TasksCloudDemoPage(); + const taskDetailsCloudDemoPage = new TaskDetailsCloudDemoPage(); + + let tasksService: TasksService; + let processDefinitionService: ProcessDefinitionsService; + let processInstancesService: ProcessInstancesService; + let queryService: QueryService; + + let completedTask, createdTask, assigneeTask, toBeCompletedTask, completedProcess, claimedTask; + const candidateuserapp = resources.ACTIVITI7_APPS.CANDIDATE_USER_APP.name; + const completedTaskName = StringUtil.generateRandomString(), assignedTaskName = StringUtil.generateRandomString(); + + beforeAll(async (done) => { + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, TestConfig.adf.hostIdentity, false); + loginSSOPage.clickOnSSOButton(); + loginSSOPage.loginSSOIdentityService(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + const apiService = new ApiService('activiti', TestConfig.adf.hostBPM, TestConfig.adf.hostSso, 'BPM'); + await apiService.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + tasksService = new TasksService(apiService); + createdTask = await tasksService.createStandaloneTask(StringUtil.generateRandomString(), candidateuserapp); + + assigneeTask = await tasksService.createStandaloneTask(StringUtil.generateRandomString(), candidateuserapp); + await tasksService.claimTask(assigneeTask.entry.id, candidateuserapp); + + toBeCompletedTask = await tasksService.createStandaloneTask(StringUtil.generateRandomString(), candidateuserapp); + await tasksService.claimTask(toBeCompletedTask.entry.id, candidateuserapp); + + completedTask = await tasksService.createStandaloneTask(assignedTaskName, candidateuserapp); + await tasksService.claimTask(completedTask.entry.id, candidateuserapp); + await tasksService.createAndCompleteTask(completedTaskName, candidateuserapp); + + processDefinitionService = new ProcessDefinitionsService(apiService); + const processDefinition = await processDefinitionService.getProcessDefinitions(candidateuserapp); + + processInstancesService = new ProcessInstancesService(apiService); + completedProcess = await processInstancesService.createProcessInstance(processDefinition.list.entries[0].entry.key, candidateuserapp); + + queryService = new QueryService(apiService); + const task = await queryService.getProcessInstanceTasks(completedProcess.entry.id, candidateuserapp); + tasksService = new TasksService(apiService); + claimedTask = await tasksService.claimTask(task.list.entries[0].entry.id, candidateuserapp); + + done(); + }); + + beforeEach((done) => { + navigationBarPage.navigateToProcessServicesCloudPage(); + appListCloudComponent.checkApsContainer(); + appListCloudComponent.goToApp(candidateuserapp); + done(); + }); + + it('[C307093] Complete button is not displayed when the task is already completed', () => { + tasksCloudDemoPage.completedTasksFilter().clickTaskFilter(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('Completed Tasks'); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(completedTaskName); + tasksCloudDemoPage.taskListCloudComponent().selectRow(completedTaskName); + taskDetailsCloudDemoPage.checkTaskDetailsHeaderIsDisplayed(); + taskDetailsCloudDemoPage.taskFormCloud().checkCompleteButtonIsNotDisplayed(); + }); + + it('[C307095] Task can not be completed by owner user', () => { + tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + tasksCloudDemoPage.editTaskFilterCloudComponent().clickCustomiseFilterHeader().clearAssignee().setStatusFilterDropDown('CREATED'); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(createdTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().selectRow(createdTask.entry.name); + taskDetailsCloudDemoPage.checkTaskDetailsHeaderIsDisplayed(); + taskDetailsCloudDemoPage.taskFormCloud().checkCompleteButtonIsNotDisplayed(); + }); + + it('[C307110] Task list is displayed after clicking on Cancel button', () => { + tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(assigneeTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().selectRow(assigneeTask.entry.name); + taskDetailsCloudDemoPage.checkTaskDetailsHeaderIsDisplayed(); + taskDetailsCloudDemoPage.taskFormCloud().clickCancelButton(); + + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(assigneeTask.entry.name); + }); + + it('[C307094] Standalone Task can be completed by a user that is owner and assignee', () => { + tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(toBeCompletedTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().selectRow(toBeCompletedTask.entry.name); + taskDetailsCloudDemoPage.checkTaskDetailsHeaderIsDisplayed(); + taskDetailsCloudDemoPage.taskFormCloud().checkCompleteButtonIsDisplayed().clickCompleteButton(); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(toBeCompletedTask.entry.name); + + tasksCloudDemoPage.completedTasksFilter().clickTaskFilter(); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(toBeCompletedTask.entry.name); + taskDetailsCloudDemoPage.taskFormCloud().checkCompleteButtonIsNotDisplayed(); + }); + + it('[C307111] Task of a process can be completed by a user that is owner and assignee', () => { + tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); + expect(tasksCloudDemoPage.getActiveFilterName()).toBe('My Tasks'); + + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(claimedTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().selectRow(claimedTask.entry.name); + taskDetailsCloudDemoPage.checkTaskDetailsHeaderIsDisplayed(); + taskDetailsCloudDemoPage.taskFormCloud().checkCompleteButtonIsDisplayed().clickCompleteButton(); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(claimedTask.entry.name); + + tasksCloudDemoPage.completedTasksFilter().clickTaskFilter(); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(claimedTask.entry.name); + taskDetailsCloudDemoPage.taskFormCloud().checkCompleteButtonIsNotDisplayed(); + }); + +}); diff --git a/lib/testing/src/lib/process-services-cloud/pages/public-api.ts b/lib/testing/src/lib/process-services-cloud/pages/public-api.ts index 9fd6becfc7..56c2c2b11c 100644 --- a/lib/testing/src/lib/process-services-cloud/pages/public-api.ts +++ b/lib/testing/src/lib/process-services-cloud/pages/public-api.ts @@ -27,5 +27,6 @@ export * from './process-list-cloud-component.page'; export * from './task-filters-cloud-component.page'; export * from './task-list-cloud-component.page'; export * from './start-process-cloud-component.page'; +export * from './task-form-cloud-component.page'; export * from './dialog/public-api'; diff --git a/lib/testing/src/lib/process-services-cloud/pages/task-form-cloud-component.page.ts b/lib/testing/src/lib/process-services-cloud/pages/task-form-cloud-component.page.ts new file mode 100644 index 0000000000..6378fd4143 --- /dev/null +++ b/lib/testing/src/lib/process-services-cloud/pages/task-form-cloud-component.page.ts @@ -0,0 +1,48 @@ +/*! + * @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 { element, by } from 'protractor'; +import { BrowserVisibility } from '../../core/utils/browser-visibility'; + +export class TaskFormCloudComponent { + + cancelButton = element(by.css("button[id='adf-cloud-cancel-task']")); + completeButton = element(by.css('button[adf-cloud-complete-task]')); + + checkCompleteButtonIsDisplayed() { + BrowserVisibility.waitUntilElementIsVisible(this.completeButton); + return this; + } + + checkCompleteButtonIsNotDisplayed() { + BrowserVisibility.waitUntilElementIsNotVisible(this.completeButton); + return this; + } + + clickCompleteButton() { + BrowserVisibility.waitUntilElementIsVisible(this.completeButton); + this.completeButton.click(); + return this; + } + + clickCancelButton() { + BrowserVisibility.waitUntilElementIsVisible(this.cancelButton); + this.cancelButton.click(); + return this; + } + +}