diff --git a/e2e/pages/adf/demo-shell/process-services/processCloudDemoPage.ts b/e2e/pages/adf/demo-shell/process-services/processCloudDemoPage.ts index 9d9c8e667b..e71637e930 100644 --- a/e2e/pages/adf/demo-shell/process-services/processCloudDemoPage.ts +++ b/e2e/pages/adf/demo-shell/process-services/processCloudDemoPage.ts @@ -83,7 +83,7 @@ export class ProcessCloudDemoPage { } async newProcessButtonIsDisplayed(): Promise { - await BrowserVisibility.waitUntilElementIsVisible(this.newProcessButton); + await BrowserVisibility.waitUntilElementIsClickable(this.newProcessButton); } async isProcessFiltersListVisible(): Promise { diff --git a/e2e/pages/adf/process-services/startProcessPage.ts b/e2e/pages/adf/process-services/startProcessPage.ts index ee79ac7adb..f5c1f46070 100644 --- a/e2e/pages/adf/process-services/startProcessPage.ts +++ b/e2e/pages/adf/process-services/startProcessPage.ts @@ -79,7 +79,7 @@ export class StartProcessPage { } async selectOption(name): Promise { - const selectProcessDropdown: ElementFinder = element(by.cssContainingText('.mat-option-text', name)); + const selectProcessDropdown: ElementFinder = element(by.xpath(`//mat-option/child::span [text() = ' ${name} ']`)); await BrowserActions.click(selectProcessDropdown); } @@ -99,6 +99,7 @@ export class StartProcessPage { } async clickFormStartProcessButton(): Promise { + await BrowserVisibility.waitUntilElementIsClickable(this.formStartProcessButton); await BrowserActions.click(this.formStartProcessButton); } diff --git a/e2e/process-services-cloud/form-field/visibility-condition.e2e.ts b/e2e/process-services-cloud/form-field/visibility-condition.e2e.ts index 38850666b1..4d1c6187f1 100644 --- a/e2e/process-services-cloud/form-field/visibility-condition.e2e.ts +++ b/e2e/process-services-cloud/form-field/visibility-condition.e2e.ts @@ -15,14 +15,19 @@ * limitations under the License. */ -import { LoginSSOPage, SettingsPage, Widget } from '@alfresco/adf-testing'; -import { browser } from 'protractor'; +import { LoginSSOPage, SettingsPage, Widget, AppListCloudPage, IdentityService, GroupIdentityService, ApiService, StringUtil, StartTasksCloudPage, TaskFormCloudComponent } from '@alfresco/adf-testing'; +import { browser, by } from 'protractor'; import { AlfrescoApiCompatibility as AlfrescoApi } from '@alfresco/js-api'; import { NavigationBarPage } from '../../pages/adf/navigationBarPage'; import { FormCloudDemoPage } from '../../pages/adf/demo-shell/process-services-cloud/cloudFormDemoPage'; import { checkboxVisibilityFormJson, multipleCheckboxVisibilityFormJson } from '../../resources/forms/checkbox-visibility-condition'; import { multipleVisibilityFormJson } from '../../resources/forms/multiple-visibility-conditions'; +import { TasksCloudDemoPage } from '../../pages/adf/demo-shell/process-services/tasksCloudDemoPage'; +import resources = require('../../util/resources'); +import { StartProcessPage } from '../../pages/adf/process-services/startProcessPage'; +import { ProcessCloudDemoPage } from '../../pages/adf/demo-shell/process-services/processCloudDemoPage'; +import { ProcessDetailsCloudDemoPage } from '../../pages/adf/demo-shell/process-services-cloud/processDetailsCloudDemoPage'; describe('Visibility conditions - cloud', () => { @@ -248,3 +253,149 @@ describe('Visibility conditions - cloud', () => { await widget.textWidget().isWidgetVisible(widgets.textOneId); }); }); + +describe('Task cloud visibility', async () => { + + const loginSSOPage = new LoginSSOPage(); + const navigationBarPage = new NavigationBarPage(); + const appListCloudComponent = new AppListCloudPage(); + const tasksCloudDemoPage = new TasksCloudDemoPage(); + const settingsPage = new SettingsPage(); + const startTask = new StartTasksCloudPage(); + const taskFormCloudComponent = new TaskFormCloudComponent(); + const startProcessPage = new StartProcessPage(); + const processCloudDemoPage = new ProcessCloudDemoPage(); + const processDetailsCloudDemoPage = new ProcessDetailsCloudDemoPage(); + + const simpleApp = resources.ACTIVITI7_APPS.SIMPLE_APP.name; + const standaloneTaskName = StringUtil.generateRandomString(5); + const processName = StringUtil.generateRandomString(5); + let identityService: IdentityService; + let groupIdentityService: GroupIdentityService; + let testUser, groupInfo; + const apiService = new ApiService(browser.params.config.oauth2.clientId, browser.params.config.bpmHost, browser.params.config.oauth2.host, 'BPM'); + + beforeAll(async () => { + await apiService.login(browser.params.identityAdmin.email, browser.params.identityAdmin.password); + identityService = new IdentityService(apiService); + groupIdentityService = new GroupIdentityService(apiService); + testUser = await identityService.createIdentityUserWithRole(apiService, [identityService.ROLES.APS_USER]); + groupInfo = await groupIdentityService.getGroupInfoByGroupName('hr'); + await identityService.addUserToGroup(testUser.idIdentityService, groupInfo.id); + + await settingsPage.setProviderBpmSso( + browser.params.config.bpmHost, + browser.params.config.oauth2.host, + browser.params.config.identityHost); + await loginSSOPage.loginSSOIdentityService(testUser.email, testUser.password); + + }); + + afterAll(async () => { + await apiService.login(browser.params.identityAdmin.email, browser.params.identityAdmin.password); + await identityService.deleteIdentityUser(testUser.idIdentityService); + + }); + + beforeEach(async () => { + await navigationBarPage.navigateToProcessServicesCloudPage(); + await appListCloudComponent.checkApsContainer(); + await appListCloudComponent.goToApp(simpleApp); + await tasksCloudDemoPage.taskListCloudComponent().checkTaskListIsLoaded(); + }); + + it('[C315170] Should be able to complete a task with a form with required number widgets', async () => { + await tasksCloudDemoPage.openNewTaskForm(); + await startTask.checkFormIsDisplayed(); + await startTask.addName(standaloneTaskName); + await startTask.selectFormDefinition('requirednumbervisibility'); + await startTask.clickStartButton(); + await tasksCloudDemoPage.taskListCloudComponent().selectRow(standaloneTaskName); + + await taskFormCloudComponent.formFields().checkWidgetIsVisible('Number1'); + await taskFormCloudComponent.formFields().checkWidgetIsHidden('Number2'); + await expect(await taskFormCloudComponent.formFields().isCompleteFormButtonDisabled()).toBeTruthy(); + + await taskFormCloudComponent.formFields().setFieldValue(by.id, 'Number1', 5); + await taskFormCloudComponent.formFields().checkWidgetIsVisible('Number2'); + await expect(await taskFormCloudComponent.formFields().isCompleteFormButtonDisabled()).toBeFalsy(); + + await taskFormCloudComponent.formFields().setFieldValue(by.id, 'Number1', 123); + await expect(await taskFormCloudComponent.formFields().isCompleteFormButtonDisabled()).toBeTruthy(); + await taskFormCloudComponent.formFields().checkWidgetIsHidden('Number2'); + }); + + it('[C315169] Should be able to start a process with visibility condition for number widgets', async () => { + + await processCloudDemoPage.openNewProcessForm(); + await startProcessPage.clearField(startProcessPage.processNameInput); + await startProcessPage.selectFromProcessDropdown('numbervisibilityprocess'); + await startProcessPage.enterProcessName(processName); + await startProcessPage.clickStartProcessButton(); + + await processDetailsCloudDemoPage.selectProcessTaskByName(processName); + await tasksCloudDemoPage.taskListCloudComponent().selectRow('number_visibility_task'); + await taskFormCloudComponent.clickClaimButton(); + + await taskFormCloudComponent.formFields().checkWidgetIsVisible('Number1'); + await taskFormCloudComponent.formFields().checkWidgetIsHidden('Number2'); + await expect(await taskFormCloudComponent.formFields().isCompleteFormButtonDisabled()).toBeTruthy(); + + await taskFormCloudComponent.formFields().setFieldValue(by.id, 'Number1', 5); + await taskFormCloudComponent.formFields().checkWidgetIsVisible('Number2'); + await expect(await taskFormCloudComponent.formFields().isCompleteFormButtonDisabled()).toBeFalsy(); + + await taskFormCloudComponent.formFields().setFieldValue(by.id, 'Number1', 123); + await expect(await taskFormCloudComponent.formFields().isCompleteFormButtonDisabled()).toBeTruthy(); + await taskFormCloudComponent.formFields().checkWidgetIsHidden('Number2'); + + await taskFormCloudComponent.formFields().setFieldValue(by.id, 'Number1', 4); + await expect(await taskFormCloudComponent.formFields().isCompleteFormButtonDisabled()).toBeFalsy(); + await taskFormCloudComponent.clickCompleteButton(); + }); + + it('[C315232] Should be able to complete a process with visibility condition for boolean widgets', async () => { + + await processCloudDemoPage.openNewProcessForm(); + await startProcessPage.clearField(startProcessPage.processNameInput); + await startProcessPage.selectFromProcessDropdown('booleanvisibilityprocess'); + await startProcessPage.enterProcessName(processName); + await startProcessPage.clickStartProcessButton(); + + await processDetailsCloudDemoPage.selectProcessTaskByName(processName); + await tasksCloudDemoPage.taskListCloudComponent().selectRow('boolean_visibility_task'); + await taskFormCloudComponent.clickClaimButton(); + + await taskFormCloudComponent.formFields().checkWidgetIsVisible('Checkbox2'); + await taskFormCloudComponent.formFields().checkWidgetIsHidden('Checkbox3'); + await expect(await taskFormCloudComponent.formFields().isCompleteFormButtonDisabled()).toBeTruthy(); + + await taskFormCloudComponent.formFields().clickField(by.id, 'Checkbox1'); + await taskFormCloudComponent.formFields().clickField(by.id, 'Checkbox2'); + await taskFormCloudComponent.formFields().checkWidgetIsVisible('Checkbox3'); + await expect(await taskFormCloudComponent.formFields().isCompleteFormButtonDisabled()).toBeFalsy(); + + await taskFormCloudComponent.clickCompleteButton(); + }); + + it('[C315208] Should be able to complete a task with Checkbox widgets', async () => { + await tasksCloudDemoPage.openNewTaskForm(); + await startTask.checkFormIsDisplayed(); + await startTask.addName(standaloneTaskName); + await startTask.selectFormDefinition('booleanvisibility'); + await startTask.clickStartButton(); + await tasksCloudDemoPage.taskListCloudComponent().selectRow(standaloneTaskName); + + await taskFormCloudComponent.formFields().checkWidgetIsVisible('Checkbox2'); + await taskFormCloudComponent.formFields().checkWidgetIsHidden('Checkbox3'); + await expect(await taskFormCloudComponent.formFields().isCompleteFormButtonDisabled()).toBeTruthy(); + + await taskFormCloudComponent.formFields().clickField(by.id, 'Checkbox1'); + await taskFormCloudComponent.formFields().clickField(by.id, 'Checkbox2'); + await taskFormCloudComponent.formFields().checkWidgetIsVisible('Checkbox3'); + await expect(await taskFormCloudComponent.formFields().isCompleteFormButtonDisabled()).toBeFalsy(); + + await taskFormCloudComponent.clickCompleteButton(); + }); + +}); diff --git a/lib/testing/src/lib/core/pages/form/formFields.ts b/lib/testing/src/lib/core/pages/form/formFields.ts index 43126953b0..2373213a95 100644 --- a/lib/testing/src/lib/core/pages/form/formFields.ts +++ b/lib/testing/src/lib/core/pages/form/formFields.ts @@ -39,6 +39,11 @@ export class FormFields { await BrowserActions.clearSendKeys(fieldElement, value); } + async clickField(locator, field): Promise { + const fieldElement: any = element(locator(field)); + await BrowserActions.click(fieldElement); + } + async checkWidgetIsVisible(fieldId): Promise { const fieldElement = element.all(by.css(`adf-form-field div[id='field-${fieldId}-container']`)).first(); await BrowserVisibility.waitUntilElementIsVisible(fieldElement); diff --git a/lib/testing/src/lib/process-services-cloud/pages/start-tasks-cloud-component.page.ts b/lib/testing/src/lib/process-services-cloud/pages/start-tasks-cloud-component.page.ts index 4a0c680076..007b5d489c 100644 --- a/lib/testing/src/lib/process-services-cloud/pages/start-tasks-cloud-component.page.ts +++ b/lib/testing/src/lib/process-services-cloud/pages/start-tasks-cloud-component.page.ts @@ -91,7 +91,7 @@ export class StartTasksCloudPage { async selectFormDefinition(option: string): Promise { await BrowserActions.click(this.formDefinitionSelector); - const row = element(by.cssContainingText('mat-option span', option)); + const row = element(by.xpath(`//mat-option/child::span [text() = '${option}']`)); await BrowserActions.click(row); }