From ccc52d40dd455b8bb2cd2ed9ff7bf67cea57f0bf Mon Sep 17 00:00:00 2001 From: Marouan Bentaleb <38426175+marouanbentaleb@users.noreply.github.com> Date: Tue, 16 Oct 2018 18:31:17 +0100 Subject: [PATCH] [ADF-3608] Automated test for required dropdown column in Dynamic Table (#3896) --- .../adf/process_services/widgets/dropdown.ts | 19 +++ .../process_services/widgets/dynamicTable.ts | 9 +- .../dynamic_table_date_picker.e2e.ts | 144 ++++++++++++------ .../apps/AppDynamicTableDropdown.zip | Bin 0 -> 5414 bytes e2e/util/resources.js | 7 + 5 files changed, 129 insertions(+), 50 deletions(-) create mode 100644 e2e/resources/apps/AppDynamicTableDropdown.zip diff --git a/e2e/pages/adf/process_services/widgets/dropdown.ts b/e2e/pages/adf/process_services/widgets/dropdown.ts index 1fc718c314..5ca906402a 100644 --- a/e2e/pages/adf/process_services/widgets/dropdown.ts +++ b/e2e/pages/adf/process_services/widgets/dropdown.ts @@ -16,15 +16,34 @@ */ import FormFields = require('../formFields'); +import Util = require('../../../../util/util'); +import { by, element } from 'protractor'; export class Dropdown { formFields = new FormFields(); selectedOptionLocator = by.css('mat-select[id="dropdown"] span span'); + dropdown = element(by.id('dropdown')); getSelectedOptionText(fieldId) { return this.formFields.getFieldText(fieldId, this.selectedOptionLocator); } + selectOption(option) { + this.openDropdown(); + let row = element(by.cssContainingText('mat-option span', option)); + return row.click(); + } + + openDropdown() { + this.checkDropdownIsDisplayed(); + Util.waitUntilElementIsClickable(this.dropdown); + return this.dropdown.click(); + } + + checkDropdownIsDisplayed() { + Util.waitUntilElementIsVisible(this.dropdown); + return this.dropdown; + } } diff --git a/e2e/pages/adf/process_services/widgets/dynamicTable.ts b/e2e/pages/adf/process_services/widgets/dynamicTable.ts index 2adb9675b0..0fcb62af00 100644 --- a/e2e/pages/adf/process_services/widgets/dynamicTable.ts +++ b/e2e/pages/adf/process_services/widgets/dynamicTable.ts @@ -17,6 +17,7 @@ import FormFields = require('../formFields'); import Util = require('../../../../util/util'); +import { element, by, browser, protractor } from 'protractor'; export class DynamicTable { formFields = new FormFields(); @@ -30,7 +31,7 @@ export class DynamicTable { calendarContent = element(by.css('div[class="mat-datetimepicker-calendar-content"]')); saveButton = element(by.cssContainingText('button span', 'Save')); errorMessage = element(by.css('div[class="adf-error-text"]')); - dateWidget = element(by.css('button[aria-label="Open calendar"]')); + dateWidget = element.all(by.css('button[aria-label="Open calendar"]')).first(); calendarNumber = element.all(by.css('td div')); tableRow = element.all(by.css('tbody tr')); @@ -96,4 +97,10 @@ export class DynamicTable { waitForCalendarToDisappear() { Util.waitUntilElementIsNotVisible(this.calendarNumber); } + + checkItemIsPresent(item) { + let row = element(by.cssContainingText('table tbody tr td span', item)); + let present = Util.waitUntilElementIsVisible(row); + expect(present).toBe(true); + } } diff --git a/e2e/process-services/dynamic_table_date_picker.e2e.ts b/e2e/process-services/dynamic_table_date_picker.e2e.ts index dff3aebd55..7a5d0b2609 100644 --- a/e2e/process-services/dynamic_table_date_picker.e2e.ts +++ b/e2e/process-services/dynamic_table_date_picker.e2e.ts @@ -20,6 +20,7 @@ import { ProcessServicesPage } from '../pages/adf/process_services/processServic import ProcessFiltersPage = require('../pages/adf/process_services/processFiltersPage'); import { AppNavigationBarPage } from '../pages/adf/process_services/appNavigationBarPage'; import { DynamicTable } from '../pages/adf/process_services/widgets/dynamicTable'; +import { Dropdown } from '../pages/adf/process_services/widgets/dropdown'; import TestConfig = require('../test.config'); import resources = require('../util/resources'); @@ -28,25 +29,14 @@ import AlfrescoApi = require('alfresco-js-api-node'); import { AppsActions } from '../actions/APS/apps.actions'; import { UsersActions } from '../actions/users.actions'; -describe('Dynamic Table - Date Picker', () => { +describe('Dynamic Table', () => { let loginPage = new LoginPage(); let processServicesPage = new ProcessServicesPage(); let processFiltersPage = new ProcessFiltersPage(); let appNavigationBarPage = new AppNavigationBarPage(); let dynamicTable = new DynamicTable(); - - let app = resources.Files.DYNAMIC_TABLE_APP; - let user, tenantId, appId; - - let randomText = { - date: 'HELLO WORLD', - dateTime: 'Test', - error: `Field 'columnDate' is required.` - }; - - let datePosition = 15; - let rowPosition = 0; + let user, tenantId, appId, apps, users; beforeAll(async(done) => { this.alfrescoJsApi = new AlfrescoApi({ @@ -54,8 +44,8 @@ describe('Dynamic Table - Date Picker', () => { hostBpm: TestConfig.adf.url }); - let apps = new AppsActions(); - let users = new UsersActions(); + apps = new AppsActions(); + users = new UsersActions(); await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); @@ -63,21 +53,10 @@ describe('Dynamic Table - Date Picker', () => { tenantId = user.tenantId; - await this.alfrescoJsApi.login(user.email, user.password); - - let importedApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location); - appId = importedApp.id; - - await loginPage.loginToProcessServicesUsingUserModel(user); - done(); }); afterAll(async(done) => { - await this.alfrescoJsApi.login(user.email, user.password); - - await this.alfrescoJsApi.activiti.modelsApi.deleteModel(appId); - await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); await this.alfrescoJsApi.activiti.adminTenantsApi.deleteTenant(tenantId); @@ -85,41 +64,108 @@ describe('Dynamic Table - Date Picker', () => { done(); }); - it('[C286277] Should have a datepicker and a mask for DateTime field', () => { - processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + describe('Date Picker', () => { + let app = resources.Files.DYNAMIC_TABLE_APP; - appNavigationBarPage.clickProcessButton(); + let randomText = { + date: 'HELLO WORLD', + dateTime: 'Test', + error: `Field 'columnDate' is required.` + }; - processFiltersPage.clickCreateProcessButton(); - processFiltersPage.clickNewProcessDropdown(); + let datePosition = 15; + let rowPosition = 0; - dynamicTable.clickAddButton(); - dynamicTable.clickColumnDateTime(); + beforeAll(async(done) => { + await this.alfrescoJsApi.login(user.email, user.password); - expect(dynamicTable.addRandomStringOnDateTime(randomText.dateTime)).toBe(''); + let importedApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location); + appId = importedApp.id; + + await loginPage.loginToProcessServicesUsingUserModel(user); + + done(); + }); + + afterAll(async(done) => { + await this.alfrescoJsApi.login(user.email, user.password); + + await this.alfrescoJsApi.activiti.modelsApi.deleteModel(appId); + + done(); + }); + + beforeEach(() => { + processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + + appNavigationBarPage.clickProcessButton(); + + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + }); + + it('[C286277] Should have a datepicker and a mask for DateTime field', () => { + dynamicTable.clickAddButton(); + dynamicTable.clickColumnDateTime(); + + expect(dynamicTable.addRandomStringOnDateTime(randomText.dateTime)).toBe(''); + }); + + it('[C286279] Should be able to save row with Date field', () => { + dynamicTable.clickAddButton(); + dynamicTable.addRandomStringOnDate(randomText.date); + dynamicTable.clickSaveButton(); + + expect(dynamicTable.checkErrorMessage()).toBe(randomText.error); + + dynamicTable.clickDateWidget(); + dynamicTable.getDateCalendarNumber(datePosition); + dynamicTable.waitForCalendarToDisappear(); + dynamicTable.clickSaveButton(); + dynamicTable.getTableRow(rowPosition); + }); }); - it('[C286279] Should be able to save row with Date field', () => { - loginPage.loginToProcessServicesUsingUserModel(user); + describe('Required Dropdown', () => { + let app = resources.Files.APP_DYNAMIC_TABLE_DROPDOWN; + let dropdown = new Dropdown(); - processServicesPage.goToProcessServices().goToTaskApp().clickProcessButton(); + beforeAll(async(done) => { - appNavigationBarPage.clickProcessButton(); + await this.alfrescoJsApi.login(user.email, user.password); - processFiltersPage.clickCreateProcessButton(); - processFiltersPage.clickNewProcessDropdown(); + let importedApp = await apps.importPublishDeployApp(this.alfrescoJsApi, app.file_location); + appId = importedApp.id; - dynamicTable.clickAddButton(); - dynamicTable.addRandomStringOnDate(randomText.date); - dynamicTable.clickSaveButton(); + await loginPage.loginToProcessServicesUsingUserModel(user); - expect(dynamicTable.checkErrorMessage()).toBe(randomText.error); + done(); + }); - dynamicTable.clickDateWidget(); - dynamicTable.getDateCalendarNumber(datePosition); - dynamicTable.waitForCalendarToDisappear(); - dynamicTable.clickSaveButton(); - dynamicTable.getTableRow(rowPosition); + afterAll(async(done) => { + await this.alfrescoJsApi.login(user.email, user.password); + + await this.alfrescoJsApi.activiti.modelsApi.deleteModel(appId); + + done(); + }); + + beforeEach(() => { + processServicesPage.goToProcessServices().goToApp(app.title).clickProcessButton(); + + appNavigationBarPage.clickProcessButton(); + + processFiltersPage.clickCreateProcessButton(); + processFiltersPage.clickNewProcessDropdown(); + }); + + it('[C286519] Should be able to save row with required dropdown column', () => { + let dropdownOption = 'Option 1'; + dynamicTable.clickAddButton(); + dropdown.selectOption(dropdownOption); + dynamicTable.clickSaveButton(); + dynamicTable.checkItemIsPresent(dropdownOption); + }); }); }); diff --git a/e2e/resources/apps/AppDynamicTableDropdown.zip b/e2e/resources/apps/AppDynamicTableDropdown.zip new file mode 100644 index 0000000000000000000000000000000000000000..f3c0dba188f2d041c86d2c6abe5139075c1eb092 GIT binary patch literal 5414 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 DAvJ)U literal 0 HcmV?d00001 diff --git a/e2e/util/resources.js b/e2e/util/resources.js index 85dd901a38..d449556479 100644 --- a/e2e/util/resources.js +++ b/e2e/util/resources.js @@ -44,6 +44,13 @@ exports.Files = { task_name: "Task Test 2" }, + APP_DYNAMIC_TABLE_DROPDOWN:{ + file_location:"/resources/apps/AppDynamicTableDropdown.zip", + title: "App3576", + description: "Description for app", + processName: "Process3576" + }, + SIMPLE_APP: { file_location: "/resources/Simple App.zip", title: "Simple App",