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 3a391b755b..55200764bd 100644 --- a/e2e/process-services-cloud/task-form-cloud-component.e2e.ts +++ b/e2e/process-services-cloud/task-form-cloud-component.e2e.ts @@ -17,8 +17,18 @@ import { browser } from 'protractor'; import { - AppListCloudPage, StringUtil, ApiService, LoginSSOPage, TasksService, QueryService, - ProcessDefinitionsService, ProcessInstancesService, SettingsPage, TaskHeaderCloudPage, TaskFormCloudComponent + AppListCloudPage, + StringUtil, + ApiService, + LoginSSOPage, + TasksService, + QueryService, + ProcessDefinitionsService, + ProcessInstancesService, + SettingsPage, + TaskHeaderCloudPage, + TaskFormCloudComponent, + Widget } from '@alfresco/adf-testing'; import { NavigationBarPage } from '../pages/adf/navigationBarPage'; import { TasksCloudDemoPage } from '../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; @@ -34,13 +44,15 @@ describe('Task form cloud component', () => { const taskHeaderCloudPage = new TaskHeaderCloudPage(); const taskFormCloudComponent = new TaskFormCloudComponent(); const settingsPage = new SettingsPage(); + const widget = new Widget(); + const formToTestValidationsKey = 'form-49904910-603c-48e9-8c8c-1d442c0fa524'; let tasksService: TasksService; let processDefinitionService: ProcessDefinitionsService; let processInstancesService: ProcessInstancesService; let queryService: QueryService; - let completedTask, createdTask, assigneeTask, toBeCompletedTask, completedProcess, claimedTask; + let completedTask, createdTask, assigneeTask, toBeCompletedTask, completedProcess, claimedTask, formValidationsTask; const candidateBaseApp = resources.ACTIVITI7_APPS.CANDIDATE_BASE_APP.name; const completedTaskName = StringUtil.generateRandomString(), assignedTaskName = StringUtil.generateRandomString(); @@ -55,6 +67,9 @@ describe('Task form cloud component', () => { assigneeTask = await tasksService.createStandaloneTask(StringUtil.generateRandomString(), candidateBaseApp); await tasksService.claimTask(assigneeTask.entry.id, candidateBaseApp); + formValidationsTask = await tasksService.createStandaloneTaskWithForm(StringUtil.generateRandomString(), candidateBaseApp, formToTestValidationsKey); + await tasksService.claimTask(formValidationsTask.entry.id, candidateBaseApp); + toBeCompletedTask = await tasksService.createStandaloneTask(StringUtil.generateRandomString(), candidateBaseApp); await tasksService.claimTask(toBeCompletedTask.entry.id, candidateBaseApp); @@ -89,6 +104,60 @@ describe('Task form cloud component', () => { expect(taskFormCloudComponent.getReleaseButtonText()).toBe('RELEASE'); }); + it('[C310142] Empty content is displayed when having a task without form', async () => { + navigationBarPage.navigateToProcessServicesCloudPage(); + appListCloudComponent.checkApsContainer(); + appListCloudComponent.goToApp(candidateBaseApp); + tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(assigneeTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().selectRow(assigneeTask.entry.name); + taskFormCloudComponent.checkFormIsNotDisplayed(); + expect(taskFormCloudComponent.getFormTitle()).toBe(assigneeTask.entry.name); + taskFormCloudComponent.checkFormContentIsEmpty(); + expect(taskFormCloudComponent.getEmptyFormContentTitle()).toBe(`No form available`); + expect(taskFormCloudComponent.getEmptyFormContentSubtitle()).toBe(`Attach a form that can be viewed later`); + }); + + it('[C310199] Should not be able to complete a task when required field is empty or invalid data is added to a field', async () => { + navigationBarPage.navigateToProcessServicesCloudPage(); + appListCloudComponent.checkApsContainer(); + appListCloudComponent.goToApp(candidateBaseApp); + tasksCloudDemoPage.myTasksFilter().clickTaskFilter(); + tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(formValidationsTask.entry.name); + tasksCloudDemoPage.taskListCloudComponent().selectRow(formValidationsTask.entry.name); + taskFormCloudComponent.checkFormIsDisplayed(); + taskFormCloudComponent.formFields().checkFormIsDisplayed(); + taskFormCloudComponent.formFields().checkWidgetIsVisible('Text0tma8h'); + taskFormCloudComponent.formFields().checkWidgetIsVisible('Date0m1moq'); + taskFormCloudComponent.formFields().checkWidgetIsVisible('Number0klykr'); + taskFormCloudComponent.formFields().checkWidgetIsVisible('Amount0mtp1h'); + + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(false); + widget.textWidget().setValue('Text0tma8h', 'Some random text'); + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(true); + + widget.dateWidget().setDateInput('Date0m1moq', 'invalid date'); + widget.dateWidget().clickOutsideWidget('Date0m1moq'); + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(false); + + widget.dateWidget().setDateInput('Date0m1moq', '20-10-2018'); + widget.dateWidget().clickOutsideWidget('Date0m1moq'); + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(true); + + widget.numberWidget().setFieldValue('Number0klykr', 'invalid number'); + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(false); + + widget.numberWidget().setFieldValue('Number0klykr', '26'); + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(true); + + widget.amountWidget().setFieldValue('Amount0mtp1h', 'invalid amount'); + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(false); + + widget.amountWidget().setFieldValue('Amount0mtp1h', '660'); + expect(taskFormCloudComponent.getCompleteButton().isEnabled()).toBe(true); + + }); + describe('Complete task - cloud directive', () => { beforeEach((done) => { diff --git a/e2e/resources/activiti7/candidatebaseapp.zip b/e2e/resources/activiti7/candidatebaseapp.zip index 5df5689ba4..1f8e86b76c 100644 Binary files a/e2e/resources/activiti7/candidatebaseapp.zip and b/e2e/resources/activiti7/candidatebaseapp.zip differ diff --git a/lib/testing/src/lib/core/actions/identity/tasks.service.ts b/lib/testing/src/lib/core/actions/identity/tasks.service.ts index 3d266413c4..cef3f7c22e 100644 --- a/lib/testing/src/lib/core/actions/identity/tasks.service.ts +++ b/lib/testing/src/lib/core/actions/identity/tasks.service.ts @@ -43,6 +43,25 @@ export class TasksService { } } + async createStandaloneTaskWithForm(taskName, appName, formKey, options?) { + try { + const path = '/' + appName + '/rb/v1/tasks'; + const method = 'POST'; + + const queryParams = {}, postBody = { + 'name': taskName, + 'payloadType': 'CreateTaskPayload', + 'formKey': formKey, + ...options + }; + + return await this.api.performBpmOperation(path, method, queryParams, postBody); + } catch (error) { + // tslint:disable-next-line:no-console + console.log('Create FormTask - Service error, Response: ', JSON.parse(JSON.stringify(error))); + } + } + async completeTask(taskId, appName) { try { const path = '/' + appName + '/rb/v1/tasks/' + taskId + '/complete'; 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 index 9b468c2e6a..0f97379b2c 100644 --- 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 @@ -28,6 +28,10 @@ export class TaskFormCloudComponent { saveButton = element(by.css('button[id="adf-form-save"]')); claimButton = element(by.css('button[adf-cloud-claim-task]')); form = element(by.css('adf-cloud-form')); + formTitle = element(by.css(`span.adf-form-title`)); + emptyContentIcon = element(by.css(`div.adf-empty-content mat-icon.adf-empty-content__icon`)); + emptyContentTitle = element(by.css(`div.adf-empty-content div.adf-empty-content__title`)); + emptyContentSubtitle = element(by.css(`div.adf-empty-content div.adf-empty-content__subtitle`)); checkCompleteButtonIsDisplayed() { BrowserVisibility.waitUntilElementIsVisible(this.completeButton); @@ -68,6 +72,16 @@ export class TaskFormCloudComponent { return this; } + getFormTitle() { + BrowserVisibility.waitUntilElementIsVisible(this.formTitle); + return this.formTitle.getText(); + } + + checkFormIsNotDisplayed() { + BrowserVisibility.waitUntilElementIsNotVisible(this.form); + return this; + } + getReleaseButtonText() { return BrowserActions.getText(this.releaseButton); } @@ -82,4 +96,23 @@ export class TaskFormCloudComponent { this.saveButton.click(); return this; } + + checkFormContentIsEmpty() { + BrowserVisibility.waitUntilElementIsVisible(this.emptyContentIcon); + return this; + } + + getEmptyFormContentTitle() { + return BrowserActions.getText(this.emptyContentTitle); + } + + getEmptyFormContentSubtitle() { + return BrowserActions.getText(this.emptyContentSubtitle); + } + + getCompleteButton() { + BrowserVisibility.waitUntilElementIsVisible(this.completeButton); + return this.completeButton; + } + }