diff --git a/e2e/process-services-cloud/task-form-cloud-component-tab.e2e.ts b/e2e/process-services-cloud/task-form-cloud-component-tab.e2e.ts index c7e1d4da6f..005ce00ed8 100644 --- a/e2e/process-services-cloud/task-form-cloud-component-tab.e2e.ts +++ b/e2e/process-services-cloud/task-form-cloud-component-tab.e2e.ts @@ -62,7 +62,8 @@ describe('Task form cloud component', () => { tabFieldField: 'tabBasicFieldField', tabVarVar: 'tabBasicVarVar', tabFieldVar: 'tabBasicFieldVar', - tabNextOperators: 'tabNextOperators' + tabNextOperators: 'tabNextOperators', + tabMultipleConditions: 'tabMultipleConditions' }; const widgets = { @@ -78,6 +79,10 @@ describe('Task form cloud component', () => { notDisplayTab: 'anythingElse' }; + const myTasksFilter = 'my-tasks'; + const myTasksFilterTitle = 'My Tasks'; + const completedTasksFilter = 'completed-tasks'; + beforeAll(async () => { await apiService.login(browser.params.identityAdmin.email, browser.params.identityAdmin.password); @@ -97,17 +102,17 @@ describe('Task form cloud component', () => { const formCloudService = new FormCloudService(apiServiceHrUser); - const tabVisibilityFieldsId = await formCloudService.getIdByFormName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name, browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.forms.tabVisibilityFields.name); + const tabVisibilityFieldsId = await formCloudService.getIdByFormName(simpleApp, browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.forms.tabVisibilityFields.name); - const tabVisibilityVarsId = await formCloudService.getIdByFormName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name, browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.forms.tabVisibilityVars.name); + const tabVisibilityVarsId = await formCloudService.getIdByFormName(simpleApp, browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.forms.tabVisibilityVars.name); - for (let i = 0; i < 3; i++) { + for (let i = 0; i < 4; i++) { visibilityConditionTasks[i] = await tasksService.createStandaloneTaskWithForm(StringUtil.generateRandomString(), simpleApp, tabVisibilityFieldsId); await tasksService.claimTask(visibilityConditionTasks[i].entry.id, simpleApp); } - for (let i = 3; i < 6; i++) { + for (let i = 4; i < 7; i++) { visibilityConditionTasks[i] = await tasksService.createStandaloneTaskWithForm(StringUtil.generateRandomString(), simpleApp, tabVisibilityVarsId); await tasksService.claimTask(visibilityConditionTasks[i].entry.id, simpleApp); @@ -156,12 +161,8 @@ describe('Task form cloud component', () => { describe('Complete task with form - cloud directive', () => { it('[C315174] Should be able to complete a standalone task with visible tab with empty value for field', async () => { - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); - await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); - - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(visibilityConditionTasks[0].entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(visibilityConditionTasks[0].entry.name); - await taskHeaderCloudPage.checkTaskPropertyListIsDisplayed(); + await chooseFilter(myTasksFilter, myTasksFilterTitle); + await selectTaskByName(visibilityConditionTasks[0].entry.name); await widget.tab().checkTabIsDisplayedByLabel(tab.tabWithFields); await widget.tab().checkTabIsNotDisplayedByLabel(tab.tabFieldValue); @@ -173,23 +174,17 @@ describe('Task form cloud component', () => { await taskFormCloudComponent.clickCompleteButton(); - await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); + await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe(myTasksFilterTitle); await tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(visibilityConditionTasks[0].entry.name); - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('completed-tasks'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(visibilityConditionTasks[0].entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(visibilityConditionTasks[0].entry.name); + await chooseFilterAndSelectTaskByName(completedTasksFilter, visibilityConditionTasks[0].entry.name); await widget.tab().checkTabIsDisplayedByLabel(tab.tabWithFields); await widget.tab().checkTabIsDisplayedByLabel(tab.tabFieldValue); }); it('[C315177] Should be able to complete a standalone task with invisible tab with invalid value for field', async () => { - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); - await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); - - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(visibilityConditionTasks[1].entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(visibilityConditionTasks[1].entry.name); - await taskHeaderCloudPage.checkTaskPropertyListIsDisplayed(); + await chooseFilter(myTasksFilter, myTasksFilterTitle); + await selectTaskByName(visibilityConditionTasks[1].entry.name); await widget.tab().checkTabIsDisplayedByLabel(tab.tabWithFields); await widget.tab().checkTabIsDisplayedByLabel(tab.tabFieldField); @@ -210,25 +205,17 @@ describe('Task form cloud component', () => { await taskFormCloudComponent.clickCompleteButton(); - await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); + await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe(myTasksFilterTitle); await tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(visibilityConditionTasks[1].entry.name); - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('completed-tasks'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(visibilityConditionTasks[1].entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(visibilityConditionTasks[1].entry.name); + await chooseFilterAndSelectTaskByName(completedTasksFilter, visibilityConditionTasks[1].entry.name); await widget.tab().checkTabIsDisplayedByLabel(tab.tabWithFields); await widget.tab().checkTabIsNotDisplayedByLabel(tab.tabFieldField); }); it('[C315178] Should be able to complete a standalone task with invisible tab with valid value', async () => { - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); - await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); - - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(visibilityConditionTasks[2].entry.name); - - await tasksCloudDemoPage.taskListCloudComponent().selectRow(visibilityConditionTasks[2].entry.name); - - await taskHeaderCloudPage.checkTaskPropertyListIsDisplayed(); + await chooseFilter(myTasksFilter, myTasksFilterTitle); + await selectTaskByName(visibilityConditionTasks[2].entry.name); await widget.tab().checkTabIsDisplayedByLabel(tab.tabWithFields); await widget.tab().checkTabIsNotDisplayedByLabel(tab.tabFieldVar); @@ -246,25 +233,18 @@ describe('Task form cloud component', () => { await widget.tab().checkTabIsNotDisplayedByLabel(tab.tabFieldVar); await taskFormCloudComponent.clickCompleteButton(); - await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); + await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe(myTasksFilterTitle); await tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(visibilityConditionTasks[2].entry.name); - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('completed-tasks'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(visibilityConditionTasks[2].entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(visibilityConditionTasks[2].entry.name); - + await chooseFilterAndSelectTaskByName(completedTasksFilter, visibilityConditionTasks[2].entry.name); await widget.tab().checkTabIsDisplayedByLabel(tab.tabWithFields); await widget.tab().checkTabIsNotDisplayedByLabel(tab.tabFieldVar); }); it('[C315175] Should be able to complete a standalone task with invisible tab with empty value for field', async () => { - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); - await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); - - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(visibilityConditionTasks[3].entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(visibilityConditionTasks[3].entry.name); - await taskHeaderCloudPage.checkTaskPropertyListIsDisplayed(); + await chooseFilter(myTasksFilter, myTasksFilterTitle); + await selectTaskByName(visibilityConditionTasks[4].entry.name); await widget.tab().checkTabIsDisplayedByLabel(tab.tabWithFields); await widget.tab().checkTabIsNotDisplayedByLabel(tab.tabVarValue); @@ -273,23 +253,17 @@ describe('Task form cloud component', () => { await taskFormCloudComponent.clickCompleteButton(); - await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(visibilityConditionTasks[3].entry.name); + await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe(myTasksFilterTitle); + await tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(visibilityConditionTasks[4].entry.name); - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('completed-tasks'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(visibilityConditionTasks[3].entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(visibilityConditionTasks[3].entry.name); + await chooseFilterAndSelectTaskByName(completedTasksFilter, visibilityConditionTasks[4].entry.name); await widget.tab().checkTabIsDisplayedByLabel(tab.tabWithFields); await widget.tab().checkTabIsNotDisplayedByLabel(tab.tabVarValue); }); it('[C315176] Should not be able to complete a standalone task with visible tab with invalid value for field', async () => { - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); - await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); - - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(visibilityConditionTasks[4].entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(visibilityConditionTasks[4].entry.name); - await taskHeaderCloudPage.checkTaskPropertyListIsDisplayed(); + await chooseFilter(myTasksFilter, myTasksFilterTitle); + await selectTaskByName(visibilityConditionTasks[5].entry.name); await widget.tab().checkTabIsDisplayedByLabel(tab.tabWithFields); await widget.tab().checkTabIsNotDisplayedByLabel(tab.tabVarField); @@ -306,12 +280,8 @@ describe('Task form cloud component', () => { }); it('[C315179] Should be able to complete a standalone task with visible tab with valid value for field', async () => { - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); - await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); - - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(visibilityConditionTasks[5].entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(visibilityConditionTasks[5].entry.name); - await taskHeaderCloudPage.checkTaskPropertyListIsDisplayed(); + await chooseFilter(myTasksFilter, myTasksFilterTitle); + await selectTaskByName(visibilityConditionTasks[6].entry.name); await widget.tab().checkTabIsDisplayedByLabel(tab.tabWithFields); await widget.tab().checkTabIsDisplayedByLabel(tab.tabVarVar); @@ -322,14 +292,54 @@ describe('Task form cloud component', () => { await taskFormCloudComponent.clickCompleteButton(); - await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(visibilityConditionTasks[5].entry.name); + await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe(myTasksFilterTitle); + await tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(visibilityConditionTasks[6].entry.name); - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('completed-tasks'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(visibilityConditionTasks[5].entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(visibilityConditionTasks[5].entry.name); + await chooseFilterAndSelectTaskByName(completedTasksFilter, visibilityConditionTasks[6].entry.name); await widget.tab().checkTabIsDisplayedByLabel(tab.tabWithFields); await widget.tab().checkTabIsDisplayedByLabel(tab.tabVarVar); }); + + it('[C315180] Should be able to complete a standalone task with tab when has multiple visibility conditions and next condition operators', async () => { + await chooseFilter(myTasksFilter, myTasksFilterTitle); + await selectTaskByName(visibilityConditionTasks[3].entry.name); + + await widget.tab().checkTabIsDisplayedByLabel(tab.tabWithFields); + await widget.tab().checkTabIsNotDisplayedByLabel(tab.tabMultipleConditions); + await widget.textWidget().isWidgetVisible(widgets.textOneId); + await widget.textWidget().setValue(widgets.textOneId, value.displayTab); + await widget.textWidget().isWidgetVisible(widgets.textThreeId); + await widget.textWidget().setValue(widgets.textThreeId, value.displayTab); + await widget.tab().checkTabIsNotDisplayedByLabel(tab.tabMultipleConditions); + + await widget.textWidget().setValue(widgets.textThreeId, value.notDisplayTab); + await widget.tab().checkTabIsDisplayedByLabel(tab.tabWithFields); + await widget.tab().checkTabIsDisplayedByLabel(tab.tabMultipleConditions); + await taskFormCloudComponent.clickCompleteButton(); + + await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe(myTasksFilterTitle); + await tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(visibilityConditionTasks[3].entry.name); + + await chooseFilterAndSelectTaskByName(completedTasksFilter, visibilityConditionTasks[3].entry.name); + await widget.tab().checkTabIsDisplayedByLabel(tab.tabWithFields); + await widget.tab().checkTabIsDisplayedByLabel(tab.tabMultipleConditions); + }); + + async function chooseFilterAndSelectTaskByName(filterName: string, taskName: string): Promise { + await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter(filterName); + await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(taskName); + await tasksCloudDemoPage.taskListCloudComponent().selectRow(taskName); + } + + async function selectTaskByName(taskName: string): Promise { + await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(taskName); + await tasksCloudDemoPage.taskListCloudComponent().selectRow(taskName); + await taskHeaderCloudPage.checkTaskPropertyListIsDisplayed(); + } + + async function chooseFilter(filterName: string, filterTitle: string): Promise { + await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter(filterName); + await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe(filterTitle); + } }); }); 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 40fc497a05..b635635a40 100644 --- a/e2e/process-services-cloud/task-form-cloud-component.e2e.ts +++ b/e2e/process-services-cloud/task-form-cloud-component.e2e.ts @@ -37,6 +37,8 @@ describe('Task form cloud component', () => { const candidateBaseApp = browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.name; const simpleApp = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.name; + const simpleAppProcess = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.processes; + const simpleAppForm = browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.forms; const loginSSOPage = new LoginPage(); const navigationBarPage = new NavigationBarPage(); @@ -51,9 +53,18 @@ describe('Task form cloud component', () => { const queryService = new QueryService(apiService); const processDefinitionService = new ProcessDefinitionsService(apiService); const processInstancesService = new ProcessInstancesService(apiService); + const formCloudService = new FormCloudService(apiService); + + const completedTaskName = StringUtil.generateRandomString(), assignedTaskName = StringUtil.generateRandomString(); + const myTasksFilter = 'my-tasks'; + const completedTasksFilter = 'completed-tasks'; + const dateFieldId = 'Date0rzbb6'; + const defaultDate = '2020-07-09'; + const changedDate = '2020-07-10'; + const dropdownFieldId = 'DropdownOptions'; let completedTask, createdTask, assigneeTask, toBeCompletedTask, formValidationsTask, formTaskId, assigneeTaskId, assigneeReleaseTask, candidateUsersTask ; - const completedTaskName = StringUtil.generateRandomString(), assignedTaskName = StringUtil.generateRandomString(); + let dateTimerTaskId, dateTimerTask, dateTimerChangedTaskId, dateTimerChangedTask, dropdownOptionsTask; beforeAll(async () => { await apiService.login(browser.params.testConfig.hrUser.email, browser.params.testConfig.hrUser.password); @@ -63,9 +74,7 @@ describe('Task form cloud component', () => { assigneeTask = await tasksService.createStandaloneTask(StringUtil.generateRandomString(), candidateBaseApp); await tasksService.claimTask(assigneeTask.entry.id, candidateBaseApp); - const formCloudService = new FormCloudService(apiService); - - const formToTestValidationsKey = await formCloudService.getIdByFormName(browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.name, + const formToTestValidationsKey = await formCloudService.getIdByFormName(candidateBaseApp, browser.params.resources.ACTIVITI_CLOUD_APPS.CANDIDATE_BASE_APP.forms.formtotestvalidations); formValidationsTask = await tasksService.createStandaloneTaskWithForm(StringUtil.generateRandomString(), candidateBaseApp, formToTestValidationsKey); @@ -88,16 +97,31 @@ describe('Task form cloud component', () => { await tasksService.claimTask(candidateUsersTask.entry.id, candidateBaseApp); processDefinition = await processDefinitionService - .getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.processes.dropdownrestprocess, simpleApp); + .getProcessDefinitionByName(simpleAppProcess.dropdownrestprocess, simpleApp); const formProcess = await processInstancesService.createProcessInstance(processDefinition.entry.key, simpleApp); - const formTasks = await queryService.getProcessInstanceTasks(formProcess.entry.id, simpleApp); - formTaskId = formTasks.list.entries[0].entry.id; + const dropdownOptionsId = await formCloudService.getIdByFormName(simpleApp, simpleAppForm.dropdownWithOptions.name); + dropdownOptionsTask = await tasksService.createStandaloneTaskWithForm(StringUtil.generateRandomString(), + simpleApp, dropdownOptionsId); + await tasksService.claimTask(dropdownOptionsTask.entry.id, simpleApp); + + const timerProcessDefinition = await processDefinitionService + .getProcessDefinitionByName(simpleAppProcess.intermediateDateProcessVarTimer, simpleApp); + const dateTimerProcess = await processInstancesService.createProcessInstance(timerProcessDefinition.entry.key, simpleApp); + dateTimerTask = await queryService.getProcessInstanceTasks(dateTimerProcess.entry.id, simpleApp); + dateTimerTaskId = dateTimerTask.list.entries[0].entry.id; + + const timerChangedProcessDefinition = await processDefinitionService + .getProcessDefinitionByName(simpleAppProcess.intermediateDateProcessVarTimer, simpleApp); + const dateTimerChangedProcess = await processInstancesService.createProcessInstance(timerChangedProcessDefinition.entry.key, simpleApp); + dateTimerChangedTask = await queryService.getProcessInstanceTasks(dateTimerChangedProcess.entry.id, simpleApp); + dateTimerChangedTaskId = dateTimerChangedTask.list.entries[0].entry.id; + /* cspell: disable-next-line */ - const assigneeProcessDefinition = await processDefinitionService.getProcessDefinitionByName(browser.params.resources.ACTIVITI_CLOUD_APPS.SIMPLE_APP.processes.calledprocess, simpleApp); + const assigneeProcessDefinition = await processDefinitionService.getProcessDefinitionByName(simpleAppProcess.calledprocess, simpleApp); const assigneeProcess = await processInstancesService.createProcessInstance(assigneeProcessDefinition.entry.key, simpleApp); assigneeReleaseTask = await queryService.getProcessInstanceTasks(assigneeProcess.entry.id, simpleApp); assigneeTaskId = assigneeReleaseTask.list.entries[0].entry.id; @@ -118,7 +142,7 @@ describe('Task form cloud component', () => { it('[C310366] Should refresh buttons and form after an action is complete', async () => { await appListCloudComponent.goToApp(simpleApp); - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); + await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter(myTasksFilter); await expect(tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); await tasksCloudDemoPage.editTaskFilterCloudComponent().openFilter(); await tasksCloudDemoPage.editTaskFilterCloudComponent().clearAssignee(); @@ -141,9 +165,7 @@ describe('Task form cloud component', () => { await taskFormCloudComponent.checkReleaseButtonIsDisplayed(); await taskFormCloudComponent.clickCompleteButton(); - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('completed-tasks'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedById(formTaskId); - await tasksCloudDemoPage.taskListCloudComponent().selectRowByTaskId(formTaskId); + await openTaskByIdFromFilters(completedTasksFilter, formTaskId); await taskFormCloudComponent.checkFormIsReadOnly(); await taskFormCloudComponent.checkClaimButtonIsNotDisplayed(); @@ -154,29 +176,59 @@ describe('Task form cloud component', () => { it('[C306872] Should not be able to Release a process task which has only assignee', async () => { await appListCloudComponent.goToApp(simpleApp); - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedById(assigneeTaskId); - await tasksCloudDemoPage.taskListCloudComponent().selectRowByTaskId(assigneeTaskId); + await openTaskByIdFromFilters(myTasksFilter, assigneeTaskId); await expect(await taskHeaderCloudPage.getAssignee()).toEqual(assigneeReleaseTask.list.entries[0].entry.assignee); await expect(await taskHeaderCloudPage.getStatus()).toEqual('ASSIGNED'); await taskFormCloudComponent.checkReleaseButtonIsNotDisplayed(); }); + it('[C310200] Should be able to save a task form', async () => { + const selectedOption = 'option1'; + const dropdownId = '#DropdownOptions'; + + await goToAppOpenDropdownTaskByNameFromFilters(myTasksFilter, dropdownOptionsTask.entry.name); + await widget.dropdown().openDropdown(dropdownId); + await widget.dropdown().selectOption(selectedOption, dropdownId ); + await taskFormCloudComponent.checkSaveButtonIsDisplayed(); + await taskFormCloudComponent.clickSaveButton(); + + await navigationBarPage.clickHomeButton(); + await navigationBarPage.navigateToProcessServicesCloudPage(); + await appListCloudComponent.checkApsContainer(); + await goToAppOpenDropdownTaskByNameFromFilters(myTasksFilter, dropdownOptionsTask.entry.name); + + await expect(await widget.dropdown().getSelectedOptionText(dropdownFieldId)).toBe(selectedOption); + }); + + it('[C313200] Should be able to complete a Task form with process date variable mapped to a Date widget in the form', async () => { + await appListCloudComponent.goToApp(simpleApp); + await openTaskByIdFromFilters(myTasksFilter, dateTimerTaskId); + await verifyDateInput(dateFieldId, defaultDate); + await completeTask(); + await verifyDateCompletedTask(dateTimerTaskId, defaultDate); + + await openTaskByIdFromFilters(myTasksFilter, dateTimerChangedTaskId ); + await verifyDateInput(dateFieldId, defaultDate); + await widget.dateWidget().clearDateInput(dateFieldId); + await widget.dateWidget().setDateInput(dateFieldId, changedDate ); + await completeTask(); + + await verifyDateCompletedTask(dateTimerChangedTaskId, changedDate); + }); + describe('Candidate Base App', () => { beforeEach(async () => { await appListCloudComponent.goToApp(candidateBaseApp); }); it('[C307032] Should display the appropriate title for the unclaim option of a Task', async () => { - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedById(candidateUsersTask.entry.id); - await tasksCloudDemoPage.taskListCloudComponent().selectRowByTaskId(candidateUsersTask.entry.id); + await openTaskByIdFromFilters(myTasksFilter, candidateUsersTask.entry.id); await expect(await taskFormCloudComponent.getReleaseButtonText()).toBe('RELEASE'); }); it('[C310142] Empty content is displayed when having a task without form', async () => { - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); + await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter(myTasksFilter); await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(assigneeTask.entry.name); await tasksCloudDemoPage.taskListCloudComponent().selectRow(assigneeTask.entry.name); await taskFormCloudComponent.checkFormIsNotDisplayed(); @@ -187,10 +239,8 @@ describe('Task form cloud component', () => { }); it('[C310199] Should not be able to complete a task when required field is empty or invalid data is added to a field', async () => { - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(formValidationsTask.entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(formValidationsTask.entry.name); - await taskFormCloudComponent.checkFormIsDisplayed(); + await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter(myTasksFilter); + await selectTaskByName(formValidationsTask.entry.name); await taskFormCloudComponent.formFields().checkFormIsDisplayed(); await taskFormCloudComponent.formFields().checkWidgetIsVisible('Text0tma8h'); await taskFormCloudComponent.formFields().checkWidgetIsVisible('Date0m1moq'); @@ -223,7 +273,7 @@ describe('Task form cloud component', () => { }); it('[C307093] Complete button is not displayed when the task is already completed', async () => { - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('completed-tasks'); + await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter(completedTasksFilter); await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('Completed Tasks'); await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(completedTaskName); await tasksCloudDemoPage.taskListCloudComponent().selectRow(completedTaskName); @@ -232,7 +282,7 @@ describe('Task form cloud component', () => { }); it('[C307095] Task can not be completed by owner user', async () => { - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); + await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter(myTasksFilter); await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); await tasksCloudDemoPage.editTaskFilterCloudComponent().openFilter(); @@ -241,19 +291,15 @@ describe('Task form cloud component', () => { await tasksCloudDemoPage.editTaskFilterCloudComponent().clearAssignee(); await tasksCloudDemoPage.editTaskFilterCloudComponent().setStatusFilterDropDown('CREATED'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(createdTask.entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(createdTask.entry.name); - await taskHeaderCloudPage.checkTaskPropertyListIsDisplayed(); + await selectTaskByName(createdTask.entry.name); await taskFormCloudComponent.checkCompleteButtonIsNotDisplayed(); }); it('[C307110] Task list is displayed after clicking on Cancel button', async () => { - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); + await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter(myTasksFilter); await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(assigneeTask.entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(assigneeTask.entry.name); - await taskHeaderCloudPage.checkTaskPropertyListIsDisplayed(); + await selectTaskByName(assigneeTask.entry.name); await taskFormCloudComponent.clickCancelButton(); await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); @@ -261,35 +307,67 @@ describe('Task form cloud component', () => { }); it('[C307094] Standalone Task can be completed by a user that is owner and assignee', async () => { - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); + await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter(myTasksFilter); await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(toBeCompletedTask.entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(toBeCompletedTask.entry.name); - await taskHeaderCloudPage.checkTaskPropertyListIsDisplayed(); - await taskFormCloudComponent.checkCompleteButtonIsDisplayed(); - await taskFormCloudComponent.clickCompleteButton(); + await selectTaskByName(toBeCompletedTask.entry.name); + await completeTask(); await tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(toBeCompletedTask.entry.name); - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('completed-tasks'); + await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter(completedTasksFilter); await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(toBeCompletedTask.entry.name); await taskFormCloudComponent.checkCompleteButtonIsNotDisplayed(); }); it('[C307111] Task of a process can be completed by a user that is owner and assignee', async () => { - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('my-tasks'); + await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter(myTasksFilter); await expect(await tasksCloudDemoPage.taskFilterCloudComponent.getActiveFilterName()).toBe('My Tasks'); - await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(completedTask.entry.name); - await tasksCloudDemoPage.taskListCloudComponent().selectRow(completedTask.entry.name); - await taskHeaderCloudPage.checkTaskPropertyListIsDisplayed(); - await taskFormCloudComponent.checkCompleteButtonIsDisplayed(); - await taskFormCloudComponent.clickCompleteButton(); + await selectTaskByName(completedTask.entry.name); + await completeTask(); await tasksCloudDemoPage.taskListCloudComponent().checkContentIsNotDisplayedByName(completedTask.entry.name); - await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter('completed-tasks'); + await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter(completedTasksFilter); await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(completedTask.entry.name); await taskFormCloudComponent.checkCompleteButtonIsNotDisplayed(); }); }); + + async function openTaskByIdFromFilters(filterName: string, taskId: string): Promise { + await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter(filterName); + await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedById(taskId); + await tasksCloudDemoPage.taskListCloudComponent().selectRowByTaskId(taskId); + } + + async function verifyDateInput(widgetId: string, input: string): Promise { + await widget.dateWidget().checkWidgetIsVisible(widgetId); + await expect(await widget.dateWidget().getDateInput(widgetId)).toBe(input); + } + + async function selectTaskByName(taskName: string): Promise { + await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(taskName); + await tasksCloudDemoPage.taskListCloudComponent().selectRow(taskName); + await taskHeaderCloudPage.checkTaskPropertyListIsDisplayed(); + } + + async function verifyDateCompletedTask(taskId: string, input: string): Promise { + await openTaskByIdFromFilters(completedTasksFilter, taskId ); + await taskFormCloudComponent.checkFormIsReadOnly(); + await verifyDateInput(dateFieldId, input); + await taskFormCloudComponent.clickCancelButton(); + } + + async function goToAppOpenDropdownTaskByNameFromFilters(filterName: string, taskName: string): Promise { + await appListCloudComponent.goToApp(simpleApp); + await tasksCloudDemoPage.taskFilterCloudComponent.clickTaskFilter(filterName); + await tasksCloudDemoPage.taskListCloudComponent().checkContentIsDisplayedByName(taskName); + await tasksCloudDemoPage.taskListCloudComponent().selectRow(taskName); + await taskHeaderCloudPage.checkTaskPropertyListIsDisplayed(); + await widget.dropdown().isWidgetVisible(dropdownFieldId); + } + + async function completeTask(): Promise { + await taskFormCloudComponent.checkCompleteButtonIsDisplayed(); + await taskFormCloudComponent.clickCompleteButton(); + } }); diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js index 5d653e5c79..91f90b4ac8 100644 --- a/e2e/protractor.conf.js +++ b/e2e/protractor.conf.js @@ -57,7 +57,7 @@ let specs = function () { if (LIST_SPECS && LIST_SPECS !== '') { arraySpecs = LIST_SPECS.split(','); - arraySpecs = arraySpecs.map((el) => './' + el); + arraySpecs = arraySpecs.map((el) => './' + el.replace('e2e/', '')); specExists(arraySpecs); } else { diff --git a/scripts/travis/e2e/content-services-e2e.sh b/scripts/travis/e2e/content-services-e2e.sh index dfd7ef7e60..88ea711452 100755 --- a/scripts/travis/e2e/content-services-e2e.sh +++ b/scripts/travis/e2e/content-services-e2e.sh @@ -24,15 +24,18 @@ fi; #-b is needed to run the Folder upload test that are not workin in Headless chrome RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --use-dist -b -save -m 4 || exit 1) if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "$CONTEXT_ENV" || "${TRAVIS_EVENT_TYPE}" == "push" ]]; then + echo "Run all e2e $CONTEXT_ENV" $RUN_CHECK $RUN_E2E --folder $CONTEXT_ENV -else if [[ $AFFECTED_E2E = "e2e/$CONTEXT_ENV" ]]; - then +else if [[ $AFFECTED_E2E == "e2e/$CONTEXT_ENV" ]]; then + echo "Run affected e2e" + HEAD_SHA_BRANCH="$(git merge-base origin/$TRAVIS_BRANCH HEAD)" LIST_SPECS="$(git diff --name-only $HEAD_SHA_BRANCH HEAD | grep "^e2e/$CONTEXT_ENV" | paste -sd , -)" - if [[ $LIST_SPECS != "" ]]; - then - echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS + + echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS + + if [[ $LIST_SPECS != "" ]]; then $RUN_CHECK $RUN_E2E --specs "$LIST_SPECS" fi diff --git a/scripts/travis/e2e/core-e2e.sh b/scripts/travis/e2e/core-e2e.sh index 427dbe2039..cd993a8978 100755 --- a/scripts/travis/e2e/core-e2e.sh +++ b/scripts/travis/e2e/core-e2e.sh @@ -24,16 +24,18 @@ fi; ./node_modules/@alfresco/adf-cli/bin/adf-cli check-cs-env --host "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1 RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --use-dist -m 2 || exit 1) -if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "$CONTEXT_ENV" || "${TRAVIS_EVENT_TYPE}" == "push" ]]; -then +if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "$CONTEXT_ENV" || "${TRAVIS_EVENT_TYPE}" == "push" ]]; then + echo "Run all e2e $CONTEXT_ENV" $RUN_E2E --folder $CONTEXT_ENV || exit 1 -else if [[ $AFFECTED_E2E = "e2e/$CONTEXT_ENV" ]]; - then +else if [[ $AFFECTED_E2E == "e2e/$CONTEXT_ENV" ]]; then + echo "Run affected e2e" HEAD_SHA_BRANCH="$(git merge-base origin/$TRAVIS_BRANCH HEAD)" LIST_SPECS="$(git diff --name-only $HEAD_SHA_BRANCH HEAD | grep "^e2e/$CONTEXT_ENV" | paste -sd , -)" + + echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS + if [[ $LIST_SPECS != "" ]]; then - echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS $RUN_E2E --specs "$LIST_SPECS" || exit 1 fi fi diff --git a/scripts/travis/e2e/process-services-cloud-e2e.sh b/scripts/travis/e2e/process-services-cloud-e2e.sh index 1da81c6282..c5b0b82f8a 100755 --- a/scripts/travis/e2e/process-services-cloud-e2e.sh +++ b/scripts/travis/e2e/process-services-cloud-e2e.sh @@ -27,20 +27,20 @@ check_env(){ ./node_modules/@alfresco/adf-cli/bin/adf-cli check-cs-env --host "$E2E_HOST_BPM" -u "$E2E_ADMIN_EMAIL_IDENTITY" -p "$E2E_ADMIN_PASSWORD_IDENTITY" || exit 1 } -if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "$CONTEXT_ENV" || "${TRAVIS_EVENT_TYPE}" == "push" ]]; -then - echo "Case 1 - adf-testing has been changed"; +if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "$CONTEXT_ENV" || "${TRAVIS_EVENT_TYPE}" == "push" ]]; then + echo "Run all e2e $CONTEXT_ENV" check_env; $RUN_E2E --folder $CONTEXT_ENV -else if [[ $AFFECTED_E2E = "e2e/$CONTEXT_ENV" ]]; - then - echo "Case 2 - e2e/$CONTEXT_ENV folder has been changed"; +else if [[ $AFFECTED_E2E == "e2e/$CONTEXT_ENV" ]]; then + echo "Run affected e2e" check_env; HEAD_SHA_BRANCH="$(git merge-base origin/$TRAVIS_BRANCH HEAD)" LIST_SPECS="$(git diff --name-only $HEAD_SHA_BRANCH HEAD | grep "^e2e/$CONTEXT_ENV/" | paste -sd , -)" + + echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS + if [[ $LIST_SPECS != "" ]]; then - echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS $RUN_E2E --specs "$LIST_SPECS" fi fi diff --git a/scripts/travis/e2e/process-services-e2e.sh b/scripts/travis/e2e/process-services-e2e.sh index fb549621ca..2ca62a6da6 100755 --- a/scripts/travis/e2e/process-services-e2e.sh +++ b/scripts/travis/e2e/process-services-e2e.sh @@ -22,16 +22,19 @@ fi; ./node_modules/@alfresco/adf-cli/bin/adf-cli check-ps-env --host "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" || exit 1 RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2E_HOST" -u "$E2E_USERNAME" -p "$E2E_PASSWORD" -e "$E2E_EMAIL" --use-dist -m 2 || exit 1) -if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "$CONTEXT_ENV" || "${TRAVIS_EVENT_TYPE}" == "push" ]]; -then +if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "$CONTEXT_ENV" || "${TRAVIS_EVENT_TYPE}" == "push" ]]; then + echo "Run all e2e $CONTEXT_ENV" $RUN_E2E --folder $CONTEXT_ENV -else if [[ $AFFECTED_E2E = "e2e/$CONTEXT_ENV" ]]; - then +else if [[ $AFFECTED_E2E == "e2e/$CONTEXT_ENV" ]]; then + echo "Run affected e2e" + HEAD_SHA_BRANCH="$(git merge-base origin/$TRAVIS_BRANCH HEAD)" LIST_SPECS="$(git diff --name-only $HEAD_SHA_BRANCH HEAD | grep "^e2e/$CONTEXT_ENV/" | paste -sd , -)" + + echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS + if [[ $LIST_SPECS != "" ]]; then - echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS $RUN_E2E --specs "$LIST_SPECS" fi fi diff --git a/scripts/travis/e2e/search-e2e.sh b/scripts/travis/e2e/search-e2e.sh index e2450f8849..bc336df348 100755 --- a/scripts/travis/e2e/search-e2e.sh +++ b/scripts/travis/e2e/search-e2e.sh @@ -25,13 +25,15 @@ RUN_E2E=$(echo ./scripts/test-e2e-lib.sh -host http://localhost:4200 -proxy "$E2 if [[ $AFFECTED_LIBS =~ "testing" || $AFFECTED_LIBS =~ "content-services" || "${TRAVIS_EVENT_TYPE}" == "push" ]]; then $RUN_E2E --folder $CONTEXT_ENV -else if [[ $AFFECTED_E2E = "e2e/$CONTEXT_ENV" ]]; +else if [[ $AFFECTED_E2E == "e2e/$CONTEXT_ENV" ]]; then HEAD_SHA_BRANCH="$(git merge-base origin/$TRAVIS_BRANCH HEAD)" LIST_SPECS="$(git diff --name-only $HEAD_SHA_BRANCH HEAD | grep "^e2e/$CONTEXT_ENV" | paste -sd , -)" + + echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS + if [[ $LIST_SPECS != "" ]]; then - echo "Run $CONTEXT_ENV e2e based on the sha $HEAD_SHA_BRANCH with the specs: "$LIST_SPECS $RUN_E2E --specs "$LIST_SPECS" fi fi