diff --git a/e2e/content-services/search/components/search-date-range.component.e2e.ts b/e2e/content-services/search/components/search-date-range.component.e2e.ts new file mode 100644 index 0000000000..9b4c839fa8 --- /dev/null +++ b/e2e/content-services/search/components/search-date-range.component.e2e.ts @@ -0,0 +1,227 @@ +/*! + * @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 { LoginPage } from '../../../pages/adf/loginPage'; +import SearchDialog = require('../../../pages/adf/dialog/searchDialog'); +import DataTablePage = require('../../../pages/adf/dataTablePage'); +import { SearchResultsPage } from '../../../pages/adf/searchResultsPage'; +import { DatePickerPage } from '../../../pages/adf/material/datePickerPage'; +import { NavigationBarPage } from '../../../pages/adf/navigationBarPage'; +import { ConfigEditorPage } from '../../../pages/adf/configEditorPage'; +import { SearchFiltersPage } from '../../../pages/adf/searchFiltersPage'; +import path = require('path'); + +import TestConfig = require('../../../test.config'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { browser } from 'protractor'; + +describe('Search Filters', () => { + + let loginPage = new LoginPage(); + let searchDialog = new SearchDialog(); + let searchFilters = new SearchFiltersPage(); + let dateRangeFilter = searchFilters.createdDateRangeFilterPage(); + let searchResults = new SearchResultsPage(); + let datePicker = new DatePickerPage(); + let navigationBar = new NavigationBarPage(); + let configEditor = new ConfigEditorPage(); + let dataTable = new DataTablePage(); + + beforeAll(async (done) => { + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + loginPage.loginToContentServices(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + searchDialog.checkSearchIconIsVisible() + .clickOnSearchIcon() + .enterTextAndPressEnter('*'); + + done(); + }); + + beforeEach(() => { + searchFilters.checkCreatedRangeFilterIsDisplayed() + .clickCreatedRangeFilterHeader() + .checkCreatedRangeFilterIsExpanded(); + }); + + afterEach(async (done) => { + await browser.refresh(); + done(); + }); + + it('[C277106] Should display default values for Date Range widget', () => { + dateRangeFilter.checkFromFieldIsDisplayed() + .checkFromDateToggleIsDisplayed() + .checkToFieldIsDisplayed() + .checkToDateToggleIsDisplayed() + .checkApplyButtonIsDisplayed() + .checkApplyButtonIsDisabled() + .checkClearButtonIsDisplayed(); + }); + + it('[C277104] Should be able to set dates using date pickers', () => { + dateRangeFilter.checkFromDateToggleIsDisplayed().openFromDatePicker() + .selectTodayDate(); + browser.controlFlow().execute(async () => { + await expect(dateRangeFilter.getFromDate()).toEqual(dateRangeFilter.getFromCalendarSelectedDate()); + }); + }); + + it('[C277105] Should be able to type a date', () => { + let date = '01-May-18'; + dateRangeFilter.putFromDate(date); + browser.controlFlow().execute(async () => { + await expect(dateRangeFilter.getFromCalendarSelectedDate()).toEqual(dateRangeFilter.getFromDate()); + }); + }); + + it('[C277119] FROM and TO dates should depend on each other', () => { + dateRangeFilter.checkFromDateToggleIsDisplayed().openFromDatePicker() + .checkDatesAfterDateAreDisabled(new Date()) + .closeDatePicker(); + + dateRangeFilter.checkToDateToggleIsDisplayed().openToDatePicker() + .checkDatesAfterDateAreDisabled(new Date()) + .closeDatePicker(); + + dateRangeFilter.checkFromDateToggleIsDisplayed().openFromDatePicker() + .selectTodayDate() + .checkDatePickerIsNotDisplayed(); + + dateRangeFilter.checkToDateToggleIsDisplayed().openToDatePicker() + .checkDatesBeforeDateAreDisabled(new Date()) + .checkDatesAfterDateAreDisabled(new Date()); + }); + + it('[C277107] Should be able to apply a date range', () => { + let fromDate, toDate; + dateRangeFilter.checkFromDateToggleIsDisplayed().openFromDatePicker() + .selectTodayDate() + .checkDatePickerIsNotDisplayed(); + dateRangeFilter.getFromDate().then((date) => { + fromDate = datePicker.convertDefaultFormatToDate(date); + }); + + dateRangeFilter.checkApplyButtonIsDisabled(); + + dateRangeFilter.checkToDateToggleIsDisplayed().openToDatePicker() + .selectTodayDate() + .checkDatePickerIsNotDisplayed(); + dateRangeFilter.getToDate().then((date) => { + toDate = datePicker.convertDefaultFormatToDate(date); + }); + + dateRangeFilter.checkApplyButtonIsEnabled() + .clickApplyButton(); + + searchResults.sortByCreated(true); + browser.controlFlow().execute(async () => { + let firstResult = await dataTable.getNodeIdFirstElement(); + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then((node) => { + let nodeCreation = new Date(node.entry.createdAt); + nodeCreation.setHours(0, 0, 0, 0); + browser.controlFlow().execute(async () => { + await expect(nodeCreation.getTime() >= fromDate.getTime()).toBe(true); + await expect(nodeCreation.getTime() <= toDate.getTime()).toBe(true); + }); + }); + }); + + searchResults.sortByCreated(false); + browser.controlFlow().execute(async () => { + let firstResult = await dataTable.getNodeIdFirstElement(); + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then((node) => { + let nodeCreation = new Date(node.entry.createdAt); + nodeCreation.setHours(0, 0, 0, 0); + browser.controlFlow().execute(async () => { + await expect(nodeCreation.getTime() >= fromDate.getTime()).toBe(true); + await expect(nodeCreation.getTime() <= toDate.getTime()).toBe(true); + }); + }); + }); + }); + + it('[C277108] Should display a warning message when user doesn\'t set the date range at all', () => { + dateRangeFilter.checkFromFieldIsDisplayed() + .clickFromField() + .clickToField() + .checkFromErrorMessageIsDisplayed('Required value') + .clickFromField() + .checkToErrorMessageIsDisplayed('Required value'); + }); + + it('[C277114] Should display warning message if user doesn\'t set the date range properly', () => { + let toDate = '01-May-18'; + let fromDate = '16-May-18'; + + dateRangeFilter.checkToFieldIsDisplayed() + .putToDate(toDate) + .checkFromFieldIsDisplayed() + .putFromDate(fromDate) + .clickFromField() + .checkToErrorMessageIsDisplayed('No days selected.'); + }); + + it('[C277115] Should display warning message if user types a date later than today\'s date', () => { + let tomorrowDate = new Date(new Date().getTime() + 24 * 60 * 60 * 1000); + dateRangeFilter.checkFromFieldIsDisplayed() + .putFromDate(datePicker.convertDateToDefaultFormat(tomorrowDate)) + .checkFromErrorMessageIsDisplayed('The date is beyond the maximum date.'); + }); + + it('[C277108] Should display a warning message when user doesn\'t set the date range at all', () => { + dateRangeFilter.checkFromFieldIsDisplayed() + .putFromDate('Wrong Format') + .clickToField() + .checkFromErrorMessageIsDisplayed('Invalid date. The date must be in the format \'DD-MMM-YY\'') + .putFromDate('01-May-18') + .checkFromErrorMessageIsNotDisplayed(); + }); + + it('[C277117] Should be able to change date format', () => { + let json = JSON.parse(require('fs').readFileSync(path.join(TestConfig.main.rootPath, '/content-services/search/search.config.json'), 'utf8')); + json.categories[4].component.settings.dateFormat = 'MM-DD-YY'; + + navigationBar.clickConfigEditorButton(); + configEditor.clickSearchConfiguration(); + configEditor.clickClearButton(); + configEditor.enterBigConfigurationText(JSON.stringify(json)); + configEditor.clickSaveButton(); + + searchDialog.clickOnSearchIcon().enterTextAndPressEnter('*'); + searchFilters.checkCreatedRangeFilterIsDisplayed() + .clickCreatedRangeFilterHeader() + .checkCreatedRangeFilterIsExpanded(); + dateRangeFilter.checkFromFieldIsDisplayed() + .openFromDatePicker(); + + let todayDate = datePicker.convertDateToNewFormat(new Date()); + datePicker.selectTodayDate(); + + browser.controlFlow().execute(async () => { + await expect(dateRangeFilter.getFromDate()).toEqual(todayDate); + }); + }); +}); diff --git a/e2e/pages/adf/content_services/search/components/dateRangeFilterPage.ts b/e2e/pages/adf/content_services/search/components/dateRangeFilterPage.ts new file mode 100644 index 0000000000..2e80d1d697 --- /dev/null +++ b/e2e/pages/adf/content_services/search/components/dateRangeFilterPage.ts @@ -0,0 +1,162 @@ +/*! + * @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 = require('../../../../../util/util'); +import { by, browser, protractor } from 'protractor'; +import { DatePickerPage } from '../../../material/datePickerPage'; + +export class DateRangeFilterPage { + + fromField = by.css('input[data-automation-id="date-range-from-input"]'); + fromDateToggle = by.css('mat-datepicker-toggle[data-automation-id="date-range-from-date-toggle"]'); + toField = by.css('input[data-automation-id="date-range-to-input"]'); + toDateToggle = by.css('mat-datepicker-toggle[data-automation-id="date-range-to-date-toggle"]'); + applyButton = by.css('button[data-automation-id="date-range-apply-btn"]'); + clearButton = by.css('button[data-automation-id="date-range-clear-btn"]'); + fromErrorMessage = by.css('mat-error[data-automation-id="date-range-from-error"]'); + toErrorMessage = by.css('mat-error[data-automation-id="date-range-to-error"]'); + filter; + + constructor(filter) { + this.filter = filter; + } + + getFromDate() { + return this.filter.element(this.fromField).getAttribute('value'); + } + + putFromDate(date) { + this.checkFromFieldIsDisplayed(); + this.filter.element(this.fromField).clear(); + this.filter.element(this.fromField).sendKeys(date); + this.filter.element(this.fromField).sendKeys(protractor.Key.ENTER); + return this; + } + + getFromCalendarSelectedDate() { + let selectedDate = this.openFromDatePicker().getSelectedDate(); + new DatePickerPage().closeDatePicker(); + return selectedDate; + } + + openFromDatePicker() { + Util.waitUntilElementIsClickable(this.filter.element(this.fromDateToggle)); + this.filter.element(this.fromDateToggle).click(); + return new DatePickerPage().checkDatePickerIsDisplayed(); + } + + openToDatePicker() { + Util.waitUntilElementIsClickable(this.filter.element(this.toDateToggle)); + this.filter.element(this.toDateToggle).click(); + return new DatePickerPage().checkDatePickerIsDisplayed(); + } + + clickFromField() { + Util.waitUntilElementIsClickable(this.filter.element(this.fromField)); + this.filter.element(this.fromField).click(); + return this; + } + + checkFromErrorMessageIsDisplayed(msg) { + Util.waitUntilElementIsVisible(this.filter.element(this.fromErrorMessage)); + browser.controlFlow().execute(async () => { + await expect(this.filter.element(this.fromErrorMessage).getText()).toEqual(msg); + }); + return this; + } + + checkFromErrorMessageIsNotDisplayed() { + Util.waitUntilElementIsNotVisible(this.filter.element(this.fromErrorMessage)); + return this; + } + + checkFromFieldIsDisplayed() { + Util.waitUntilElementIsVisible(this.filter.element(this.fromField)); + return this; + } + + checkFromDateToggleIsDisplayed() { + Util.waitUntilElementIsVisible(this.filter.element(this.fromDateToggle)); + return this; + } + + getToDate() { + return this.filter.element(this.toField).getAttribute('value'); + } + + putToDate(date) { + this.checkToFieldIsDisplayed(); + this.filter.element(this.toField).clear(); + this.filter.element(this.toField).sendKeys(date); + this.filter.element(this.toField).sendKeys(protractor.Key.ENTER); + return this; + } + + clickToField() { + Util.waitUntilElementIsClickable(this.filter.element(this.toField)); + this.filter.element(this.toField).click(); + return this; + } + + checkToErrorMessageIsDisplayed(msg) { + Util.waitUntilElementIsVisible(this.filter.element(this.toErrorMessage)); + browser.controlFlow().execute(async () => { + await expect(this.filter.element(this.toErrorMessage).getText()).toEqual(msg); + }); + return this; + } + + checkToFieldIsDisplayed() { + Util.waitUntilElementIsVisible(this.filter.element(this.toField)); + return this; + } + + checkToDateToggleIsDisplayed() { + Util.waitUntilElementIsVisible(this.filter.element(this.toDateToggle)); + return this; + } + + clickApplyButton() { + Util.waitUntilElementIsClickable(this.filter.element(this.applyButton)); + this.filter.element(this.applyButton).click(); + return this; + } + + checkApplyButtonIsDisplayed() { + Util.waitUntilElementIsVisible(this.filter.element(this.applyButton)); + return this; + } + + checkApplyButtonIsEnabled() { + browser.controlFlow().execute(async () => { + await expect(this.filter.element(this.applyButton).isEnabled()).toBe(true); + }); + return this; + } + + checkApplyButtonIsDisabled() { + browser.controlFlow().execute(async () => { + await expect(this.filter.element(this.applyButton).isEnabled()).toBe(false); + }); + return this; + } + + checkClearButtonIsDisplayed() { + Util.waitUntilElementIsVisible(this.filter.element(this.clearButton)); + return this; + } +} diff --git a/e2e/pages/adf/content_services/search/search-categories.ts b/e2e/pages/adf/content_services/search/search-categories.ts index dafe2801bd..0b0458559d 100644 --- a/e2e/pages/adf/content_services/search/search-categories.ts +++ b/e2e/pages/adf/content_services/search/search-categories.ts @@ -19,6 +19,7 @@ import Util = require('../../../../util/util'); import { element, by } from 'protractor'; import { SearchTextPage } from './components/search-text'; import { SearchCheckListPage } from './components/search-checkList'; +import { DateRangeFilterPage } from './components/dateRangeFilterPage'; export class SearchCategoriesPage { @@ -30,6 +31,10 @@ export class SearchCategoriesPage { return new SearchTextPage(filter); } + dateRangeFilter(filter) { + return new DateRangeFilterPage(filter); + } + checkFilterIsDisplayed(filter) { Util.waitUntilElementIsVisible(filter); return this; @@ -55,4 +60,11 @@ export class SearchCategoriesPage { return this; } + checkFilterIsExpanded(filter) { + filter.getAttribute('class').then((elementClass) => { + expect(elementClass).toContain('mat-expanded'); + }); + return this; + } + } diff --git a/e2e/pages/adf/dataTablePage.js b/e2e/pages/adf/dataTablePage.js index d9cff126bc..18c7a2ad04 100644 --- a/e2e/pages/adf/dataTablePage.js +++ b/e2e/pages/adf/dataTablePage.js @@ -251,5 +251,10 @@ var DataTablePage = function () { return inputFilter.sendKeys(filterText); }; + this.getNodeIdFirstElement = function () { + let firstNode = element.all(by.css('adf-datatable div[title="Node id"] span')).first(); + return firstNode.getText(); + }; + }; module.exports = DataTablePage; diff --git a/e2e/pages/adf/loginPage.ts b/e2e/pages/adf/loginPage.ts index 7ef8a13a54..bf98e0312d 100644 --- a/e2e/pages/adf/loginPage.ts +++ b/e2e/pages/adf/loginPage.ts @@ -49,38 +49,31 @@ export class LoginPage { successRouteSwitch = element(by.id('adf-toggle-show-successRoute')); logoSwitch = element(by.id('adf-toggle-logo')); header = element(by.id('adf-header')); - cardBackground = element(by.css('mat-card[class*="adf-login-card"]')); settingsPage = new SettingsPage(); waitForElements() { - let deferred = protractor.promise.defer(); - - Util.waitUntilElementIsVisible(this.txtUsername).then(() => { - Util.waitUntilElementIsVisible(this.txtPassword).then(() => { - deferred.fulfill(); - }, () => { - deferred.rejected(); - }); - }); - - return deferred.promise; - + Util.waitUntilElementIsVisible(this.txtUsername); + Util.waitUntilElementIsVisible(this.txtPassword); + return this; } enterUsername(username) { Util.waitUntilElementIsVisible(this.txtUsername); this.txtUsername.sendKeys(''); - return this.txtUsername.clear().sendKeys(username); + this.txtUsername.clear(); + return this.txtUsername.sendKeys(username); } enterPassword(password) { Util.waitUntilElementIsVisible(this.txtPassword); - return this.txtPassword.clear().sendKeys(password); + this.txtPassword.clear(); + return this.txtPassword.sendKeys(password); } clearUsername() { Util.waitUntilElementIsVisible(this.txtUsername); - return this.txtUsername.click().clear(); + this.txtUsername.click(); + return this.txtUsername.clear(); } clearPassword() { @@ -102,12 +95,16 @@ export class LoginPage { checkLoginError(message) { Util.waitUntilElementIsVisible(this.loginTooltip); - expect(this.loginTooltip.getText()).toEqual(message); + browser.controlFlow().execute(async () => { + await expect(this.loginTooltip.getText()).toEqual(message); + }); } checkLoginImgURL(url) { Util.waitUntilElementIsVisible(this.logoImg); - expect(this.logoImg.getAttribute('src')).toEqual(url); + browser.controlFlow().execute(async () => { + await expect(this.logoImg.getAttribute('src')).toEqual(url); + }); } checkUsernameInactive() { @@ -138,18 +135,9 @@ export class LoginPage { checkSignInButtonIsEnabled() { Util.waitUntilElementIsVisible(this.signInButton); - expect(this.signInButton.isEnabled()).toBe(true); - } - - defaultLogin() { - browser.driver.get(TestConfig.adf.url + TestConfig.adf.login); - this.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); - } - - loginUsingUserModel(userModel) { - browser.driver.get(TestConfig.adf.url + TestConfig.adf.login); - this.waitForElements(); - this.login(userModel.getId(), userModel.getPassword()); + browser.controlFlow().execute(async () => { + await expect(this.signInButton.isEnabled()).toBe(true); + }); } loginToProcessServicesUsingUserModel(userModel) { @@ -158,12 +146,6 @@ export class LoginPage { this.login(userModel.email, userModel.password); } - loginToProcessServicesUsingDefaultUser() { - this.settingsPage.setProviderBpm(); - this.waitForElements(); - this.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); - } - loginToContentServicesUsingUserModel(userModel) { this.settingsPage.setProviderEcm(); this.waitForElements(); @@ -174,18 +156,21 @@ export class LoginPage { loginToContentServices(username, password) { this.settingsPage.setProviderEcm(); this.waitForElements(); - this.login(username, password); } goToLoginPage() { - browser.driver.get(TestConfig.adf.url + TestConfig.adf.port + '/login'); + browser.controlFlow().execute(async () => { + await browser.driver.get(TestConfig.adf.url + TestConfig.adf.port + '/login'); + }); this.waitForElements(); } checkSignInButtonIsDisabled() { Util.waitUntilElementIsVisible(this.signInButton); - expect(this.signInButton.isEnabled()).toBe(false); + browser.controlFlow().execute(async () => { + await expect(this.signInButton.isEnabled()).toBe(false); + }); } clickSignInButton() { @@ -193,57 +178,19 @@ export class LoginPage { this.signInButton.click(); } - clickRememberMe() { - Util.waitUntilElementIsVisible(this.rememberMe); - this.rememberMe.click(); - } - showPassword() { Util.waitUntilElementIsVisible(this.showPasswordElement); this.showPasswordElement.click(); } - getShowPasswordIconColor() { - let deferred = protractor.promise.defer(); - - Util.waitUntilElementIsVisible(this.showPasswordElement); - this.showPasswordElement.getCssValue('color').then((value) => { - deferred.fulfill(value); - }); - - return deferred.promise; - } - - getSignInButtonColor() { - let deferred = protractor.promise.defer(); - - Util.waitUntilElementIsVisible(this.signInButton); - this.signInButton.getCssValue('color').then((value) => { - deferred.fulfill(value); - }); - - return deferred.promise; - } - - getBackgroundColor() { - let deferred = protractor.promise.defer(); - - Util.waitUntilElementIsVisible(this.cardBackground); - this.cardBackground.getCssValue('color').then((value) => { - deferred.fulfill(value); - }); - - return deferred.promise; - } - hidePassword() { Util.waitUntilElementIsVisible(this.hidePasswordElement); this.hidePasswordElement.click(); } checkPasswordIsShown(password) { - this.txtPassword.getAttribute('value').then((text) => { - expect(text).toEqual(password); + this.txtPassword.getAttribute('value').then(async (text) => { + await expect(text).toEqual(password); }); } @@ -287,14 +234,6 @@ export class LoginPage { this.formControllersPage.disableToggle(this.rememberMeSwitch); } - enableRememberMe() { - this.formControllersPage.enableToggle(this.rememberMeSwitch); - } - - disableSuccessRouteSwitch() { - this.formControllersPage.disableToggle(this.successRouteSwitch); - } - enableSuccessRouteSwitch() { this.formControllersPage.enableToggle(this.successRouteSwitch); } @@ -306,13 +245,15 @@ export class LoginPage { enterSuccessRoute(route) { Util.waitUntilElementIsVisible(this.successRouteTxt); this.successRouteTxt.sendKeys(''); - return this.successRouteTxt.clear().sendKeys(route); + this.successRouteTxt.clear(); + return this.successRouteTxt.sendKeys(route); } enterLogo(logo) { Util.waitUntilElementIsVisible(this.logoTxt); this.logoTxt.sendKeys(''); - return this.logoTxt.clear().sendKeys(logo); + this.logoTxt.clear(); + return this.logoTxt.sendKeys(logo); } login(username, password) { diff --git a/e2e/pages/adf/material/datePickerPage.ts b/e2e/pages/adf/material/datePickerPage.ts new file mode 100644 index 0000000000..9978e6e578 --- /dev/null +++ b/e2e/pages/adf/material/datePickerPage.ts @@ -0,0 +1,93 @@ +/*! + * @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 = require('../../../util/util'); +import { element, by, browser, protractor } from 'protractor'; + +export class DatePickerPage { + + datePicker = element(by.css('mat-calendar')); + months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']; + nextMonthButton = element(by.css('button[class*="mat-calendar-next-button"]')); + previousMonthButton = element(by.css('button[class*="mat-calendar-previous-button"]')); + + getSelectedDate() { + return element(by.css('td[class*="mat-calendar-body-active"]')).getAttribute('aria-label'); + } + + checkDatesAfterDateAreDisabled(date) { + let afterDate = new Date(date.getTime() + 24 * 60 * 60 * 1000); + let afterCalendar = element(by.css(`td[class*="mat-calendar-body-cell"][aria-label="${this.convertDateToDefaultFormat(afterDate)}"]`)); + browser.controlFlow().execute(async () => { + if (await afterCalendar.isPresent()) { + await expect(afterCalendar.getAttribute('aria-disabled')).toBe('true'); + } + await expect(this.nextMonthButton.isEnabled()).toBe(false); + }); + return this; + } + + checkDatesBeforeDateAreDisabled(date) { + let beforeDate = new Date(date.getTime() - 24 * 60 * 60 * 1000); + let beforeCalendar = element(by.css(`td[class*="mat-calendar-body-cell"][aria-label="${this.convertDateToDefaultFormat(beforeDate)}"]`)); + browser.controlFlow().execute(async () => { + if (await beforeCalendar.isPresent()) { + await expect(beforeCalendar.getAttribute('aria-disabled')).toBe('true'); + } + await expect(this.previousMonthButton.isEnabled()).toBe(false); + }); + return this; + } + + convertDefaultFormatToDate(dateString) { // Format : dd-Mmm-yy + let date = dateString.split('-'); + return new Date((2000 + parseInt(date[2], 10)), this.months.indexOf(date[1]), date[0]); + } + + convertDateToDefaultFormat(date) { // Format : dd-Mmm-yy + return `${('0' + date.getDate()).slice(-2)}-${this.months[date.getMonth()]}-${date.getFullYear().toString().substr(-2)}`; + } + + convertDateToNewFormat(date) { // Format : mm-dd-yy + return `${date.getMonth() + 1}-${('0' + date.getDate()).slice(-2)}-${date.getFullYear().toString().substr(-2)}`; + } + + selectTodayDate() { + this.checkDatePickerIsDisplayed(); + let todayDate = element(by.css('.mat-calendar-body-today')); + Util.waitUntilElementIsClickable(todayDate); + todayDate.click(); + return this; + } + + closeDatePicker() { + browser.controlFlow().execute(async () => { + await browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); + }); + this.checkDatePickerIsNotDisplayed(); + } + + checkDatePickerIsDisplayed() { + Util.waitUntilElementIsVisible(this.datePicker); + return this; + } + + checkDatePickerIsNotDisplayed() { + Util.waitUntilElementIsNotVisible(this.datePicker); + return this; + } +} diff --git a/e2e/pages/adf/searchFiltersPage.ts b/e2e/pages/adf/searchFiltersPage.ts index 876b649724..c0ab046e2b 100644 --- a/e2e/pages/adf/searchFiltersPage.ts +++ b/e2e/pages/adf/searchFiltersPage.ts @@ -29,11 +29,16 @@ export class SearchFiltersPage { fileSizeFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-SEARCH.FACET_FIELDS.SIZE"]')); nameFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Name"]')); checkListFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Check List"]')); + createdDateRangeFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Created Date (range)"]')); checkSearchFiltersIsDisplayed() { Util.waitUntilElementIsVisible(this.searchFilters); } + createdDateRangeFilterPage() { + return this.searchCategoriesPage.dateRangeFilter(this.createdDateRangeFilter); + } + textFiltersPage() { return this.searchCategoriesPage.textFiltersPage(this.nameFilter); } @@ -99,4 +104,19 @@ export class SearchFiltersPage { this.searchCategoriesPage.checkFilterIsCollapsed(this.fileSizeFilter); return this; } + + checkCreatedRangeFilterIsDisplayed() { + this.searchCategoriesPage.checkFilterIsDisplayed(this.createdDateRangeFilter); + return this; + } + + clickCreatedRangeFilterHeader() { + this.searchCategoriesPage.clickFilterHeader(this.createdDateRangeFilter); + return this; + } + + checkCreatedRangeFilterIsExpanded() { + this.searchCategoriesPage.checkFilterIsExpanded(this.createdDateRangeFilter); + return this; + } } diff --git a/e2e/pages/adf/searchResultsPage.ts b/e2e/pages/adf/searchResultsPage.ts index 15ad1cd4fc..8f05563c15 100644 --- a/e2e/pages/adf/searchResultsPage.ts +++ b/e2e/pages/adf/searchResultsPage.ts @@ -79,14 +79,6 @@ export class SearchResultsPage { this.closeActionButton(); } - copyContent(content) { - this.contentList.copyContent(content); - } - - moveContent(content) { - this.contentList.moveContent(content); - } - sortByName(sortOrder) { this.sortBy(sortOrder, 'Name'); } @@ -99,6 +91,10 @@ export class SearchResultsPage { Util.waitUntilElementIsClickable(selectedSortingOption); browser.executeScript(`document.evaluate('//span [contains(text(), "${sortType}")]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click();`); + browser.controlFlow().execute(async () => { + await browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); + }); + this.sortByOrder(sortOrder); } diff --git a/e2e/process-services/dynamic_table_date_picker.e2e.ts b/e2e/process-services/dynamic_table_date_picker.e2e.ts index 0728b57581..918429de6e 100644 --- a/e2e/process-services/dynamic_table_date_picker.e2e.ts +++ b/e2e/process-services/dynamic_table_date_picker.e2e.ts @@ -21,6 +21,7 @@ import ProcessFiltersPage = require('../pages/adf/process_services/processFilter import { AppNavigationBarPage } from '../pages/adf/process_services/appNavigationBarPage'; import { DynamicTableWidget } from '../pages/adf/process_services/widgets/dynamicTableWidget'; import { DropdownWidget } from '../pages/adf/process_services/widgets/dropdownWidget'; +import { DatePickerPage } from '../pages/adf/material/datePickerPage'; import TestConfig = require('../test.config'); import resources = require('../util/resources'); @@ -36,6 +37,7 @@ describe('Dynamic Table', () => { let processFiltersPage = new ProcessFiltersPage(); let appNavigationBarPage = new AppNavigationBarPage(); let dynamicTable = new DynamicTableWidget(); + let datePicker = new DatePickerPage(); let user, tenantId, appId, apps, users; beforeAll(async(done) => { @@ -73,7 +75,6 @@ describe('Dynamic Table', () => { error: `Field 'columnDate' is required.` }; - let datePosition = 15; let rowPosition = 0; beforeAll(async(done) => { @@ -119,8 +120,8 @@ describe('Dynamic Table', () => { expect(dynamicTable.checkErrorMessage()).toBe(randomText.error); dynamicTable.clickDateWidget(); - dynamicTable.getDateCalendarNumber(datePosition); - dynamicTable.waitForCalendarToDisappear(); + datePicker.selectTodayDate() + .checkDatePickerIsNotDisplayed(); dynamicTable.clickSaveButton(); dynamicTable.getTableRow(rowPosition); }); diff --git a/lib/content-services/search/components/search-date-range/search-date-range.component.html b/lib/content-services/search/components/search-date-range/search-date-range.component.html index a833b68da3..0e429a9cb5 100644 --- a/lib/content-services/search/components/search-date-range/search-date-range.component.html +++ b/lib/content-services/search/components/search-date-range/search-date-range.component.html @@ -7,10 +7,11 @@ placeholder="{{ 'SEARCH.FILTER.RANGE.FROM-DATE' | translate }}" [matDatepicker]="fromDatepicker" [max]="maxDate" - (focusout)="onChangedHandler($event, from)"> - + (focusout)="onChangedHandler($event, from)" + data-automation-id="date-range-from-input"> + - + {{ getFromValidationMessage() | translate: { requiredFormat: datePickerDateFormat } }} @@ -24,19 +25,20 @@ [matDatepicker]="toDatepicker" [min]="from.value" [max]="maxDate" - (focusout)="onChangedHandler($event, to)"> - + (focusout)="onChangedHandler($event, to)" + data-automation-id="date-range-to-input"> + - + {{ getToValidationMessage() | translate: { requiredFormat: datePickerDateFormat } }}
- -