diff --git a/e2e/content-services/search/components/search-date-range.component.e2e.ts b/e2e/content-services/search/components/search-date-range.e2e.ts similarity index 92% rename from e2e/content-services/search/components/search-date-range.component.e2e.ts rename to e2e/content-services/search/components/search-date-range.e2e.ts index 712ec84218..1884e676f8 100644 --- a/e2e/content-services/search/components/search-date-range.component.e2e.ts +++ b/e2e/content-services/search/components/search-date-range.e2e.ts @@ -30,7 +30,7 @@ import TestConfig = require('../../../test.config'); import AlfrescoApi = require('alfresco-js-api-node'); import { browser } from 'protractor'; -describe('Search Filters', () => { +describe('Search Date Range Filter', () => { let loginPage = new LoginPage(); let searchDialog = new SearchDialog(); @@ -138,13 +138,11 @@ describe('Search Filters', () => { 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) => { + await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (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); - }); + await expect(nodeCreation.getTime() >= fromDate.getTime()).toBe(true); + await expect(nodeCreation.getTime() <= toDate.getTime()).toBe(true); }); }); @@ -152,13 +150,11 @@ describe('Search Filters', () => { 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) => { + await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (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); - }); + await expect(nodeCreation.getTime() >= fromDate.getTime()).toBe(true); + await expect(nodeCreation.getTime() <= toDate.getTime()).toBe(true); }); }); }); diff --git a/e2e/content-services/search/components/search-number-range.e2e.ts b/e2e/content-services/search/components/search-number-range.e2e.ts new file mode 100644 index 0000000000..85df46c769 --- /dev/null +++ b/e2e/content-services/search/components/search-number-range.e2e.ts @@ -0,0 +1,519 @@ +/*! + * @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 { NavigationBarPage } from '../../../pages/adf/navigationBarPage'; +import { ConfigEditorPage } from '../../../pages/adf/configEditorPage'; +import { SearchFiltersPage } from '../../../pages/adf/searchFiltersPage'; + +import TestConfig = require('../../../test.config'); + +import AlfrescoApi = require('alfresco-js-api-node'); +import { UploadActions } from '../../../actions/ACS/upload.actions'; +import AcsUserModel = require('../../../models/ACS/acsUserModel'); +import FileModel = require('../../../models/ACS/fileModel'); +import { browser } from 'protractor'; +import resources = require('../../../util/resources'); +import { SearchConfiguration } from '../search.config'; + +describe('Search Number Range Filter', () => { + + const loginPage = new LoginPage(); + const searchDialog = new SearchDialog(); + const searchFilters = new SearchFiltersPage(); + const sizeRangeFilter = searchFilters.sizeRangeFilterPage(); + const searchResults = new SearchResultsPage(); + const navigationBar = new NavigationBarPage(); + const configEditor = new ConfigEditorPage(); + const dataTable = new DataTablePage(); + + const acsUser = new AcsUserModel(); + + const file2BytesModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.UNSUPPORTED.file_name, + 'location': resources.Files.ADF_DOCUMENTS.UNSUPPORTED.file_location + }); + + const file0BytesModel = new FileModel({ + 'name': resources.Files.ADF_DOCUMENTS.TXT_0B.file_name, + 'location': resources.Files.ADF_DOCUMENTS.TXT_0B.file_location + }); + + let file2Bytes, file0Bytes; + const uploadActions = new UploadActions(); + + beforeAll(async (done) => { + + this.alfrescoJsApi = new AlfrescoApi({ + provider: 'ECM', + hostEcm: TestConfig.adf.url + }); + + await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword); + + await this.alfrescoJsApi.core.peopleApi.addPerson(acsUser); + + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + + file2Bytes = await uploadActions.uploadFile(this.alfrescoJsApi, file2BytesModel.location, file2BytesModel.name, '-my-'); + file0Bytes = await uploadActions.uploadFile(this.alfrescoJsApi, file0BytesModel.location, file0BytesModel.name, '-my-'); + await browser.driver.sleep(15000); + + loginPage.loginToContentServices(acsUser.id, acsUser.password); + + searchDialog.checkSearchIconIsVisible() + .clickOnSearchIcon() + .enterTextAndPressEnter('*'); + + done(); + }); + + afterAll(async (done) => { + await this.alfrescoJsApi.login(acsUser.id, acsUser.password); + await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, file2Bytes.entry.id); + await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, file0Bytes.entry.id); + done(); + }); + + beforeEach(() => { + searchFilters.checkSizeRangeFilterIsDisplayed() + .clickSizeRangeFilterHeader() + .checkSizeRangeFilterIsExpanded(); + }); + + afterEach(async (done) => { + await browser.refresh(); + done(); + }); + + it('[C276921] Should display default values for Number Range widget', () => { + sizeRangeFilter.checkFromFieldIsDisplayed() + .checkToFieldIsDisplayed() + .checkApplyButtonIsDisplayed() + .checkClearButtonIsDisplayed(); + + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false); + }); + + it('[C276922] Should be keep value when Number Range widget is collapsed', () => { + let size = 5; + sizeRangeFilter.putFromNumber(size); + sizeRangeFilter.putToNumber(size); + searchFilters.clickSizeRangeFilterHeader() + .checkSizeRangeFilterIsCollapsed() + .clickSizeRangeFilterHeader() + .checkSizeRangeFilterIsExpanded(); + expect(sizeRangeFilter.getFromNumber()).toEqual(`${size}`); + expect(sizeRangeFilter.getToNumber()).toEqual(`${size}`); + }); + + it('[C276924] Should display error message when input had an invalid format', () => { + sizeRangeFilter.checkFromFieldIsDisplayed() + .putFromNumber('a').putToNumber('A') + .checkFromErrorInvalidIsDisplayed().checkToErrorInvalidIsDisplayed(); + + expect(sizeRangeFilter.getFromErrorInvalid()).toEqual('Invalid Format'); + expect(sizeRangeFilter.getToErrorInvalid()).toEqual('Invalid Format'); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false); + + sizeRangeFilter.putFromNumber('@').putToNumber('£') + .checkFromErrorInvalidIsDisplayed().checkToErrorInvalidIsDisplayed(); + expect(sizeRangeFilter.getFromErrorInvalid()).toEqual('Invalid Format'); + expect(sizeRangeFilter.getToErrorInvalid()).toEqual('Invalid Format'); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false); + + sizeRangeFilter.putFromNumber('4.5').putToNumber('4,5') + .checkFromErrorInvalidIsDisplayed().checkToErrorInvalidIsDisplayed(); + expect(sizeRangeFilter.getFromErrorInvalid()).toEqual('Invalid Format'); + expect(sizeRangeFilter.getToErrorInvalid()).toEqual('Invalid Format'); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false); + + sizeRangeFilter.putFromNumber('01').putToNumber('-1'); + expect(sizeRangeFilter.getFromErrorInvalid()).toEqual('Invalid Format'); + expect(sizeRangeFilter.getToErrorInvalid()).toEqual('Invalid Format'); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false); + + sizeRangeFilter.clearFromField().clearToField() + .checkFromErrorRequiredIsDisplayed().checkToErrorRequiredIsDisplayed(); + expect(sizeRangeFilter.getFromErrorRequired()).toEqual('Required value'); + expect(sizeRangeFilter.getToErrorRequired()).toEqual('Required value'); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false); + }); + + it('[C276943] Should be able to put a big value in To field', () => { + let toSize = 999999999; + let fromSize = 0; + sizeRangeFilter.checkToFieldIsDisplayed() + .putToNumber(toSize) + .putFromNumber(fromSize); + + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + searchResults.tableIsLoaded(); + searchResults.sortBySize(false); + + browser.controlFlow().execute(async () => { + let firstResult = await dataTable.getNodeIdFirstElement(); + await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { + await expect(node.entry.content.sizeInBytes <= toSize).toBe(true); + }); + }); + }); + + it('[C276944] Should be able to filter by name when size range filter is applied', () => { + let nameFilter = searchFilters.textFiltersPage(); + let toSize = 40; + let fromSize = 0; + searchFilters.checkNameFilterIsDisplayed() + .checkNameFilterIsExpanded(); + nameFilter.searchByName('*'); + + sizeRangeFilter.checkFromFieldIsDisplayed() + .putFromNumber(fromSize) + .putToNumber(toSize); + + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + searchResults.sortBySize(false); + + browser.controlFlow().execute(async () => { + let firstResult = await dataTable.getNodeIdFirstElement(); + await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { + await expect(node.entry.content.sizeInBytes <= toSize).toBe(true); + }); + }); + + searchFilters.checkNameFilterIsDisplayed() + .checkNameFilterIsExpanded(); + nameFilter.searchByName('z*'); + searchResults.sortBySize(false); + + browser.controlFlow().execute(async () => { + let firstResult = await dataTable.getNodeIdFirstElement(); + await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { + await expect(node.entry.content.sizeInBytes <= toSize).toBe(true); + let name = node.entry.name; + await expect(/z*/i.test(name)).toBe(true); + }); + }); + }); + + it('[C276950] Should be able to filter by size (slider) when size range filter is applied', () => { + let sizeSliderFilter = searchFilters.sizeSliderFilterPage(); + let toSize = 20; + let sliderSize = 18; + + searchFilters.checkSizeSliderFilterIsDisplayed() + .clickSizeSliderFilterHeader() + .checkSizeSliderFilterIsExpanded(); + sizeSliderFilter.checkSliderIsDisplayed().setValue(sliderSize); + + sizeRangeFilter.checkFromFieldIsDisplayed() + .putFromNumber(0) + .putToNumber(toSize); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + searchResults.sortBySize(false); + searchResults.tableIsLoaded(); + + browser.controlFlow().execute(async () => { + let firstResult = await dataTable.getNodeIdFirstElement(); + await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { + await expect(node.entry.content.sizeInBytes <= sliderSize).toBe(true); + }); + }); + + sizeRangeFilter.checkFromFieldIsDisplayed() + .putFromNumber(1); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + searchResults.sortBySize(true); + searchResults.tableIsLoaded(); + + browser.controlFlow().execute(async () => { + let firstResult = await dataTable.getNodeIdFirstElement(); + await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { + await expect(node.entry.content.sizeInBytes >= 1).toBe(true); + await expect(node.entry.content.sizeInBytes <= sliderSize).toBe(true); + }); + }); + + sizeRangeFilter.checkFromFieldIsDisplayed() + .putFromNumber(19); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + searchResults.checkNoResultMessageIsDisplayed(); + }); + + it('[C276951] Should not display folders when Size range is applied', () => { + sizeRangeFilter.checkToFieldIsDisplayed() + .putToNumber(99999999) + .putFromNumber(0); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + searchResults.tableIsLoaded(); + searchFilters.checkCheckListFilterIsDisplayed(); + searchFilters.clickCheckListFilter(); + searchFilters.checkCheckListFilterIsExpanded(); + + searchFilters.checkListFiltersPage() + .clickCheckListOption('Folder'); + + searchResults.tableIsLoaded(); + searchResults.checkNoResultMessageIsDisplayed(); + }); + + it('[C276952] Should only display empty files when size range is set from 0 to 1', () => { + sizeRangeFilter.checkToFieldIsDisplayed() + .putToNumber(1) + .putFromNumber(0); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + searchResults.tableIsLoaded(); + searchResults.sortBySize(false); + + browser.controlFlow().execute(async () => { + let firstResult = await dataTable.getNodeIdFirstElement(); + await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { + await expect(node.entry.content.sizeInBytes).toEqual(0); + }); + }); + }); + + it('[C277092] Should disable apply button when from field value equal/is bigger than to field value', () => { + sizeRangeFilter.checkFromFieldIsDisplayed() + .putFromNumber(10); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false); + + sizeRangeFilter.putToNumber('5'); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false); + + sizeRangeFilter.putToNumber('10'); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(false); + }); + + it('[C289930] Should be able to clear values in number range fields', () => { + sizeRangeFilter.checkFromFieldIsDisplayed().checkClearButtonIsDisplayed().checkNoErrorMessageIsDisplayed() + .clickClearButton().checkNoErrorMessageIsDisplayed() + .putFromNumber(0).putToNumber(1).clickClearButton(); + + expect(sizeRangeFilter.getFromNumber()).toEqual(''); + expect(sizeRangeFilter.getToNumber()).toEqual(''); + + sizeRangeFilter.putFromNumber(0).putToNumber(1).clickApplyButton(); + searchResults.sortBySize(false); + + browser.controlFlow().execute(async () => { + let firstResult = await dataTable.getNodeIdFirstElement(); + await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { + await expect(node.entry.content.sizeInBytes <= 1).toBe(true); + }); + }); + + sizeRangeFilter.clickClearButton(); + + expect(sizeRangeFilter.getFromNumber()).toEqual(''); + expect(sizeRangeFilter.getToNumber()).toEqual(''); + + browser.controlFlow().execute(async () => { + let firstResult = await dataTable.getNodeIdFirstElement(); + await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { + await expect(node.entry.content.sizeInBytes >= 1).toBe(true); + }); + }); + }); + + it('[C277137] Number Range should be inclusive', () => { + sizeRangeFilter.checkToFieldIsDisplayed() + .putToNumber(2) + .putFromNumber(1); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + + searchResults.tableIsLoaded(); + searchResults.checkContentIsDisplayed(file2BytesModel.name); + + sizeRangeFilter.checkToFieldIsDisplayed() + .putToNumber(1) + .putFromNumber(0); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + + searchResults.tableIsLoaded(); + searchResults.checkContentIsNotDisplayed(file2BytesModel.name); + + sizeRangeFilter.checkToFieldIsDisplayed() + .putToNumber(3) + .putFromNumber(2); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + + searchResults.tableIsLoaded(); + searchResults.checkContentIsDisplayed(file2BytesModel.name); + + sizeRangeFilter.checkToFieldIsDisplayed() + .putToNumber(4) + .putFromNumber(3); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + + searchResults.tableIsLoaded(); + searchResults.checkContentIsNotDisplayed(file2BytesModel.name); + }); + + describe('Configuration change', () => { + let jsonFile; + + beforeEach(() => { + let searchConfiguration = new SearchConfiguration(); + jsonFile = searchConfiguration.getConfiguration(); + }); + + it('[C276928] Should be able to change the field property for number range', () => { + jsonFile.categories[3].component.settings.field = 'cm:created'; + + navigationBar.clickConfigEditorButton(); + configEditor.clickSearchConfiguration(); + configEditor.clickClearButton(); + configEditor.enterBigConfigurationText(JSON.stringify(jsonFile)).clickSaveButton(); + + searchDialog.checkSearchIconIsVisible() + .clickOnSearchIcon() + .enterTextAndPressEnter('*'); + + searchFilters.checkSizeRangeFilterIsDisplayed() + .clickSizeRangeFilterHeader() + .checkSizeRangeFilterIsExpanded(); + + let fromYear = (new Date()).getFullYear(); + let toYear = fromYear + 1; + + sizeRangeFilter.checkToFieldIsDisplayed() + .putToNumber(toYear) + .putFromNumber(fromYear); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + searchResults.tableIsLoaded(); + searchResults.sortByCreated(false); + + browser.controlFlow().execute(async () => { + let firstResult = await dataTable.getNodeIdFirstElement(); + await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { + await expect((node.entry.createdAt.getFullYear()) <= toYear).toBe(true); + }); + }); + + searchResults.sortByCreated(true); + + browser.controlFlow().execute(async () => { + let firstResult = await dataTable.getNodeIdFirstElement(); + await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => { + await expect((node.entry.createdAt.getFullYear()) >= fromYear).toBe(true); + }); + }); + }); + + it('[C277139] Should be able to set To field to be exclusive', () => { + jsonFile.categories[3].component.settings.format = '[{FROM} TO {TO}>'; + + navigationBar.clickConfigEditorButton(); + configEditor.clickSearchConfiguration(); + configEditor.clickClearButton(); + configEditor.enterBigConfigurationText(JSON.stringify(jsonFile)).clickSaveButton(); + + searchDialog.checkSearchIconIsVisible() + .clickOnSearchIcon() + .enterTextAndPressEnter('*'); + + searchFilters.checkSizeRangeFilterIsDisplayed() + .clickSizeRangeFilterHeader() + .checkSizeRangeFilterIsExpanded(); + + sizeRangeFilter.checkToFieldIsDisplayed() + .putToNumber(2) + .putFromNumber(1); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + + searchResults.tableIsLoaded(); + searchResults.checkContentIsNotDisplayed(file2BytesModel.name); + + sizeRangeFilter.checkToFieldIsDisplayed() + .putToNumber(3) + .putFromNumber(1); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + + searchResults.tableIsLoaded(); + searchResults.checkContentIsDisplayed(file2BytesModel.name); + }); + + it('[C277140] Should be able to set From field to be exclusive', () => { + jsonFile.categories[3].component.settings.format = '<{FROM} TO {TO}]'; + + navigationBar.clickConfigEditorButton(); + configEditor.clickSearchConfiguration(); + configEditor.clickClearButton(); + configEditor.enterBigConfigurationText(JSON.stringify(jsonFile)).clickSaveButton(); + + searchDialog.checkSearchIconIsVisible() + .clickOnSearchIcon() + .enterTextAndPressEnter('*'); + + searchFilters.checkSizeRangeFilterIsDisplayed() + .clickSizeRangeFilterHeader() + .checkSizeRangeFilterIsExpanded(); + + sizeRangeFilter.checkToFieldIsDisplayed() + .putToNumber(3) + .putFromNumber(1); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + + searchResults.tableIsLoaded(); + searchResults.checkContentIsDisplayed(file2BytesModel.name); + + sizeRangeFilter.checkToFieldIsDisplayed() + .putToNumber(3) + .putFromNumber(2); + expect(sizeRangeFilter.checkApplyButtonIsEnabled()).toBe(true); + + sizeRangeFilter.clickApplyButton(); + + searchResults.tableIsLoaded(); + searchResults.checkContentIsNotDisplayed(file2BytesModel.name); + }); + }); +}); diff --git a/e2e/pages/adf/content_services/search/components/numberRangeFilterPage.ts b/e2e/pages/adf/content_services/search/components/numberRangeFilterPage.ts new file mode 100644 index 0000000000..f5792a5f10 --- /dev/null +++ b/e2e/pages/adf/content_services/search/components/numberRangeFilterPage.ts @@ -0,0 +1,141 @@ +/*! + * @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, protractor, browser } from 'protractor'; + +export class NumberRangeFilterPage { + + fromInput = by.css('input[data-automation-id="number-range-from-input"]'); + toInput = by.css('input[data-automation-id="number-range-to-input"]'); + applyButton = by.css('button[data-automation-id="number-range-btn-apply"]'); + clearButton = by.css('button[data-automation-id="number-range-btn-clear"]'); + fromErrorInvalid = by.css('mat-error[data-automation-id="number-range-from-error-invalid"]'); + fromErrorRequired = by.css('mat-error[data-automation-id="number-range-from-error-required"]'); + toErrorInvalid = by.css('mat-error[data-automation-id="number-range-to-error-invalid"]'); + toErrorRequired = by.css('mat-error[data-automation-id="number-range-to-error-required"]'); + filter; + + constructor(filter) { + this.filter = filter; + } + clearFromField() { + Util.waitUntilElementIsClickable(this.filter.element(this.fromInput)); + this.filter.element(this.fromInput).getAttribute('value').then((value) => { + for (let i = value.length; i >= 0; i--) { + this.filter.element(this.fromInput).sendKeys(protractor.Key.BACK_SPACE); + } + }); + return this; + } + getFromNumber() { + return this.filter.element(this.fromInput).getAttribute('value'); + } + putFromNumber(value) { + this.checkFromFieldIsDisplayed(); + this.filter.element(this.fromInput).clear(); + this.filter.element(this.fromInput).sendKeys(value); + this.filter.element(this.fromInput).sendKeys(protractor.Key.ENTER); + return this; + } + getFromErrorRequired() { + Util.waitUntilElementIsVisible(this.filter.element(this.fromErrorRequired)); + return this.filter.element(this.fromErrorRequired).getText(); + } + checkFromErrorRequiredIsDisplayed() { + Util.waitUntilElementIsVisible(this.filter.element(this.fromErrorRequired)); + return this; + } + getFromErrorInvalid() { + Util.waitUntilElementIsVisible(this.filter.element(this.fromErrorInvalid)); + return this.filter.element(this.fromErrorInvalid).getText(); + } + checkFromErrorInvalidIsDisplayed() { + Util.waitUntilElementIsVisible(this.filter.element(this.fromErrorInvalid)); + return this; + } + checkFromFieldIsDisplayed() { + Util.waitUntilElementIsVisible(this.filter.element(this.fromInput)); + return this; + } + clearToField() { + Util.waitUntilElementIsClickable(this.filter.element(this.toInput)); + this.filter.element(this.toInput).getAttribute('value').then((value) => { + for (let i = value.length; i >= 0; i--) { + this.filter.element(this.toInput).sendKeys(protractor.Key.BACK_SPACE); + } + }); + return this; + } + getToNumber() { + return this.filter.element(this.toInput).getAttribute('value'); + } + putToNumber(value) { + this.checkToFieldIsDisplayed(); + this.filter.element(this.toInput).clear(); + this.filter.element(this.toInput).sendKeys(value); + this.filter.element(this.toInput).sendKeys(protractor.Key.ENTER); + return this; + } + getToErrorRequired() { + Util.waitUntilElementIsVisible(this.filter.element(this.toErrorRequired)); + return this.filter.element(this.toErrorRequired).getText(); + } + checkToErrorRequiredIsDisplayed() { + Util.waitUntilElementIsVisible(this.filter.element(this.toErrorRequired)); + return this; + } + getToErrorInvalid() { + Util.waitUntilElementIsVisible(this.filter.element(this.toErrorInvalid)); + return this.filter.element(this.toErrorInvalid).getText(); + } + checkToErrorInvalidIsDisplayed() { + Util.waitUntilElementIsVisible(this.filter.element(this.toErrorInvalid)); + return this; + } + checkToFieldIsDisplayed() { + Util.waitUntilElementIsVisible(this.filter.element(this.toInput)); + 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() { + return this.filter.element(this.applyButton).isEnabled(); + } + clickClearButton() { + Util.waitUntilElementIsClickable(this.filter.element(this.clearButton)); + this.filter.element(this.clearButton).click(); + return this; + } + checkClearButtonIsDisplayed() { + Util.waitUntilElementIsVisible(this.filter.element(this.clearButton)); + return this; + } + checkNoErrorMessageIsDisplayed() { + Util.waitUntilElementIsNotVisible(this.filter.element(this.fromErrorInvalid)); + Util.waitUntilElementIsNotVisible(this.filter.element(this.fromErrorRequired)); + Util.waitUntilElementIsNotVisible(this.filter.element(this.toErrorInvalid)); + Util.waitUntilElementIsNotVisible(this.filter.element(this.toErrorRequired)); + return this; + } +} diff --git a/e2e/pages/adf/content_services/search/components/search-slider.page.ts b/e2e/pages/adf/content_services/search/components/search-slider.page.ts new file mode 100644 index 0000000000..9f0aec2473 --- /dev/null +++ b/e2e/pages/adf/content_services/search/components/search-slider.page.ts @@ -0,0 +1,56 @@ +/*! + * @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 { browser, by, protractor } from 'protractor'; +import Util = require('../../../../../util/util'); + +export class SearchSliderPage { + + filter; + slider = by.css('mat-slider'); + + constructor(filter) { + this.filter = filter; + } + + setValue(value) { + this.clickSlider(); + browser.controlFlow().execute(async () => { + let actualValue; + do { + actualValue = await this.filter.element(this.slider).getAttribute('aria-valuenow'); + if (actualValue < value) { + await browser.actions().sendKeys(protractor.Key.ARROW_RIGHT).perform(); + } else if (actualValue > value) { + await browser.actions().sendKeys(protractor.Key.ARROW_LEFT).perform(); + } + }while (Number(actualValue) !== value); + }); + return this; + } + + clickSlider() { + Util.waitUntilElementIsClickable(this.filter.element(this.slider)); + this.filter.element(this.slider).click(); + return this; + } + + checkSliderIsDisplayed() { + Util.waitUntilElementIsVisible(this.filter.element(this.slider)); + return this; + } +} diff --git a/e2e/pages/adf/content_services/search/components/search-text.ts b/e2e/pages/adf/content_services/search/components/search-text.ts index e26801f2d0..539d0d2df4 100644 --- a/e2e/pages/adf/content_services/search/components/search-text.ts +++ b/e2e/pages/adf/content_services/search/components/search-text.ts @@ -16,7 +16,7 @@ */ import Util = require('../../../../../util/util'); -import { element, by } from 'protractor'; +import { protractor, by } from 'protractor'; export class SearchTextPage { diff --git a/e2e/pages/adf/content_services/search/search-categories.ts b/e2e/pages/adf/content_services/search/search-categories.ts index 843d7b76a5..b649621a08 100644 --- a/e2e/pages/adf/content_services/search/search-categories.ts +++ b/e2e/pages/adf/content_services/search/search-categories.ts @@ -16,11 +16,13 @@ */ import Util = require('../../../../util/util'); -import { element, by } from 'protractor'; +import { by } from 'protractor'; import { SearchTextPage } from './components/search-text'; import { SearchCheckListPage } from './components/search-checkList'; import { SearchRadioPage } from './components/search-radio'; import { DateRangeFilterPage } from './components/dateRangeFilterPage'; +import { NumberRangeFilterPage } from './components/numberRangeFilterPage'; +import { SearchSliderPage } from './components/search-slider.page'; export class SearchCategoriesPage { @@ -40,6 +42,14 @@ export class SearchCategoriesPage { return new DateRangeFilterPage(filter); } + numberRangeFilter(filter) { + return new NumberRangeFilterPage(filter); + } + + sliderFilter(filter) { + return new SearchSliderPage(filter); + } + checkFilterIsDisplayed(filter) { Util.waitUntilElementIsVisible(filter); return this; diff --git a/e2e/pages/adf/searchFiltersPage.ts b/e2e/pages/adf/searchFiltersPage.ts index d8c2279555..ab13b8b341 100644 --- a/e2e/pages/adf/searchFiltersPage.ts +++ b/e2e/pages/adf/searchFiltersPage.ts @@ -31,11 +31,17 @@ export class SearchFiltersPage { 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)"]')); typeFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Type"]')); + sizeRangeFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Content Size (range)"]')); + sizeSliderFilter = element(by.css('mat-expansion-panel[data-automation-id="expansion-panel-Content Size"]')); checkSearchFiltersIsDisplayed() { Util.waitUntilElementIsVisible(this.searchFilters); } + sizeRangeFilterPage() { + return this.searchCategoriesPage.numberRangeFilter(this.sizeRangeFilter); + } + createdDateRangeFilterPage() { return this.searchCategoriesPage.dateRangeFilter(this.createdDateRangeFilter); } @@ -56,6 +62,10 @@ export class SearchFiltersPage { return this.searchCategoriesPage.checkListFiltersPage(this.fileTypeFilter); } + sizeSliderFilterPage() { + return this.searchCategoriesPage.sliderFilter(this.sizeSliderFilter); + } + checkFileTypeFilterIsDisplayed() { this.searchCategoriesPage.checkFilterIsDisplayed(this.fileTypeFilter); return this; @@ -71,6 +81,11 @@ export class SearchFiltersPage { return this; } + checkNameFilterIsExpanded() { + this.searchCategoriesPage.checkFilterIsExpanded(this.nameFilter); + return this; + } + checkNameFilterIsDisplayed() { this.searchCategoriesPage.checkFilterIsDisplayed(this.nameFilter); return this; @@ -90,6 +105,10 @@ export class SearchFiltersPage { this.searchCategoriesPage.clickFilterHeader(this.fileSizeFilter); return this; } + checkFileSizeFilterIsCollapsed() { + this.searchCategoriesPage.checkFilterIsCollapsed(this.fileSizeFilter); + return this; + } clickFileTypeFilterHeader() { this.searchCategoriesPage.clickFilterHeader(this.fileTypeFilter); @@ -110,6 +129,11 @@ export class SearchFiltersPage { this.searchCategoriesPage.checkFilterIsCollapsed(this.checkListFilter); } + checkCheckListFilterIsExpanded() { + this.searchCategoriesPage.checkFilterIsExpanded(this.checkListFilter); + return this; + } + checkCreatedRangeFilterIsDisplayed() { this.searchCategoriesPage.checkFilterIsDisplayed(this.createdDateRangeFilter); return this; @@ -149,4 +173,42 @@ export class SearchFiltersPage { return this; } + checkSizeRangeFilterIsDisplayed() { + this.searchCategoriesPage.checkFilterIsDisplayed(this.createdDateRangeFilter); + return this; + } + + clickSizeRangeFilterHeader() { + this.searchCategoriesPage.clickFilterHeader(this.sizeRangeFilter); + return this; + } + + checkSizeRangeFilterIsExpanded() { + this.searchCategoriesPage.checkFilterIsExpanded(this.sizeRangeFilter); + return this; + } + + checkSizeRangeFilterIsCollapsed() { + this.searchCategoriesPage.checkFilterIsCollapsed(this.sizeRangeFilter); + return this; + } + + checkSizeSliderFilterIsDisplayed() { + this.searchCategoriesPage.checkFilterIsDisplayed(this.sizeSliderFilter); + return this; + } + clickSizeSliderFilterHeader() { + this.searchCategoriesPage.clickFilterHeader(this.sizeSliderFilter); + return this; + } + + checkSizeSliderFilterIsExpanded() { + this.searchCategoriesPage.checkFilterIsExpanded(this.sizeSliderFilter); + return this; + } + + checkSizeSliderFilterIsCollapsed() { + this.searchCategoriesPage.checkFilterIsCollapsed(this.sizeSliderFilter); + return this; + } } diff --git a/e2e/pages/adf/searchResultsPage.ts b/e2e/pages/adf/searchResultsPage.ts index 8f05563c15..8c9a88e88f 100644 --- a/e2e/pages/adf/searchResultsPage.ts +++ b/e2e/pages/adf/searchResultsPage.ts @@ -87,13 +87,9 @@ export class SearchResultsPage { Util.waitUntilElementIsClickable(this.sortingArrow); this.sortingArrow.click(); - let selectedSortingOption = element(by.xpath(``)); + let selectedSortingOption = element(by.cssContainingText('span[class="mat-option-text"]', sortType)); 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(); - }); + selectedSortingOption.click(); this.sortByOrder(sortOrder); } @@ -123,6 +119,10 @@ export class SearchResultsPage { this.sortBy(sortOrder, 'Created'); } + sortBySize(sortOrder) { + this.sortBy(sortOrder, 'Size'); + } + sortAndCheckListIsOrderedByName(sortOrder) { this.sortByName(sortOrder); this.dataTable.waitForTableBody(); diff --git a/lib/content-services/search/components/search-number-range/search-number-range.component.html b/lib/content-services/search/components/search-number-range/search-number-range.component.html index a747d767e2..3dad089a05 100644 --- a/lib/content-services/search/components/search-number-range/search-number-range.component.html +++ b/lib/content-services/search/components/search-number-range/search-number-range.component.html @@ -4,11 +4,12 @@ - + autocomplete="off" + data-automation-id="number-range-from-input"> + {{ 'SEARCH.FILTER.VALIDATION.INVALID-FORMAT' | translate }} - + {{ 'SEARCH.FILTER.VALIDATION.REQUIRED-VALUE' | translate }} @@ -17,21 +18,22 @@ - + autocomplete="off" + data-automation-id="number-range-to-input"> + {{ 'SEARCH.FILTER.VALIDATION.INVALID-FORMAT' | translate }} - + {{ 'SEARCH.FILTER.VALIDATION.REQUIRED-VALUE' | translate }}
- -