diff --git a/e2e/pages/adf/demo-shell/tasksCloudDemoPage.ts b/e2e/pages/adf/demo-shell/tasksCloudDemoPage.ts index ec1edc53ce..a06ea9ab06 100644 --- a/e2e/pages/adf/demo-shell/tasksCloudDemoPage.ts +++ b/e2e/pages/adf/demo-shell/tasksCloudDemoPage.ts @@ -27,10 +27,14 @@ export class TasksCloudDemoPage { myTasks = element(by.css('span[data-automation-id="my-tasks-filter"]')); completedTasks = element(by.css('span[data-automation-id="completed-tasks-filter"]')); activeFilter = element(by.css("mat-list-item[class*='active'] span")); + taskFilters = element(by.css("mat-expansion-panel[data-automation-id='Task Filters']")); editTaskFilterCloud = new EditTaskFilterCloudComponent(); + createButton = element(by.css('button[data-automation-id="create-button"')); + newTaskButton = element(by.css('button[data-automation-id="btn-start-task"]')); + taskFiltersCloudComponent(filter) { return new TaskFiltersCloudComponent(filter); } @@ -68,4 +72,29 @@ export class TasksCloudDemoPage { Util.waitUntilElementIsVisible(this.taskFilters); return this.taskFilters.click(); } + + openNewTaskForm() { + this.createButtonIsDisplayed(); + this.clickOnCreateButton(); + this.newTaskButtonIsDisplayed(); + this.newTaskButton.click(); + return this; + } + + createButtonIsDisplayed() { + Util.waitUntilElementIsVisible(this.createButton); + return this; + } + + newTaskButtonIsDisplayed() { + Util.waitUntilElementIsVisible(this.newTaskButton); + return this; + } + + clickOnCreateButton() { + Util.waitUntilElementIsClickable(this.createButton); + this.createButton.click(); + return this; + } + } diff --git a/e2e/pages/adf/process-cloud/startTasksCloudComponent.ts b/e2e/pages/adf/process-cloud/startTasksCloudComponent.ts new file mode 100644 index 0000000000..52e221e431 --- /dev/null +++ b/e2e/pages/adf/process-cloud/startTasksCloudComponent.ts @@ -0,0 +1,130 @@ +/*! + * @license + * Copyright 2016 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 { Util } from '../../../util/util'; +import { element, by, Key, protractor } from 'protractor'; + +export class StartTasksCloudComponent { + + name = element(by.css('input[id="name_id"]')); + dueDate = element(by.css('input[id="date_id"]')); + description = element(by.css('textarea[id="description_id"]')); + assignee = element(by.css('adf-cloud-people input')); + priority = element(by.css('input[formcontrolname="priority"]')); + startButton = element(by.css('button[id="button-start"]')); + startButtonEnabled = element(by.css('button[id="button-start"]:not(disabled)')); + cancelButton = element(by.css('button[id="button-cancel"]')); + + addName(userName) { + Util.waitUntilElementIsVisible(this.name); + this.name.clear(); + this.name.sendKeys(userName); + return this; + } + + addDescription(userDescription) { + Util.waitUntilElementIsVisible(this.description); + this.description.sendKeys(userDescription); + return this; + } + + addPriority(userPriority) { + Util.waitUntilElementIsVisible(this.priority); + this.priority.sendKeys(userPriority); + return this; + } + + addDueDate(date) { + Util.waitUntilElementIsVisible(this.dueDate); + this.clearField(this.dueDate); + this.dueDate.sendKeys(date); + return this; + } + + addAssignee(name) { + Util.waitUntilElementIsVisible(this.assignee); + this.assignee.sendKeys(name); + this.selectAssigneeFromList(name); + return this; + } + + selectAssigneeFromList(name) { + let assigneeRow = element(by.cssContainingText('mat-option span.adf-people-label-name', name)); + Util.waitUntilElementIsVisible(assigneeRow); + assigneeRow.click(); + Util.waitUntilElementIsNotVisible(assigneeRow); + return this; + } + + getAssignee() { + Util.waitUntilElementIsVisible(this.assignee); + return this.assignee.getAttribute('placeholder'); + } + + clickStartButton() { + Util.waitUntilElementIsVisible(this.startButton); + Util.waitUntilElementIsClickable(this.startButton); + return this.startButton.click(); + } + + checkStartButtonIsEnabled() { + Util.waitUntilElementIsVisible(this.startButtonEnabled); + return this; + } + + checkStartButtonIsDisabled() { + Util.waitUntilElementIsVisible(this.startButton.getAttribute('disabled')); + return this; + } + + clickCancelButton() { + Util.waitUntilElementIsVisible(this.cancelButton); + Util.waitUntilElementIsClickable(this.cancelButton); + return this.cancelButton.click(); + } + + blur(locator) { + locator.click(); + locator.sendKeys(Key.TAB); + return this; + } + + checkValidationErrorIsDisplayed(error, elementRef = 'mat-error') { + const errorElement = element(by.cssContainingText(elementRef, error)); + Util.waitUntilElementIsVisible(errorElement); + return this; + } + + validateAssignee(error) { + this.checkValidationErrorIsDisplayed(error, '.adf-start-task-cloud-error'); + return this; + } + + validateDate(error) { + this.checkValidationErrorIsDisplayed(error, '.adf-error-text'); + return this; + } + + clearField(locator) { + Util.waitUntilElementIsVisible(locator); + locator.getAttribute('value').then((result) => { + for (let i = result.length; i >= 0; i--) { + locator.sendKeys(protractor.Key.BACK_SPACE); + } + }); + } +} diff --git a/e2e/process-services-cloud/start-task-custom-app-cloud.e2e.ts b/e2e/process-services-cloud/start-task-custom-app-cloud.e2e.ts new file mode 100644 index 0000000000..c090d74b0f --- /dev/null +++ b/e2e/process-services-cloud/start-task-custom-app-cloud.e2e.ts @@ -0,0 +1,102 @@ +/*! + * @license + * Copyright 2016 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 { LoginSSOPage } from '../pages/adf/loginSSOPage'; +import { SettingsPage } from '../pages/adf/settingsPage'; +import { AppListCloudComponent } from '../pages/adf/process-cloud/appListCloudComponent'; +import TestConfig = require('../test.config'); +import { NavigationBarPage } from '../pages/adf/navigationBarPage'; +import { TasksCloudDemoPage } from '../pages/adf/demo-shell/tasksCloudDemoPage'; +import { StartTasksCloudComponent } from '../pages/adf/process-cloud/startTasksCloudComponent'; +import { Util } from '../util/util'; + +describe('Start Task', () => { + + const settingsPage = new SettingsPage(); + const loginSSOPage = new LoginSSOPage(); + const navigationBarPage = new NavigationBarPage(); + const appListCloudComponent = new AppListCloudComponent(); + const tasksCloudDemoPage = new TasksCloudDemoPage(); + const startTask = new StartTasksCloudComponent(); + const standaloneTaskName = Util.generateRandomString(5); + const taskName255Characters = Util.generateRandomString(255); + const taskNameBiggerThen255Characters = Util.generateRandomString(256); + const lengthValidationError = 'Length exceeded, 255 characters max.'; + const requiredError = 'Field required'; + const dateValidationError = 'Date format DD/MM/YYYY'; + const user = TestConfig.adf.adminEmail, password = TestConfig.adf.adminPassword; + const appName = 'task-app'; + let silentLogin; + + beforeAll((done) => { + silentLogin = false; + settingsPage.setProviderBpmSso(TestConfig.adf.hostBPM, TestConfig.adf.hostSso, silentLogin); + loginSSOPage.clickOnSSOButton(); + loginSSOPage.loginAPS(user, password); + navigationBarPage.navigateToProcessServicesCloudPage(); + appListCloudComponent.checkApsContainer(); + appListCloudComponent.checkAppIsDisplayed(appName); + appListCloudComponent.goToApp(appName); + tasksCloudDemoPage.taskListCloudComponent().getDataTable().waitForTableBody(); + done(); + }); + + it('[C290166] Should be possible to cancel a task', () => { + tasksCloudDemoPage.openNewTaskForm(); + startTask.checkStartButtonIsDisabled() + .blur(startTask.name) + .checkValidationErrorIsDisplayed(requiredError); + startTask.addName(standaloneTaskName) + .addDescription('descriptions') + .addDueDate('12/12/2018'); + startTask.checkStartButtonIsEnabled(); + startTask.clickCancelButton(); + tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsNotDisplayed(standaloneTaskName); + }); + + it('[C290180] Should be able to create a new standalone task', () => { + tasksCloudDemoPage.openNewTaskForm(); + startTask.addName(standaloneTaskName) + .addDescription('descriptions') + .addDueDate('12/12/2018') + .addPriority('50') + .clickStartButton(); + tasksCloudDemoPage.taskListCloudComponent().getDataTable().checkContentIsDisplayed(standaloneTaskName); + }); + + it('[C290181] Should be displayed an error message if task name exceed 255 characters', () => { + tasksCloudDemoPage.openNewTaskForm(); + startTask.addName(taskName255Characters) + .checkStartButtonIsEnabled(); + startTask.addName(taskNameBiggerThen255Characters) + .blur(startTask.name) + .checkValidationErrorIsDisplayed(lengthValidationError) + .checkStartButtonIsDisabled() + .clickCancelButton(); + }); + + it('[C291774] Should be displayed an error message if the date is invalid', () => { + tasksCloudDemoPage.openNewTaskForm(); + startTask.addDueDate('12/12/2018') + .checkStartButtonIsEnabled(); + startTask.addDueDate('invalid date') + .blur(startTask.dueDate) + .validateDate(dateValidationError) + .checkStartButtonIsDisabled(); + }); + +});