[ACA-1767] add tests for Viewer actions (#641)

* add tests for Viewer actions

* exclude e2e from auto-formatting for now

* update lock file
This commit is contained in:
Adina Parpalita 2018-09-18 18:54:33 +03:00 committed by Denys Vuika
parent f9e9057974
commit a9467dcc47
18 changed files with 2618 additions and 1481 deletions

View File

@ -1,2 +1,3 @@
node_modules
src/assets/i18n
e2e

View File

@ -1,3 +1,3 @@
{
"singleQuote": true
"singleQuote": true
}

View File

@ -30,11 +30,11 @@ export abstract class Component {
component: ElementFinder;
constructor(selector: string, ancestor?: ElementFinder) {
const locator = by.css(selector);
const locator = selector;
this.component = ancestor
? ancestor.element(locator)
: element(locator);
? ancestor.$$(locator).first()
: browser.$$(locator).first();
}
wait() {

View File

@ -30,264 +30,298 @@ import { Menu } from '../menu/menu';
import { Utils } from '../../utilities/utils';
export class DataTable extends Component {
private static selectors = {
root: 'adf-datatable',
private static selectors = {
root: 'adf-datatable',
head: '.adf-datatable-header',
columnHeader: '.adf-datatable-row .adf-datatable-table-cell-header',
sortedColumnHeader: `
head: '.adf-datatable-header',
columnHeader: '.adf-datatable-row .adf-datatable-table-cell-header',
sortedColumnHeader: `
.adf-data-table__header--sorted-asc,
.adf-data-table__header--sorted-desc
`,
body: '.adf-datatable-body',
row: '.adf-datatable-row[role]',
selectedRow: '.adf-datatable-row.is-selected',
cell: '.adf-data-table-cell',
locationLink: '.aca-location-link',
nameLink: '.dl-link',
body: '.adf-datatable-body',
row: '.adf-datatable-row[role]',
selectedRow: '.adf-datatable-row.is-selected',
cell: '.adf-data-table-cell',
locationLink: '.aca-location-link',
nameLink: '.dl-link',
selectedIcon: '.mat-icon',
selectedIcon: '.mat-icon',
emptyListContainer: 'div.adf-no-content-container',
emptyFolderDragAndDrop: '.adf-empty-list_template .adf-empty-folder',
emptyListContainer: 'div.adf-no-content-container',
emptyFolderDragAndDrop: '.adf-empty-list_template .adf-empty-folder',
emptyListTitle: '.adf-empty-content__title',
emptyListSubtitle: '.adf-empty-content__subtitle',
emptyListText: '.adf-empty-content__text'
};
emptyListTitle: '.adf-empty-content__title',
emptyListSubtitle: '.adf-empty-content__subtitle',
emptyListText: '.adf-empty-content__text'
};
head: ElementFinder = this.component.element(by.css(DataTable.selectors.head));
body: ElementFinder = this.component.element(by.css(DataTable.selectors.body));
cell = by.css(DataTable.selectors.cell);
locationLink = by.css(DataTable.selectors.locationLink);
nameLink: ElementFinder = browser.element(by.css(DataTable.selectors.nameLink));
emptyList: ElementFinder = this.component.element(by.css(DataTable.selectors.emptyListContainer));
emptyFolderDragAndDrop: ElementFinder = this.component.element(by.css(DataTable.selectors.emptyFolderDragAndDrop));
emptyListTitle: ElementFinder = this.component.element(by.css(DataTable.selectors.emptyListTitle));
emptyListSubtitle: ElementFinder = this.component.element(by.css(DataTable.selectors.emptyListSubtitle));
emptyListText: ElementArrayFinder = this.component.all(by.css(DataTable.selectors.emptyListText));
head: ElementFinder = this.component.element(by.css(DataTable.selectors.head));
body: ElementFinder = this.component.element(by.css(DataTable.selectors.body));
cell = by.css(DataTable.selectors.cell);
locationLink = by.css(DataTable.selectors.locationLink);
nameLink: ElementFinder = browser.element(by.css(DataTable.selectors.nameLink));
emptyList: ElementFinder = this.component.element(by.css(DataTable.selectors.emptyListContainer));
emptyFolderDragAndDrop: ElementFinder = this.component.element(by.css(DataTable.selectors.emptyFolderDragAndDrop));
emptyListTitle: ElementFinder = this.component.element(by.css(DataTable.selectors.emptyListTitle));
emptyListSubtitle: ElementFinder = this.component.element(by.css(DataTable.selectors.emptyListSubtitle));
emptyListText: ElementArrayFinder = this.component.all(by.css(DataTable.selectors.emptyListText));
menu: Menu = new Menu();
menu: Menu = new Menu();
constructor(ancestor?: ElementFinder) {
super(DataTable.selectors.root, ancestor);
}
constructor(ancestor?: ElementFinder) {
super(DataTable.selectors.root, ancestor);
}
// Wait methods (waits for elements)
waitForHeader() {
return browser.wait(EC.presenceOf(this.head), BROWSER_WAIT_TIMEOUT);
}
// Wait methods (waits for elements)
waitForHeader() {
return browser.wait(EC.presenceOf(this.head), BROWSER_WAIT_TIMEOUT);
}
waitForEmptyState() {
return browser.wait(EC.presenceOf(this.emptyList), BROWSER_WAIT_TIMEOUT);
}
waitForEmptyState() {
return browser.wait(EC.presenceOf(this.emptyList), BROWSER_WAIT_TIMEOUT);
}
// Header/Column methods
getColumnHeaders(): ElementArrayFinder {
const locator = by.css(DataTable.selectors.columnHeader);
return this.head.all(locator);
}
// Header/Column methods
getColumnHeaders(): ElementArrayFinder {
const locator = by.css(DataTable.selectors.columnHeader);
return this.head.all(locator);
}
getNthColumnHeader(nth: number): ElementFinder {
return this.getColumnHeaders().get(nth - 1);
}
getNthColumnHeader(nth: number): ElementFinder {
return this.getColumnHeaders().get(nth - 1);
}
getColumnHeaderByLabel(label: string): ElementFinder {
const locator = by.cssContainingText(DataTable.selectors.columnHeader, label);
return this.head.element(locator);
}
getColumnHeaderByLabel(label: string): ElementFinder {
const locator = by.cssContainingText(DataTable.selectors.columnHeader, label);
return this.head.element(locator);
}
getSortedColumnHeader(): ElementFinder {
const locator = by.css(DataTable.selectors.sortedColumnHeader);
return this.head.element(locator);
}
getSortedColumnHeader(): ElementFinder {
const locator = by.css(DataTable.selectors.sortedColumnHeader);
return this.head.element(locator);
}
getSortingOrder() {
return this.getSortedColumnHeader().getAttribute('class')
.then(str => {
if (str.includes('asc')) {
return 'asc';
} else {
if (str.includes('desc')) {
return 'desc';
}
}
});
}
getSortingOrder() {
return this.getSortedColumnHeader()
.getAttribute('class')
.then(str => {
if (str.includes('asc')) {
return 'asc';
} else {
if (str.includes('desc')) {
return 'desc';
}
}
});
}
sortByColumn(columnName: string): promise.Promise<void> {
const column = this.getColumnHeaderByLabel(columnName);
const click = browser.actions().mouseMove(column).click();
sortByColumn(columnName: string): promise.Promise<void> {
const column = this.getColumnHeaderByLabel(columnName);
const click = browser
.actions()
.mouseMove(column)
.click();
return click.perform();
}
return click.perform();
}
// Rows methods
getRows(): ElementArrayFinder {
return this.body.all(by.css(DataTable.selectors.row));
}
// Rows methods
getRows(): ElementArrayFinder {
return this.body.all(by.css(DataTable.selectors.row));
}
countRows(): promise.Promise<number> {
return this.getRows().count();
}
countRows(): promise.Promise<number> {
return this.getRows().count();
}
getSelectedRows(): ElementArrayFinder {
return this.body.all(by.css(DataTable.selectors.selectedRow));
}
getSelectedRows(): ElementArrayFinder {
return this.body.all(by.css(DataTable.selectors.selectedRow));
}
countSelectedRows(): promise.Promise<number> {
return this.getSelectedRows().count();
}
countSelectedRows(): promise.Promise<number> {
return this.getSelectedRows().count();
}
getNthRow(nth: number): ElementFinder {
return this.getRows().get(nth - 1);
}
getNthRow(nth: number): ElementFinder {
return this.getRows().get(nth - 1);
}
getRowByName(name: string): ElementFinder {
return this.body.element(by.cssContainingText(DataTable.selectors.row, name));
}
getRowByName(name: string): ElementFinder {
return this.body.element(by.cssContainingText(DataTable.selectors.row, name));
}
getRowFirstCell(name: string) {
return this.getRowByName(name).all(by.css(DataTable.selectors.cell)).get(0);
}
getRowFirstCell(name: string) {
return this.getRowByName(name)
.all(by.css(DataTable.selectors.cell))
.get(0);
}
getRowNameCell(name: string) {
return this.getRowByName(name).all(by.css(DataTable.selectors.cell)).get(1);
}
getRowNameCell(name: string) {
return this.getRowByName(name)
.all(by.css(DataTable.selectors.cell))
.get(1);
}
getRowNameCellText(name: string) {
return this.getRowNameCell(name).$('span');
}
getRowNameCellText(name: string) {
return this.getRowNameCell(name).$('span');
}
getItemNameTooltip(name: string): promise.Promise<string> {
return this.getRowNameCellText(name).getAttribute('title');
}
getItemNameTooltip(name: string): promise.Promise<string> {
return this.getRowNameCellText(name).getAttribute('title');
}
hasCheckMarkIcon(itemName: string) {
return this.getRowByName(itemName).element(by.css(DataTable.selectors.selectedIcon)).isPresent();
}
hasCheckMarkIcon(itemName: string) {
return this.getRowByName(itemName)
.element(by.css(DataTable.selectors.selectedIcon))
.isPresent();
}
getNameLink(itemName: string) {
return this.getRowNameCell(itemName).$(DataTable.selectors.nameLink);
}
getNameLink(itemName: string) {
return this.getRowNameCell(itemName).$(DataTable.selectors.nameLink);
}
hasLinkOnName(itemName: string) {
return this.getNameLink(itemName).isPresent();
}
hasLinkOnName(itemName: string) {
return this.getNameLink(itemName).isPresent();
}
// Navigation/selection methods
doubleClickOnRowByName(name: string): promise.Promise<any> {
const item = this.getRowFirstCell(name);
return Utils.waitUntilElementClickable(item)
.then(() => browser.actions().mouseMove(item).click().click().perform());
}
// Navigation/selection methods
doubleClickOnRowByName(name: string): promise.Promise<any> {
const item = this.getRowFirstCell(name);
return Utils.waitUntilElementClickable(item).then(() =>
browser
.actions()
.mouseMove(item)
.click()
.click()
.perform()
);
}
selectItem(name: string): promise.Promise<any> {
const item = this.getRowFirstCell(name);
return Utils.waitUntilElementClickable(item)
.then(() => item.click());
}
selectItem(name: string): promise.Promise<any> {
const item = this.getRowFirstCell(name);
return Utils.waitUntilElementClickable(item).then(() => item.click());
}
clickNameLink(itemName: string) {
return this.getNameLink(itemName).click();
}
clickNameLink(itemName: string) {
return this.getNameLink(itemName).click();
}
selectMultipleItems(names: string[]): promise.Promise<void> {
return this.clearSelection()
.then(() => browser.actions().sendKeys(protractor.Key.COMMAND).perform())
.then(() => {
names.forEach(name => {
this.selectItem(name);
});
})
.then(() => browser.actions().sendKeys(protractor.Key.NULL).perform());
}
selectMultipleItems(names: string[]): promise.Promise<void> {
return this.clearSelection()
.then(() =>
browser
.actions()
.sendKeys(protractor.Key.COMMAND)
.perform()
)
.then(() => {
names.forEach(name => {
this.selectItem(name);
});
})
.then(() =>
browser
.actions()
.sendKeys(protractor.Key.NULL)
.perform()
);
}
clearSelection(): promise.Promise<void> {
return this.getSelectedRows().count()
.then(count => {
if (count !== 0) { browser.refresh().then(() => this.waitForHeader()); }
});
}
clearSelection(): promise.Promise<void> {
return this.getSelectedRows()
.count()
.then(count => {
if (count !== 0) {
browser.refresh().then(() => this.waitForHeader());
}
});
}
async rightClickOnItem(itemName: string) {
const item = this.getRowFirstCell(itemName);
await browser.actions().click(item, protractor.Button.RIGHT).perform();
}
async rightClickOnItem(itemName: string) {
const item = this.getRowFirstCell(itemName);
await browser
.actions()
.click(item, protractor.Button.RIGHT)
.perform();
}
async rightClickOnMultipleSelection() {
const itemFromSelection = this.getSelectedRows().get(0);
await browser.actions().click(itemFromSelection, protractor.Button.RIGHT).perform();
}
async rightClickOnMultipleSelection() {
const itemFromSelection = this.getSelectedRows().get(0);
await browser
.actions()
.click(itemFromSelection, protractor.Button.RIGHT)
.perform();
}
getItemLocation(name: string) {
return this.getRowByName(name).element(this.locationLink);
}
getItemLocation(name: string) {
return this.getRowByName(name).element(this.locationLink);
}
getItemLocationTooltip(name: string): promise.Promise<string> {
return this.getItemLocation(name).$('a').getAttribute('title');
}
getItemLocationTooltip(name: string): promise.Promise<string> {
return this.getItemLocation(name)
.$('a')
.getAttribute('title');
}
getItemLocationTileAttr(name: string) {
const location = this.getItemLocation(name).$('a');
const condition = () => location.getAttribute('title').then((value) => value && value.length > 0);
getItemLocationTileAttr(name: string) {
const location = this.getItemLocation(name).$('a');
const condition = () => location.getAttribute('title').then(value => value && value.length > 0);
browser.actions()
.mouseMove(location)
.perform();
browser
.actions()
.mouseMove(location)
.perform();
browser.wait(condition, BROWSER_WAIT_TIMEOUT);
return location.getAttribute('title');
}
browser.wait(condition, BROWSER_WAIT_TIMEOUT);
return location.getAttribute('title');
}
clickItemLocation(name: string) {
return this.getItemLocation(name).click();
}
clickItemLocation(name: string) {
return this.getItemLocation(name).click();
}
// empty state methods
isEmptyList(): promise.Promise<boolean> {
return this.emptyList.isPresent();
}
// empty state methods
isEmptyList(): promise.Promise<boolean> {
return this.emptyList.isPresent();
}
isEmptyWithDragAndDrop(): promise.Promise<boolean> {
return this.emptyFolderDragAndDrop.isDisplayed();
}
isEmptyWithDragAndDrop(): promise.Promise<boolean> {
return this.emptyFolderDragAndDrop.isDisplayed();
}
getEmptyDragAndDropText(): promise.Promise<string> {
return this.isEmptyWithDragAndDrop()
.then(() => {
return this.emptyFolderDragAndDrop.getText();
});
}
getEmptyDragAndDropText(): promise.Promise<string> {
return this.isEmptyWithDragAndDrop().then(() => {
return this.emptyFolderDragAndDrop.getText();
});
}
getEmptyStateTitle(): promise.Promise<string> {
return this.isEmptyList()
.then(() => {
return this.emptyListTitle.getText();
});
}
getEmptyStateTitle(): promise.Promise<string> {
return this.isEmptyList().then(() => {
return this.emptyListTitle.getText();
});
}
getEmptyStateSubtitle(): promise.Promise<string> {
return this.isEmptyList()
.then(() => {
return this.emptyListSubtitle.getText();
});
}
getEmptyStateSubtitle(): promise.Promise<string> {
return this.isEmptyList().then(() => {
return this.emptyListSubtitle.getText();
});
}
getEmptyStateText(): promise.Promise<string> {
return this.isEmptyList()
.then(() => {
return this.emptyListText.getText();
});
}
getEmptyStateText(): promise.Promise<string> {
return this.isEmptyList().then(() => {
return this.emptyListText.getText();
});
}
getCellsContainingName(name: string) {
return this.getRows().all(by.cssContainingText(DataTable.selectors.cell, name))
.map(cell => cell.getText());
}
getCellsContainingName(name: string) {
return this.getRows()
.all(by.cssContainingText(DataTable.selectors.cell, name))
.map(cell => cell.getText());
}
async hasContextMenu() {
return (await this.menu.getItemsCount()) > 0;
}
async hasContextMenu() {
return (await this.menu.getItemsCount()) > 0;
}
}

View File

@ -0,0 +1,126 @@
import { Utils } from './../../utilities/utils';
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { ElementFinder, by, browser, ExpectedConditions as EC } from 'protractor';
import { BROWSER_WAIT_TIMEOUT } from '../../configs';
import { Component } from '../component';
export class CopyMoveDialog extends Component {
private static selectors = {
root: '.adf-content-node-selector-dialog',
title: '.mat-dialog-title',
content: '.mat-dialog-content',
locationDropDown: 'site-dropdown-container',
locationOption: '.mat-option .mat-option-text',
dataTable: '.adf-datatable-body',
row: '.adf-datatable-row[role]',
selectedRow: '.is-selected',
button: '.mat-dialog-actions button'
};
title: ElementFinder = this.component.element(by.css(CopyMoveDialog.selectors.title));
content: ElementFinder = this.component.element(by.css(CopyMoveDialog.selectors.content));
dataTable: ElementFinder = this.component.element(by.css(CopyMoveDialog.selectors.dataTable));
locationDropDown: ElementFinder = this.component.element(by.id(CopyMoveDialog.selectors.locationDropDown));
locationPersonalFiles: ElementFinder = browser.element(by.cssContainingText(CopyMoveDialog.selectors.locationOption, 'Personal Files'));
locationFileLibraries: ElementFinder = browser.element(by.cssContainingText(CopyMoveDialog.selectors.locationOption, 'File Libraries'));
row: ElementFinder = this.component.element(by.css(CopyMoveDialog.selectors.row));
cancelButton: ElementFinder = this.component.element(by.cssContainingText(CopyMoveDialog.selectors.button, 'Cancel'));
copyButton: ElementFinder = this.component.element(by.cssContainingText(CopyMoveDialog.selectors.button, 'Copy'));
moveButton: ElementFinder = this.component.element(by.cssContainingText(CopyMoveDialog.selectors.button, 'Move'));
constructor(ancestor?: ElementFinder) {
super(CopyMoveDialog.selectors.root, ancestor);
}
async waitForDialogToClose() {
await browser.wait(EC.stalenessOf(this.title), BROWSER_WAIT_TIMEOUT);
}
async waitForDropDownToOpen() {
await browser.wait(EC.presenceOf(this.locationPersonalFiles), BROWSER_WAIT_TIMEOUT);
}
async waitForDropDownToClose() {
await browser.wait(EC.stalenessOf(browser.$(CopyMoveDialog.selectors.locationOption)), BROWSER_WAIT_TIMEOUT);
}
async waitForRowToBeSelected() {
await browser.wait(EC.presenceOf(this.component.element(by.css(CopyMoveDialog.selectors.selectedRow))), BROWSER_WAIT_TIMEOUT);
}
async isDialogOpen() {
return await browser.$(CopyMoveDialog.selectors.root).isDisplayed();
}
async getTitle() {
return await this.title.getText();
}
async clickCancel() {
await this.cancelButton.click();
await this.waitForDialogToClose();
}
async clickCopy() {
await this.copyButton.click();
await this.waitForDialogToClose();
}
async clickMove() {
await this.moveButton.click();
await this.waitForDialogToClose();
}
getRow(folderName: string) {
return this.dataTable.element(by.cssContainingText('.adf-name-location-cell', folderName));
}
async selectLocation(location: 'Personal Files' | 'File Libraries') {
await this.locationDropDown.click();
await this.waitForDropDownToOpen();
if (location === 'Personal Files') {
await this.locationPersonalFiles.click();
} else {
await this.locationFileLibraries.click();
}
await this.waitForDropDownToClose();
}
async chooseDestination(folderName: string) {
const row = this.getRow(folderName);
await Utils.waitUntilElementClickable(row);
await row.click();
await this.waitForRowToBeSelected();
}
}

View File

@ -0,0 +1,67 @@
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { ElementFinder, by, browser, ExpectedConditions as EC } from 'protractor';
import { BROWSER_WAIT_TIMEOUT } from '../../configs';
import { Component } from '../component';
export class ManageVersionsDialog extends Component {
private static selectors = {
root: '.aca-node-versions-dialog',
title: '.mat-dialog-title',
content: '.mat-dialog-content',
button: '.mat-button'
};
title: ElementFinder = this.component.element(by.css(ManageVersionsDialog.selectors.title));
content: ElementFinder = this.component.element(by.css(ManageVersionsDialog.selectors.content));
closeButton: ElementFinder = this.component.element(by.cssContainingText(ManageVersionsDialog.selectors.button, 'Close'));
constructor(ancestor?: ElementFinder) {
super(ManageVersionsDialog.selectors.root, ancestor);
}
async waitForDialogToClose() {
return await browser.wait(EC.stalenessOf(this.title), BROWSER_WAIT_TIMEOUT);
}
async isDialogOpen() {
return await browser.$(ManageVersionsDialog.selectors.root).isDisplayed();
}
async getTitle() {
return await this.title.getText();
}
async getText() {
return await this.content.getText();
}
async clickClose() {
await this.closeButton.click();
await this.waitForDialogToClose();
}
}

View File

@ -0,0 +1,67 @@
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { ElementFinder, by, browser, ExpectedConditions as EC } from 'protractor';
import { BROWSER_WAIT_TIMEOUT } from '../../configs';
import { Component } from '../component';
export class ShareDialog extends Component {
private static selectors = {
root: '.adf-share-dialog',
title: '.mat-dialog-title',
content: '.mat-dialog-content',
button: '.mat-button'
};
title: ElementFinder = this.component.element(by.css(ShareDialog.selectors.title));
content: ElementFinder = this.component.element(by.css(ShareDialog.selectors.content));
closeButton: ElementFinder = this.component.element(by.cssContainingText(ShareDialog.selectors.button, 'CLOSE'));
constructor(ancestor?: ElementFinder) {
super(ShareDialog.selectors.root, ancestor);
}
async waitForDialogToClose() {
return await browser.wait(EC.stalenessOf(this.title), BROWSER_WAIT_TIMEOUT);
}
async isDialogOpen() {
return await browser.$(ShareDialog.selectors.root).isDisplayed();
}
async getTitle() {
return await this.title.getText();
}
async getText() {
return await this.content.getText();
}
async clickClose() {
await this.closeButton.click();
await this.waitForDialogToClose();
}
}

View File

@ -23,13 +23,13 @@
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { ElementFinder, ElementArrayFinder, by, promise, protractor, browser } from 'protractor';
import { ElementFinder, ElementArrayFinder, by, protractor, browser } from 'protractor';
import { Menu } from '../menu/menu';
import { Component } from '../component';
export class Toolbar extends Component {
private static selectors = {
root: 'adf-toolbar',
root: '.adf-toolbar',
button: '.mat-icon-button'
};
@ -70,4 +70,8 @@ export class Toolbar extends Component {
return await button.getAttribute('title');
}
async clickButton(title: string) {
const btn = this.getButtonByTitleAttribute(title);
await btn.click();
}
}

View File

@ -40,6 +40,7 @@ export class Viewer extends Component {
viewerExtensionContent: 'app-preview-extension'
};
root: ElementFinder = browser.$(Viewer.selectors.root);
viewerLayout: ElementFinder = this.component.element(by.css(Viewer.selectors.layout));
viewerContainer: ElementFinder = this.component.element(by.css(Viewer.selectors.contentContainer));
closeButton: ElementFinder = this.component.element(by.css(Viewer.selectors.closeBtn));

View File

@ -44,57 +44,57 @@ export const E2E_ROOT_PATH = __dirname;
// Application Routes
export const APP_ROUTES = {
FAVORITES: '/favorites',
FILE_LIBRARIES: '/libraries',
LOGIN: '/login',
LOGOUT: '/logout',
PERSONAL_FILES: '/personal-files',
RECENT_FILES: '/recent-files',
SHARED_FILES: '/shared',
TRASHCAN: '/trashcan'
FAVORITES: '/favorites',
FILE_LIBRARIES: '/libraries',
LOGIN: '/login',
LOGOUT: '/logout',
PERSONAL_FILES: '/personal-files',
RECENT_FILES: '/recent-files',
SHARED_FILES: '/shared',
TRASHCAN: '/trashcan'
};
// Sidebar labels
export const SIDEBAR_LABELS = {
PERSONAL_FILES: 'Personal Files',
FILE_LIBRARIES: 'File Libraries',
SHARED_FILES: 'Shared',
RECENT_FILES: 'Recent Files',
FAVORITES: 'Favorites',
TRASH: 'Trash'
PERSONAL_FILES: 'Personal Files',
FILE_LIBRARIES: 'File Libraries',
SHARED_FILES: 'Shared',
RECENT_FILES: 'Recent Files',
FAVORITES: 'Favorites',
TRASH: 'Trash'
};
// Page titles
export const PAGE_TITLES = {
VIEWER: 'Preview',
SEARCH: 'Search Results'
VIEWER: 'Preview',
SEARCH: 'Search Results'
};
// Site visibility
export const SITE_VISIBILITY = {
PUBLIC: 'PUBLIC',
MODERATED: 'MODERATED',
PRIVATE: 'PRIVATE'
PUBLIC: 'PUBLIC',
MODERATED: 'MODERATED',
PRIVATE: 'PRIVATE'
};
// Site roles
export const SITE_ROLES = {
SITE_CONSUMER: 'SiteConsumer',
SITE_COLLABORATOR: 'SiteCollaborator',
SITE_CONTRIBUTOR: 'SiteContributor',
SITE_MANAGER: 'SiteManager'
SITE_CONSUMER: 'SiteConsumer',
SITE_COLLABORATOR: 'SiteCollaborator',
SITE_CONTRIBUTOR: 'SiteContributor',
SITE_MANAGER: 'SiteManager'
};
export const FILES = {
docxFile: 'file-docx.docx',
xlsxFile: 'file-xlsx.xlsx',
pdfFile: 'file-pdf.pdf',
unsupportedFile: 'file_unsupported.3DS'
docxFile: 'file-docx.docx',
xlsxFile: 'file-xlsx.xlsx',
pdfFile: 'file-pdf.pdf',
unsupportedFile: 'file_unsupported.3DS'
};
export const EXTENSIBILITY_CONFIGS = {
DEFAULT_EXTENSIONS_CONFIG: 'extensions-default.json',
INFO_DRAWER: 'info-drawer-ext.json',
INFO_DRAWER_EMPTY: 'info-drawer-no-tabs-ext.json',
VIEWER: 'viewer-ext.json'
DEFAULT_EXTENSIONS_CONFIG: 'extensions-default.json',
INFO_DRAWER: 'info-drawer-ext.json',
INFO_DRAWER_EMPTY: 'info-drawer-no-tabs-ext.json',
VIEWER: 'viewer-ext.json'
};

View File

@ -30,239 +30,259 @@ import { RepoClient } from '../../utilities/repo-client/repo-client';
import { Utils } from '../../utilities/utils';
describe('Restore from Trash', () => {
const username = `user-${Utils.random()}`;
const username = `user-${Utils.random()}`;
const apis = {
admin: new RepoClient(),
user: new RepoClient(username, username)
};
const apis = {
admin: new RepoClient(),
user: new RepoClient(username, username)
};
const loginPage = new LoginPage();
const logoutPage = new LogoutPage();
const page = new BrowsingPage();
const { dataTable, toolbar } = page;
const loginPage = new LoginPage();
const logoutPage = new LogoutPage();
const page = new BrowsingPage();
const { dataTable, toolbar } = page;
beforeAll(done => {
apis.admin.people
.createUser({ username })
.then(() => loginPage.loginWith(username))
.then(done);
});
afterAll(done => {
Promise.all([apis.admin.trashcan.emptyTrash(), logoutPage.load()]).then(done);
});
xit('');
describe('successful restore', () => {
const file = `file-${Utils.random()}.txt`;
let fileId;
const folder = `folder-${Utils.random()}`;
let folderId;
beforeAll(done => {
apis.admin.people.createUser({ username })
.then(() => loginPage.loginWith(username))
.then(done);
});
afterAll(done => {
Promise.all([
apis.admin.trashcan.emptyTrash(),
logoutPage.load()
])
apis.user.nodes
.createFile(file)
.then(resp => (fileId = resp.entry.id))
.then(() => apis.user.nodes.createFolder(folder).then(resp => (folderId = resp.entry.id)))
.then(() => apis.user.nodes.deleteNodesById([fileId, folderId], false))
.then(done);
});
xit('');
describe('successful restore', () => {
const file = `file-${Utils.random()}.txt`; let fileId;
const folder = `folder-${Utils.random()}`; let folderId;
beforeAll(done => {
apis.user.nodes.createFile(file).then(resp => fileId = resp.entry.id)
.then(() => apis.user.nodes.createFolder(folder).then(resp => folderId = resp.entry.id))
.then(() => apis.user.nodes.deleteNodesById([ fileId, folderId ], false))
.then(done);
});
beforeEach(done => {
page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
.then(() => dataTable.waitForHeader())
.then(done);
});
afterAll(done => {
apis.user.trashcan.emptyTrash().then(done);
});
it('restore file - [C217177]', () => {
dataTable.selectItem(file)
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.getSnackBarMessage())
.then(text => {
expect(text).toContain(`${file} restored`);
expect(text).toContain(`View`);
expect(dataTable.getRowByName(file).isPresent()).toBe(false, 'Item was not removed from list');
})
.then(() => page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES))
.then(() => page.dataTable.waitForHeader())
.then(() => {
expect(page.dataTable.getRowByName(file).isPresent()).toBe(true, 'Item not displayed in list');
})
.then(() => apis.user.nodes.deleteNodeById(fileId, false));
});
it('restore folder - [C280438]', () => {
dataTable.selectItem(folder)
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.getSnackBarMessage())
.then(text => {
expect(text).toContain(`${folder} restored`);
expect(text).toContain(`View`);
expect(dataTable.getRowByName(folder).isPresent()).toBe(false, 'Item was not removed from list');
})
.then(() => page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES))
.then(() => page.dataTable.waitForHeader())
.then(() => {
expect(page.dataTable.getRowByName(folder).isPresent()).toBe(true, 'Item not displayed in list');
})
.then(() => apis.user.nodes.deleteNodeById(folderId, false));
});
it('restore multiple items - [C217182]', () => {
dataTable.selectMultipleItems([ file, folder ])
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.getSnackBarMessage())
.then(text => {
expect(text).toContain(`Restore successful`);
expect(text).not.toContain(`View`);
expect(dataTable.getRowByName(file).isPresent()).toBe(false, 'Item was not removed from list');
expect(dataTable.getRowByName(folder).isPresent()).toBe(false, 'Item was not removed from list');
})
.then(() => page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES))
.then(() => page.dataTable.waitForHeader())
.then(() => {
expect(page.dataTable.getRowByName(file).isPresent()).toBe(true, 'Item not displayed in list');
expect(page.dataTable.getRowByName(folder).isPresent()).toBe(true, 'Item not displayed in list');
})
.then(() => apis.user.nodes.deleteNodesById([ fileId, folderId ], false));
});
it('View from notification - [C217181]', () => {
dataTable.selectItem(file)
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.clickSnackBarAction())
.then(() => page.dataTable.waitForHeader())
.then(() => {
expect(page.sidenav.isActiveByLabel('Personal Files')).toBe(true, 'Personal Files sidebar link not active');
expect(browser.getCurrentUrl()).toContain(APP_ROUTES.PERSONAL_FILES);
})
.then(() => apis.user.nodes.deleteNodeById(fileId, false));
});
beforeEach(done => {
page.sidenav
.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
.then(() => dataTable.waitForHeader())
.then(done);
});
describe('failure to restore', () => {
const file1 = `file-${Utils.random()}.txt`; let file1Id1, file1Id2;
const file2 = `file-${Utils.random()}.txt`; let file2Id;
const folder1 = `folder-${Utils.random()}`; let folder1Id;
const folder2 = `folder-${Utils.random()}`; let folder2Id;
beforeAll(done => {
apis.user.nodes.createFolder(folder1).then(resp => folder1Id = resp.entry.id)
.then(() => apis.user.nodes.createFile(file1, folder1Id).then(resp => file1Id1 = resp.entry.id))
.then(() => apis.user.nodes.deleteNodeById(file1Id1, false))
.then(() => apis.user.nodes.createFile(file1, folder1Id).then(resp => file1Id2 = resp.entry.id))
.then(() => apis.user.nodes.createFolder(folder2).then(resp => folder2Id = resp.entry.id))
.then(() => apis.user.nodes.createFile(file2, folder2Id).then(resp => file2Id = resp.entry.id))
.then(() => apis.user.nodes.deleteNodeById(file2Id, false))
.then(() => apis.user.nodes.deleteNodeById(folder2Id, false))
.then(done);
});
beforeEach(done => {
page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
.then(() => dataTable.waitForHeader())
.then(done);
});
afterAll(done => {
Promise.all([
apis.user.nodes.deleteNodeById(file1Id2),
apis.user.trashcan.emptyTrash()
])
.then(done);
});
it('Restore a file when another file with same name exists on the restore location - [C217178]', () => {
page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
.then(() => dataTable.selectItem(file1))
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.getSnackBarMessage())
.then(text => expect(text).toEqual(`Can't restore, ${file1} already exists`));
});
it('Restore a file when original location no longer exists - [C217179]', () => {
page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
.then(() => dataTable.selectItem(file2))
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.getSnackBarMessage())
.then(text => expect(text).toEqual(`Can't restore ${file2}, the original location no longer exists`));
});
afterAll(done => {
apis.user.trashcan.emptyTrash().then(done);
});
describe('Notification on partial success', () => {
const folder1 = `folder1-${Utils.random()}.txt`; let folder1Id;
const folder2 = `folder2-${Utils.random()}.txt`; let folder2Id;
const file1 = `file-${Utils.random()}.txt`; let file1Id;
const file2 = `file-${Utils.random()}.txt`; let file2Id;
it('restore file - [C217177]', () => {
dataTable
.selectItem(file)
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.getSnackBarMessage())
.then(text => {
expect(text).toContain(`${file} restored`);
expect(text).toContain(`View`);
expect(dataTable.getRowByName(file).isPresent()).toBe(false, 'Item was not removed from list');
})
.then(() => page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES))
.then(() => page.dataTable.waitForHeader())
.then(() => {
expect(page.dataTable.getRowByName(file).isPresent()).toBe(true, 'Item not displayed in list');
})
const folder3 = `folder3-${Utils.random()}.txt`; let folder3Id;
const folder4 = `folder4-${Utils.random()}.txt`; let folder4Id;
const file3 = `file3-${Utils.random()}.txt`; let file3Id;
const file4 = `file4-${Utils.random()}.txt`; let file4Id;
const file5 = `file5-${Utils.random()}.txt`; let file5Id;
beforeAll(done => {
apis.user.nodes.createFolder(folder1).then(resp => folder1Id = resp.entry.id)
.then(() => apis.user.nodes.createFile(file1, folder1Id).then(resp => file1Id = resp.entry.id))
.then(() => apis.user.nodes.createFolder(folder2).then(resp => folder2Id = resp.entry.id))
.then(() => apis.user.nodes.createFile(file2, folder2Id).then(resp => file2Id = resp.entry.id))
.then(() => apis.user.nodes.deleteNodeById(file1Id, false))
.then(() => apis.user.nodes.deleteNodeById(folder1Id, false))
.then(() => apis.user.nodes.deleteNodeById(file2Id, false))
.then(() => apis.user.nodes.createFolder(folder3).then(resp => folder3Id = resp.entry.id))
.then(() => apis.user.nodes.createFile(file3, folder3Id).then(resp => file3Id = resp.entry.id))
.then(() => apis.user.nodes.createFile(file4, folder3Id).then(resp => file4Id = resp.entry.id))
.then(() => apis.user.nodes.createFolder(folder4).then(resp => folder4Id = resp.entry.id))
.then(() => apis.user.nodes.createFile(file5, folder4Id).then(resp => file5Id = resp.entry.id))
.then(() => apis.user.nodes.deleteNodeById(file3Id, false))
.then(() => apis.user.nodes.deleteNodeById(file4Id, false))
.then(() => apis.user.nodes.deleteNodeById(folder3Id, false))
.then(() => apis.user.nodes.deleteNodeById(file5Id, false))
.then(() => loginPage.loginWith(username))
.then(done);
});
beforeEach(done => {
page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
.then(() => dataTable.waitForHeader())
.then(done);
});
afterAll(done => {
Promise.all([
apis.user.trashcan.emptyTrash(),
logoutPage.load()
])
.then(done);
});
it('one failure - [C217183]', () => {
dataTable.selectMultipleItems([ file1, file2 ])
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.getSnackBarMessage())
.then(text => expect(text).toEqual(`Can't restore ${file1}, the original location no longer exists`));
});
it('multiple failures - [C217184]', () => {
dataTable.selectMultipleItems([ file3, file4, file5 ])
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.getSnackBarMessage())
.then(text => expect(text).toEqual('2 items not restored because of issues with the restore location'));
});
.then(() => apis.user.nodes.deleteNodeById(fileId, false));
});
it('restore folder - [C280438]', () => {
dataTable
.selectItem(folder)
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.getSnackBarMessage())
.then(text => {
expect(text).toContain(`${folder} restored`);
expect(text).toContain(`View`);
expect(dataTable.getRowByName(folder).isPresent()).toBe(false, 'Item was not removed from list');
})
.then(() => page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES))
.then(() => page.dataTable.waitForHeader())
.then(() => {
expect(page.dataTable.getRowByName(folder).isPresent()).toBe(true, 'Item not displayed in list');
})
.then(() => apis.user.nodes.deleteNodeById(folderId, false));
});
it('restore multiple items - [C217182]', () => {
dataTable
.selectMultipleItems([file, folder])
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.getSnackBarMessage())
.then(text => {
expect(text).toContain(`Restore successful`);
expect(text).not.toContain(`View`);
expect(dataTable.getRowByName(file).isPresent()).toBe(false, 'Item was not removed from list');
expect(dataTable.getRowByName(folder).isPresent()).toBe(false, 'Item was not removed from list');
})
.then(() => page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES))
.then(() => page.dataTable.waitForHeader())
.then(() => {
expect(page.dataTable.getRowByName(file).isPresent()).toBe(true, 'Item not displayed in list');
expect(page.dataTable.getRowByName(folder).isPresent()).toBe(true, 'Item not displayed in list');
})
.then(() => apis.user.nodes.deleteNodesById([fileId, folderId], false));
});
it('View from notification - [C217181]', () => {
dataTable
.selectItem(file)
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.clickSnackBarAction())
.then(() => page.dataTable.waitForHeader())
.then(() => {
expect(page.sidenav.isActiveByLabel('Personal Files')).toBe(true, 'Personal Files sidebar link not active');
expect(browser.getCurrentUrl()).toContain(APP_ROUTES.PERSONAL_FILES);
})
.then(() => apis.user.nodes.deleteNodeById(fileId, false));
});
});
describe('failure to restore', () => {
const file1 = `file-${Utils.random()}.txt`;
let file1Id1, file1Id2;
const file2 = `file-${Utils.random()}.txt`;
let file2Id;
const folder1 = `folder-${Utils.random()}`;
let folder1Id;
const folder2 = `folder-${Utils.random()}`;
let folder2Id;
beforeAll(done => {
apis.user.nodes
.createFolder(folder1)
.then(resp => (folder1Id = resp.entry.id))
.then(() => apis.user.nodes.createFile(file1, folder1Id).then(resp => (file1Id1 = resp.entry.id)))
.then(() => apis.user.nodes.deleteNodeById(file1Id1, false))
.then(() => apis.user.nodes.createFile(file1, folder1Id).then(resp => (file1Id2 = resp.entry.id)))
.then(() => apis.user.nodes.createFolder(folder2).then(resp => (folder2Id = resp.entry.id)))
.then(() => apis.user.nodes.createFile(file2, folder2Id).then(resp => (file2Id = resp.entry.id)))
.then(() => apis.user.nodes.deleteNodeById(file2Id, false))
.then(() => apis.user.nodes.deleteNodeById(folder2Id, false))
.then(done);
});
beforeEach(done => {
page.sidenav
.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
.then(() => dataTable.waitForHeader())
.then(done);
});
afterAll(done => {
Promise.all([apis.user.nodes.deleteNodeById(file1Id2), apis.user.trashcan.emptyTrash()]).then(done);
});
it('Restore a file when another file with same name exists on the restore location - [C217178]', () => {
page.sidenav
.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
.then(() => dataTable.selectItem(file1))
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.getSnackBarMessage())
.then(text => expect(text).toEqual(`Can't restore, ${file1} already exists`));
});
it('Restore a file when original location no longer exists - [C217179]', () => {
page.sidenav
.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
.then(() => dataTable.selectItem(file2))
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.getSnackBarMessage())
.then(text => expect(text).toEqual(`Can't restore ${file2}, the original location no longer exists`));
});
});
describe('Notification on partial success', () => {
const folder1 = `folder1-${Utils.random()}.txt`;
let folder1Id;
const folder2 = `folder2-${Utils.random()}.txt`;
let folder2Id;
const file1 = `file-${Utils.random()}.txt`;
let file1Id;
const file2 = `file-${Utils.random()}.txt`;
let file2Id;
const folder3 = `folder3-${Utils.random()}.txt`;
let folder3Id;
const folder4 = `folder4-${Utils.random()}.txt`;
let folder4Id;
const file3 = `file3-${Utils.random()}.txt`;
let file3Id;
const file4 = `file4-${Utils.random()}.txt`;
let file4Id;
const file5 = `file5-${Utils.random()}.txt`;
let file5Id;
beforeAll(done => {
apis.user.nodes
.createFolder(folder1)
.then(resp => (folder1Id = resp.entry.id))
.then(() => apis.user.nodes.createFile(file1, folder1Id).then(resp => (file1Id = resp.entry.id)))
.then(() => apis.user.nodes.createFolder(folder2).then(resp => (folder2Id = resp.entry.id)))
.then(() => apis.user.nodes.createFile(file2, folder2Id).then(resp => (file2Id = resp.entry.id)))
.then(() => apis.user.nodes.deleteNodeById(file1Id, false))
.then(() => apis.user.nodes.deleteNodeById(folder1Id, false))
.then(() => apis.user.nodes.deleteNodeById(file2Id, false))
.then(() => apis.user.nodes.createFolder(folder3).then(resp => (folder3Id = resp.entry.id)))
.then(() => apis.user.nodes.createFile(file3, folder3Id).then(resp => (file3Id = resp.entry.id)))
.then(() => apis.user.nodes.createFile(file4, folder3Id).then(resp => (file4Id = resp.entry.id)))
.then(() => apis.user.nodes.createFolder(folder4).then(resp => (folder4Id = resp.entry.id)))
.then(() => apis.user.nodes.createFile(file5, folder4Id).then(resp => (file5Id = resp.entry.id)))
.then(() => apis.user.nodes.deleteNodeById(file3Id, false))
.then(() => apis.user.nodes.deleteNodeById(file4Id, false))
.then(() => apis.user.nodes.deleteNodeById(folder3Id, false))
.then(() => apis.user.nodes.deleteNodeById(file5Id, false))
.then(() => loginPage.loginWith(username))
.then(done);
});
beforeEach(done => {
page.sidenav
.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH)
.then(() => dataTable.waitForHeader())
.then(done);
});
afterAll(done => {
Promise.all([apis.user.trashcan.emptyTrash(), logoutPage.load()]).then(done);
});
it('one failure - [C217183]', () => {
dataTable
.selectMultipleItems([file1, file2])
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.getSnackBarMessage())
.then(text => expect(text).toEqual(`Can't restore ${file1}, the original location no longer exists`));
});
it('multiple failures - [C217184]', () => {
dataTable
.selectMultipleItems([file3, file4, file5])
.then(() => toolbar.getButtonByTitleAttribute('Restore').click())
.then(() => page.getSnackBarMessage())
.then(text => expect(text).toEqual('2 items not restored because of issues with the restore location'));
});
});
});

