[ADF-3442] create library dialog (#4018)

* library dialog

* integrate with demo shell

* update resources

* fix license

* auto focus for the first input

* update e2e tests

* try close the dialog between tests

* fix afterEach

* Revert "try close the dialog between tests"

This reverts commit 63464f2b03c226c606d09b18c7d2782e3bb52c0a.

* update code due to css lint issues

* csslint settings for vs code

* missing import
lint fix
remove not used import
convert errorPage js to ts
convert tasklistpage js to ts
fix redirection creation folder in root
fix lint issue
fix e2e

* e2e fix

* fix PS tests

* navigation import

* fix tests tooltip
convert paginapage to ts

* fix lint

* fix lock files e2e
filterspage to ts

* fix lint

* fix cs cre
git dept 3 and not 50 as default in travis

* quiet log git download

* add some delay and change the delete lock

* fix node entry

* convert searchDialog to typescript
parallel protractor

* disable browser execute

* restote test

* change search tests

* move search in a separate e2e folder

* experiment fix e2e

* change util presence
change protractor conf

* fix unshare test

* improve query viewerPage using css over xpath

* waitForAngularEnabled before browser redirect

* convert util to ts and more

* convert other files to ts

* convert to ts other files

* trigger build

* function fixes use arrow function

* process service fixes

* lint fix
review timeout default

* fix failing tests

* restore timeout

* share dialog fix

* remove

* use configuration admin

* fix APS 2 login sso
This commit is contained in:
Denys Vuika
2018-12-05 13:05:39 +00:00
committed by Eugenio Romano
parent 9fd564a78e
commit 058d23d57f
237 changed files with 8974 additions and 9201 deletions
@@ -0,0 +1,367 @@
/*!
* @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 { SearchFiltersPage } from '../../pages/adf/searchFiltersPage';
import { ContentListPage } from '../../pages/adf/dialog/contentListPage';
import { ConfigEditorPage } from '../../pages/adf/configEditorPage';
import { NavigationBarPage } from '../../pages/adf/navigationBarPage';
import { SearchDialog } from '../../pages/adf/dialog/searchDialog';
import { AcsUserModel } from '../../models/ACS/acsUserModel';
import TestConfig = require('../../test.config');
import { SearchConfiguration } from '../search.config';
import AlfrescoApi = require('alfresco-js-api-node');
import { UploadActions } from '../../actions/ACS/upload.actions';
import { browser } from 'protractor';
describe('Search Radio Component', () => {
const loginPage = new LoginPage();
const searchFiltersPage = new SearchFiltersPage();
const contentList = new ContentListPage();
const configEditorPage = new ConfigEditorPage();
const navigationBarPage = new NavigationBarPage();
const searchDialog = new SearchDialog();
let acsUser = new AcsUserModel();
let uploadActions = new UploadActions();
let filterType = {
folder: 'Folder',
document: 'Document',
custom: 'TEST_NAME'
};
let nodeNames = {
document: 'this_is_a_unique_name.txt',
folder: 'this_is_a_unique_name'
};
let createdFile, createdFolder;
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);
createdFolder = await this.alfrescoJsApi.nodes.addNode('-my-', {name: nodeNames.folder, nodeType: 'cm:folder'});
createdFile = await this.alfrescoJsApi.nodes.addNode('-my-', {name: nodeNames.document, nodeType: 'cm:content'});
await browser.driver.sleep(15000);
loginPage.loginToContentServicesUsingUserModel(acsUser);
browser.get(TestConfig.adf.url + '/search;q=' + nodeNames.folder + '');
done();
});
afterAll(async (done) => {
await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword);
await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, createdFile.entry.id);
await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, createdFolder.entry.id);
done();
});
it('[C276991] Should be able to click between options and Clear All button', () => {
searchFiltersPage.checkCheckListFilterIsDisplayed();
searchFiltersPage.checkCheckListFilterIsCollapsed();
searchFiltersPage.clickCheckListFilter();
searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsDisplayed(filterType.folder);
searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsDisplayed(filterType.document);
searchFiltersPage.checkListFiltersPage().checkClearAllButtonIsDisplayed();
searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsNotSelected(filterType.folder);
searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsNotSelected(filterType.document);
searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.folder);
searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsSelected(filterType.folder);
contentList.checkContentIsDisplayed(nodeNames.folder);
contentList.checkContentIsNotDisplayed(nodeNames.document);
searchFiltersPage.checkListFiltersPage().clickClearAllButton();
searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsNotSelected(filterType.folder);
contentList.checkContentIsDisplayed(nodeNames.folder);
contentList.checkContentIsDisplayed(nodeNames.document);
searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.folder);
searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.document);
searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsSelected(filterType.folder);
searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsSelected(filterType.document);
contentList.checkContentIsDisplayed(nodeNames.folder);
contentList.checkContentIsDisplayed(nodeNames.document);
searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.folder);
searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsSelected(filterType.document);
searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsNotSelected(filterType.folder);
contentList.checkContentIsDisplayed(nodeNames.document);
contentList.checkContentIsNotDisplayed(nodeNames.folder);
});
describe('configuration change', () => {
let jsonFile;
beforeEach(() => {
let searchConfiguration = new SearchConfiguration();
jsonFile = searchConfiguration.getConfiguration();
});
it('[C277143] Should be able to click show more/less button with pageSize set as default', () => {
navigationBarPage.clickConfigEditorButton();
for (let numberOfOptions = 0; numberOfOptions < 8; numberOfOptions++) {
jsonFile.categories[1].component.settings.options.push({ 'name': 'Folder', 'value': "TYPE:'cm:folder'" });
}
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder);
searchFiltersPage.clickCheckListFilter();
expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(5);
searchFiltersPage.checkListFiltersPage().checkShowMoreButtonIsDisplayed();
searchFiltersPage.checkListFiltersPage().checkShowLessButtonIsNotDisplayed();
searchFiltersPage.checkListFiltersPage().clickShowMoreButton();
expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(10);
searchFiltersPage.checkListFiltersPage().checkShowMoreButtonIsNotDisplayed();
searchFiltersPage.checkListFiltersPage().checkShowLessButtonIsDisplayed();
searchFiltersPage.checkListFiltersPage().clickShowLessButton();
expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(5);
searchFiltersPage.checkListFiltersPage().checkShowMoreButtonIsDisplayed();
searchFiltersPage.checkListFiltersPage().checkShowLessButtonIsNotDisplayed();
browser.refresh();
});
it('[C277144] Should be able to click show more/less button with pageSize set with a custom value', () => {
navigationBarPage.clickConfigEditorButton();
jsonFile.categories[1].component.settings.pageSize = 10;
for (let numberOfOptions = 0; numberOfOptions < 8; numberOfOptions++) {
jsonFile.categories[1].component.settings.options.push({ 'name': 'Folder', 'value': "TYPE:'cm:folder'" });
}
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder);
searchFiltersPage.clickCheckListFilter();
expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(10);
searchFiltersPage.checkListFiltersPage().checkShowMoreButtonIsNotDisplayed();
browser.refresh();
navigationBarPage.clickConfigEditorButton();
jsonFile.categories[1].component.settings.pageSize = 11;
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder);
searchFiltersPage.clickCheckListFilter();
expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(10);
searchFiltersPage.checkListFiltersPage().checkShowMoreButtonIsNotDisplayed();
browser.refresh();
navigationBarPage.clickConfigEditorButton();
jsonFile.categories[1].component.settings.pageSize = 9;
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder);
searchFiltersPage.clickCheckListFilter();
expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(9);
searchFiltersPage.checkListFiltersPage().checkShowMoreButtonIsDisplayed();
browser.refresh();
});
it('[C277145] Should be able to click show more/less button with pageSize set to zero', () => {
navigationBarPage.clickConfigEditorButton();
jsonFile.categories[1].component.settings.pageSize = 0;
for (let numberOfOptions = 0; numberOfOptions < 8; numberOfOptions++) {
jsonFile.categories[1].component.settings.options.push({ 'name': 'Folder', 'value': "TYPE:'cm:folder'" });
}
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder);
searchFiltersPage.clickCheckListFilter();
expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(5);
searchFiltersPage.checkListFiltersPage().checkShowMoreButtonIsDisplayed();
searchFiltersPage.checkListFiltersPage().checkShowLessButtonIsNotDisplayed();
searchFiltersPage.checkListFiltersPage().clickShowMoreButton();
expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(10);
searchFiltersPage.checkListFiltersPage().checkShowMoreButtonIsNotDisplayed();
searchFiltersPage.checkListFiltersPage().checkShowLessButtonIsDisplayed();
browser.refresh();
navigationBarPage.clickConfigEditorButton();
delete jsonFile.categories[1].component.settings.pageSize;
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder);
searchFiltersPage.clickCheckListFilter();
expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(5);
searchFiltersPage.checkListFiltersPage().checkShowMoreButtonIsDisplayed();
searchFiltersPage.checkListFiltersPage().checkShowLessButtonIsNotDisplayed();
searchFiltersPage.checkListFiltersPage().clickShowMoreButton();
expect(searchFiltersPage.checkListFiltersPage().getCheckListOptionsNumberOnPage()).toBe(10);
searchFiltersPage.checkListFiltersPage().checkShowMoreButtonIsNotDisplayed();
searchFiltersPage.checkListFiltersPage().checkShowLessButtonIsDisplayed();
});
});
describe('Properties', () => {
let jsonFile;
beforeEach(() => {
let searchConfiguration = new SearchConfiguration();
jsonFile = searchConfiguration.getConfiguration();
});
beforeAll(async (done) => {
loginPage.loginToContentServicesUsingUserModel(acsUser);
done();
});
it('[C277018] Should be able to change the operator', () => {
navigationBarPage.clickConfigEditorButton();
jsonFile.categories[1].component.settings.operator = 'AND';
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder);
searchFiltersPage.clickCheckListFilter();
searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.folder);
searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsSelected(filterType.folder);
contentList.checkContentIsDisplayed(nodeNames.folder);
contentList.checkContentIsNotDisplayed(nodeNames.document);
searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.document);
contentList.checkContentIsNotDisplayed(nodeNames.folder);
contentList.checkContentIsNotDisplayed(nodeNames.document);
browser.refresh();
});
it('[C277019] Should be able to add new properties with different types', () => {
navigationBarPage.clickConfigEditorButton();
jsonFile.categories[1].component.settings.options.push({ 'name': filterType.custom, 'value': "TYPE:'cm:auditable'" });
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder);
searchFiltersPage.clickCheckListFilter();
searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsDisplayed(filterType.folder);
searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsDisplayed(filterType.document);
searchFiltersPage.checkListFiltersPage().checkCheckListOptionIsDisplayed(filterType.custom);
searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.custom);
contentList.checkContentIsNotDisplayed(nodeNames.folder);
contentList.checkContentIsNotDisplayed(nodeNames.document);
searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.document);
searchFiltersPage.checkListFiltersPage().clickCheckListOption(filterType.folder);
contentList.checkContentIsDisplayed(nodeNames.folder);
contentList.checkContentIsDisplayed(nodeNames.document);
});
});
});
@@ -0,0 +1,232 @@
/*!
* @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 } from '../../pages/adf/dialog/searchDialog';
import { DataTablePage } from '../../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 { SearchConfiguration } from '../search.config';
import TestConfig = require('../../test.config');
import AlfrescoApi = require('alfresco-js-api-node');
import { browser } from 'protractor';
describe('Search Date Range Filter', () => {
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);
await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => {
let nodeCreation = new Date(node.entry.createdAt);
nodeCreation.setHours(0, 0, 0, 0);
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);
await this.alfrescoJsApi.core.nodesApi.getNode(firstResult).then(async (node) => {
let nodeCreation = new Date(node.entry.createdAt);
nodeCreation.setHours(0, 0, 0, 0);
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();
});
describe('configuration change', () => {
let jsonFile;
beforeAll(() => {
let searchConfiguration = new SearchConfiguration();
jsonFile = searchConfiguration.getConfiguration();
});
it('[C277117] Should be able to change date format', () => {
jsonFile.categories[4].component.settings.dateFormat = 'MM-DD-YY';
navigationBar.clickConfigEditorButton();
configEditor.clickSearchConfiguration();
configEditor.clickClearButton();
configEditor.enterConfiguration(JSON.stringify(jsonFile));
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);
});
});
});
});
@@ -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 } from '../../pages/adf/dialog/searchDialog';
import { DataTablePage } from '../../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 } from '../../models/ACS/acsUserModel';
import { FileModel } from '../../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);
});
});
});
+323
View File
@@ -0,0 +1,323 @@
/*!
* @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 { SearchFiltersPage } from '../../pages/adf/searchFiltersPage';
import { ContentListPage } from '../../pages/adf/dialog/contentListPage';
import { ConfigEditorPage } from '../../pages/adf/configEditorPage';
import { NavigationBarPage } from '../../pages/adf/navigationBarPage';
import { SearchDialog } from '../../pages/adf/dialog/searchDialog';
import { AcsUserModel } from '../../models/ACS/acsUserModel';
import TestConfig = require('../../test.config');
import { SearchConfiguration } from '../search.config';
import AlfrescoApi = require('alfresco-js-api-node');
import { UploadActions } from '../../actions/ACS/upload.actions';
import { browser } from 'protractor';
describe('Search Radio Component', () => {
const loginPage = new LoginPage();
const searchFiltersPage = new SearchFiltersPage();
const contentList = new ContentListPage();
const configEditorPage = new ConfigEditorPage();
const navigationBarPage = new NavigationBarPage();
const searchDialog = new SearchDialog();
let acsUser = new AcsUserModel();
let uploadActions = new UploadActions();
let filterType = {
none: 'None',
all: 'All',
folder: 'Folder',
document: 'Document',
custom: 'TEST_NAME'
};
let nodeNames = {
document: 'this_is_a_unique_name.txt',
folder: 'this_is_a_unique_name'
};
let createdFile, createdFolder;
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);
createdFolder = await this.alfrescoJsApi.nodes.addNode('-my-', {name: nodeNames.folder, nodeType: 'cm:folder'});
createdFile = await this.alfrescoJsApi.nodes.addNode('-my-', {
name: nodeNames.document,
nodeType: 'cm:content'
});
await browser.driver.sleep(15000);
loginPage.loginToContentServicesUsingUserModel(acsUser);
browser.get(TestConfig.adf.url + '/search;q=' + nodeNames.folder + '');
done();
});
afterAll(async (done) => {
await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword);
await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, createdFile.entry.id);
await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, createdFolder.entry.id);
done();
});
it('[C277039] Should be able to choose only one option at a time', () => {
searchFiltersPage.checkTypeFilterIsDisplayed();
searchFiltersPage.checkTypeFilterIsCollapsed();
searchFiltersPage.clickTypeFilterHeader();
searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsDisplayed(filterType.none);
searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsDisplayed(filterType.all);
searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsDisplayed(filterType.folder);
searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsDisplayed(filterType.document);
searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsChecked(filterType.none);
contentList.checkContentIsDisplayed(nodeNames.folder);
contentList.checkContentIsDisplayed(nodeNames.document);
searchFiltersPage.typeFiltersPage().clickFilterRadioButton(filterType.folder);
searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsChecked(filterType.folder);
contentList.checkContentIsDisplayed(nodeNames.folder);
contentList.checkContentIsNotDisplayed(nodeNames.document);
searchFiltersPage.typeFiltersPage().clickFilterRadioButton(filterType.document);
searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsChecked(filterType.document);
contentList.checkContentIsDisplayed(nodeNames.document);
contentList.checkContentIsNotDisplayed(nodeNames.folder);
searchFiltersPage.typeFiltersPage().clickFilterRadioButton(filterType.all);
searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsChecked(filterType.all);
contentList.checkContentIsDisplayed(nodeNames.folder);
contentList.checkContentIsDisplayed(nodeNames.document);
});
describe('configuration change', () => {
let jsonFile;
beforeEach(() => {
let searchConfiguration = new SearchConfiguration();
jsonFile = searchConfiguration.getConfiguration();
});
it('[C277147] Should be able to customise the pageSize value', () => {
navigationBarPage.clickConfigEditorButton();
jsonFile.categories[5].component.settings.pageSize = 10;
for (let numberOfOptions = 0; numberOfOptions < 6; numberOfOptions++) {
jsonFile.categories[5].component.settings.options.push({
'name': 'APP.SEARCH.RADIO.FOLDER',
'value': "TYPE:'cm:folder'"
});
}
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder);
searchFiltersPage.clickTypeFilterHeader();
expect(searchFiltersPage.typeFiltersPage().getRadioButtonsNumberOnPage()).toBe(10);
browser.refresh();
navigationBarPage.clickConfigEditorButton();
jsonFile.categories[5].component.settings.pageSize = 11;
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder);
searchFiltersPage.clickTypeFilterHeader();
expect(searchFiltersPage.typeFiltersPage().getRadioButtonsNumberOnPage()).toBe(10);
browser.refresh();
navigationBarPage.clickConfigEditorButton();
jsonFile.categories[5].component.settings.pageSize = 9;
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder);
searchFiltersPage.clickTypeFilterHeader();
expect(searchFiltersPage.typeFiltersPage().getRadioButtonsNumberOnPage()).toBe(9);
searchFiltersPage.typeFiltersPage().checkShowMoreButtonIsDisplayed();
searchFiltersPage.typeFiltersPage().checkShowLessButtonIsNotDisplayed();
browser.refresh();
});
it('[C277148] Should be able to click show more/less button', () => {
navigationBarPage.clickConfigEditorButton();
jsonFile.categories[5].component.settings.pageSize = 0;
for (let numberOfOptions = 0; numberOfOptions < 6; numberOfOptions++) {
jsonFile.categories[5].component.settings.options.push({
'name': 'APP.SEARCH.RADIO.FOLDER',
'value': "TYPE:'cm:folder'"
});
}
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder);
searchFiltersPage.clickTypeFilterHeader();
expect(searchFiltersPage.typeFiltersPage().getRadioButtonsNumberOnPage()).toBe(5);
searchFiltersPage.typeFiltersPage().checkShowMoreButtonIsDisplayed();
searchFiltersPage.typeFiltersPage().checkShowLessButtonIsNotDisplayed();
searchFiltersPage.typeFiltersPage().clickShowMoreButton();
expect(searchFiltersPage.typeFiltersPage().getRadioButtonsNumberOnPage()).toBe(10);
searchFiltersPage.typeFiltersPage().checkShowMoreButtonIsNotDisplayed();
searchFiltersPage.typeFiltersPage().checkShowLessButtonIsDisplayed();
searchFiltersPage.typeFiltersPage().clickShowLessButton();
expect(searchFiltersPage.typeFiltersPage().getRadioButtonsNumberOnPage()).toBe(5);
searchFiltersPage.typeFiltersPage().checkShowMoreButtonIsDisplayed();
searchFiltersPage.typeFiltersPage().checkShowLessButtonIsNotDisplayed();
browser.refresh();
navigationBarPage.clickConfigEditorButton();
delete jsonFile.categories[5].component.settings.pageSize;
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder);
searchFiltersPage.clickTypeFilterHeader();
expect(searchFiltersPage.typeFiltersPage().getRadioButtonsNumberOnPage()).toBe(5);
searchFiltersPage.typeFiltersPage().checkShowMoreButtonIsDisplayed();
searchFiltersPage.typeFiltersPage().checkShowLessButtonIsNotDisplayed();
searchFiltersPage.typeFiltersPage().clickShowMoreButton();
expect(searchFiltersPage.typeFiltersPage().getRadioButtonsNumberOnPage()).toBe(10);
searchFiltersPage.typeFiltersPage().checkShowMoreButtonIsNotDisplayed();
searchFiltersPage.typeFiltersPage().checkShowLessButtonIsDisplayed();
searchFiltersPage.typeFiltersPage().clickShowLessButton();
expect(searchFiltersPage.typeFiltersPage().getRadioButtonsNumberOnPage()).toBe(5);
searchFiltersPage.typeFiltersPage().checkShowMoreButtonIsDisplayed();
searchFiltersPage.typeFiltersPage().checkShowLessButtonIsNotDisplayed();
});
});
describe('Properties', () => {
let jsonFile;
beforeEach(() => {
let searchConfiguration = new SearchConfiguration();
jsonFile = searchConfiguration.getConfiguration();
});
beforeAll(async (done) => {
loginPage.loginToContentServicesUsingUserModel(acsUser);
done();
});
it('[C277033] Should be able to add a new option', () => {
navigationBarPage.clickConfigEditorButton();
jsonFile.categories[5].component.settings.options.push({
'name': filterType.custom,
'value': "TYPE:'cm:content'"
});
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().checkSearchBarIsVisible().enterTextAndPressEnter(nodeNames.folder);
searchFiltersPage.clickTypeFilterHeader();
searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsDisplayed(filterType.none);
searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsDisplayed(filterType.all);
searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsDisplayed(filterType.folder);
searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsDisplayed(filterType.document);
searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsDisplayed(filterType.custom);
searchFiltersPage.typeFiltersPage().checkFilterRadioButtonIsChecked(filterType.none);
searchFiltersPage.typeFiltersPage().clickFilterRadioButton(filterType.custom);
contentList.checkContentIsDisplayed(nodeNames.document);
contentList.checkContentIsNotDisplayed(nodeNames.folder);
});
});
});
+242
View File
@@ -0,0 +1,242 @@
/*!
* @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 } from '../../pages/adf/dialog/searchDialog';
import { DataTablePage } from '../../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 } from '../../models/ACS/acsUserModel';
import { FileModel } from '../../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 sizeSliderFilter = searchFilters.sizeSliderFilterPage();
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
});
let file2Bytes;
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-');
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);
done();
});
beforeEach(() => {
searchFilters.checkSizeSliderFilterIsDisplayed()
.clickSizeSliderFilterHeader()
.checkSizeSliderFilterIsExpanded();
});
afterEach(async (done) => {
await browser.refresh();
done();
});
it('[C276970] Should be able to expand/collapse Search Size Slider', () => {
searchFilters.checkSizeSliderFilterIsExpanded()
.clickSizeSliderFilterHeader();
sizeSliderFilter.checkSliderIsDisplayed()
.checkClearButtonIsDisplayed()
.checkClearButtonIsEnabled();
searchFilters.checkSizeSliderFilterIsCollapsed();
});
it('[C276972] Should be keep value when Search Size Slider is collapsed', () => {
let size = 5;
sizeSliderFilter.checkSliderIsDisplayed().setValue(size);
searchFilters.clickSizeSliderFilterHeader()
.checkSizeSliderFilterIsCollapsed()
.clickSizeSliderFilterHeader()
.checkSizeSliderFilterIsExpanded()
.checkSizeSliderFilterIsDisplayed();
expect(sizeSliderFilter.getValue()).toEqual(`${size}`);
});
it('[C276981] Should be able to clear value in Search Size Slider', () => {
let size = 5;
sizeSliderFilter.checkSliderIsDisplayed().setValue(size);
searchResults.sortBySize(false)
.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 <= size).toBe(true);
});
});
sizeSliderFilter.checkSliderIsDisplayed()
.clickClearButton();
searchResults.sortBySize(false)
.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 >= size).toBe(true);
});
});
});
describe('Configuration change', () => {
let jsonFile;
beforeEach(() => {
let searchConfiguration = new SearchConfiguration();
jsonFile = searchConfiguration.getConfiguration();
});
it('[C276983] Should be able to disable thumb label in Search Size Slider', () => {
jsonFile.categories[2].component.settings.thumbLabel = false;
navigationBar.clickConfigEditorButton();
configEditor.clickSearchConfiguration();
configEditor.clickClearButton();
configEditor.enterConfiguration(JSON.stringify(jsonFile)).clickSaveButton();
searchDialog.checkSearchIconIsVisible()
.clickOnSearchIcon()
.enterTextAndPressEnter('*');
searchFilters.checkSizeSliderFilterIsDisplayed()
.clickSizeSliderFilterHeader()
.checkSizeSliderFilterIsExpanded();
sizeSliderFilter.checkSliderWithThumbLabelIsNotDisplayed();
});
it('[C276985] Should be able to set min value for Search Size Slider', () => {
let minSize = 3;
jsonFile.categories[2].component.settings.min = minSize;
navigationBar.clickConfigEditorButton();
configEditor.clickSearchConfiguration();
configEditor.clickClearButton();
configEditor.enterConfiguration(JSON.stringify(jsonFile)).clickSaveButton();
searchDialog.checkSearchIconIsVisible()
.clickOnSearchIcon()
.enterTextAndPressEnter('*');
searchFilters.checkSizeSliderFilterIsDisplayed()
.clickSizeSliderFilterHeader()
.checkSizeSliderFilterIsExpanded();
sizeSliderFilter.checkSliderIsDisplayed();
expect(sizeSliderFilter.getMinValue()).toEqual(`${minSize}`);
});
it('[C276986] Should be able to set max value for Search Size Slider', () => {
let maxSize = 50;
jsonFile.categories[2].component.settings.max = maxSize;
navigationBar.clickConfigEditorButton();
configEditor.clickSearchConfiguration();
configEditor.clickClearButton();
configEditor.enterConfiguration(JSON.stringify(jsonFile)).clickSaveButton();
searchDialog.checkSearchIconIsVisible()
.clickOnSearchIcon()
.enterTextAndPressEnter('*');
searchFilters.checkSizeSliderFilterIsDisplayed()
.clickSizeSliderFilterHeader()
.checkSizeSliderFilterIsExpanded();
sizeSliderFilter.checkSliderIsDisplayed();
expect(sizeSliderFilter.getMaxValue()).toEqual(`${maxSize}`);
});
it('[C276987] Should be able to set steps for Search Size Slider', () => {
let step = 10;
jsonFile.categories[2].component.settings.step = step;
navigationBar.clickConfigEditorButton();
configEditor.clickSearchConfiguration();
configEditor.clickClearButton();
configEditor.enterConfiguration(JSON.stringify(jsonFile)).clickSaveButton();
searchDialog.checkSearchIconIsVisible()
.clickOnSearchIcon()
.enterTextAndPressEnter('*');
searchFilters.checkSizeSliderFilterIsDisplayed()
.clickSizeSliderFilterHeader()
.checkSizeSliderFilterIsExpanded();
let randomValue = 5;
sizeSliderFilter.checkSliderIsDisplayed()
.setValue(randomValue);
expect(sizeSliderFilter.getValue()).toEqual(`0`);
sizeSliderFilter.setValue(step);
expect(sizeSliderFilter.getValue()).toEqual(`${step}`);
});
});
});
+133
View File
@@ -0,0 +1,133 @@
/*!
* @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 } from 'protractor';
import { AcsUserModel } from '../../models/ACS/acsUserModel';
import { FolderModel } from '../../models/ACS/folderModel';
import TestConfig = require('../../test.config');
import AlfrescoApi = require('alfresco-js-api-node');
import { LoginPage } from '../../pages/adf/loginPage';
import { SearchDialog } from '../../pages/adf/dialog/searchDialog';
import { SearchResultsPage } from '../../pages/adf/searchResultsPage';
import { SearchFiltersPage } from '../../pages/adf/searchFiltersPage';
import { ConfigEditorPage } from '../../pages/adf/configEditorPage';
import { NavigationBarPage } from '../../pages/adf/navigationBarPage';
import { SearchConfiguration } from '../search.config';
describe('Search component - Text widget', () => {
const configEditorPage = new ConfigEditorPage();
const navigationBarPage = new NavigationBarPage();
const searchFiltersPage = new SearchFiltersPage();
let loginPage = new LoginPage();
let searchDialog = new SearchDialog();
let searchResultPage = new SearchResultsPage();
let acsUser = new AcsUserModel();
let newFolderModel = new FolderModel({'name': 'newFolder', 'description': 'newDescription'});
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);
await this.alfrescoJsApi.nodes.addNode('-my-', {
'name': newFolderModel.name,
'nodeType': 'cm:folder',
'properties':
{
'cm:description': newFolderModel.description
}
}, {}, {});
await browser.driver.sleep(10000);
loginPage.loginToContentServicesUsingUserModel(acsUser);
done();
});
it('[C289329] Placeholder should be displayed in the widget when the input string is empty', () => {
browser.get(TestConfig.adf.url + '/search;q=*');
searchResultPage.tableIsLoaded();
searchFiltersPage.checkNameFilterIsDisplayed();
expect(searchFiltersPage.textFiltersPage().getNamePlaceholder()).toEqual('Enter the name');
});
describe('configuration change', () => {
let jsonFile;
beforeAll(() => {
let searchConfiguration = new SearchConfiguration();
jsonFile = searchConfiguration.getConfiguration();
});
it('[C289330] Should be able to change the Field setting', () => {
browser.get(TestConfig.adf.url + '/search;q=*');
searchResultPage.tableIsLoaded();
searchFiltersPage.checkCheckListFilterIsDisplayed();
searchFiltersPage.clickCheckListFilter();
searchFiltersPage.checkListFiltersPage().clickCheckListOption('Folder');
searchFiltersPage.checkNameFilterIsDisplayed();
searchFiltersPage.textFiltersPage().searchByName(newFolderModel.name);
searchResultPage.checkContentIsDisplayed(newFolderModel.name);
searchFiltersPage.textFiltersPage().searchByName(newFolderModel.description);
searchResultPage.checkContentIsNotDisplayed(newFolderModel.name);
jsonFile.categories[0].component.settings.field = 'cm:description';
navigationBarPage.clickConfigEditorButton();
configEditorPage.clickSearchConfiguration();
configEditorPage.clickClearButton();
configEditorPage.enterBigConfigurationText(JSON.stringify(jsonFile));
configEditorPage.clickSaveButton();
searchDialog.clickOnSearchIcon().enterTextAndPressEnter('*');
searchResultPage.tableIsLoaded();
searchFiltersPage.checkCheckListFilterIsDisplayed();
searchFiltersPage.clickCheckListFilter();
searchFiltersPage.checkListFiltersPage().clickCheckListOption('Folder');
searchFiltersPage.checkNameFilterIsDisplayed();
searchFiltersPage.textFiltersPage().searchByName(newFolderModel.name);
searchResultPage.checkContentIsNotDisplayed(newFolderModel.name);
searchFiltersPage.textFiltersPage().searchByName(newFolderModel.description);
searchResultPage.checkContentIsDisplayed(newFolderModel.name);
});
});
});
+175
View File
@@ -0,0 +1,175 @@
/*!
* @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.
*/
export class SearchConfiguration {
constructor() {
}
getConfiguration() {
return {
'include': ['path', 'allowableOperations'],
'sorting': {
'options': [
{'key': 'name', 'label': 'Name', 'type': 'FIELD', 'field': 'cm:name', 'ascending': true},
{
'key': 'content.sizeInBytes',
'label': 'Size',
'type': 'FIELD',
'field': 'content.size',
'ascending': true
},
{
'key': 'description',
'label': 'Description',
'type': 'FIELD',
'field': 'cm:description',
'ascending': true
},
{
'key': 'createdByUser',
'label': 'Author',
'type': 'FIELD',
'field': 'cm:creator',
'ascending': true
},
{'key': 'createdAt', 'label': 'Created', 'type': 'FIELD', 'field': 'cm:created', 'ascending': true}
],
'defaults': [
{'key': 'name', 'type': 'FIELD', 'field': 'cm:name', 'ascending': true}
]
},
'filterQueries': [
{'query': "TYPE:'cm:folder' OR TYPE:'cm:content'"},
{'query': 'NOT cm:creator:System'}
],
'facetFields': {
'expanded': true,
'fields': [
{'field': 'content.mimetype', 'mincount': 1, 'label': '1:Type'},
{'field': 'content.size', 'mincount': 1, 'label': '2:Size'},
{'field': 'creator', 'mincount': 1, 'label': '3:Creator'},
{'field': 'modifier', 'mincount': 1, 'label': '4:Modifier'},
{'field': 'created', 'mincount': 1, 'label': '5:Created'}
]
},
'facetQueries': {
'label': 'My facet queries',
'pageSize': 5,
'queries': [
{'query': 'created:2018', 'label': '1.Created This Year'},
{'query': 'content.mimetype', 'label': '2.Type'},
{'query': 'content.size:[0 TO 10240]', 'label': '3.Size: xtra small'},
{'query': 'content.size:[10240 TO 102400]', 'label': '4.Size: small'},
{'query': 'content.size:[102400 TO 1048576]', 'label': '5.Size: medium'},
{'query': 'content.size:[1048576 TO 16777216]', 'label': '6.Size: large'},
{'query': 'content.size:[16777216 TO 134217728]', 'label': '7.Size: xtra large'},
{'query': 'content.size:[134217728 TO MAX]', 'label': '8.Size: XX large'}
]
},
'categories': [
{
'id': 'queryName',
'name': 'Name',
'enabled': true,
'expanded': true,
'component': {
'selector': 'text',
'settings': {
'pattern': "cm:name:'(.*?)'",
'field': 'cm:name',
'placeholder': 'Enter the name'
}
}
},
{
'id': 'checkList',
'name': 'Check List',
'enabled': true,
'component': {
'selector': 'check-list',
'settings': {
'pageSize': 5,
'operator': 'OR',
'options': [
{'name': 'Folder', 'value': "TYPE:'cm:folder'"},
{'name': 'Document', 'value': "TYPE:'cm:content'"}
]
}
}
},
{
'id': 'contentSize',
'name': 'Content Size',
'enabled': true,
'component': {
'selector': 'slider',
'settings': {
'field': 'cm:content.size',
'min': 0,
'max': 18,
'step': 1,
'thumbLabel': true
}
}
},
{
'id': 'contentSizeRange',
'name': 'Content Size (range)',
'enabled': true,
'component': {
'selector': 'number-range',
'settings': {
'field': 'cm:content.size',
'format': '[{FROM} TO {TO}]'
}
}
},
{
'id': 'createdDateRange',
'name': 'Created Date (range)',
'enabled': true,
'component': {
'selector': 'date-range',
'settings': {
'field': 'cm:created',
'dateFormat': 'DD-MMM-YY'
}
}
},
{
'id': 'queryType',
'name': 'Type',
'enabled': true,
'component': {
'selector': 'radio',
'settings': {
'field': null,
'pageSize': 5,
'options': [
{'name': 'APP.SEARCH.RADIO.NONE', 'value': '', 'default': true},
{'name': 'APP.SEARCH.RADIO.ALL', 'value': "TYPE:'cm:folder' OR TYPE:'cm:content'"},
{'name': 'APP.SEARCH.RADIO.FOLDER', 'value': "TYPE:'cm:folder'"},
{'name': 'APP.SEARCH.RADIO.DOCUMENT', 'value': "TYPE:'cm:content'"}
]
}
}
}
]
};
}
}
+300
View File
@@ -0,0 +1,300 @@
/*!
* @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 } from 'protractor';
import { LoginPage } from '../pages/adf/loginPage';
import { SearchDialog } from '../pages/adf/dialog/searchDialog';
import { ContentServicesPage } from '../pages/adf/contentServicesPage';
import { FilePreviewPage } from '../pages/adf/filePreviewPage';
import { SearchResultsPage } from '../pages/adf/searchResultsPage';
import { AcsUserModel } from '../models/ACS/acsUserModel';
import { FileModel } from '../models/ACS/fileModel';
import { FolderModel } from '../models/ACS/folderModel';
import TestConfig = require('../test.config');
import { Util } from '../util/util';
import AlfrescoApi = require('alfresco-js-api-node');
import { UploadActions } from '../actions/ACS/upload.actions';
xdescribe('Search component - Search Bar', () => {
let search = {
inactive: {
firstChar: 'x',
secondChar: 'y',
thirdChar: 'z',
name: 'impossible-name-folder' + Util.generateRandomString(8)
}
};
let loginPage = new LoginPage();
let contentServicesPage = new ContentServicesPage();
let searchDialog = new SearchDialog();
let searchResultPage = new SearchResultsPage();
let filePreviewPage = new FilePreviewPage();
let acsUser = new AcsUserModel();
let filename = Util.generateRandomString(16);
let firstFolderName = Util.generateRandomString(16);
let secondFolderName = Util.generateRandomString(16);
let thirdFolderName = Util.generateRandomString(16);
let filesToDelete = [];
let firstFileModel = new FileModel({
'name': filename, 'shortName': filename.substring(0, 8)
});
let firstFolderModel = new FolderModel({
'name': firstFolderName, 'shortName': firstFolderName.substring(0, 8)
});
let secondFolder = new FolderModel({
'name': secondFolderName, 'shortName': secondFolderName.substring(0, 8)
});
let thirdFolder = new FolderModel({
'name': thirdFolderName, 'shortName': thirdFolderName.substring(0, 8)
});
beforeAll(async (done) => {
let uploadActions = new UploadActions();
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);
let firstFileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, firstFileModel.location, firstFileModel.name, '-my-');
Object.assign(firstFileModel, firstFileUploaded.entry);
filesToDelete.push(await uploadActions.uploadFolder(this.alfrescoJsApi, firstFolderModel.name, '-my-'));
filesToDelete.push(await uploadActions.uploadFolder(this.alfrescoJsApi, secondFolder.name, '-my-'));
filesToDelete.push(await uploadActions.uploadFolder(this.alfrescoJsApi, thirdFolder.name, '-my-'));
await browser.driver.sleep(15000); // wait search index previous file/folder uploaded
loginPage.loginToContentServicesUsingUserModel(acsUser);
done();
});
afterAll(async (done) => {
let uploadActions = new UploadActions();
filesToDelete.forEach(async (currentNode) => {
await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, currentNode.entry.id);
});
done();
});
beforeEach(() => {
contentServicesPage.goToDocumentList();
});
it('[C272798] Search bar should be visible', () => {
searchDialog
.checkSearchBarIsNotVisible()
.checkSearchIconIsVisible();
searchDialog
.clickOnSearchIcon()
.checkSearchBarIsVisible()
.checkSearchIconIsVisible();
searchDialog
.clickOnSearchIcon()
.checkSearchBarIsNotVisible()
.checkSearchIconIsVisible();
});
it('[C272799] Should be possible to hide search bar after input', () => {
searchDialog
.checkSearchIconIsVisible()
.clickOnSearchIcon()
.enterText(firstFolderModel.shortName);
searchDialog
.clickOnSearchIcon()
.checkSearchBarIsNotVisible()
.checkSearchIconIsVisible();
contentServicesPage.checkAcsContainer();
});
it('[C260255] Should display message when searching for an inexistent file', () => {
searchDialog
.checkSearchBarIsNotVisible()
.clickOnSearchIcon()
.checkNoResultMessageIsNotDisplayed()
.enterText(search.inactive.name)
.checkNoResultMessageIsDisplayed();
searchDialog.clearText();
searchDialog.checkSearchBarIsNotVisible();
});
it('[C260256] Should display file/folder in search suggestion when typing first characters', () => {
searchDialog
.clickOnSearchIcon()
.checkSearchBarIsVisible()
.enterText(firstFolderModel.shortName);
searchDialog.resultTableContainsRow(firstFolderModel.name);
expect(searchDialog.getSpecificRowsHighlightName(firstFolderModel.name)).toEqual(firstFolderModel.shortName);
expect(searchDialog.getSpecificRowsAuthor(firstFolderModel.name)).toEqual(acsUser.firstName + ' ' + acsUser.lastName);
expect(searchDialog.getSpecificRowsCompleteName(firstFolderModel.name)).toEqual(firstFolderModel.name);
searchDialog.clearText();
searchDialog.checkSearchBarIsNotVisible();
searchDialog.clickOnSearchIcon().enterText(firstFileModel.shortName);
searchDialog.resultTableContainsRow(firstFileModel.name);
expect(searchDialog.getSpecificRowsHighlightName(firstFileModel.name)).toEqual(firstFileModel.shortName);
expect(searchDialog.getSpecificRowsAuthor(firstFileModel.name)).toEqual(acsUser.firstName + ' ' + acsUser.lastName);
expect(searchDialog.getSpecificRowsCompleteName(firstFileModel.name)).toEqual(firstFileModel.name);
searchDialog.clearText();
searchDialog.checkSearchBarIsNotVisible();
});
it('[C272800] Should display file/folder in search suggestion when typing name', () => {
searchDialog
.clickOnSearchIcon()
.checkSearchBarIsVisible()
.enterText(firstFolderModel.name);
searchDialog.resultTableContainsRow(firstFolderModel.name);
expect(searchDialog.getSpecificRowsHighlightName(firstFolderModel.name)).toEqual(firstFolderModel.name);
expect(searchDialog.getSpecificRowsAuthor(firstFolderModel.name)).toEqual(acsUser.firstName + ' ' + acsUser.lastName);
expect(searchDialog.getSpecificRowsCompleteName(firstFolderModel.name)).toEqual(firstFolderModel.name);
searchDialog.clearText();
searchDialog.checkSearchBarIsNotVisible();
searchDialog.clickOnSearchIcon().enterText(firstFileModel.name);
searchDialog.resultTableContainsRow(firstFileModel.name);
expect(searchDialog.getSpecificRowsHighlightName(firstFileModel.name)).toEqual(firstFileModel.name);
expect(searchDialog.getSpecificRowsAuthor(firstFileModel.name)).toEqual(acsUser.firstName + ' ' + acsUser.lastName);
expect(searchDialog.getSpecificRowsCompleteName(firstFileModel.name)).toEqual(firstFileModel.name);
searchDialog.clearText();
searchDialog.checkSearchBarIsNotVisible();
});
it('[C260257] Should display content when clicking on folder from search suggestions', () => {
searchDialog
.clickOnSearchIcon()
.checkSearchBarIsVisible()
.enterText(firstFolderModel.shortName);
searchDialog.resultTableContainsRow(firstFolderModel.name);
searchDialog.clickOnSpecificRow(firstFolderModel.name);
contentServicesPage
.checkAcsContainer()
.waitForTableBody();
expect(contentServicesPage.currentFolderName()).toEqual(firstFolderModel.name);
contentServicesPage.goToDocumentList();
searchDialog
.checkSearchIconIsVisible()
.clickOnSearchIcon()
.checkSearchBarIsVisible()
.enterText(firstFileModel.name)
.resultTableContainsRow(firstFileModel.name);
searchDialog.clickOnSpecificRow(firstFileModel.name);
expect(filePreviewPage.getPDFTitleFromSearch()).toEqual(firstFileModel.name);
filePreviewPage.closePreviewWithButton();
});
it('[C272801] Should display message when searching for non-existent folder', () => {
searchDialog
.checkSearchIconIsVisible()
.clickOnSearchIcon()
.checkSearchBarIsVisible()
.enterTextAndPressEnter(search.inactive.name);
searchResultPage.checkNoResultMessageIsDisplayed();
});
it('[C272802] Should be able to find an existent folder in search results', () => {
searchDialog
.checkSearchIconIsVisible()
.clickOnSearchIcon()
.checkSearchBarIsVisible()
.enterTextAndPressEnter(firstFolderModel.name);
searchResultPage.checkContentIsDisplayed(firstFolderModel.name);
});
it('[C260258] Should be able to find an existent file in search results', () => {
searchDialog
.checkSearchIconIsVisible()
.clickOnSearchIcon()
.checkSearchBarIsVisible()
.enterTextAndPressEnter(firstFileModel.name);
searchResultPage.checkContentIsDisplayed(firstFileModel.name);
});
it('[C91321] Should be able to use down arrow key when navigating throw suggestions', () => {
searchDialog
.checkSearchIconIsVisible()
.clickOnSearchIcon()
.checkSearchBarIsVisible()
.enterText(secondFolder.shortName)
.pressDownArrowAndEnter();
contentServicesPage.checkAcsContainer();
expect(contentServicesPage.currentFolderName()).toEqual(secondFolder.name);
});
xit('[C260254] Search bar should get closed when changing browser tab', () => {
searchDialog
.checkSearchIconIsVisible()
.clickOnSearchIcon()
.checkSearchBarIsVisible()
.enterText(secondFolder.shortName);
searchDialog.resultTableContainsRow(secondFolder.name);
Util.openNewTabInBrowser();
Util.switchToWindowHandler(0);
browser.sleep(500);
searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible();
});
});
+152
View File
@@ -0,0 +1,152 @@
/*!
* @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 } from '../pages/adf/dialog/searchDialog';
import { SearchFiltersPage } from '../pages/adf/searchFiltersPage';
import { PaginationPage } from '../pages/adf/paginationPage';
import { ContentListPage } from '../pages/adf/dialog/contentListPage';
import { AcsUserModel } from '../models/ACS/acsUserModel';
import { FileModel } from '../models/ACS/fileModel';
import TestConfig = require('../test.config');
import { Util } from '../util/util';
import resources = require('../util/resources');
import AlfrescoApi = require('alfresco-js-api-node');
import { UploadActions } from '../actions/ACS/upload.actions';
import { browser } from 'protractor';
describe('Search Filters', () => {
let loginPage = new LoginPage();
let searchDialog = new SearchDialog();
let searchFiltersPage = new SearchFiltersPage();
let uploadActions = new UploadActions();
let paginationPage = new PaginationPage();
let contentList = new ContentListPage();
let acsUser = new AcsUserModel();
let filename = Util.generateRandomString(16);
let fileModel = new FileModel({
'name': filename, 'shortName': filename.substring(0, 8)
});
let pngFileModel = new FileModel({
'name': resources.Files.ADF_DOCUMENTS.PNG.file_name,
'location': resources.Files.ADF_DOCUMENTS.PNG.file_location
});
let fileUploaded, fileTypePng;
let filter = { type: 'TYPE-PNG Image' };
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);
fileUploaded = await uploadActions.uploadFile(this.alfrescoJsApi, fileModel.location, fileModel.name, '-my-');
fileTypePng = await uploadActions.uploadFile(this.alfrescoJsApi, pngFileModel.location, pngFileModel.name, '-my-');
loginPage.loginToContentServicesUsingUserModel(acsUser);
await browser.driver.sleep(30000); // wait search index previous file/folder uploaded
searchDialog.checkSearchIconIsVisible();
searchDialog.clickOnSearchIcon();
searchDialog.enterTextAndPressEnter(fileUploaded.entry.name);
searchFiltersPage.checkSearchFiltersIsDisplayed();
done();
});
afterAll(async (done) => {
await this.alfrescoJsApi.login(acsUser.id, acsUser.password);
await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, fileUploaded.entry.id);
await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, fileTypePng.entry.id);
done();
});
it('[C286298] Should be able to cancel a filter using "x" button from the toolbar', () => {
let userOption = `${acsUser.firstName} ${acsUser.lastName}`;
searchFiltersPage.creatorCheckListFiltersPage().filterBy(userOption)
.checkChipIsDisplayed(userOption)
.removeFilterOption(userOption)
.checkChipIsNotDisplayed(userOption);
});
it('[C277146] Should Show more/less buttons be hidden when inactive', () => {
browser.get(TestConfig.adf.url + '/search;q=*');
searchFiltersPage.creatorCheckListFiltersPage().checkShowLessButtonIsNotDisplayed()
.checkShowMoreButtonIsDisplayed()
.clickShowMoreButtonUntilIsNotDisplayed()
.checkShowLessButtonIsDisplayed()
.clickShowLessButtonUntilIsNotDisplayed();
});
it('[C286556] Search categories should preserve their collapsed/expanded state after the search', () => {
browser.get(TestConfig.adf.url + '/search;q=*');
searchFiltersPage.clickFileTypeListFilter()
.checkFileTypeFilterIsCollapsed()
.clickFileSizeFilterHeader()
.checkFileSizeFilterIsCollapsed();
searchFiltersPage.creatorCheckListFiltersPage().clickCheckListOption('Administrator');
searchFiltersPage.checkFileTypeFilterIsCollapsed()
.checkFileSizeFilterIsCollapsed();
});
it('[C287796] Should be able to display the correct bucket number after selecting a filter', () => {
browser.get(TestConfig.adf.url + '/search;q=*');
searchFiltersPage.fileTypeCheckListFiltersPage().clickCheckListOption('PNG Image');
let bucketNumberForFilter = searchFiltersPage.fileTypeCheckListFiltersPage().getBucketNumberOfFilterType(filter.type);
let resultFileNames = contentList.getAllRowsNameColumn();
expect(bucketNumberForFilter).not.toEqual('0');
expect(paginationPage.getTotalNumberOfFiles()).toEqual(bucketNumberForFilter);
resultFileNames.then((fileNames) => {
fileNames.map((nameOfResultFiles) => {
expect(nameOfResultFiles).toContain('.png');
});
});
});
});
+250
View File
@@ -0,0 +1,250 @@
/*!
* @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 TestConfig = require('../test.config');
import AlfrescoApi = require('alfresco-js-api-node');
import { Util } from '../util/util';
import resources = require('../util/resources');
import CONSTANTS = require('../util/constants');
import { UploadActions } from '../actions/ACS/upload.actions';
import { browser } from 'protractor';
import { LoginPage } from '../pages/adf/loginPage';
import { SearchDialog } from '../pages/adf/dialog/searchDialog';
import { SearchResultsPage } from '../pages/adf/searchResultsPage';
import { SearchFiltersPage } from '../pages/adf/searchFiltersPage';
import { AcsUserModel } from '../models/ACS/acsUserModel';
import { FileModel } from '../models/ACS/fileModel';
describe('Search Component - Multi-Select Facet', () => {
let loginPage = new LoginPage();
let searchDialog = new SearchDialog();
let searchResultsPage = new SearchResultsPage();
let uploadActions = new UploadActions();
let searchFiltersPage = new SearchFiltersPage();
let site, userOption;
beforeAll(() => {
this.alfrescoJsApi = new AlfrescoApi({
provider: 'ECM',
hostEcm: TestConfig.adf.url
});
});
describe('', () => {
let jpgFile, jpgFileSite, txtFile, txtFileSite;
let acsUser = new AcsUserModel();
let randomName = Util.generateRandomString();
let jpgFileInfo = new FileModel({
'location': resources.Files.ADF_DOCUMENTS.JPG.file_location,
'name': `${randomName}.jpg`
});
let txtFileInfo = new FileModel({
'location': resources.Files.ADF_DOCUMENTS.TXT_0B.file_location,
'name': `${randomName}.txt`
});
beforeAll(async (done) => {
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);
site = await this.alfrescoJsApi.core.sitesApi.createSite({
title: Util.generateRandomString(8),
visibility: 'PUBLIC'
});
jpgFile = await uploadActions.uploadFile(this.alfrescoJsApi, jpgFileInfo.location, jpgFileInfo.name, '-my-');
jpgFileSite = await uploadActions.uploadFile(this.alfrescoJsApi, jpgFileInfo.location, jpgFileInfo.name, site.entry.guid);
txtFile = await uploadActions.uploadFile(this.alfrescoJsApi, txtFileInfo.location, txtFileInfo.name, '-my-');
txtFileSite = await uploadActions.uploadFile(this.alfrescoJsApi, txtFileInfo.location, txtFileInfo.name, site.entry.guid);
await browser.driver.sleep(30000);
loginPage.loginToContentServicesUsingUserModel(acsUser);
searchDialog.checkSearchIconIsVisible();
searchDialog.clickOnSearchIcon();
searchDialog.enterTextAndPressEnter(`${randomName}`);
userOption = `${acsUser.firstName} ${acsUser.lastName}`;
searchFiltersPage.checkSearchFiltersIsDisplayed();
searchFiltersPage.creatorCheckListFiltersPage().filterBy(userOption);
done();
});
afterAll(async (done) => {
Promise.all([
uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, jpgFile.entry.id),
uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, jpgFileSite.entry.id),
uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, txtFile.entry.id),
uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, txtFileSite.entry.id)
]);
await this.alfrescoJsApi.core.sitesApi.deleteSite(site.entry.id);
done();
});
it('[C280054] Should be able to select multiple items from a search facet filter', () => {
searchFiltersPage.fileTypeCheckListFiltersPage().filterBy('Plain Text');
expect(searchResultsPage.numberOfResultsDisplayed()).toBe(2);
searchResultsPage.checkContentIsDisplayed(txtFile.entry.name);
searchResultsPage.checkContentIsDisplayed(txtFileSite.entry.name);
searchFiltersPage.fileTypeCheckListFiltersPage().filterBy('JPEG Image');
expect(searchResultsPage.numberOfResultsDisplayed()).toBe(4);
searchResultsPage.checkContentIsDisplayed(txtFile.entry.name);
searchResultsPage.checkContentIsDisplayed(txtFileSite.entry.name);
searchResultsPage.checkContentIsDisplayed(jpgFile.entry.name);
searchResultsPage.checkContentIsDisplayed(jpgFileSite.entry.name);
});
});
describe('', () => {
let jpgFile, txtFile;
let userUploadingTxt = new AcsUserModel();
let userUploadingImg = new AcsUserModel();
let randomName = Util.generateRandomString();
let jpgFileInfo = new FileModel({
'location': resources.Files.ADF_DOCUMENTS.JPG.file_location,
'name': `${randomName}.jpg`
});
let txtFileInfo = new FileModel({
'location': resources.Files.ADF_DOCUMENTS.TXT_0B.file_location,
'name': `${randomName}.txt`
});
beforeAll(async (done) => {
await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword);
await this.alfrescoJsApi.core.peopleApi.addPerson(userUploadingTxt);
await this.alfrescoJsApi.core.peopleApi.addPerson(userUploadingImg);
await this.alfrescoJsApi.login(userUploadingTxt.id, userUploadingTxt.password);
site = await this.alfrescoJsApi.core.sitesApi.createSite({
title: Util.generateRandomString(8),
visibility: 'PUBLIC'
});
await this.alfrescoJsApi.core.sitesApi.addSiteMember(site.entry.id, {
id: userUploadingImg.id,
role: CONSTANTS.CS_USER_ROLES.MANAGER
});
txtFile = await uploadActions.uploadFile(this.alfrescoJsApi, txtFileInfo.location, txtFileInfo.name, site.entry.guid);
await this.alfrescoJsApi.login(userUploadingImg.id, userUploadingImg.password);
jpgFile = await uploadActions.uploadFile(this.alfrescoJsApi, jpgFileInfo.location, jpgFileInfo.name, site.entry.guid);
await browser.driver.sleep(30000);
loginPage.loginToContentServicesUsingUserModel(userUploadingImg);
searchDialog.checkSearchIconIsVisible();
searchDialog.clickOnSearchIcon();
searchDialog.enterTextAndPressEnter(`*${randomName}*`);
done();
});
it('[C280056] Should be able to select multiple items from multiple search facet filters', () => {
searchFiltersPage.checkSearchFiltersIsDisplayed();
searchFiltersPage.creatorCheckListFiltersPage().filterBy(`${userUploadingTxt.firstName} ${userUploadingTxt.lastName}`);
searchFiltersPage.creatorCheckListFiltersPage().filterBy(`${userUploadingImg.firstName} ${userUploadingImg.lastName}`);
searchResultsPage.checkContentIsDisplayed(txtFile.entry.name);
searchResultsPage.checkContentIsDisplayed(jpgFile.entry.name);
searchFiltersPage.fileTypeCheckListFiltersPage().filterBy('Plain Text');
searchFiltersPage.fileTypeCheckListFiltersPage().filterBy('JPEG Image');
expect(searchResultsPage.numberOfResultsDisplayed()).toBe(2);
searchResultsPage.checkContentIsDisplayed(txtFile.entry.name);
searchResultsPage.checkContentIsDisplayed(jpgFile.entry.name);
});
});
describe('', () => {
let txtFile;
let acsUser = new AcsUserModel();
let randomName = Util.generateRandomString();
let txtFileInfo = new FileModel({
'location': resources.Files.ADF_DOCUMENTS.TXT_0B.file_location,
'name': `${randomName}.txt`
});
beforeAll(async (done) => {
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);
site = await this.alfrescoJsApi.core.sitesApi.createSite({
title: Util.generateRandomString(8),
visibility: 'PUBLIC'
});
txtFile = await uploadActions.uploadFile(this.alfrescoJsApi, txtFileInfo.location, txtFileInfo.name, '-my-');
await browser.driver.sleep(30000);
loginPage.loginToContentServicesUsingUserModel(acsUser);
searchDialog.checkSearchIconIsVisible();
searchDialog.clickOnSearchIcon();
searchDialog.enterTextAndPressEnter(`*${randomName}*`);
searchFiltersPage.checkSearchFiltersIsDisplayed();
done();
});
afterAll(async (done) => {
await uploadActions.deleteFilesOrFolder(this.alfrescoJsApi, txtFile.entry.id);
await this.alfrescoJsApi.core.sitesApi;
done();
});
it('[C280058] Should update filter facets items number when another filter facet item is selected', () => {
searchFiltersPage.fileTypeCheckListFiltersPage().filterBy('Plain Text');
searchFiltersPage.creatorCheckListFiltersPage().filterBy(`${acsUser.firstName} ${acsUser.lastName}`);
expect(searchResultsPage.numberOfResultsDisplayed()).toBe(1);
searchResultsPage.checkContentIsDisplayed(txtFile.entry.name);
});
});
});
+296
View File
@@ -0,0 +1,296 @@
/*!
* @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 } from 'protractor';
import { LoginPage } from '../pages/adf/loginPage';
import { SearchDialog } from '../pages/adf/dialog/searchDialog';
import { ContentServicesPage } from '../pages/adf/contentServicesPage';
import { SearchResultsPage } from '../pages/adf/searchResultsPage';
import { FilePreviewPage } from '../pages/adf/filePreviewPage';
import { AcsUserModel } from '../models/ACS/acsUserModel';
import { FolderModel } from '../models/ACS/folderModel';
import { FileModel } from '../models/ACS/fileModel';
import TestConfig = require('../test.config');
import { Util } from '../util/util';
import resources = require('../util/resources');
import AlfrescoApi = require('alfresco-js-api-node');
import { UploadActions } from '../actions/ACS/upload.actions';
describe('Search component - Search Page', () => {
let search = {
active: {
firstFile: null,
secondFile: null,
base: Util.generateRandomString(7),
extension: '.txt'
},
no_permission: {
noPermFile: 'Meetings',
noPermFolder: 'Meeting Notes'
}
};
let loginPage = new LoginPage();
let contentServicesPage = new ContentServicesPage();
let searchDialog = new SearchDialog();
let searchResultPage = new SearchResultsPage();
let filePreviewPage = new FilePreviewPage();
let acsUser = new AcsUserModel();
let emptyFolderModel = new FolderModel({ 'name': 'search' + Util.generateRandomString() });
let firstFileModel;
let newFolderModel = new FolderModel({ 'name': 'newFolder' });
let fileNames = [], adminFileNames = [], nrOfFiles = 15, adminNrOfFiles = 5;
beforeAll(async (done) => {
fileNames = Util.generateSequenceFiles(1, nrOfFiles, search.active.base, search.active.extension);
adminFileNames = Util.generateSequenceFiles(nrOfFiles + 1, nrOfFiles + adminNrOfFiles, search.active.base, search.active.extension);
search.active.firstFile = fileNames[0];
search.active.secondFile = fileNames[1];
fileNames.splice(0, 1);
firstFileModel = new FileModel({
'name': search.active.firstFile,
'location': resources.Files.ADF_DOCUMENTS.TXT.file_location
});
let uploadActions = new UploadActions();
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);
await uploadActions.uploadFolder(this.alfrescoJsApi, emptyFolderModel.name, '-my-');
let newFolderModelUploaded = await uploadActions.uploadFolder(this.alfrescoJsApi, newFolderModel.name, '-my-');
await uploadActions.createEmptyFiles(this.alfrescoJsApi, fileNames, newFolderModelUploaded.entry.id);
await uploadActions.uploadFile(this.alfrescoJsApi, firstFileModel.location, firstFileModel.name, '-my-');
await this.alfrescoJsApi.login(TestConfig.adf.adminEmail, TestConfig.adf.adminPassword);
await uploadActions.createEmptyFiles(this.alfrescoJsApi, adminFileNames, newFolderModelUploaded.entry.id);
browser.driver.sleep(12000);
loginPage.loginToContentServicesUsingUserModel(acsUser);
done();
});
it('[C260264] Should display message when no results are found', () => {
let notExistentFileName = Util.generateRandomString();
searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon()
.enterTextAndPressEnter(notExistentFileName);
searchResultPage.checkNoResultMessageIsDisplayed();
});
it('[C260265] Should display file previewer when opening a file from search results', () => {
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter(firstFileModel.name);
searchResultPage.checkContentIsDisplayed(firstFileModel.name);
searchResultPage.navigateToFolder(firstFileModel.name);
browser.driver.sleep(200);
filePreviewPage.closePreviewWithButton();
});
it('[C272810] Should display only files corresponding to search', () => {
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter(search.active.firstFile);
searchResultPage.checkContentIsDisplayed(search.active.firstFile);
expect(searchResultPage.numberOfResultsDisplayed()).toBe(1);
});
it('[C260267] Should display content when opening a folder from search results', () => {
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter(emptyFolderModel.name);
searchResultPage.checkNoResultMessageIsNotDisplayed();
searchResultPage.checkContentIsDisplayed(emptyFolderModel.name);
searchResultPage.navigateToFolder(emptyFolderModel.name);
contentServicesPage.currentFolderName().then((result) => {
expect(result).toEqual(emptyFolderModel.name);
});
});
it('[C260261] Should be able to delete a file from search results', () => {
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter(search.active.firstFile);
searchResultPage.checkContentIsDisplayed(search.active.firstFile);
searchResultPage.deleteContent(search.active.firstFile);
searchResultPage.checkNoResultMessageIsDisplayed();
searchResultPage.checkContentIsNotDisplayed(search.active.firstFile);
searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon()
.enterTextAndPressEnter(search.active.firstFile);
searchResultPage.checkNoResultMessageIsDisplayed();
});
it('[C272809] Should be able to delete a folder from search results', () => {
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter(emptyFolderModel.name);
searchResultPage.checkContentIsDisplayed(emptyFolderModel.name);
searchResultPage.checkNoResultMessageIsNotDisplayed();
searchResultPage.checkContentIsDisplayed(emptyFolderModel.name);
searchResultPage.deleteContent(emptyFolderModel.name);
searchResultPage.checkNoResultMessageIsDisplayed();
searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon()
.enterTextAndPressEnter(emptyFolderModel.name);
searchResultPage.checkNoResultMessageIsDisplayed();
});
describe('Sorting', () => {
afterEach(async (done) => {
await browser.refresh();
done();
});
it('[C272803] Should be able to sort results by name (Ascending)', () => {
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter(search.active.base);
searchResultPage.checkContentIsDisplayed(search.active.secondFile);
searchResultPage.sortAndCheckListIsOrderedByName(true).then((result) => {
expect(result).toEqual(true);
});
});
it('[C272804] Should be able to sort results by name (Descending)', () => {
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter(search.active.base);
searchResultPage.checkContentIsDisplayed(search.active.secondFile);
searchResultPage.sortAndCheckListIsOrderedByName(false).then((result) => {
expect(result).toEqual(true);
});
});
it('[C272805] Should be able to sort results by author (Ascending)', () => {
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter(search.active.base);
searchResultPage.checkContentIsDisplayed(search.active.secondFile);
searchResultPage.sortAndCheckListIsOrderedByAuthor(true).then((result) => {
expect(result).toEqual(true);
});
});
it('[C272806] Should be able to sort results by author (Descending)', () => {
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter(search.active.base);
searchResultPage.checkContentIsDisplayed(search.active.secondFile);
searchResultPage.sortAndCheckListIsOrderedByAuthor(false).then((result) => {
expect(result).toEqual(true);
});
});
it('[C272807] Should be able to sort results by date (Ascending)', () => {
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter(search.active.base);
searchResultPage.checkContentIsDisplayed(search.active.secondFile);
searchResultPage.sortAndCheckListIsOrderedByCreated(true).then((result) => {
expect(result).toEqual(true);
});
});
it('[C260260] Should be able to sort results by date (Descending)', () => {
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter(search.active.base);
searchResultPage.checkContentIsDisplayed(search.active.secondFile);
searchResultPage.sortAndCheckListIsOrderedByCreated(false).then((result) => {
expect(result).toEqual(true);
});
});
});
it('[C260262] Should not be able to delete a file from search results without rights', () => {
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter(search.no_permission.noPermFile);
searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFile);
searchResultPage.checkDeleteIsDisabled(search.no_permission.noPermFile);
searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFile);
searchDialog.checkSearchBarIsNotVisible().checkSearchIconIsVisible().clickOnSearchIcon()
.enterTextAndPressEnter(search.no_permission.noPermFile);
searchResultPage.checkNoResultMessageIsNotDisplayed();
searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFile);
});
it('[C272808] Should not be able to delete a folder from search results without rights', () => {
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter(search.no_permission.noPermFolder);
searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFolder);
searchResultPage.checkDeleteIsDisabled(search.no_permission.noPermFolder);
searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFolder);
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter(search.no_permission.noPermFolder);
searchResultPage.checkNoResultMessageIsNotDisplayed();
searchResultPage.checkContentIsDisplayed(search.no_permission.noPermFolder);
});
it('[C286675] Should display results when searching for all elements', () => {
searchDialog
.clickOnSearchIcon()
.enterTextAndPressEnter('*');
searchResultPage.checkNoResultMessageIsNotDisplayed();
});
});