View File

@ -30,311 +30,636 @@ import { RepoClient } from '../../utilities/repo-client/repo-client';
import { Utils } from '../../utilities/utils';
describe('Toolbar actions - multiple selection : ', () => {
const username = `user-${Utils.random()}`;
const username = `user-${Utils.random()}`;
const file1 = `file-${Utils.random()}.txt`; let file1Id;
const file2 = `file-${Utils.random()}.txt`; let file2Id;
const file1 = `file-${Utils.random()}.txt`;
let file1Id;
const file2 = `file-${Utils.random()}.txt`;
let file2Id;
const folder1 = `folder-${Utils.random()}`; let folder1Id;
const folder2 = `folder-${Utils.random()}`; let folder2Id;
const folder1 = `folder-${Utils.random()}`;
let folder1Id;
const folder2 = `folder-${Utils.random()}`;
let folder2Id;
const fileForDelete1 = `file-${Utils.random()}.txt`; let fileForDelete1Id;
const fileForDelete2 = `file-${Utils.random()}.txt`; let fileForDelete2Id;
const folderForDelete1 = `folder-${Utils.random()}`; let folderForDelete1Id;
const folderForDelete2 = `folder-${Utils.random()}`; let folderForDelete2Id;
const fileForDelete1 = `file-${Utils.random()}.txt`;
let fileForDelete1Id;
const fileForDelete2 = `file-${Utils.random()}.txt`;
let fileForDelete2Id;
const folderForDelete1 = `folder-${Utils.random()}`;
let folderForDelete1Id;
const folderForDelete2 = `folder-${Utils.random()}`;
let folderForDelete2Id;
const siteName = `site-${Utils.random()}`;
const file1InSite = `file1-${Utils.random()}.txt`;
const file2InSite = `file2-${Utils.random()}.txt`;
const folder1InSite = `folder1-${Utils.random()}`;
const folder2InSite = `folder2-${Utils.random()}`;
const siteName = `site-${Utils.random()}`;
const file1InSite = `file1-${Utils.random()}.txt`;
const file2InSite = `file2-${Utils.random()}.txt`;
const folder1InSite = `folder1-${Utils.random()}`;
const folder2InSite = `folder2-${Utils.random()}`;
const apis = {
admin: new RepoClient(),
user: new RepoClient(username, username)
};
const apis = {
admin: new RepoClient(),
user: new RepoClient(username, username)
};
const loginPage = new LoginPage();
const logoutPage = new LogoutPage();
const page = new BrowsingPage();
const { dataTable, toolbar } = page;
const loginPage = new LoginPage();
const logoutPage = new LogoutPage();
const page = new BrowsingPage();
const { dataTable, toolbar } = page;
beforeAll(async (done) => {
await apis.admin.people.createUser({ username });
beforeAll(async done => {
await apis.admin.people.createUser({ username });
file1Id = (await apis.user.nodes.createFiles([ file1 ])).entry.id;
file2Id = (await apis.user.nodes.createFiles([ file2 ])).entry.id;
folder1Id = (await apis.user.nodes.createFolders([ folder1 ])).entry.id;
folder2Id = (await apis.user.nodes.createFolders([ folder2 ])).entry.id;
fileForDelete1Id = (await apis.user.nodes.createFiles([ fileForDelete1 ])).entry.id;
fileForDelete2Id = (await apis.user.nodes.createFiles([ fileForDelete2 ])).entry.id;
folderForDelete1Id = (await apis.user.nodes.createFolders([ folderForDelete1 ])).entry.id;
folderForDelete2Id = (await apis.user.nodes.createFolders([ folderForDelete2 ])).entry.id;
file1Id = (await apis.user.nodes.createFiles([file1])).entry.id;
file2Id = (await apis.user.nodes.createFiles([file2])).entry.id;
folder1Id = (await apis.user.nodes.createFolders([folder1])).entry.id;
folder2Id = (await apis.user.nodes.createFolders([folder2])).entry.id;
fileForDelete1Id = (await apis.user.nodes.createFiles([fileForDelete1]))
.entry.id;
fileForDelete2Id = (await apis.user.nodes.createFiles([fileForDelete2]))
.entry.id;
folderForDelete1Id = (await apis.user.nodes.createFolders([
folderForDelete1
])).entry.id;
folderForDelete2Id = (await apis.user.nodes.createFolders([
folderForDelete2
])).entry.id;
await apis.user.shared.shareFilesByIds([ file1Id, file2Id ]);
await apis.user.shared.waitForApi({ expect: 2 });
await apis.user.shared.shareFilesByIds([file1Id, file2Id]);
await apis.user.shared.waitForApi({ expect: 2 });
await apis.user.favorites.addFavoritesByIds('file', [ file1Id, file2Id ]);
await apis.user.favorites.addFavoritesByIds('folder', [ folder1Id, folder2Id ]);
await apis.user.favorites.waitForApi({ expect: 4 });
await apis.user.favorites.addFavoritesByIds('file', [file1Id, file2Id]);
await apis.user.favorites.addFavoritesByIds('folder', [
folder1Id,
folder2Id
]);
await apis.user.favorites.waitForApi({ expect: 4 });
await apis.user.nodes.deleteNodesById([ fileForDelete1Id, fileForDelete2Id, folderForDelete1Id, folderForDelete2Id ], false);
await apis.user.nodes.deleteNodesById(
[
fileForDelete1Id,
fileForDelete2Id,
folderForDelete1Id,
folderForDelete2Id
],
false
);
await apis.user.sites.createSite(siteName, SITE_VISIBILITY.PRIVATE);
const docLibId = await apis.user.sites.getDocLibId(siteName);
await apis.user.nodes.createFile(file1InSite, docLibId);
await apis.user.nodes.createFile(file2InSite, docLibId);
await apis.user.nodes.createFolder(folder1InSite, docLibId);
await apis.user.nodes.createFolder(folder2InSite, docLibId);
await apis.user.sites.createSite(siteName, SITE_VISIBILITY.PRIVATE);
const docLibId = await apis.user.sites.getDocLibId(siteName);
await apis.user.nodes.createFile(file1InSite, docLibId);
await apis.user.nodes.createFile(file2InSite, docLibId);
await apis.user.nodes.createFolder(folder1InSite, docLibId);
await apis.user.nodes.createFolder(folder2InSite, docLibId);
await loginPage.loginWith(username);
done();
await loginPage.loginWith(username);
done();
});
afterAll(async done => {
await Promise.all([
apis.user.nodes.deleteNodesById([file1Id, file2Id, folder1Id, folder2Id]),
apis.user.trashcan.emptyTrash(),
apis.user.sites.deleteSite(siteName),
logoutPage.load()
]);
done();
});
xit('');
describe('Personal Files', () => {
beforeEach(async done => {
await dataTable.clearSelection();
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES);
await dataTable.waitForHeader();
done();
});
afterAll(async (done) => {
await Promise.all([
apis.user.nodes.deleteNodesById([ file1Id, file2Id, folder1Id, folder2Id ]),
apis.user.trashcan.emptyTrash(),
apis.user.sites.deleteSite(siteName),
logoutPage.load()
]);
done();
it('Unselect items with single click - [C280458]', async () => {
await dataTable.selectMultipleItems([file1, file2, folder1, folder2]);
expect(await dataTable.countSelectedRows()).toEqual(
4,
'incorrect selected rows number'
);
await dataTable.selectItem(file1);
expect(await dataTable.countSelectedRows()).toEqual(
1,
'incorrect selected rows number'
);
});
xit('');
it('Select / unselect selected items by CMD+click - [C217110]', async () => {
await browser
.actions()
.sendKeys(protractor.Key.COMMAND)
.perform();
await dataTable.selectItem(file1);
await dataTable.selectItem(file2);
await dataTable.selectItem(folder1);
await dataTable.selectItem(folder2);
await browser
.actions()
.sendKeys(protractor.Key.NULL)
.perform();
expect(await dataTable.countSelectedRows()).toEqual(
4,
'incorrect selected rows number'
);
await browser
.actions()
.sendKeys(protractor.Key.COMMAND)
.perform();
await dataTable.selectItem(file1);
await dataTable.selectItem(file2);
await browser
.actions()
.sendKeys(protractor.Key.NULL)
.perform();
describe('Personal Files', () => {
beforeEach(async (done) => {
await dataTable.clearSelection();
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES);
await dataTable.waitForHeader();
done();
});
it('Unselect items with single click - [C280458]', async () => {
await dataTable.selectMultipleItems([ file1, file2, folder1, folder2 ]);
expect(await dataTable.countSelectedRows()).toEqual(4, 'incorrect selected rows number');
await dataTable.selectItem(file1);
expect(await dataTable.countSelectedRows()).toEqual(1, 'incorrect selected rows number');
});
it('Select / unselect selected items by CMD+click - [C217110]', async () => {
await browser.actions().sendKeys(protractor.Key.COMMAND).perform();
await dataTable.selectItem(file1);
await dataTable.selectItem(file2);
await dataTable.selectItem(folder1);
await dataTable.selectItem(folder2);
await browser.actions().sendKeys(protractor.Key.NULL).perform();
expect(await dataTable.countSelectedRows()).toEqual(4, 'incorrect selected rows number');
await browser.actions().sendKeys(protractor.Key.COMMAND).perform();
await dataTable.selectItem(file1);
await dataTable.selectItem(file2);
await browser.actions().sendKeys(protractor.Key.NULL).perform();
expect(await dataTable.countSelectedRows()).toEqual(2, 'incorrect selected rows number');
});
it('correct actions appear when multiple files are selected - [C217112]', async () => {
await dataTable.selectMultipleItems([file1, file2]);
expect(await toolbar.isButtonPresent('View')).toBe(false, 'View is displayed');
expect(await toolbar.isButtonPresent('Download')).toBe(true, 'Download is not displayed');
expect(await toolbar.isButtonPresent('Edit')).toBe(false, 'Edit is displayed');
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
await toolbar.closeMoreMenu();
});
it('correct actions appear when multiple folders are selected - [C280459]', async () => {
await dataTable.selectMultipleItems([folder1, folder2]);
expect(await toolbar.isButtonPresent('View')).toBe(false, 'View is displayed');
expect(await toolbar.isButtonPresent('Download')).toBe(true, 'Download is not displayed');
expect(await toolbar.isButtonPresent('Edit')).toBe(false, 'Edit is displayed');
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
await toolbar.closeMoreMenu();
});
it('correct actions appear when both files and folders are selected - [C280460]', async () => {
await dataTable.selectMultipleItems([file1, file2, folder1, folder2]);
expect(await toolbar.isButtonPresent('View')).toBe(false, 'View is displayed');
expect(await toolbar.isButtonPresent('Download')).toBe(true, 'Download is not displayed');
expect(await toolbar.isButtonPresent('Edit')).toBe(false, 'Edit is displayed');
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
await toolbar.closeMoreMenu();
});
expect(await dataTable.countSelectedRows()).toEqual(
2,
'incorrect selected rows number'
);
});
describe('File Libraries', () => {
beforeEach(async (done) => {
await browser.actions().mouseMove(browser.$('body'), { x: 0, y: 0 }).click().perform();
await dataTable.clearSelection();
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES);
await dataTable.waitForHeader();
await dataTable.doubleClickOnRowByName(siteName);
await dataTable.waitForHeader();
done();
});
it('correct actions appear when multiple files are selected - [C280461]', async () => {
await dataTable.selectMultipleItems([file1InSite, file2InSite]);
expect(await toolbar.isButtonPresent('View')).toBe(false, 'View is displayed for selected files');
expect(await toolbar.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
expect(await toolbar.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
});
it('correct actions appear when multiple folders are selected - [C280462]', async () => {
await dataTable.selectMultipleItems([folder1InSite, folder2InSite]);
expect(await toolbar.isButtonPresent('View')).toBe(false, 'View is displayed');
expect(await toolbar.isButtonPresent('Download')).toBe(true, 'Download is not displayed');
expect(await toolbar.isButtonPresent('Edit')).toBe(false, 'Edit is displayed');
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
});
it('correct actions appear when both files and folders are selected - [C280463]', async () => {
await dataTable.selectMultipleItems([file1InSite, file2InSite, folder1InSite, folder2InSite]);
expect(await toolbar.isButtonPresent('View')).toBe(false, 'View is displayed');
expect(await toolbar.isButtonPresent('Download')).toBe(true, 'Download is not displayed');
expect(await toolbar.isButtonPresent('Edit')).toBe(false, 'Edit is displayed');
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
});
it('correct actions appear when multiple files are selected - [C217112]', async () => {
await dataTable.selectMultipleItems([file1, file2]);
expect(await toolbar.isButtonPresent('View')).toBe(
false,
'View is displayed'
);
expect(await toolbar.isButtonPresent('Download')).toBe(
true,
'Download is not displayed'
);
expect(await toolbar.isButtonPresent('Edit')).toBe(
false,
'Edit is displayed'
);
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(
true,
`Copy is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Delete')).toBe(
true,
`Delete is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Move')).toBe(
true,
`Move is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Favorite')).toBe(
true,
`Favorite is not displayed for selected files`
);
await toolbar.closeMoreMenu();
});
describe('Shared Files', () => {
beforeEach(async (done) => {
await browser.actions().mouseMove(browser.$('body'), { x: 0, y: 0 }).click().perform();
await dataTable.clearSelection();
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.SHARED_FILES);
await dataTable.waitForHeader();
done();
});
it('correct actions appear when multiple files are selected - [C280467]', async () => {
await dataTable.selectMultipleItems([file1, file2]);
expect(await toolbar.isButtonPresent('View')).toBe(false, 'View is displayed');
expect(await toolbar.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
expect(await toolbar.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files');
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
});
it('correct actions appear when multiple folders are selected - [C280459]', async () => {
await dataTable.selectMultipleItems([folder1, folder2]);
expect(await toolbar.isButtonPresent('View')).toBe(
false,
'View is displayed'
);
expect(await toolbar.isButtonPresent('Download')).toBe(
true,
'Download is not displayed'
);
expect(await toolbar.isButtonPresent('Edit')).toBe(
false,
'Edit is displayed'
);
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(
true,
`Copy is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Delete')).toBe(
true,
`Delete is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Move')).toBe(
true,
`Move is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Favorite')).toBe(
true,
`Favorite is not displayed for selected files`
);
await toolbar.closeMoreMenu();
});
describe('Recent Files', () => {
beforeEach(async (done) => {
await browser.actions().mouseMove(browser.$('body'), { x: 0, y: 0 }).click().perform();
await dataTable.clearSelection();
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.RECENT_FILES);
await dataTable.waitForHeader();
done();
});
it('correct actions appear when both files and folders are selected - [C280460]', async () => {
await dataTable.selectMultipleItems([file1, file2, folder1, folder2]);
expect(await toolbar.isButtonPresent('View')).toBe(
false,
'View is displayed'
);
expect(await toolbar.isButtonPresent('Download')).toBe(
true,
'Download is not displayed'
);
expect(await toolbar.isButtonPresent('Edit')).toBe(
false,
'Edit is displayed'
);
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(
true,
`Copy is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Delete')).toBe(
true,
`Delete is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Move')).toBe(
true,
`Move is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Favorite')).toBe(
true,
`Favorite is not displayed for selected files`
);
await toolbar.closeMoreMenu();
});
});
it('correct actions appear when multiple files are selected - [C280468]', async () => {
await dataTable.selectMultipleItems([file1, file2]);
expect(await toolbar.isButtonPresent('View')).toBe(false, 'View is displayed');
expect(await toolbar.isButtonPresent('Download')).toBe(true, 'Download is not displayed');
expect(await toolbar.isButtonPresent('Edit')).toBe(false, 'Edit is displayed');
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
});
describe('File Libraries', () => {
beforeEach(async done => {
await browser
.actions()
.mouseMove(browser.$('body'), { x: 0, y: 0 })
.click()
.perform();
await dataTable.clearSelection();
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES);
await dataTable.waitForHeader();
await dataTable.doubleClickOnRowByName(siteName);
await dataTable.waitForHeader();
done();
});
describe('Favorites', () => {
beforeEach(async (done) => {
await browser.actions().mouseMove(browser.$('body'), { x: 0, y: 0 }).click().perform();
await dataTable.clearSelection();
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES);
await dataTable.waitForHeader();
done();
});
it('correct actions appear when multiple files are selected - [C280469]', async () => {
await dataTable.selectMultipleItems([file1, file2]);
expect(await toolbar.isButtonPresent('View')).toBe(false, 'View is displayed');
expect(await toolbar.isButtonPresent('Download')).toBe(true, 'Download is not displayed');
expect(await toolbar.isButtonPresent('Edit')).toBe(false, 'Edit is displayed');
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
});
it('correct actions appear when multiple folders are selected - [C280470]', async () => {
await dataTable.selectMultipleItems([folder1, folder2]);
expect(await toolbar.isButtonPresent('View')).toBe(false, 'View is displayed');
expect(await toolbar.isButtonPresent('Download')).toBe(true, 'Download is not displayed');
expect(await toolbar.isButtonPresent('Edit')).toBe(false, 'Edit is displayed');
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
});
it('correct actions appear when both files and folders are selected - [C280471]', async () => {
await dataTable.selectMultipleItems([file1, file2, folder1, folder2]);
expect(await toolbar.isButtonPresent('View')).toBe(false, 'View is displayed');
expect(await toolbar.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files');
expect(await toolbar.isButtonPresent('Edit')).toBe(false, 'Edit is displayed');
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`);
expect(await menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`);
});
it('correct actions appear when multiple files are selected - [C280461]', async () => {
await dataTable.selectMultipleItems([file1InSite, file2InSite]);
expect(await toolbar.isButtonPresent('View')).toBe(
false,
'View is displayed for selected files'
);
expect(await toolbar.isButtonPresent('Download')).toBe(
true,
'Download is not displayed for selected files'
);
expect(await toolbar.isButtonPresent('Edit')).toBe(
false,
'Edit is displayed for selected files'
);
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(
true,
`Copy is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Delete')).toBe(
true,
`Delete is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Move')).toBe(
true,
`Move is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Favorite')).toBe(
true,
`Favorite is not displayed for selected files`
);
});
describe('Trash', () => {
beforeEach(async (done) => {
await dataTable.clearSelection();
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH);
await dataTable.waitForHeader();
done();
});
it('correct actions appear when multiple files are selected - [C280472]', async () => {
await dataTable.selectMultipleItems([fileForDelete1, fileForDelete2]);
expect(await toolbar.isButtonPresent('Permanently delete')).toBe(true, 'Permanently delete is displayed');
expect(await toolbar.isButtonPresent('Restore')).toBe(true, 'Restore is not displayed');
});
it('correct actions appear when multiple folders are selected - [C280473]', async () => {
await dataTable.selectMultipleItems([folderForDelete1, folderForDelete2]);
expect(await toolbar.isButtonPresent('Permanently delete')).toBe(true, 'Permanently delete is displayed');
expect(await toolbar.isButtonPresent('Restore')).toBe(true, 'Restore is not displayed');
});
it('correct actions appear when both files and folders are selected - [C280474]', async () => {
await dataTable.selectMultipleItems([fileForDelete1, fileForDelete2, folderForDelete1, folderForDelete2]);
expect(await toolbar.isButtonPresent('Permanently delete')).toBe(true, 'Permanently delete is displayed');
expect(await toolbar.isButtonPresent('Restore')).toBe(true, 'Restore is not displayed');
});
it('correct actions appear when multiple folders are selected - [C280462]', async () => {
await dataTable.selectMultipleItems([folder1InSite, folder2InSite]);
expect(await toolbar.isButtonPresent('View')).toBe(
false,
'View is displayed'
);
expect(await toolbar.isButtonPresent('Download')).toBe(
true,
'Download is not displayed'
);
expect(await toolbar.isButtonPresent('Edit')).toBe(
false,
'Edit is displayed'
);
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(
true,
`Copy is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Delete')).toBe(
true,
`Delete is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Move')).toBe(
true,
`Move is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Favorite')).toBe(
true,
`Favorite is not displayed for selected files`
);
});
it('correct actions appear when both files and folders are selected - [C280463]', async () => {
await dataTable.selectMultipleItems([
file1InSite,
file2InSite,
folder1InSite,
folder2InSite
]);
expect(await toolbar.isButtonPresent('View')).toBe(
false,
'View is displayed'
);
expect(await toolbar.isButtonPresent('Download')).toBe(
true,
'Download is not displayed'
);
expect(await toolbar.isButtonPresent('Edit')).toBe(
false,
'Edit is displayed'
);
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(
true,
`Copy is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Delete')).toBe(
true,
`Delete is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Move')).toBe(
true,
`Move is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Favorite')).toBe(
true,
`Favorite is not displayed for selected files`
);
});
});
describe('Shared Files', () => {
beforeEach(async done => {
await browser
.actions()
.mouseMove(browser.$('body'), { x: 0, y: 0 })
.click()
.perform();
await dataTable.clearSelection();
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.SHARED_FILES);
await dataTable.waitForHeader();
done();
});
it('correct actions appear when multiple files are selected - [C280467]', async () => {
await dataTable.selectMultipleItems([file1, file2]);
expect(await toolbar.isButtonPresent('View')).toBe(
false,
'View is displayed'
);
expect(await toolbar.isButtonPresent('Download')).toBe(
true,
'Download is not displayed for selected files'
);
expect(await toolbar.isButtonPresent('Edit')).toBe(
false,
'Edit is displayed for selected files'
);
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(
true,
`Copy is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Delete')).toBe(
true,
`Delete is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Move')).toBe(
true,
`Move is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Favorite')).toBe(
true,
`Favorite is not displayed for selected files`
);
});
});
describe('Recent Files', () => {
beforeEach(async done => {
await browser
.actions()
.mouseMove(browser.$('body'), { x: 0, y: 0 })
.click()
.perform();
await dataTable.clearSelection();
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.RECENT_FILES);
await dataTable.waitForHeader();
done();
});
it('correct actions appear when multiple files are selected - [C280468]', async () => {
await dataTable.selectMultipleItems([file1, file2]);
expect(await toolbar.isButtonPresent('View')).toBe(
false,
'View is displayed'
);
expect(await toolbar.isButtonPresent('Download')).toBe(
true,
'Download is not displayed'
);
expect(await toolbar.isButtonPresent('Edit')).toBe(
false,
'Edit is displayed'
);
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(
true,
`Copy is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Delete')).toBe(
true,
`Delete is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Move')).toBe(
true,
`Move is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Favorite')).toBe(
true,
`Favorite is not displayed for selected files`
);
});
});
describe('Favorites', () => {
beforeEach(async done => {
await browser
.actions()
.mouseMove(browser.$('body'), { x: 0, y: 0 })
.click()
.perform();
await dataTable.clearSelection();
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES);
await dataTable.waitForHeader();
done();
});
it('correct actions appear when multiple files are selected - [C280469]', async () => {
await dataTable.selectMultipleItems([file1, file2]);
expect(await toolbar.isButtonPresent('View')).toBe(
false,
'View is displayed'
);
expect(await toolbar.isButtonPresent('Download')).toBe(
true,
'Download is not displayed'
);
expect(await toolbar.isButtonPresent('Edit')).toBe(
false,
'Edit is displayed'
);
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(
true,
`Copy is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Delete')).toBe(
true,
`Delete is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Move')).toBe(
true,
`Move is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Favorite')).toBe(
true,
`Favorite is not displayed for selected files`
);
});
it('correct actions appear when multiple folders are selected - [C280470]', async () => {
await dataTable.selectMultipleItems([folder1, folder2]);
expect(await toolbar.isButtonPresent('View')).toBe(
false,
'View is displayed'
);
expect(await toolbar.isButtonPresent('Download')).toBe(
true,
'Download is not displayed'
);
expect(await toolbar.isButtonPresent('Edit')).toBe(
false,
'Edit is displayed'
);
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(
true,
`Copy is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Delete')).toBe(
true,
`Delete is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Move')).toBe(
true,
`Move is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Favorite')).toBe(
true,
`Favorite is not displayed for selected files`
);
});
it('correct actions appear when both files and folders are selected - [C280471]', async () => {
await dataTable.selectMultipleItems([file1, file2, folder1, folder2]);
expect(await toolbar.isButtonPresent('View')).toBe(
false,
'View is displayed'
);
expect(await toolbar.isButtonPresent('Download')).toBe(
true,
'Download is not displayed for selected files'
);
expect(await toolbar.isButtonPresent('Edit')).toBe(
false,
'Edit is displayed'
);
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Copy')).toBe(
true,
`Copy is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Delete')).toBe(
true,
`Delete is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Move')).toBe(
true,
`Move is not displayed for selected files`
);
expect(await menu.isMenuItemPresent('Favorite')).toBe(
true,
`Favorite is not displayed for selected files`
);
});
});
describe('Trash', () => {
beforeEach(async done => {
await dataTable.clearSelection();
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH);
await dataTable.waitForHeader();
done();
});
it('correct actions appear when multiple files are selected - [C280472]', async () => {
await dataTable.selectMultipleItems([fileForDelete1, fileForDelete2]);
expect(await toolbar.isButtonPresent('Permanently delete')).toBe(
true,
'Permanently delete is displayed'
);
expect(await toolbar.isButtonPresent('Restore')).toBe(
true,
'Restore is not displayed'
);
});
it('correct actions appear when multiple folders are selected - [C280473]', async () => {
await dataTable.selectMultipleItems([folderForDelete1, folderForDelete2]);
expect(await toolbar.isButtonPresent('Permanently delete')).toBe(
true,
'Permanently delete is displayed'
);
expect(await toolbar.isButtonPresent('Restore')).toBe(
true,
'Restore is not displayed'
);
});
it('correct actions appear when both files and folders are selected - [C280474]', async () => {
await dataTable.selectMultipleItems([
fileForDelete1,
fileForDelete2,
folderForDelete1,
folderForDelete2
]);
expect(await toolbar.isButtonPresent('Permanently delete')).toBe(
true,
'Permanently delete is displayed'
);
expect(await toolbar.isButtonPresent('Restore')).toBe(
true,
'Restore is not displayed'
);
});
});
});

View File

@ -0,0 +1,239 @@
/*!
* @license
* Alfresco Example Content Application
*
* Copyright (C) 2005 - 2018 Alfresco Software Limited
*
* This file is part of the Alfresco Example Content Application.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* The Alfresco Example Content Application is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alfresco Example Content Application is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { LoginPage, BrowsingPage, LogoutPage } from '../../pages/pages';
import { SIDEBAR_LABELS, FILES } from '../../configs';
import { RepoClient } from '../../utilities/repo-client/repo-client';
import { Utils } from '../../utilities/utils';
import { Viewer } from '../../components/viewer/viewer';
import { CopyMoveDialog } from './../../components/dialog/copy-move-dialog';
import { ShareDialog } from './../../components/dialog/share-dialog';
import { ManageVersionsDialog } from './../../components/dialog/manage-versions-dialog';
describe('Viewer actions', () => {
const username = `user-${Utils.random()}`;
const parent = `parent-${Utils.random()}`;
let parentId;
const docxFile = FILES.docxFile;
let docxFileId;
const xlsxFileForMove = FILES.xlsxFile;
const pdfFileForDelete = FILES.pdfFile;
let pdfFileForDeleteId;
const destination = `destination-${Utils.random()}`;
let destinationId;
const apis = {
admin: new RepoClient(),
user: new RepoClient(username, username)
};
const loginPage = new LoginPage();
const logoutPage = new LogoutPage();
const page = new BrowsingPage();
const dataTable = page.dataTable;
const viewer = new Viewer();
const { toolbar } = viewer;
const copyMoveDialog = new CopyMoveDialog();
const shareDialog = new ShareDialog();
const manageVersionsDialog = new ManageVersionsDialog();
beforeAll(async done => {
await apis.admin.people.createUser({ username });
parentId = (await apis.user.nodes.createFolder(parent)).entry.id;
docxFileId = (await apis.user.upload.uploadFile(docxFile, parentId)).entry.id;
await apis.user.upload.uploadFile(xlsxFileForMove, parentId);
pdfFileForDeleteId = (await apis.user.upload.uploadFile(pdfFileForDelete, parentId)).entry.id;
destinationId = (await apis.user.nodes.createFolder(destination)).entry.id;
await loginPage.loginWith(username);
done();
});
beforeEach(async done => {
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES);
await dataTable.waitForHeader();
await dataTable.doubleClickOnRowByName(parent);
await dataTable.waitForHeader();
done();
});
afterEach(async done => {
await Utils.pressEscape();
done();
});
afterAll(async done => {
await Promise.all([apis.user.nodes.deleteNodeById(parentId), apis.user.nodes.deleteNodeById(destinationId), logoutPage.load()]);
done();
});
it('Correct actions appear in the viewer toolbar - [C282025]', async () => {
await dataTable.doubleClickOnRowByName(docxFile);
expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened');
expect(await toolbar.isEmpty()).toBe(false, `viewer toolbar is empty`);
expect(await toolbar.isButtonPresent('View')).toBe(false, `View is displayed`);
expect(await toolbar.isButtonPresent('Download')).toBe(true, `Download is not displayed`);
expect(await toolbar.isButtonPresent('Print')).toBe(true, `print`);
expect(await toolbar.isButtonPresent('Activate full-screen mode')).toBe(true, `full screen`);
expect(await toolbar.isButtonPresent('View details')).toBe(true, `view details`);
const menu = await toolbar.openMoreMenu();
expect(await menu.isMenuItemPresent('Favorite')).toBe(true, `favorite`);
expect(await menu.isMenuItemPresent('Share')).toBe(true, `share`);
expect(await menu.isMenuItemPresent('Copy')).toBe(true, `copy`);
expect(await menu.isMenuItemPresent('Move')).toBe(true, `move`);
expect(await menu.isMenuItemPresent('Delete')).toBe(true, `delete`);
expect(await menu.isMenuItemPresent('Manage Versions')).toBe(true, `manage versions`);
expect(await menu.isMenuItemPresent('Permissions')).toBe(true, `permissions`);
await toolbar.closeMoreMenu();
});
it('Download action - [C268129]', async () => {
await dataTable.doubleClickOnRowByName(docxFile);
expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened');
await toolbar.clickButton('Download');
expect(await Utils.fileExistsOnOS(docxFile)).toBe(true, 'File not found in download location');
});
it('Copy action - [C268130]', async () => {
await dataTable.doubleClickOnRowByName(docxFile);
expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened');
const menu = await toolbar.openMoreMenu();
await menu.clickMenuItem('Copy');
expect(await copyMoveDialog.isDialogOpen()).toBe(true, 'Dialog is not open');
await copyMoveDialog.selectLocation('Personal Files');
await copyMoveDialog.chooseDestination(destination);
await copyMoveDialog.clickCopy();
expect(await page.getSnackBarMessage()).toContain('Copied 1 item');
await viewer.clickClose();
expect(await dataTable.getRowByName(docxFile).isPresent()).toBe(true, 'Item is not in the list');
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES);
await dataTable.waitForHeader();
await dataTable.doubleClickOnRowByName(destination);
expect(await dataTable.getRowByName(docxFile).isPresent()).toBe(true, 'Item is not present in destination');
});
it('Move action - [C268131]', async () => {
await dataTable.doubleClickOnRowByName(xlsxFileForMove);
expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened');
const menu = await toolbar.openMoreMenu();
await menu.clickMenuItem('Move');
expect(await copyMoveDialog.isDialogOpen()).toBe(true, 'Dialog is not open');
await copyMoveDialog.selectLocation('Personal Files');
await copyMoveDialog.chooseDestination(destination);
await copyMoveDialog.clickMove();
expect(await page.getSnackBarMessage()).toContain('Moved 1 item');
await viewer.clickClose();
expect(await dataTable.getRowByName(xlsxFileForMove).isPresent()).toBe(false, 'Item was not moved');
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES);
await dataTable.waitForHeader();
await dataTable.doubleClickOnRowByName(destination);
expect(await dataTable.getRowByName(xlsxFileForMove).isPresent()).toBe(true, 'Item is not present in destination');
});
it('Favorite action - [C268132]', async () => {
await dataTable.doubleClickOnRowByName(docxFile);
expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened');
const menu = await toolbar.openMoreMenu();
await menu.clickMenuItem('Favorite');
expect(await apis.user.favorites.isFavorite(docxFileId)).toBe(true, 'Item is not favorite');
await viewer.clickClose();
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES);
await dataTable.waitForHeader();
expect(await dataTable.getRowByName(docxFile).isPresent()).toBe(true, 'Item is not present in Favorites list');
await apis.user.favorites.removeFavoriteById(docxFileId);
});
it('Delete action - [C268133]', async () => {
await dataTable.doubleClickOnRowByName(pdfFileForDelete);
expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened');
const menu = await toolbar.openMoreMenu();
await menu.clickMenuItem('Delete');
expect(await page.getSnackBarMessage()).toContain(`${pdfFileForDelete} deleted`);
// TODO: enable this when ACA-1806 is fixed
// expect(await viewer.isViewerOpened()).toBe(false, 'Viewer is opened');
await Utils.pressEscape();
await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH);
await dataTable.waitForHeader();
expect(await dataTable.getRowByName(pdfFileForDelete).isPresent()).toBe(true, 'Item is not present in Trash');
await apis.user.trashcan.restore(pdfFileForDeleteId);
});
it('Full screen action - [C279282]', async () => {
await dataTable.doubleClickOnRowByName(docxFile);
expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened');
await Utils.getBrowserLog();
await toolbar.clickButton('Activate full-screen mode');
expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is closed after pressing Full screen');
const browserLogAfter = await Utils.getBrowserLog();
expect(browserLogAfter.length).toEqual(0);
});
it('Share action - [C286313]', async () => {
await dataTable.doubleClickOnRowByName(docxFile);
expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened');
const menu = await toolbar.openMoreMenu();
await menu.clickMenuItem('Share');
expect(await shareDialog.isDialogOpen()).toBe(true, 'Dialog is not open');
await shareDialog.clickClose();
});
it('Manage Versions action - [C286316]', async () => {
await dataTable.doubleClickOnRowByName(docxFile);
expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened');
const menu = await toolbar.openMoreMenu();
await menu.clickMenuItem('Manage Versions');
expect(await manageVersionsDialog.isDialogOpen()).toBe(true, 'Dialog is not open');
await manageVersionsDialog.clickClose();
});
// TODO: enable this once bug is fixed
xit('Pressing ESC in the viewer closes only the action dialog - [C286314]', async () => {
await dataTable.doubleClickOnRowByName(docxFile);
expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened');
const menu = await toolbar.openMoreMenu();
await menu.clickMenuItem('Share');
expect(await shareDialog.isDialogOpen()).toBe(true, 'Dialog is not open');
await Utils.pressEscape();
expect(await shareDialog.isDialogOpen()).toBe(false, 'Dialog is still open');
expect(await viewer.isViewerOpened()).toBe(true, 'Viewer is not opened');
});
});

View File

@ -23,64 +23,102 @@
* along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
*/
import { browser, promise, ElementFinder, ExpectedConditions as EC } from 'protractor';
import { browser, protractor, promise, ElementFinder, ExpectedConditions as EC } from 'protractor';
import { BROWSER_WAIT_TIMEOUT, E2E_ROOT_PATH, EXTENSIBILITY_CONFIGS } from '../configs';
const path = require('path');
const fs = require('fs');
export class Utils {
// generate a random value
static random(): string {
return Math.random().toString(36).substring(3, 10).toLowerCase();
// generate a random value
static random(): string {
return Math.random()
.toString(36)
.substring(3, 10)
.toLowerCase();
}
// local storage
static clearLocalStorage(): promise.Promise<any> {
return browser.executeScript('window.localStorage.clear();');
}
// session storage
static clearSessionStorage(): promise.Promise<any> {
return browser.executeScript('window.sessionStorage.clear();');
}
static getSessionStorage() {
return browser.executeScript('return window.sessionStorage.getItem("aca.extension.config");');
}
static async setSessionStorageFromConfig(key: string, configFileName: string) {
const configFile = `${E2E_ROOT_PATH}/resources/extensibility-configs/${configFileName}`;
const fileContent = JSON.stringify(fs.readFileSync(configFile, { encoding: 'utf8' }));
return await browser.executeScript(`window.sessionStorage.setItem(${key}, ${fileContent});`);
}
static async resetExtensionConfig() {
const defConfig = `${E2E_ROOT_PATH}/resources/extensibility-configs/${EXTENSIBILITY_CONFIGS.DEFAULT_EXTENSIONS_CONFIG}`;
return await this.setSessionStorageFromConfig('"aca.extension.config"', defConfig);
}
static retryCall(fn: () => Promise<any>, retry: number = 30, delay: number = 1000): Promise<any> {
const pause = duration => new Promise(res => setTimeout(res, duration));
const run = retries => fn().catch(err => (retries > 1 ? pause(delay).then(() => run(retries - 1)) : Promise.reject(err)));
return run(retry);
}
static waitUntilElementClickable(element: ElementFinder) {
return browser.wait(EC.elementToBeClickable(element), BROWSER_WAIT_TIMEOUT);
}
static typeInField(elem: ElementFinder, value: string) {
for (let i = 0; i < value.length; i++) {
const c = value.charAt(i);
elem.sendKeys(c);
browser.sleep(100);
}
}
// local storage
static clearLocalStorage(): promise.Promise<any> {
return browser.executeScript('window.localStorage.clear();');
}
static async fileExistsOnOS(fileName: string) {
const filePath = path.join((await browser.getProcessedConfig()).params.downloadFolder, fileName);
// session storage
static clearSessionStorage(): promise.Promise<any> {
return browser.executeScript('window.sessionStorage.clear();');
}
let tries = 5;
static getSessionStorage() {
return browser.executeScript('return window.sessionStorage.getItem("aca.extension.config");');
}
return new Promise(function(resolve) {
const checkExist = setInterval(() => {
fs.stat(filePath, function(error) {
tries--;
static async setSessionStorageFromConfig(key: string, configFileName: string) {
const configFile = `${E2E_ROOT_PATH}/resources/extensibility-configs/${configFileName}`;
const fileContent = JSON.stringify(fs.readFileSync(configFile, { encoding: 'utf8' }));
if (error && tries === 0) {
clearInterval(checkExist);
resolve(false);
}
return await browser.executeScript(`window.sessionStorage.setItem(${key}, ${fileContent});`);
}
if (!error) {
clearInterval(checkExist);
resolve(true);
}
});
}, 500);
});
}
static async resetExtensionConfig() {
const defConfig = `${E2E_ROOT_PATH}/resources/extensibility-configs/${EXTENSIBILITY_CONFIGS.DEFAULT_EXTENSIONS_CONFIG}`;
static async pressEscape() {
return await browser
.actions()
.sendKeys(protractor.Key.ESCAPE)
.perform();
}
return await this.setSessionStorageFromConfig('"aca.extension.config"', defConfig);
}
static retryCall(fn: () => Promise <any>, retry: number = 30, delay: number = 1000): Promise<any> {
const pause = (duration) => new Promise(res => setTimeout(res, duration));
const run = (retries) =>
fn().catch(err => retries > 1
? pause(delay).then(() => run(retries - 1))
: Promise.reject(err));
return run(retry);
}
static waitUntilElementClickable(element: ElementFinder) {
return browser.wait(EC.elementToBeClickable(element), BROWSER_WAIT_TIMEOUT);
}
static typeInField(elem: ElementFinder, value: string) {
for ( let i = 0; i < value.length; i++ ) {
const c = value.charAt(i);
elem.sendKeys(c);
browser.sleep(100);
}
}
static async getBrowserLog() {
return await browser
.manage()
.logs()
.get('browser');
}
}

221
package-lock.json generated
View File

@ -3194,8 +3194,7 @@
"async-limiter": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
"integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
"dev": true
"integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
},
"asynckit": {
"version": "0.4.0",
@ -3990,6 +3989,22 @@
"integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=",
"dev": true
},
"chrome-remote-interface": {
"version": "0.26.1",
"resolved": "https://registry.npmjs.org/chrome-remote-interface/-/chrome-remote-interface-0.26.1.tgz",
"integrity": "sha512-ela482aJK0riFu05sl+zdbnb3ezMiqzwsqf/f/27HngWds+Fat3vcZWpIoDoeQuWMid/+LfKAteAYWaWPqsweg==",
"requires": {
"commander": "2.11.x",
"ws": "^3.3.3"
},
"dependencies": {
"commander": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
"integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ=="
}
}
},
"chrome-trace-event": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz",
@ -6147,24 +6162,28 @@
"dependencies": {
"abbrev": {
"version": "1.1.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true,
"optional": true
},
"ansi-regex": {
"version": "2.1.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true
},
"aproba": {
"version": "1.2.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
"dev": true,
"optional": true
},
"are-we-there-yet": {
"version": "1.1.4",
"bundled": true,
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz",
"integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=",
"dev": true,
"optional": true,
"requires": {
@ -6174,12 +6193,14 @@
},
"balanced-match": {
"version": "1.0.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0",
@ -6188,34 +6209,40 @@
},
"chownr": {
"version": "1.0.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz",
"integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=",
"dev": true,
"optional": true
},
"code-point-at": {
"version": "1.1.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"dev": true
},
"core-util-is": {
"version": "1.0.2",
"bundled": true,
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true,
"optional": true
},
"debug": {
"version": "2.6.9",
"bundled": true,
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"optional": true,
"requires": {
@ -6224,25 +6251,29 @@
},
"deep-extend": {
"version": "0.5.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
"integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==",
"dev": true,
"optional": true
},
"delegates": {
"version": "1.0.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"dev": true,
"optional": true
},
"detect-libc": {
"version": "1.0.3",
"bundled": true,
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
"dev": true,
"optional": true
},
"fs-minipass": {
"version": "1.2.5",
"bundled": true,
"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz",
"integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==",
"dev": true,
"optional": true,
"requires": {
@ -6251,13 +6282,15 @@
},
"fs.realpath": {
"version": "1.0.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true,
"optional": true
},
"gauge": {
"version": "2.7.4",
"bundled": true,
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"dev": true,
"optional": true,
"requires": {
@ -6273,7 +6306,8 @@
},
"glob": {
"version": "7.1.2",
"bundled": true,
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"dev": true,
"optional": true,
"requires": {
@ -6287,13 +6321,15 @@
},
"has-unicode": {
"version": "2.0.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"dev": true,
"optional": true
},
"iconv-lite": {
"version": "0.4.21",
"bundled": true,
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz",
"integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==",
"dev": true,
"optional": true,
"requires": {
@ -6302,7 +6338,8 @@
},
"ignore-walk": {
"version": "3.0.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
"integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
"dev": true,
"optional": true,
"requires": {
@ -6311,7 +6348,8 @@
},
"inflight": {
"version": "1.0.6",
"bundled": true,
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"optional": true,
"requires": {
@ -6321,18 +6359,21 @@
},
"inherits": {
"version": "2.0.3",
"bundled": true,
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
},
"ini": {
"version": "1.3.5",
"bundled": true,
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true,
"optional": true
},
"is-fullwidth-code-point": {
"version": "1.0.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"requires": {
"number-is-nan": "^1.0.0"
@ -6340,13 +6381,15 @@
},
"isarray": {
"version": "1.0.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true,
"optional": true
},
"minimatch": {
"version": "3.0.4",
"bundled": true,
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
"brace-expansion": "^1.1.7"
@ -6354,12 +6397,14 @@
},
"minimist": {
"version": "0.0.8",
"bundled": true,
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true
},
"minipass": {
"version": "2.2.4",
"bundled": true,
"resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz",
"integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==",
"dev": true,
"requires": {
"safe-buffer": "^5.1.1",
@ -6368,7 +6413,8 @@
},
"minizlib": {
"version": "1.1.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz",
"integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==",
"dev": true,
"optional": true,
"requires": {
@ -6377,7 +6423,8 @@
},
"mkdirp": {
"version": "0.5.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
"requires": {
"minimist": "0.0.8"
@ -6385,13 +6432,15 @@
},
"ms": {
"version": "2.0.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true,
"optional": true
},
"needle": {
"version": "2.2.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz",
"integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==",
"dev": true,
"optional": true,
"requires": {
@ -6402,7 +6451,8 @@
},
"node-pre-gyp": {
"version": "0.10.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz",
"integrity": "sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ==",
"dev": true,
"optional": true,
"requires": {
@ -6420,7 +6470,8 @@
},
"nopt": {
"version": "4.0.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"dev": true,
"optional": true,
"requires": {
@ -6430,13 +6481,15 @@
},
"npm-bundled": {
"version": "1.0.3",
"bundled": true,
"resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz",
"integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==",
"dev": true,
"optional": true
},
"npm-packlist": {
"version": "1.1.10",
"bundled": true,
"resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz",
"integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==",
"dev": true,
"optional": true,
"requires": {
@ -6446,7 +6499,8 @@
},
"npmlog": {
"version": "4.1.2",
"bundled": true,
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true,
"optional": true,
"requires": {
@ -6458,18 +6512,21 @@
},
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"dev": true
},
"object-assign": {
"version": "4.1.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true,
"optional": true
},
"once": {
"version": "1.4.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1"
@ -6477,19 +6534,22 @@
},
"os-homedir": {
"version": "1.0.2",
"bundled": true,
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"dev": true,
"optional": true
},
"os-tmpdir": {
"version": "1.0.2",
"bundled": true,
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true,
"optional": true
},
"osenv": {
"version": "0.1.5",
"bundled": true,
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"dev": true,
"optional": true,
"requires": {
@ -6499,19 +6559,22 @@
},
"path-is-absolute": {
"version": "1.0.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true,
"optional": true
},
"process-nextick-args": {
"version": "2.0.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
"dev": true,
"optional": true
},
"rc": {
"version": "1.2.7",
"bundled": true,
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz",
"integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==",
"dev": true,
"optional": true,
"requires": {
@ -6523,7 +6586,8 @@
"dependencies": {
"minimist": {
"version": "1.2.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true,
"optional": true
}
@ -6531,7 +6595,8 @@
},
"readable-stream": {
"version": "2.3.6",
"bundled": true,
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"optional": true,
"requires": {
@ -6546,7 +6611,8 @@
},
"rimraf": {
"version": "2.6.2",
"bundled": true,
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
"integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
"dev": true,
"optional": true,
"requires": {
@ -6555,42 +6621,49 @@
},
"safe-buffer": {
"version": "5.1.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
"dev": true
},
"safer-buffer": {
"version": "2.1.2",
"bundled": true,
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true,
"optional": true
},
"sax": {
"version": "1.2.4",
"bundled": true,
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"dev": true,
"optional": true
},
"semver": {
"version": "5.5.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
"integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
"dev": true,
"optional": true
},
"set-blocking": {
"version": "2.0.0",
"bundled": true,
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true,
"optional": true
},
"signal-exit": {
"version": "3.0.2",
"bundled": true,
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"dev": true,
"optional": true
},
"string-width": {
"version": "1.0.2",
"bundled": true,
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"requires": {
"code-point-at": "^1.0.0",
@ -6600,7 +6673,8 @@
},
"string_decoder": {
"version": "1.1.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"optional": true,
"requires": {
@ -6609,7 +6683,8 @@
},
"strip-ansi": {
"version": "3.0.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"requires": {
"ansi-regex": "^2.0.0"
@ -6617,13 +6692,15 @@
},
"strip-json-comments": {
"version": "2.0.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"dev": true,
"optional": true
},
"tar": {
"version": "4.4.1",
"bundled": true,
"resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz",
"integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==",
"dev": true,
"optional": true,
"requires": {
@ -6638,13 +6715,15 @@
},
"util-deprecate": {
"version": "1.0.2",
"bundled": true,
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true,
"optional": true
},
"wide-align": {
"version": "1.1.2",
"bundled": true,
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz",
"integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==",
"dev": true,
"optional": true,
"requires": {
@ -6653,12 +6732,14 @@
},
"wrappy": {
"version": "1.0.2",
"bundled": true,
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
},
"yallist": {
"version": "3.0.2",
"bundled": true,
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz",
"integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=",
"dev": true
}
}
@ -13992,8 +14073,7 @@
"ultron": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
"integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
"dev": true
"integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og=="
},
"union-value": {
"version": "1.0.0",
@ -16005,7 +16085,6 @@
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
"integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
"dev": true,
"requires": {
"async-limiter": "~1.0.0",
"safe-buffer": "~5.1.0",

View File

@ -51,6 +51,7 @@
"@ngrx/store-devtools": "^6.1.0",
"@ngstack/code-editor": "^0.4.3",
"@ngx-translate/core": "^10.0.2",
"chrome-remote-interface": "^0.26.1",
"alfresco-js-api": "2.6.0-e0035744611f12f4f0067495615fa37ce392c810",
"core-js": "^2.5.7",
"hammerjs": "2.0.8",

View File

@ -2,77 +2,124 @@
// https://github.com/angular/protractor/blob/master/lib/config.ts
const path = require('path');
const { SpecReporter } = require('jasmine-spec-reporter');
const {
SpecReporter
} = require('jasmine-spec-reporter');
const jasmineReporters = require('jasmine-reporters');
const CDP = require('chrome-remote-interface');
const projectRoot = path.resolve(__dirname);
const downloadFolder = `${projectRoot}/e2e-downloads`;
const width = 1366;
const height = 768;
exports.config = {
allScriptsTimeout: 40000,
var fs = require('fs');
specs: [
'./e2e/suites/authentication/*.test.ts',
'./e2e/suites/list-views/*.test.ts',
'./e2e/suites/application/*.test.ts',
'./e2e/suites/navigation/*.test.ts',
'./e2e/suites/pagination/*.test.ts',
'./e2e/suites/actions/*.test.ts',
'./e2e/suites/viewer/*.test.ts',
'./e2e/suites/extensions/*.test.ts'
],
capabilities: {
browserName: 'chrome',
chromeOptions: {
prefs: {
'credentials_enable_service': false
},
args: [ '--incognito', '--headless' ]
}
},
directConnect: true,
baseUrl: 'http://localhost:4000',
framework: 'jasmine2',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 60000,
print: function() {}
},
plugins: [{
package: 'jasmine2-protractor-utils',
disableHTMLReport: false,
disableScreenshot: false,
screenshotOnExpectFailure: true,
screenshotOnSpecFailure: false,
clearFoldersBeforeTest: true,
htmlReportDir: `${projectRoot}/e2e-output/html-report/`,
screenshotPath: `${projectRoot}/e2e-output/screenshots/`
}],
onPrepare() {
require('ts-node').register({
project: 'e2e/tsconfig.e2e.json'
});
browser.manage().window().setSize(width, height);
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
consolidateAll: true,
savePath: `${projectRoot}/e2e-output/junit-report`,
filePrefix: 'results.xml',
useDotNotation: false,
useFullTestName: false,
reportFailedUrl: true
}));
function rmDir(dirPath) {
try {
var files = fs.readdirSync(dirPath);
} catch (e) {
return;
}
if (files.length > 0)
for (var i = 0; i < files.length; i++) {
var filePath = dirPath + '/' + files[i];
if (fs.statSync(filePath).isFile())
fs.unlinkSync(filePath);
else
rmDir(filePath);
}
fs.rmdirSync(dirPath);
};
exports.config = {
allScriptsTimeout: 40000,
params: {
downloadFolder: downloadFolder
},
specs: [
'./e2e/suites/authentication/*.test.ts',
'./e2e/suites/list-views/*.test.ts',
'./e2e/suites/application/*.test.ts',
'./e2e/suites/navigation/*.test.ts',
'./e2e/suites/pagination/*.test.ts',
'./e2e/suites/actions/*.test.ts',
'./e2e/suites/viewer/*.test.ts',
'./e2e/suites/extensions/*.test.ts'
],
capabilities: {
browserName: 'chrome',
chromeOptions: {
prefs: {
'credentials_enable_service': false,
'download': {
'prompt_for_download': false,
'default_directory': downloadFolder
}
},
args: ['--incognito', '--headless', '--remote-debugging-port=9222']
}
},
directConnect: true,
baseUrl: 'http://localhost:4000',
framework: 'jasmine2',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 60000,
print: function () {}
},
plugins: [{
package: 'jasmine2-protractor-utils',
disableHTMLReport: false,
disableScreenshot: false,
screenshotOnExpectFailure: true,
screenshotOnSpecFailure: false,
clearFoldersBeforeTest: true,
htmlReportDir: `${projectRoot}/e2e-output/html-report/`,
screenshotPath: `${projectRoot}/e2e-output/screenshots/`
}],
onPrepare() {
require('ts-node').register({
project: 'e2e/tsconfig.e2e.json'
});
browser.manage().window().setSize(width, height);
jasmine.getEnv().addReporter(new SpecReporter({
spec: {
displayStacktrace: true
}
}));
jasmine.getEnv().addReporter(new jasmineReporters.JUnitXmlReporter({
consolidateAll: true,
savePath: `${projectRoot}/e2e-output/junit-report`,
filePrefix: 'results.xml',
useDotNotation: false,
useFullTestName: false,
reportFailedUrl: true
}));
rmDir(downloadFolder);
CDP().then(client => {
client.send('Page.setDownloadBehavior', {
behavior: 'allow',
downloadPath: downloadFolder
})
})
.catch(err => {
console.log(err)
});
}
}