diff --git a/e2e/components/component.ts b/e2e/components/component.ts deleted file mode 100644 index 24d7f1cb1..000000000 --- a/e2e/components/component.ts +++ /dev/null @@ -1,43 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { ElementFinder, element, by, ExpectedConditions as EC, browser } from 'protractor'; -import { BROWSER_WAIT_TIMEOUT } from '../configs'; - -export abstract class Component { - component: ElementFinder; - - constructor(selector: string, ancestor?: ElementFinder) { - const locator = by.css(selector); - - this.component = ancestor - ? ancestor.element(locator) - : element(locator); - } - - wait() { - return browser.wait(EC.presenceOf(this.component), BROWSER_WAIT_TIMEOUT); - } -} diff --git a/e2e/components/components.ts b/e2e/components/components.ts deleted file mode 100644 index 70992f11d..000000000 --- a/e2e/components/components.ts +++ /dev/null @@ -1,32 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -export * from './login/login'; -export * from './header/header'; -export * from './header/user-info'; -export * from './data-table/data-table'; -export * from './pagination/pagination'; -export * from './sidenav/sidenav'; -export * from './toolbar/toolbar'; diff --git a/e2e/components/data-table/data-table.ts b/e2e/components/data-table/data-table.ts deleted file mode 100644 index ea809fcf3..000000000 --- a/e2e/components/data-table/data-table.ts +++ /dev/null @@ -1,196 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { ElementFinder, ElementArrayFinder, promise, by, browser, ExpectedConditions as EC, protractor } from 'protractor'; -import { BROWSER_WAIT_TIMEOUT } from '../../configs'; -import { Component } from '../component'; - -export class DataTable extends Component { - private static selectors = { - root: 'adf-datatable', - - head: 'table > thead', - columnHeader: 'tr > th', - sortedColumnHeader: ` - th.adf-data-table__header--sorted-asc, - th.adf-data-table__header--sorted-desc - `, - - body: 'table > tbody', - row: 'tr', - selectedRow: 'tr.is-selected', - cell: 'td', - locationLink: 'app-location-link', - - emptyListContainer: 'td.adf-no-content-container', - emptyFolderDragAndDrop: '.adf-empty-list_template .adf-empty-folder', - - emptyListTitle: 'div .empty-list__title', - emptyListText: 'div .empty-list__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); - 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)); - emptyListText: ElementArrayFinder = this.component.all(by.css(DataTable.selectors.emptyListText)); - - constructor(ancestor?: ElementFinder) { - super(DataTable.selectors.root, ancestor); - } - - // 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); - } - - // 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); - } - - 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); - } - - sortByColumn(columnName: string): promise.Promise { - const column = this.getColumnHeaderByLabel(columnName); - const click = browser.actions().mouseMove(column).click(); - - return click.perform(); - } - - // Rows methods - getRows(): ElementArrayFinder { - return this.body.all(by.css(DataTable.selectors.row)); - } - - getSelectedRows(): ElementArrayFinder { - return this.body.all(by.css(DataTable.selectors.selectedRow)); - } - - getNthRow(nth: number): ElementFinder { - return this.getRows().get(nth - 1); - } - - getRowByName(name: string): ElementFinder { - return this.body.element(by.cssContainingText(`.adf-data-table-cell`, name)); - } - - countRows(): promise.Promise { - return this.getRows().count(); - } - - // Navigation/selection methods - doubleClickOnItemName(name: string): promise.Promise { - const dblClick = browser.actions() - .mouseMove(this.getRowByName(name)) - .click() - .click(); - - return dblClick.perform(); - } - - clickOnItemName(name: string): promise.Promise { - return this.getRowByName(name).click(); - } - - selectMultipleItems(names: string[]): promise.Promise { - return browser.actions().sendKeys(protractor.Key.COMMAND).perform() - .then(() => { - names.forEach(name => { - this.clickOnItemName(name); - }); - }) - .then(() => browser.actions().sendKeys(protractor.Key.NULL).perform()); - } - - clearSelection() { - this.getSelectedRows().count() - .then(count => { - if (count !== 0) { browser.refresh().then(() => this.waitForHeader()); } - }); - } - - getItemLocation(name: string) { - const rowLocator = by.cssContainingText(DataTable.selectors.row, name); - return this.body.element(rowLocator).element(this.locationLink); - } - - clickItemLocation(name: string) { - return this.getItemLocation(name).click(); - } - - // empty state methods - isEmptyList(): promise.Promise { - return this.emptyList.isPresent(); - } - - isEmptyWithDragAndDrop(): promise.Promise { - return this.emptyFolderDragAndDrop.isDisplayed(); - } - - getEmptyDragAndDropText(): promise.Promise { - return this.isEmptyWithDragAndDrop() - .then(() => { - return this.emptyFolderDragAndDrop.getText(); - }) - .catch(() => ''); - } - - getEmptyStateTitle(): promise.Promise { - return this.isEmptyList() - .then(() => { - return this.emptyListTitle.getText(); - }) - .catch(() => ''); - } - - getEmptyStateText(): promise.Promise { - return this.isEmptyList() - .then(() => { - return this.emptyListText.getText(); - }) - .catch(() => ''); - } -} diff --git a/e2e/components/dialog/create-edit-folder-dialog.ts b/e2e/components/dialog/create-edit-folder-dialog.ts deleted file mode 100644 index a6d7f29e0..000000000 --- a/e2e/components/dialog/create-edit-folder-dialog.ts +++ /dev/null @@ -1,108 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { ElementFinder, by, browser, protractor, ExpectedConditions as EC, promise } from 'protractor'; -import { BROWSER_WAIT_TIMEOUT } from '../../configs'; -import { Component } from '../component'; - -export class CreateOrEditFolderDialog extends Component { - private static selectors = { - root: 'adf-folder-dialog', - - title: '.mat-dialog-title', - nameInput: '.mat-input-element[placeholder="Name" i]', - descriptionTextArea: '.mat-input-element[placeholder="Description" i]', - button: '.mat-dialog-actions button', - validationMessage: '.mat-hint span' - }; - - title: ElementFinder = this.component.element(by.css(CreateOrEditFolderDialog.selectors.title)); - nameInput: ElementFinder = this.component.element(by.css(CreateOrEditFolderDialog.selectors.nameInput)); - descriptionTextArea: ElementFinder = this.component.element(by.css(CreateOrEditFolderDialog.selectors.descriptionTextArea)); - createButton: ElementFinder = this.component.element(by.cssContainingText(CreateOrEditFolderDialog.selectors.button, 'Create')); - cancelButton: ElementFinder = this.component.element(by.cssContainingText(CreateOrEditFolderDialog.selectors.button, 'Cancel')); - updateButton: ElementFinder = this.component.element(by.cssContainingText(CreateOrEditFolderDialog.selectors.button, 'Update')); - validationMessage: ElementFinder = this.component.element(by.css(CreateOrEditFolderDialog.selectors.validationMessage)); - - constructor(ancestor?: ElementFinder) { - super(CreateOrEditFolderDialog.selectors.root, ancestor); - } - - waitForDialogToOpen() { - return browser.wait(EC.presenceOf(this.title), BROWSER_WAIT_TIMEOUT); - } - - waitForDialogToClose() { - return browser.wait(EC.stalenessOf(this.title), BROWSER_WAIT_TIMEOUT); - } - - getTitle(): promise.Promise { - return this.title.getText(); - } - - isValidationMessageDisplayed(): promise.Promise { - return this.validationMessage.isDisplayed(); - } - - getValidationMessage(): promise.Promise { - return this.isValidationMessageDisplayed() - .then(() => this.validationMessage.getText()) - .catch(() => ''); - } - - enterName(name: string): promise.Promise { - return this.nameInput.clear() - .then(() => this.nameInput.sendKeys(name)) - .then(() => this); - } - - enterDescription(description: string): promise.Promise { - return this.descriptionTextArea.clear() - .then(() => { - browser.actions().click(this.descriptionTextArea).sendKeys(description).perform(); - }) - .then(() => this); - } - - deleteNameWithBackspace(): promise.Promise { - return this.nameInput.clear() - .then(() => { - return this.nameInput.sendKeys(' ', protractor.Key.CONTROL, 'a', protractor.Key.NULL, protractor.Key.BACK_SPACE); - }); - } - - clickCreate() { - return this.createButton.click(); - } - - clickCancel() { - return this.cancelButton.click() - .then(() => this.waitForDialogToClose()); - } - - clickUpdate() { - return this.updateButton.click(); - } -} diff --git a/e2e/components/header/header.ts b/e2e/components/header/header.ts deleted file mode 100644 index be8d271d4..000000000 --- a/e2e/components/header/header.ts +++ /dev/null @@ -1,42 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { ElementFinder, by } from 'protractor'; -import { Component } from '../component'; -import { UserInfo } from './user-info'; - -export class Header extends Component { - private locators = { - logoLink: by.css('.app-menu__title'), - userInfo: by.css('app-current-user') - }; - - logoLink: ElementFinder = this.component.element(this.locators.logoLink); - userInfo: UserInfo = new UserInfo(this.component); - - constructor(ancestor?: ElementFinder) { - super('app-header', ancestor); - } -} diff --git a/e2e/components/header/user-info.ts b/e2e/components/header/user-info.ts deleted file mode 100644 index da110f0a9..000000000 --- a/e2e/components/header/user-info.ts +++ /dev/null @@ -1,64 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { ElementFinder, ElementArrayFinder, element, by, promise } from 'protractor'; -import { Menu } from '../menu/menu'; -import { Component } from '../component'; - -export class UserInfo extends Component { - private locators = { - avatar: by.css('.current-user__avatar'), - fullName: by.css('.current-user__full-name'), - menuItems: by.css('[mat-menu-item]') - }; - - fullName: ElementFinder = this.component.element(this.locators.fullName); - avatar: ElementFinder = this.component.element(this.locators.avatar); - - menu: Menu = new Menu(); - - constructor(ancestor?: ElementFinder) { - super('app-current-user', ancestor); - } - - openMenu(): promise.Promise { - const { menu, avatar } = this; - - return avatar.click() - .then(() => menu.wait()) - .then(() => menu); - } - - get name(): promise.Promise { - return this.fullName.getText(); - } - - signOut(): promise.Promise { - return this.openMenu() - .then(menu => { - menu.clickMenuItem('Sign out'); - }); - } -} diff --git a/e2e/components/login/login.ts b/e2e/components/login/login.ts deleted file mode 100644 index 307059de3..000000000 --- a/e2e/components/login/login.ts +++ /dev/null @@ -1,75 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { by, ElementFinder, promise } from 'protractor'; -import { Component } from '../component'; - -export class LoginComponent extends Component { - static selector = 'adf-login'; - - private locators = { - usernameInput: by.css('input#username'), - passwordInput: by.css('input#password'), - submitButton: by.css('button#login-button'), - errorMessage: by.css('.login-error-message') - }; - - usernameInput: ElementFinder = this.component.element(this.locators.usernameInput); - passwordInput: ElementFinder = this.component.element(this.locators.passwordInput); - submitButton: ElementFinder = this.component.element(this.locators.submitButton); - errorMessage: ElementFinder = this.component.element(this.locators.errorMessage); - - constructor(ancestor?: ElementFinder) { - super(LoginComponent.selector, ancestor); - } - - enterUsername(username: string): LoginComponent { - const { usernameInput } = this; - - usernameInput.clear(); - usernameInput.sendKeys(username); - - return this; - } - - enterPassword(password: string): LoginComponent { - const { passwordInput } = this; - - passwordInput.clear(); - passwordInput.sendKeys(password); - - return this; - } - - enterCredentials(username: string, password: string) { - this.enterUsername(username).enterPassword(password); - - return this; - } - - submit(): promise.Promise { - return this.submitButton.click(); - } -} diff --git a/e2e/components/menu/menu.ts b/e2e/components/menu/menu.ts deleted file mode 100644 index 1f94354ec..000000000 --- a/e2e/components/menu/menu.ts +++ /dev/null @@ -1,73 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { ElementFinder, ElementArrayFinder, by, browser, ExpectedConditions as EC, promise } from 'protractor'; -import { BROWSER_WAIT_TIMEOUT } from '../../configs'; -import { Component } from '../component'; - -export class Menu extends Component { - private static selectors = { - root: '.mat-menu-panel', - item: 'button.mat-menu-item' - }; - - items: ElementArrayFinder = this.component.all(by.css(Menu.selectors.item)); - - constructor(ancestor?: ElementFinder) { - super(Menu.selectors.root, ancestor); - } - - wait() { - return browser.wait(EC.visibilityOf(this.items.get(0)), BROWSER_WAIT_TIMEOUT); - } - - getNthItem(nth: number): ElementFinder { - return this.items.get(nth - 1); - } - - getItemByLabel(label: string): ElementFinder { - return this.component.element(by.cssContainingText(Menu.selectors.item, label)); - } - - getItemTooltip(label: string): promise.Promise { - return this.getItemByLabel(label).getAttribute('title'); - } - - getItemsCount(): promise.Promise { - return this.items.count(); - } - - clickNthItem(nth: number): promise.Promise { - return this.getNthItem(nth).click(); - } - - clickMenuItem(label: string): promise.Promise { - return this.getItemByLabel(label).click(); - } - - isMenuItemPresent(title: string): promise.Promise { - return this.component.element(by.cssContainingText(Menu.selectors.item, title)).isPresent(); - } -} diff --git a/e2e/components/pagination/pagination.ts b/e2e/components/pagination/pagination.ts deleted file mode 100644 index 7c52e3312..000000000 --- a/e2e/components/pagination/pagination.ts +++ /dev/null @@ -1,75 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { ElementFinder, ElementArrayFinder, promise, by, browser, ExpectedConditions as EC } from 'protractor'; -import { BROWSER_WAIT_TIMEOUT } from '../../configs'; -import { Menu } from '../menu/menu'; -import { Component } from '../component'; - -export class Pagination extends Component { - private static selectors = { - root: 'adf-pagination', - range: '.adf-pagination__range', - maxItems: '.adf-pagination__max-items', - currentPage: '.adf-pagination__current-page', - totalPages: '.adf-pagination__total-pages', - - previousButton: '.adf-pagination__previous-button', - nextButton: '.adf-pagination__next-button', - maxItemsButton: '.adf-pagination__max-items + button[mat-icon-button]', - pagesButton: '.adf-pagination__current-page + button[mat-icon-button]' - }; - - range: ElementFinder = this.component.element(by.css(Pagination.selectors.range)); - maxItems: ElementFinder = this.component.element(by.css(Pagination.selectors.maxItems)); - currentPage: ElementFinder = this.component.element(by.css(Pagination.selectors.currentPage)); - totalPages: ElementFinder = this.component.element(by.css(Pagination.selectors.totalPages)); - previousButton: ElementFinder = this.component.element(by.css(Pagination.selectors.previousButton)); - nextButton: ElementFinder = this.component.element(by.css(Pagination.selectors.nextButton)); - maxItemsButton: ElementFinder = this.component.element(by.css(Pagination.selectors.maxItemsButton)); - pagesButton: ElementFinder = this.component.element(by.css(Pagination.selectors.pagesButton)); - - menu: Menu = new Menu(); - - constructor(ancestor?: ElementFinder) { - super(Pagination.selectors.root, ancestor); - } - - openMaxItemsMenu(): promise.Promise { - const { menu, maxItemsButton } = this; - - return maxItemsButton.click() - .then(() => menu.wait()) - .then(() => menu); - } - - openCurrentPageMenu(): promise.Promise { - const { menu, pagesButton } = this; - - return this.pagesButton.click() - .then(() => menu.wait()) - .then(() => menu); - } -} diff --git a/e2e/components/sidenav/sidenav.ts b/e2e/components/sidenav/sidenav.ts deleted file mode 100644 index 406a5f8bb..000000000 --- a/e2e/components/sidenav/sidenav.ts +++ /dev/null @@ -1,68 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { ElementFinder, ElementArrayFinder, by, promise } from 'protractor'; -import { Menu } from '../menu/menu'; -import { Component } from '../component'; - -export class Sidenav extends Component { - private static selectors = { - root: 'app-sidenav', - link: '.sidenav-menu__item-link', - activeLink: '.sidenav-menu__item-link--active', - newButton: '.sidenav__section--new__button' - }; - - links: ElementArrayFinder = this.component.all(by.css(Sidenav.selectors.link)); - activeLink: ElementFinder = this.component.element(by.css(Sidenav.selectors.activeLink)); - newButton: ElementArrayFinder = this.component.all(by.css(Sidenav.selectors.newButton)); - - menu: Menu = new Menu(); - - constructor(ancestor?: ElementFinder) { - super(Sidenav.selectors.root, ancestor); - } - - openNewMenu(): promise.Promise { - const { menu, newButton } = this; - - return newButton.click() - .then(() => menu.wait()) - .then(() => menu); - } - - isActiveByLabel(label: string): promise.Promise { - return this.getLinkByLabel(label).getAttribute('class') - .then(className => className.includes(Sidenav.selectors.activeLink.replace('.', ''))); - } - - getLinkByLabel(label: string): ElementFinder { - return this.component.element(by.cssContainingText(Sidenav.selectors.link, label)); - } - - navigateToLinkByLabel(label: string): promise.Promise { - return this.getLinkByLabel(label).click(); - } -} diff --git a/e2e/components/toolbar/toolbar-actions.ts b/e2e/components/toolbar/toolbar-actions.ts deleted file mode 100644 index 5998cdedf..000000000 --- a/e2e/components/toolbar/toolbar-actions.ts +++ /dev/null @@ -1,68 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { ElementFinder, ElementArrayFinder, by, promise } from 'protractor'; -import { Menu } from '../menu/menu'; -import { Component } from '../component'; - -export class ToolbarActions extends Component { - private static selectors = { - root: 'adf-toolbar', - button: '.mat-icon-button' - }; - - menu: Menu = new Menu(); - buttons: ElementArrayFinder = this.component.all(by.css(ToolbarActions.selectors.button)); - - constructor(ancestor?: ElementFinder) { - super(ToolbarActions.selectors.root, ancestor); - } - - isEmpty(): promise.Promise { - return this.buttons.count().then(count => (count === 0)); - } - - isButtonPresent(title: string): promise.Promise { - return this.component.element(by.css(`${ToolbarActions.selectors.button}[title="${title}"]`)).isPresent(); - } - - getButtonByLabel(label: string): ElementFinder { - return this.component.element(by.cssContainingText(ToolbarActions.selectors.button, label)); - } - - getButtonByTitleAttribute(title: string): ElementFinder { - return this.component.element(by.css(`${ToolbarActions.selectors.button}[title="${title}"]`)); - } - - openMoreMenu(): promise.Promise { - const { menu } = this; - const moreButton = this.getButtonByTitleAttribute('More actions'); - - return moreButton - .click() - .then(() => menu.wait()) - .then(() => menu); - } -} diff --git a/e2e/components/toolbar/toolbar-breadcrumb.ts b/e2e/components/toolbar/toolbar-breadcrumb.ts deleted file mode 100644 index 872782a6d..000000000 --- a/e2e/components/toolbar/toolbar-breadcrumb.ts +++ /dev/null @@ -1,63 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { ElementFinder, ElementArrayFinder, by, promise } from 'protractor'; -import { Menu } from '../menu/menu'; -import { Component } from '../component'; - -export class ToolbarBreadcrumb extends Component { - private static selectors = { - root: 'adf-breadcrumb', - item: '.adf-breadcrumb-item' - }; - - items: ElementArrayFinder = this.component.all(by.css(ToolbarBreadcrumb.selectors.item)); - - constructor(ancestor?: ElementFinder) { - super(ToolbarBreadcrumb.selectors.root, ancestor); - } - - getNthItem(nth: number): ElementFinder { - return this.items.get(nth - 1); - } - - getItemsCount(): promise.Promise { - return this.items.count(); - } - - getFirstItemName(): promise.Promise { - return this.items.get(0).getAttribute('title'); - } - - getCurrentItem(): promise.Promise { - return this.getItemsCount() - .then(count => this.getNthItem(count)); - } - - getCurrentItemName(): promise.Promise { - return this.getCurrentItem() - .then(node => node.getAttribute('title')); - } -} diff --git a/e2e/components/toolbar/toolbar.ts b/e2e/components/toolbar/toolbar.ts deleted file mode 100644 index ed0bbe4d5..000000000 --- a/e2e/components/toolbar/toolbar.ts +++ /dev/null @@ -1,42 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { ElementFinder, ElementArrayFinder, by } from 'protractor'; -import { Component } from '../component'; -import { ToolbarActions } from './toolbar-actions'; -import { ToolbarBreadcrumb } from './toolbar-breadcrumb'; - -export class Toolbar extends Component { - private static selectors = { - root: '.inner-layout__header' - }; - - actions: ToolbarActions = new ToolbarActions(this.component); - breadcrumb: ToolbarBreadcrumb = new ToolbarBreadcrumb(this.component); - - constructor(ancestor?: ElementFinder) { - super(Toolbar.selectors.root, ancestor); - } -} diff --git a/e2e/configs.ts b/e2e/configs.ts deleted file mode 100644 index f0f304335..000000000 --- a/e2e/configs.ts +++ /dev/null @@ -1,78 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -export const BROWSER_RESOLUTION_WIDTH = 1200; -export const BROWSER_RESOLUTION_HEIGHT = 800; - -export const BROWSER_WAIT_TIMEOUT = 20000; - -// Application configs -export const APP_HOST = 'http://localhost:3000'; - -// Repository configs -export const REPO_API_HOST = 'http://localhost:8080'; -export const REPO_API_TENANT = '-default-'; - -// Admin details -export const ADMIN_USERNAME = 'admin'; -export const ADMIN_PASSWORD = 'admin'; -export const ADMIN_FULL_NAME = 'Administrator'; - -// 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' -}; - -// 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' -}; - -// Site visibility -export const SITE_VISIBILITY = { - PUBLIC: 'PUBLIC', - MODERATED: 'MODERATED', - PRIVATE: 'PRIVATE' -}; - -// Site roles -export const SITE_ROLES = { - SITE_CONSUMER: 'SiteConsumer', - SITE_COLLABORATOR: 'SiteCollaborator', - SITE_CONTRIBUTOR: 'SiteContributor', - SITE_MANAGER: 'SiteManager' -}; diff --git a/e2e/pages/browsing-page.ts b/e2e/pages/browsing-page.ts deleted file mode 100644 index 033859939..000000000 --- a/e2e/pages/browsing-page.ts +++ /dev/null @@ -1,40 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { promise } from 'protractor'; -import { Header, DataTable, Pagination, Toolbar, Sidenav } from '../components/components'; -import { Page } from './page'; - -export class BrowsingPage extends Page { - header = new Header(this.app); - sidenav = new Sidenav(this.app); - toolbar = new Toolbar(this.app); - dataTable = new DataTable(this.app); - pagination = new Pagination(this.app); - - signOut(): promise.Promise { - return this.header.userInfo.signOut(); - } -} diff --git a/e2e/pages/login-page.ts b/e2e/pages/login-page.ts deleted file mode 100644 index 0a64257b0..000000000 --- a/e2e/pages/login-page.ts +++ /dev/null @@ -1,74 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ -import { browser, ExpectedConditions as EC, promise } from 'protractor'; -import { LoginComponent } from '../components/components'; -import { Page } from './page'; -import { Utils } from '../utilities/utils'; - -import { - ADMIN_USERNAME, - ADMIN_PASSWORD, - BROWSER_WAIT_TIMEOUT, - APP_ROUTES -} from '../configs'; - -export class LoginPage extends Page { - login: LoginComponent = new LoginComponent(this.app); - - /** @override */ - constructor() { - super(APP_ROUTES.LOGIN); - } - - /** @override */ - load(): promise.Promise { - return super.load().then(() => { - const { submitButton } = this.login; - const hasSubmitButton = EC.presenceOf(submitButton); - - return browser.wait(hasSubmitButton, BROWSER_WAIT_TIMEOUT) - .then(() => Utils.clearLocalStorage()) - .then(() => browser.manage().deleteAllCookies()); - }); - } - - loginWith(username: string, password?: string): promise.Promise { - const pass = password || username; - return this.login.enterCredentials(username, pass).submit() - .then(() => super.waitForApp()); - } - - loginWithAdmin(): promise.Promise { - return this.loginWith(ADMIN_USERNAME, ADMIN_PASSWORD); - } - - tryLoginWith(username: string, password?: string): promise.Promise { - const pass = password || username; - return this.login.enterCredentials(username, pass).submit() - .then(() => { - browser.wait(EC.presenceOf(this.login.errorMessage), BROWSER_WAIT_TIMEOUT); - }); - } -} diff --git a/e2e/pages/logout-page.ts b/e2e/pages/logout-page.ts deleted file mode 100644 index e250a9627..000000000 --- a/e2e/pages/logout-page.ts +++ /dev/null @@ -1,43 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { promise } from 'protractor'; -import { Page } from './page'; -import { APP_ROUTES } from '../configs'; -import { Utils } from '../utilities/utils'; - -export class LogoutPage extends Page { - /** @override */ - constructor() { - super(APP_ROUTES.LOGIN); - } - - /** @override */ - load(): promise.Promise { - return Utils.clearLocalStorage() - .then(() => Utils.clearSessionStorage()) - .then(() => super.load()); - } -} diff --git a/e2e/pages/page.ts b/e2e/pages/page.ts deleted file mode 100644 index 2ac3b031b..000000000 --- a/e2e/pages/page.ts +++ /dev/null @@ -1,79 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, element, by, ElementFinder, promise, ExpectedConditions as EC } from 'protractor'; -import { BROWSER_WAIT_TIMEOUT } from './../configs'; - -export abstract class Page { - private static USE_HASH_STRATEGY = false; - - private locators = { - app: by.css('app-root'), - layout: by.css('app-layout'), - overlay: by.css('.cdk-overlay-container'), - snackBar: by.css('simple-snack-bar'), - snackBarAction: by.css('.mat-simple-snackbar-action') - }; - - public app: ElementFinder = element(this.locators.app); - public layout: ElementFinder = element(this.locators.layout); - public overlay: ElementFinder = element(this.locators.overlay); - public snackBar: ElementFinder = element(this.locators.snackBar); - - constructor(public url: string = '') {} - - get title(): promise.Promise { - return browser.getTitle(); - } - - load(relativeUrl: string = ''): promise.Promise { - const hash = Page.USE_HASH_STRATEGY ? '/#' : ''; - const path = `${hash}${this.url}${relativeUrl}`; - - return browser.get(path); - } - - waitForApp() { - return browser.wait(EC.presenceOf(this.layout), BROWSER_WAIT_TIMEOUT); - } - - refresh(): promise.Promise { - return browser.refresh(); - } - - isSnackBarDisplayed(): promise.Promise { - return this.snackBar.isDisplayed(); - } - - getSnackBarMessage(): promise.Promise { - return this.isSnackBarDisplayed() - .then(() => this.snackBar.getText()) - .catch(() => ''); - } - - getSnackBarAction(): ElementFinder { - return this.snackBar.element(this.locators.snackBarAction); - } -} diff --git a/e2e/pages/pages.ts b/e2e/pages/pages.ts deleted file mode 100644 index ce52fea89..000000000 --- a/e2e/pages/pages.ts +++ /dev/null @@ -1,28 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -export * from './browsing-page'; -export * from './login-page'; -export * from './logout-page'; diff --git a/e2e/suites/actions/create-folder.test.ts b/e2e/suites/actions/create-folder.test.ts deleted file mode 100644 index b26b47686..000000000 --- a/e2e/suites/actions/create-folder.test.ts +++ /dev/null @@ -1,279 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { protractor, browser, by, ElementFinder } from 'protractor'; - -import { SIDEBAR_LABELS, BROWSER_WAIT_TIMEOUT, SITE_VISIBILITY, SITE_ROLES } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { CreateOrEditFolderDialog } from '../../components/dialog/create-edit-folder-dialog'; -import { Utils } from '../../utilities/utils'; -import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client'; - -describe('Create folder', () => { - const username = `user-${Utils.random()}`; - - const parent = `parent-${Utils.random()}`; - const folderName1 = `folder-${Utils.random()}`; - const folderName2 = `folder-${Utils.random()}`; - const folderDescription = 'description of my folder'; - const duplicateFolderName = `folder-${Utils.random()}`; - const nameWithSpaces = ` folder-${Utils.random()} `; - - const siteName = `site-private-${Utils.random()}`; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, username) - }; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const personalFilesPage = new BrowsingPage(); - const createDialog = new CreateOrEditFolderDialog(); - const { dataTable } = personalFilesPage; - - function openCreateDialog(): any { - return personalFilesPage.sidenav.openNewMenu() - .then(menu => menu.clickMenuItem('Create folder')) - .then(() => createDialog.waitForDialogToOpen()); - } - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PRIVATE)) - .then(() => apis.admin.nodes.createFolders([ folderName1 ], `Sites/${siteName}/documentLibrary`)) - .then(() => apis.admin.sites.addSiteMember(siteName, username, SITE_ROLES.SITE_CONSUMER)) - .then(() => apis.user.nodes.createFolders([ duplicateFolderName ], parent)) - .then(() => loginPage.load()) - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - personalFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterEach(done => { - browser.actions().sendKeys(protractor.Key.ESCAPE).perform().then(done); - }); - - afterAll(done => { - Promise - .all([ - apis.admin.sites.deleteSite(siteName), - apis.user.nodes.deleteNodes([ parent ]), - logoutPage.load() - ]) - .then(done); - }); - - it('option is enabled when having enough permissions', () => { - personalFilesPage.dataTable.doubleClickOnItemName(parent) - .then(() => personalFilesPage.sidenav.openNewMenu()) - .then(menu => { - const isEnabled = menu.getItemByLabel('Create folder').isEnabled(); - expect(isEnabled).toBe(true, 'Create folder is not enabled'); - }); - }); - - it('creates new folder with name', () => { - personalFilesPage.dataTable.doubleClickOnItemName(parent) - .then(() => openCreateDialog()) - .then(() => createDialog.enterName(folderName1)) - .then(() => createDialog.clickCreate()) - .then(() => createDialog.waitForDialogToClose()) - .then(() => dataTable.waitForHeader()) - .then(() => { - const isPresent = dataTable.getRowByName(folderName1).isPresent(); - expect(isPresent).toBe(true, 'Folder not displayed in list view'); - }); - }); - - it('creates new folder with name and description', () => { - personalFilesPage.dataTable.doubleClickOnItemName(parent) - .then(() => openCreateDialog()) - .then(() => createDialog.enterName(folderName2)) - .then(() => createDialog.enterDescription(folderDescription)) - .then(() => createDialog.clickCreate()) - .then(() => createDialog.waitForDialogToClose()) - .then(() => dataTable.waitForHeader()) - .then(() => { - const isPresent = dataTable.getRowByName(folderName2).isPresent(); - expect(isPresent).toBe(true, 'Folder not displayed in list view'); - }) - .then(() => { - expect(apis.user.nodes.getNodeDescription(folderName2)).toEqual(folderDescription); - }); - }); - - it('enabled option tooltip', () => { - personalFilesPage.dataTable.doubleClickOnItemName(parent) - .then(() => personalFilesPage.sidenav.openNewMenu()) - .then(menu => browser.actions().mouseMove(menu.getItemByLabel('Create folder')).perform() - .then(() => menu)) - .then(menu => { - expect(menu.getItemTooltip('Create folder')).toContain('Create new folder'); - }); - }); - - it('option is disabled when not enough permissions', () => { - const fileLibrariesPage = new BrowsingPage(); - - fileLibrariesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES) - .then(() => fileLibrariesPage.dataTable.doubleClickOnItemName(siteName)) - .then(() => fileLibrariesPage.dataTable.doubleClickOnItemName(folderName1)) - .then(() => fileLibrariesPage.sidenav.openNewMenu()) - .then(menu => { - const isEnabled = menu.getItemByLabel('Create folder').isEnabled(); - expect(isEnabled).toBe(false, 'Create folder is not disabled'); - }); - }); - - it('disabled option tooltip', () => { - const fileLibrariesPage = new BrowsingPage(); - - fileLibrariesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES) - .then(() => fileLibrariesPage.dataTable.doubleClickOnItemName(siteName)) - .then(() => fileLibrariesPage.dataTable.doubleClickOnItemName(folderName1)) - .then(() => fileLibrariesPage.sidenav.openNewMenu()) - .then(menu => browser.actions().mouseMove(menu.getItemByLabel('Create folder')).perform() - .then(() => menu)) - .then(menu => { - const tooltip = menu.getItemTooltip('Create folder'); - expect(tooltip).toContain(`You can't create a folder here`); - }); - }); - - it('dialog UI elements', () => { - personalFilesPage.dataTable.doubleClickOnItemName(parent) - .then(() => openCreateDialog()) - .then(() => { - const dialogTitle = createDialog.getTitle(); - const isFolderNameDisplayed = createDialog.nameInput.isDisplayed(); - const isDescriptionDisplayed = createDialog.descriptionTextArea.isDisplayed(); - const isCreateEnabled = createDialog.createButton.isEnabled(); - const isCancelEnabled = createDialog.cancelButton.isEnabled(); - - expect(dialogTitle).toMatch('Create new folder'); - expect(isFolderNameDisplayed).toBe(true, 'Name input is not displayed'); - expect(isDescriptionDisplayed).toBe(true, 'Description field is not displayed'); - expect(isCreateEnabled).toBe(false, 'Create button is not disabled'); - expect(isCancelEnabled).toBe(true, 'Cancel button is not enabled'); - }); - }); - - it('with empty folder name', () => { - personalFilesPage.dataTable.doubleClickOnItemName(parent) - .then(() => openCreateDialog()) - .then(() => createDialog.deleteNameWithBackspace()) - .then(() => { - const isCreateEnabled = createDialog.createButton.isEnabled(); - const validationMessage = createDialog.getValidationMessage(); - - expect(isCreateEnabled).toBe(false, 'Create button is enabled'); - expect(validationMessage).toMatch('Folder name is required'); - }); - }); - - it('with folder name ending with a dot "."', () => { - personalFilesPage.dataTable.doubleClickOnItemName(parent) - .then(() => openCreateDialog()) - .then(() => createDialog.enterName('folder-name.')) - .then(dialog => { - const isCreateEnabled = dialog.createButton.isEnabled(); - const validationMessage = dialog.getValidationMessage(); - - expect(isCreateEnabled).toBe(false, 'Create button is not disabled'); - expect(validationMessage).toMatch(`Folder name can't end with a period .`); - }); - }); - - it('with folder name containing special characters', () => { - const namesWithSpecialChars = [ 'a*a', 'a"a', 'aa', `a\\a`, 'a/a', 'a?a', 'a:a', 'a|a' ]; - - personalFilesPage.dataTable.doubleClickOnItemName(parent) - .then(() => openCreateDialog()) - .then(() => namesWithSpecialChars.forEach(name => { - createDialog.enterName(name); - - const isCreateEnabled = createDialog.createButton.isEnabled(); - const validationMessage = createDialog.getValidationMessage(); - - expect(isCreateEnabled).toBe(false, 'Create button is not disabled'); - expect(validationMessage).toContain(`Folder name can't contain these characters`); - })); - }); - - it('with folder name containing only spaces', () => { - personalFilesPage.dataTable.doubleClickOnItemName(parent) - .then(() => openCreateDialog()) - .then(() => createDialog.enterName(' ')) - .then(dialog => { - const isCreateEnabled = dialog.createButton.isEnabled(); - const validationMessage = dialog.getValidationMessage(); - - expect(isCreateEnabled).toBe(false, 'Create button is not disabled'); - expect(validationMessage).toMatch(`Folder name can't contain only spaces`); - }); - }); - - it('cancel folder creation', () => { - personalFilesPage.dataTable.doubleClickOnItemName(parent) - .then(() => openCreateDialog()) - .then(() => createDialog.enterName('test')) - .then(() => createDialog.enterDescription('test description')) - .then(() => createDialog.clickCancel()) - .then(() => { - expect(createDialog.component.isPresent()).not.toBe(true, 'dialog is not closed'); - }); - }); - - it('duplicate folder name', () => { - personalFilesPage.dataTable.doubleClickOnItemName(parent) - .then(() => openCreateDialog()) - .then(() => createDialog.enterName(duplicateFolderName)) - .then(() => createDialog.clickCreate()) - .then(() => personalFilesPage.getSnackBarMessage()) - .then(message => { - expect(message).toEqual(`There's already a folder with this name. Try a different name.`); - expect(createDialog.component.isPresent()).toBe(true, 'dialog is not present'); - }); - }); - - it('trim ending spaces from folder name', () => { - personalFilesPage.dataTable.doubleClickOnItemName(parent) - .then(() => openCreateDialog()) - .then(() => createDialog.enterName(nameWithSpaces)) - .then(() => createDialog.clickCreate()) - .then(() => createDialog.waitForDialogToClose()) - .then(() => dataTable.waitForHeader()) - .then(() => { - const isPresent = dataTable.getRowByName(nameWithSpaces.trim()).isPresent(); - expect(isPresent).toBe(true, 'Folder not displayed in list view'); - }); - }); -}); diff --git a/e2e/suites/actions/edit-folder.test.ts b/e2e/suites/actions/edit-folder.test.ts deleted file mode 100644 index 7a8826620..000000000 --- a/e2e/suites/actions/edit-folder.test.ts +++ /dev/null @@ -1,190 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { protractor, element, browser, by, ElementFinder, promise } from 'protractor'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { SIDEBAR_LABELS, SITE_VISIBILITY, SITE_ROLES } from '../../configs'; -import { RepoClient } from '../../utilities/repo-client/repo-client'; -import { CreateOrEditFolderDialog } from '../../components/dialog/create-edit-folder-dialog'; -import { Utils } from '../../utilities/utils'; - -describe('Edit folder', () => { - const username = `user-${Utils.random()}`; - - const parent = `parent-${Utils.random()}`; - const folderName = `folder-${Utils.random()}`; - const folderDescription = 'my folder description'; - - const folderNameToEdit = `folder-${Utils.random()}`; - const duplicateFolderName = `folder-${Utils.random()}`; - - const folderNameEdited = `folder-${Utils.random()}`; - const folderDescriptionEdited = 'my folder description edited'; - - const siteName = `site-private-${Utils.random()}`; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, username) - }; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const personalFilesPage = new BrowsingPage(); - const editDialog = new CreateOrEditFolderDialog(); - const { dataTable } = personalFilesPage; - const editButton = personalFilesPage.toolbar.actions.getButtonByTitleAttribute('Edit'); - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PRIVATE)) - .then(() => apis.admin.nodes.createFolders([ folderName ], `Sites/${siteName}/documentLibrary`)) - .then(() => apis.admin.sites.addSiteMember(siteName, username, SITE_ROLES.SITE_CONSUMER)) - - .then(() => apis.user.nodes.createNodeWithProperties( folderName, '', folderDescription, parent )) - .then(() => apis.user.nodes.createFolders([ folderNameToEdit, duplicateFolderName ], parent)) - .then(() => loginPage.load()) - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - personalFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES) - .then(() => dataTable.waitForHeader()) - .then(() => dataTable.doubleClickOnItemName(parent)) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterEach(done => { - browser.actions().sendKeys(protractor.Key.ESCAPE).perform().then(done); - }); - - afterAll(done => { - Promise - .all([ - apis.admin.sites.deleteSite(siteName), - apis.user.nodes.deleteNodes([ parent ]), - logoutPage.load() - ]) - .then(done); - }); - - it('dialog UI defaults', () => { - dataTable.clickOnItemName(folderName) - .then(() => editButton.click()) - .then(() => { - expect(editDialog.getTitle()).toEqual('Edit folder'); - expect(editDialog.nameInput.getAttribute('value')).toBe(folderName); - expect(editDialog.descriptionTextArea.getAttribute('value')).toBe(folderDescription); - expect(editDialog.updateButton.isEnabled()).toBe(true, 'upload button is not enabled'); - expect(editDialog.cancelButton.isEnabled()).toBe(true, 'cancel button is not enabled'); - }); - }); - - it('properties are modified when pressing OK', () => { - dataTable.clickOnItemName(folderNameToEdit) - .then(() => editButton.click()) - .then(() => editDialog.waitForDialogToOpen()) - .then(() => editDialog.enterName(folderNameEdited)) - .then(() => editDialog.enterDescription(folderDescriptionEdited)) - .then(() => editDialog.clickUpdate()) - .then(() => editDialog.waitForDialogToClose()) - .then(() => dataTable.waitForHeader()) - .then(() => { - const isPresent = dataTable.getRowByName(folderNameEdited).isPresent(); - expect(isPresent).toBe(true, 'Folder not displayed in list view'); - }) - .then(() => { - expect(apis.user.nodes.getNodeDescription(folderNameEdited)).toEqual(folderDescriptionEdited); - }); - }); - - it('with empty folder name', () => { - dataTable.clickOnItemName(folderName) - .then(() => editButton.click()) - .then(() => editDialog.deleteNameWithBackspace()) - .then(() => { - expect(editDialog.updateButton.isEnabled()).toBe(false, 'upload button is not enabled'); - expect(editDialog.getValidationMessage()).toMatch('Folder name is required'); - }); - }); - - it('with name with special characters', () => { - const namesWithSpecialChars = [ 'a*a', 'a"a', 'aa', `a\\a`, 'a/a', 'a?a', 'a:a', 'a|a' ]; - - dataTable.clickOnItemName(folderName) - .then(() => editButton.click()) - .then(() => namesWithSpecialChars.forEach(name => { - editDialog.enterName(name); - - expect(editDialog.updateButton.isEnabled()).toBe(false, 'upload button is not disabled'); - expect(editDialog.getValidationMessage()).toContain(`Folder name can't contain these characters`); - })); - }); - - it('with name ending with a dot', () => { - dataTable.clickOnItemName(folderName) - .then(() => editButton.click()) - .then(() => editDialog.nameInput.sendKeys('.')) - .then(() => { - expect(editDialog.updateButton.isEnabled()).toBe(false, 'upload button is not enabled'); - expect(editDialog.getValidationMessage()).toMatch(`Folder name can't end with a period .`); - }); - }); - - it('Cancel button', () => { - dataTable.clickOnItemName(folderName) - .then(() => editButton.click()) - .then(() => editDialog.clickCancel()) - .then(() => { - expect(editDialog.component.isPresent()).not.toBe(true, 'dialog is not closed'); - }); - }); - - it('with duplicate folder name', () => { - dataTable.clickOnItemName(folderName) - .then(() => editButton.click()) - .then(() => editDialog.enterName(duplicateFolderName)) - .then(() => editDialog.clickUpdate()) - .then(() => personalFilesPage.getSnackBarMessage()) - .then(message => { - expect(message).toEqual(`There's already a folder with this name. Try a different name.`); - expect(editDialog.component.isPresent()).toBe(true, 'dialog is not present'); - }); - }); - - it('trim ending spaces', () => { - dataTable.clickOnItemName(folderName) - .then(() => editButton.click()) - .then(() => editDialog.nameInput.sendKeys(' ')) - .then(() => editDialog.clickUpdate()) - .then(() => editDialog.waitForDialogToClose()) - .then(() => { - expect(personalFilesPage.snackBar.isPresent()).not.toBe(true, 'notification appears'); - expect(dataTable.getRowByName(folderName).isPresent()).toBe(true, 'Folder not displayed in list view'); - }); - }); -}); diff --git a/e2e/suites/actions/permanently-delete.test.ts b/e2e/suites/actions/permanently-delete.test.ts deleted file mode 100644 index 7cf88a95f..000000000 --- a/e2e/suites/actions/permanently-delete.test.ts +++ /dev/null @@ -1,113 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, protractor, promise } from 'protractor'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs'; -import { RepoClient } from '../../utilities/repo-client/repo-client'; -import { Utils } from '../../utilities/utils'; - -describe('Permanently delete from Trash', () => { - const username = `user-${Utils.random()}`; - - const file1 = `file-${Utils.random()}.txt`; - const file2 = `file-${Utils.random()}.txt`; - let filesIds; - - const folder1 = `folder-${Utils.random()}`; - const folder2 = `folder-${Utils.random()}`; - let foldersIds; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, username) - }; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const trashPage = new BrowsingPage(); - const { dataTable } = trashPage; - const { toolbar } = trashPage; - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => apis.user.nodes.createFiles([ file1, file2 ])) - .then(resp => filesIds = resp.data.list.entries.map(entries => entries.entry.id)) - .then(() => apis.user.nodes.createFolders([ folder1, folder2 ])) - .then(resp => foldersIds = resp.data.list.entries.map(entries => entries.entry.id)) - - .then(() => apis.user.nodes.deleteNodesById(filesIds, false)) - .then(() => apis.user.nodes.deleteNodesById(foldersIds, false)) - - .then(() => loginPage.load()) - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - trashPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - Promise.all([ - apis.admin.trashcan.emptyTrash(), - logoutPage.load() - ]) - .then(done); - }); - - it('delete file', () => { - dataTable.clickOnItemName(file1) - .then(() => toolbar.actions.getButtonByTitleAttribute('Permanently delete').click()) - .then(() => trashPage.getSnackBarMessage()) - .then(text => { - expect(text).toBe(`${file1} deleted`); - expect(dataTable.getRowByName(file1).isPresent()).toBe(false, 'Item was not deleted'); - }); - }); - - it('delete folder', () => { - dataTable.clickOnItemName(folder1) - .then(() => toolbar.actions.getButtonByTitleAttribute('Permanently delete').click()) - .then(() => trashPage.getSnackBarMessage()) - .then(text => { - expect(text).toBe(`${folder1} deleted`); - expect(dataTable.getRowByName(folder1).isPresent()).toBe(false, 'Item was not deleted'); - }); - }); - - it('delete multiple items', () => { - dataTable.selectMultipleItems([ file2, folder2 ]) - .then(() => toolbar.actions.getButtonByTitleAttribute('Permanently delete').click()) - .then(() => trashPage.getSnackBarMessage()) - .then(text => { - expect(text).toBe(`2 items deleted`); - expect(dataTable.getRowByName(file2).isPresent()).toBe(false, 'Item was not deleted'); - expect(dataTable.getRowByName(folder2).isPresent()).toBe(false, 'Item was not deleted'); - }); - }); -}); diff --git a/e2e/suites/actions/restore.test.ts b/e2e/suites/actions/restore.test.ts deleted file mode 100644 index 179408cb5..000000000 --- a/e2e/suites/actions/restore.test.ts +++ /dev/null @@ -1,147 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, protractor, promise } from 'protractor'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs'; -import { RepoClient } from '../../utilities/repo-client/repo-client'; -import { Utils } from '../../utilities/utils'; - -describe('Restore from Trash', () => { - const username = `user-${Utils.random()}`; - - const file1 = `file-${Utils.random()}.txt`; - const file2 = `file-${Utils.random()}.txt`; - const file3 = `file-${Utils.random()}.txt`; - let filesIds; - - const folder1 = `folder-${Utils.random()}`; - const folder2 = `folder-${Utils.random()}`; - let foldersIds; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, username) - }; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const trashPage = new BrowsingPage(); - const personalFilesPage = new BrowsingPage(); - const { dataTable } = trashPage; - const { toolbar } = trashPage; - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => apis.user.nodes.createFiles([ file1, file2, file3 ])) - .then(resp => filesIds = resp.data.list.entries.map(entries => entries.entry.id)) - .then(() => apis.user.nodes.createFolders([ folder1, folder2 ])) - .then(resp => foldersIds = resp.data.list.entries.map(entries => entries.entry.id)) - - .then(() => apis.user.nodes.deleteNodesById(filesIds, false)) - .then(() => apis.user.nodes.deleteNodesById(foldersIds, false)) - - .then(() => loginPage.load()) - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - trashPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - Promise.all([ - apis.user.nodes.deleteNodesById(filesIds), - apis.user.nodes.deleteNodesById(foldersIds), - apis.admin.trashcan.emptyTrash(), - logoutPage.load() - ]) - .then(done); - }); - - it('restore file', () => { - dataTable.clickOnItemName(file1) - .then(() => toolbar.actions.getButtonByTitleAttribute('Restore').click()) - .then(() => trashPage.getSnackBarMessage()) - .then(text => { - expect(text).toContain(`${file1} restored`); - expect(text).toContain(`View`); - expect(dataTable.getRowByName(file1).isPresent()).toBe(false, 'Item was not removed from list'); - }) - .then(() => personalFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES)) - .then(() => personalFilesPage.dataTable.waitForHeader()) - .then(() => { - expect(personalFilesPage.dataTable.getRowByName(file1).isPresent()).toBe(true, 'Item not displayed in list'); - }); - }); - - it('restore folder', () => { - dataTable.clickOnItemName(folder1) - .then(() => toolbar.actions.getButtonByTitleAttribute('Restore').click()) - .then(() => trashPage.getSnackBarMessage()) - .then(text => { - expect(text).toContain(`${folder1} restored`); - expect(text).toContain(`View`); - expect(dataTable.getRowByName(folder1).isPresent()).toBe(false, 'Item was not removed from list'); - }) - .then(() => personalFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES)) - .then(() => personalFilesPage.dataTable.waitForHeader()) - .then(() => { - expect(personalFilesPage.dataTable.getRowByName(folder1).isPresent()).toBe(true, 'Item not displayed in list'); - }); - }); - - it('restore multiple items', () => { - dataTable.selectMultipleItems([ file2, folder2 ]) - .then(() => toolbar.actions.getButtonByTitleAttribute('Restore').click()) - .then(() => trashPage.getSnackBarMessage()) - .then(text => { - expect(text).toContain(`Restore successful`); - expect(text).not.toContain(`View`); - expect(dataTable.getRowByName(file2).isPresent()).toBe(false, 'Item was not removed from list'); - expect(dataTable.getRowByName(folder2).isPresent()).toBe(false, 'Item was not removed from list'); - }) - .then(() => personalFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES)) - .then(() => personalFilesPage.dataTable.waitForHeader()) - .then(() => { - expect(personalFilesPage.dataTable.getRowByName(file2).isPresent()).toBe(true, 'Item not displayed in list'); - expect(personalFilesPage.dataTable.getRowByName(folder2).isPresent()).toBe(true, 'Item not displayed in list'); - }); - }); - - it('View from notification', () => { - dataTable.clickOnItemName(file3) - .then(() => toolbar.actions.getButtonByTitleAttribute('Restore').click()) - .then(() => trashPage.getSnackBarAction().click()) - .then(() => personalFilesPage.dataTable.waitForHeader()) - .then(() => { - expect(personalFilesPage.sidenav.isActiveByLabel('Personal Files')).toBe(true, 'Personal Files sidebar link not active'); - expect(browser.getCurrentUrl()).toContain(APP_ROUTES.PERSONAL_FILES); - }); - }); -}); diff --git a/e2e/suites/actions/toolbar-multiple-selection.test.ts b/e2e/suites/actions/toolbar-multiple-selection.test.ts deleted file mode 100644 index 7a0f00ab8..000000000 --- a/e2e/suites/actions/toolbar-multiple-selection.test.ts +++ /dev/null @@ -1,535 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, protractor, promise } from 'protractor'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs'; -import { RepoClient } from '../../utilities/repo-client/repo-client'; -import { Utils } from '../../utilities/utils'; - -describe('Toolbar actions - multiple selection : ', () => { - const user1 = `user-${Utils.random()}`; - const user2 = `user-${Utils.random()}`; - - 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 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-private-${Utils.random()}`; - const file1Admin = `file-${Utils.random()}.txt`; - const file2Admin = `file-${Utils.random()}.txt`; - const folder1Admin = `folder-${Utils.random()}`; - const folder2Admin = `folder-${Utils.random()}`; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(user1, user1) - }; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const page = new BrowsingPage(); - const { dataTable } = page; - const { toolbar } = page; - - beforeAll(done => { - apis.admin.people.createUser(user1) - .then(() => apis.user.nodes.createFiles([ file1 ]).then(resp => file1Id = resp.data.entry.id)) - .then(() => apis.user.nodes.createFiles([ file2 ]).then(resp => file2Id = resp.data.entry.id)) - .then(() => apis.user.nodes.createFolders([ folder1 ]).then(resp => folder1Id = resp.data.entry.id)) - .then(() => apis.user.nodes.createFolders([ folder2 ]).then(resp => folder2Id = resp.data.entry.id)) - .then(() => apis.user.nodes.createFiles([ fileForDelete1 ]).then(resp => fileForDelete1Id = resp.data.entry.id)) - .then(() => apis.user.nodes.createFiles([ fileForDelete2 ]).then(resp => fileForDelete2Id = resp.data.entry.id)) - .then(() => apis.user.nodes.createFolders([ folderForDelete1 ]).then(resp => folderForDelete1Id = resp.data.entry.id)) - .then(() => apis.user.nodes.createFolders([ folderForDelete2 ]).then(resp => folderForDelete2Id = resp.data.entry.id)) - - .then(() => apis.user.shared.shareFileById(file1Id)) - .then(() => apis.user.shared.shareFileById(file2Id)) - - .then(() => apis.user.favorites.addFavoriteById('file', file1Id)) - .then(() => apis.user.favorites.addFavoriteById('file', file2Id)) - .then(() => apis.user.favorites.addFavoriteById('folder', folder1Id)) - .then(() => apis.user.favorites.addFavoriteById('folder', folder2Id)) - - .then(() => apis.user.nodes.deleteNodeById(fileForDelete1Id, false)) - .then(() => apis.user.nodes.deleteNodeById(fileForDelete2Id, false)) - .then(() => apis.user.nodes.deleteNodeById(folderForDelete1Id, false)) - .then(() => apis.user.nodes.deleteNodeById(folderForDelete2Id, false)) - - .then(done); - }); - - afterAll(done => { - Promise.all([ - apis.user.nodes.deleteNodeById(file1Id), - apis.user.nodes.deleteNodeById(file2Id), - apis.user.nodes.deleteNodeById(folder1Id), - apis.user.nodes.deleteNodeById(folder2Id), - - apis.user.trashcan.permanentlyDelete(fileForDelete1Id), - apis.user.trashcan.permanentlyDelete(fileForDelete2Id), - apis.user.trashcan.permanentlyDelete(folderForDelete1Id), - apis.user.trashcan.permanentlyDelete(folderForDelete2Id), - - logoutPage.load() - ]) - .then(done); - }); - - xit(''); - - describe('Personal Files', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(user1)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('correct actions appear when multiple files are selected', () => { - dataTable.selectMultipleItems([file1, file2]) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files'); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`); - }) - .then(() => browser.$('body').click()) - .then(() => dataTable.clearSelection()); - }); - - it('correct actions appear when multiple folders are selected', () => { - dataTable.selectMultipleItems([folder1, folder2]) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files'); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`); - }) - .then(() => browser.$('body').click()) - .then(() => dataTable.clearSelection()); - }); - - it('correct actions appear when both files and folders are selected', () => { - dataTable.selectMultipleItems([file1, file2, folder1, folder2]) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files'); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`); - }) - .then(() => browser.$('body').click()) - .then(() => dataTable.clearSelection()); - }); - }); - - describe('File Libraries', () => { - beforeAll(done => { - apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PUBLIC) - .then(() => apis.admin.people.createUser(user2)) - .then(() => apis.admin.sites.addSiteMember(siteName, user1, SITE_ROLES.SITE_MANAGER)) - .then(() => apis.admin.sites.addSiteMember(siteName, user2, SITE_ROLES.SITE_CONSUMER)) - .then(() => apis.admin.nodes.createFiles([ file1Admin, file2Admin ], `Sites/${siteName}/documentLibrary`)) - .then(() => apis.admin.nodes.createFolders([ folder1Admin, folder2Admin ], `Sites/${siteName}/documentLibrary`)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES) - .then(() => dataTable.waitForHeader()) - .then(() => dataTable.doubleClickOnItemName(siteName)) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - apis.admin.sites.deleteSite(siteName).then(done); - }); - - xit(''); - - describe('user is Manager', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(user1)) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('correct actions appear when multiple files are selected', () => { - dataTable.selectMultipleItems([file1Admin, file2Admin]) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files'); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`); - }) - .then(() => browser.$('body').click()) - .then(() => dataTable.clearSelection()); - }); - - it('correct actions appear when multiple folders are selected', () => { - dataTable.selectMultipleItems([folder1Admin, folder2Admin]) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files'); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`); - }) - .then(() => browser.$('body').click()) - .then(() => dataTable.clearSelection()); - }); - - it('correct actions appear when both files and folders are selected', () => { - dataTable.selectMultipleItems([file1Admin, file2Admin, folder1Admin, folder2Admin]) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files'); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`); - }) - .then(() => browser.$('body').click()) - .then(() => dataTable.clearSelection()); - }); - }); - - describe('user is Consumer', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(user2)) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('correct actions appear when multiple files are selected', () => { - dataTable.selectMultipleItems([file1Admin, file2Admin]) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files'); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`); - expect(menu.isMenuItemPresent('Delete')).toBe(false, `Delete is displayed for selected files`); - expect(menu.isMenuItemPresent('Move')).toBe(false, `Move is displayed for selected files`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`); - }) - .then(() => browser.$('body').click()) - .then(() => dataTable.clearSelection()); - }); - - it('correct actions appear when multiple folders are selected', () => { - dataTable.selectMultipleItems([folder1Admin, folder2Admin]) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files'); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`); - expect(menu.isMenuItemPresent('Delete')).toBe(false, `Delete is displayed for selected files`); - expect(menu.isMenuItemPresent('Move')).toBe(false, `Move is displayed for selected files`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`); - }) - .then(() => browser.$('body').click()) - .then(() => dataTable.clearSelection()); - }); - - it('correct actions appear when both files and folders are selected', () => { - dataTable.selectMultipleItems([file1Admin, file2Admin, folder1Admin, folder2Admin]) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files'); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`); - expect(menu.isMenuItemPresent('Delete')).toBe(false, `Delete is not displayed for selected files`); - expect(menu.isMenuItemPresent('Move')).toBe(false, `Move is not displayed for selected files`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`); - }) - .then(() => browser.$('body').click()) - .then(() => dataTable.clearSelection()); - }); - }); - }); - - describe('Shared Files', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(user1)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.SHARED_FILES) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('correct actions appear when multiple files are selected', () => { - dataTable.selectMultipleItems([file1, file2]) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files'); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`); - }) - .then(() => browser.$('body').click()) - .then(() => dataTable.clearSelection()); - }); - }); - - describe('Recent Files', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(user1)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.RECENT_FILES) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('correct actions appear when multiple files are selected', () => { - dataTable.selectMultipleItems([file1, file2]) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files'); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`); - }) - .then(() => browser.$('body').click()) - .then(() => dataTable.clearSelection()); - }); - }); - - describe('Favorites', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(user1)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('correct actions appear when multiple files are selected', () => { - dataTable.selectMultipleItems([file1, file2]) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files'); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`); - }) - .then(() => browser.$('body').click()) - .then(() => dataTable.clearSelection()); - }); - - it('correct actions appear when multiple folders are selected', () => { - dataTable.selectMultipleItems([folder1, folder2]) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files'); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`); - }) - .then(() => browser.$('body').click()) - .then(() => dataTable.clearSelection()); - }); - - it('correct actions appear when both files and folders are selected', () => { - dataTable.selectMultipleItems([file1, file2, folder1, folder2]) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, 'View is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, 'Download is not displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, 'Edit is displayed for selected files'); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for selected files`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for selected files`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for selected files`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for selected files`); - }) - .then(() => browser.$('body').click()) - .then(() => dataTable.clearSelection()); - }); - }); - - describe('Trash', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(user1)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('correct actions appear when multiple files are selected', () => { - dataTable.selectMultipleItems([fileForDelete1, fileForDelete2]) - .then(() => { - expect(toolbar.actions.isButtonPresent('Permanently delete')) - .toBe(true, 'Permanently delete is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Restore')).toBe(true, 'Restore is not displayed for selected files'); - }) - .then(() => dataTable.clearSelection()); - }); - - it('correct actions appear when multiple folders are selected', () => { - dataTable.selectMultipleItems([folderForDelete1, folderForDelete2]) - .then(() => { - expect(toolbar.actions.isButtonPresent('Permanently delete')) - .toBe(true, 'Permanently delete is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Restore')).toBe(true, 'Restore is not displayed for selected files'); - }) - .then(() => dataTable.clearSelection()); - }); - - it('correct actions appear when both files and folders are selected', () => { - dataTable.selectMultipleItems([fileForDelete1, fileForDelete2, folderForDelete1, folderForDelete2]) - .then(() => { - expect(toolbar.actions.isButtonPresent('Permanently delete')) - .toBe(true, 'Permanently delete is displayed for selected files'); - expect(toolbar.actions.isButtonPresent('Restore')).toBe(true, 'Restore is not displayed for selected files'); - }) - .then(() => dataTable.clearSelection()); - }); - }); -}); diff --git a/e2e/suites/actions/toolbar-single-selection.test.ts b/e2e/suites/actions/toolbar-single-selection.test.ts deleted file mode 100644 index 9721ef5d0..000000000 --- a/e2e/suites/actions/toolbar-single-selection.test.ts +++ /dev/null @@ -1,535 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, protractor, promise } from 'protractor'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs'; -import { RepoClient } from '../../utilities/repo-client/repo-client'; -import { Utils } from '../../utilities/utils'; - -describe('Toolbar actions - single selection : ', () => { - const username = `user-${Utils.random()}`; - const username2 = `user-${Utils.random()}`; - - const fileUser = `file-${Utils.random()}.txt`; - let fileUserId; - - const folderUser = `folder-${Utils.random()}`; - let folderUserId; - - const fileForDelete = `file-${Utils.random()}.txt`; - let fileForDeleteId; - - const folderForDelete = `folder-${Utils.random()}`; - let folderForDeleteId; - - const siteName = `site-private-${Utils.random()}`; - const fileAdmin = `file-${Utils.random()}.txt`; - const folderAdmin = `folder-${Utils.random()}`; - - 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; - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => apis.user.nodes.createFiles([ fileUser ])) - .then(resp => fileUserId = resp.data.entry.id) - .then(() => apis.user.nodes.createFiles([ fileForDelete ])) - .then(resp => fileForDeleteId = resp.data.entry.id) - .then(() => apis.user.nodes.createFolders([ folderForDelete ])) - .then(resp => folderForDeleteId = resp.data.entry.id) - .then(() => apis.user.nodes.createFolders([ folderUser ])) - .then(resp => folderUserId = resp.data.entry.id) - .then(() => apis.user.shared.shareFileById(fileUserId)) - .then(() => apis.user.favorites.addFavoriteById('file', fileUserId)) - .then(() => apis.user.favorites.addFavoriteById('folder', folderUserId)) - .then(done); - }); - - afterAll(done => { - Promise.all([ - apis.user.nodes.deleteNodeById(fileUserId), - apis.user.nodes.deleteNodeById(folderUserId), - logoutPage.load() - ]) - .then(done); - }); - - xit(''); - - describe('Personal Files', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('actions are not displayed when no item is selected', () => { - expect(toolbar.actions.isEmpty()).toBe(true, `actions displayed though nothing selected`); - }); - - it('actions are displayed when a file is selected', () => { - dataTable.clickOnItemName(fileUser) - .then(() => { - expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${fileUser}`); - }); - }); - - it('actions are displayed when a folder is selected', () => { - dataTable.clickOnItemName(folderUser) - .then(() => { - expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${folderUser}`); - }); - }); - - it('correct actions appear when a file is selected', () => { - dataTable.clickOnItemName(fileUser) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(true, `View is not displayed for ${fileUser}`); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not displayed for ${fileUser}`); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, `Edit is displayed for ${fileUser}`); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${fileUser}`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${fileUser}`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${fileUser}`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${fileUser}`); - }) - .then(() => browser.$('body').click()); - }); - - it('correct actions appear when a folder is selected', () => { - dataTable.clickOnItemName(folderUser) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, `View is displayed for ${folderUser}`); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not enabled for ${folderUser}`); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(true, `Edit is not displayed for ${folderUser}`); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${folderUser}`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${folderUser}`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${folderUser}`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${folderUser}`); - }) - .then(() => browser.$('body').click()); - }); - }); - - describe('File Libraries', () => { - beforeAll(done => { - apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PUBLIC) - .then(() => apis.admin.people.createUser(username2)) - .then(() => apis.admin.sites.addSiteMember(siteName, username, SITE_ROLES.SITE_MANAGER)) - .then(() => apis.admin.sites.addSiteMember(siteName, username2, SITE_ROLES.SITE_CONSUMER)) - .then(() => apis.admin.nodes.createFiles([ fileAdmin ], `Sites/${siteName}/documentLibrary`)) - .then(() => apis.admin.nodes.createFolders([ folderAdmin ], `Sites/${siteName}/documentLibrary`)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES) - .then(() => dataTable.waitForHeader()) - .then(() => dataTable.doubleClickOnItemName(siteName)) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - apis.admin.sites.deleteSite(siteName).then(done); - }); - - xit(''); - - describe('user is Manager', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('actions are not displayed when no item is selected', () => { - expect(toolbar.actions.isEmpty()).toBe(true, `actions displayed though nothing selected`); - }); - - it('actions are displayed when a file is selected', () => { - dataTable.clickOnItemName(fileAdmin) - .then(() => { - expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${fileAdmin}`); - }); - }); - - it('actions are displayed when a folder is selected', () => { - dataTable.clickOnItemName(folderAdmin) - .then(() => { - expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${folderAdmin}`); - }); - }); - - it('correct actions appear when a file is selected', () => { - dataTable.clickOnItemName(fileAdmin) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(true, `View is not displayed for ${fileAdmin}`); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not displayed for ${fileAdmin}`); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, `Edit is displayed for ${fileAdmin}`); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${fileAdmin}`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${fileAdmin}`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${fileAdmin}`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${fileAdmin}`); - }) - .then(() => browser.$('body').click()); - }); - - it('correct actions appear when a folder is selected', () => { - dataTable.clickOnItemName(folderAdmin) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, `View is displayed for ${folderAdmin}`); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not enabled for ${folderAdmin}`); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(true, `Edit is not displayed for ${folderAdmin}`); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${folderAdmin}`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${folderAdmin}`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${folderAdmin}`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${folderAdmin}`); - }) - .then(() => browser.$('body').click()); - }); - }); - - describe('user is Consumer', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(username2)) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('actions are not displayed when no item is selected', () => { - expect(toolbar.actions.isEmpty()).toBe(true, `actions displayed though nothing selected`); - }); - - it('actions are displayed when a file is selected', () => { - dataTable.clickOnItemName(fileAdmin) - .then(() => { - expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${fileAdmin}`); - }); - }); - - it('actions are displayed when a folder is selected', () => { - dataTable.clickOnItemName(folderAdmin) - .then(() => { - expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${folderAdmin}`); - }); - }); - - it('correct actions appear when a file is selected', () => { - dataTable.clickOnItemName(fileAdmin) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(true, `View is not displayed for ${fileAdmin}`); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not displayed for ${fileAdmin}`); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, `Edit is displayed for ${fileAdmin}`); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${fileAdmin}`); - expect(menu.isMenuItemPresent('Delete')).toBe(false, `Delete is displayed for ${fileAdmin}`); - expect(menu.isMenuItemPresent('Move')).toBe(false, `Move is displayed for ${fileAdmin}`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${fileAdmin}`); - }) - .then(() => browser.$('body').click()); - }); - - it('correct actions appear when a folder is selected', () => { - dataTable.clickOnItemName(folderAdmin) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, `View is displayed for ${folderAdmin}`); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not enabled for ${folderAdmin}`); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, `Edit is displayed for ${folderAdmin}`); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${folderAdmin}`); - expect(menu.isMenuItemPresent('Delete')).toBe(false, `Delete is displayed for ${folderAdmin}`); - expect(menu.isMenuItemPresent('Move')).toBe(false, `Move is displayed for ${folderAdmin}`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${folderAdmin}`); - }) - .then(() => browser.$('body').click()); - }); - }); - }); - - describe('Shared Files', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.SHARED_FILES) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('actions are not displayed when no item is selected', () => { - expect(toolbar.actions.isEmpty()).toBe(true, `actions displayed though nothing selected`); - }); - - it('actions are displayed when a file is selected', () => { - dataTable.clickOnItemName(fileUser) - .then(() => { - expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${fileUser}`); - }); - }); - - it('correct actions appear when a file is selected', () => { - dataTable.clickOnItemName(fileUser) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(true, `View is not displayed for ${fileUser}`); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not displayed for ${fileUser}`); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, `Edit is displayed for ${fileUser}`); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${fileUser}`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${fileUser}`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${fileUser}`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${fileUser}`); - }) - .then(() => browser.$('body').click()); - }); - }); - - describe('Recent Files', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.RECENT_FILES) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('actions are not displayed when no item is selected', () => { - expect(toolbar.actions.isEmpty()).toBe(true, `actions displayed though nothing selected`); - }); - - it('actions are displayed when a file is selected', () => { - dataTable.clickOnItemName(fileUser) - .then(() => { - expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${fileUser}`); - }); - }); - - it('correct actions appear when a file is selected', () => { - dataTable.clickOnItemName(fileUser) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(true, `View is not displayed for ${fileUser}`); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not displayed for ${fileUser}`); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, `Edit is displayed for ${fileUser}`); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${fileUser}`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${fileUser}`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${fileUser}`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${fileUser}`); - }) - .then(() => browser.$('body').click()); - }); - }); - - describe('Favorites', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('actions are not displayed when no item is selected', () => { - expect(toolbar.actions.isEmpty()).toBe(true, `actions displayed though nothing selected`); - }); - - it('actions are displayed when a file is selected', () => { - dataTable.clickOnItemName(fileUser) - .then(() => { - expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${fileUser}`); - }); - }); - - it('actions are displayed when a folder is selected', () => { - dataTable.clickOnItemName(folderUser) - .then(() => { - expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${folderUser}`); - }); - }); - - it('correct actions appear when a file is selected', () => { - dataTable.clickOnItemName(fileUser) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(true, `View is not displayed for ${fileUser}`); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not displayed for ${fileUser}`); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(false, `Edit is displayed for ${fileUser}`); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${fileUser}`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${fileUser}`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${fileUser}`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${fileUser}`); - }) - .then(() => browser.$('body').click()); - }); - - it('correct actions appear when a folder is selected', () => { - dataTable.clickOnItemName(folderUser) - .then(() => { - expect(toolbar.actions.isButtonPresent('View')).toBe(false, `View is displayed for ${folderUser}`); - expect(toolbar.actions.isButtonPresent('Download')).toBe(true, `Download is not enabled for ${folderUser}`); - expect(toolbar.actions.isButtonPresent('Edit')).toBe(true, `Edit is not displayed for ${folderUser}`); - }) - .then(() => toolbar.actions.openMoreMenu()) - .then(menu => { - expect(menu.isMenuItemPresent('Copy')).toBe(true, `Copy is not displayed for ${folderUser}`); - expect(menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${folderUser}`); - expect(menu.isMenuItemPresent('Move')).toBe(true, `Move is not displayed for ${folderUser}`); - expect(menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${folderUser}`); - }) - .then(() => browser.$('body').click()); - }); - }); - - describe('Trash', () => { - beforeAll(done => { - apis.user.nodes.deleteNodeById(fileForDeleteId, false) - .then(() => apis.user.nodes.deleteNodeById(folderForDeleteId, false)) - .then(() => loginPage.load()) - .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.permanentlyDelete(fileForDeleteId), - apis.user.trashcan.permanentlyDelete(folderForDeleteId), - logoutPage.load() - ]) - .then(done); - }); - - it('actions are not displayed when no item is selected', () => { - expect(toolbar.actions.isEmpty()).toBe(true, `actions displayed though nothing selected`); - }); - - it('actions are displayed when a file is selected', () => { - dataTable.clickOnItemName(fileForDelete) - .then(() => { - expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${fileForDelete}`); - }); - }); - - it('actions are displayed when a folder is selected', () => { - dataTable.clickOnItemName(folderForDelete) - .then(() => { - expect(toolbar.actions.isEmpty()).toBe(false, `actions not displayed for ${folderForDelete}`); - }); - }); - - it('correct actions appear when a file is selected', () => { - dataTable.clickOnItemName(fileForDelete) - .then(() => { - expect(toolbar.actions.isButtonPresent('Permanently delete')) - .toBe(true, `Permanently delete is not displayed for ${fileForDelete}`); - expect(toolbar.actions.isButtonPresent('Restore')).toBe(true, `Restore is not displayed for ${fileForDelete}`); - }); - }); - - it('correct actions appear when a folder is selected', () => { - dataTable.clickOnItemName(folderForDelete) - .then(() => { - expect(toolbar.actions.isButtonPresent('Permanently delete')) - .toBe(true, `Permanently delete is displayed for ${folderForDelete}`); - expect(toolbar.actions.isButtonPresent('Restore')).toBe(true, `Restore is not enabled for ${folderForDelete}`); - }); - }); - }); -}); diff --git a/e2e/suites/application/page-titles.test.ts b/e2e/suites/application/page-titles.test.ts deleted file mode 100644 index 69ee99f2e..000000000 --- a/e2e/suites/application/page-titles.test.ts +++ /dev/null @@ -1,133 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser } from 'protractor'; - -import { SIDEBAR_LABELS } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; - -describe('Page titles', () => { - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const page = new BrowsingPage(); - - xit(''); - - describe('on Login / Logout pages', () => { - it('on Login page', () => { - loginPage.load() - .then(() => { - expect(browser.getTitle()).toContain('Sign in'); - }); - }); - - it('after logout', () => { - loginPage.load() - .then(() => loginPage.loginWithAdmin()) - .then(() => page.signOut()) - .then(() => { - expect(browser.getTitle()).toContain('Sign in'); - }); - }); - - it('when pressing Back after Logout', () => { - loginPage.load() - .then(() => loginPage.loginWithAdmin()) - .then(() => page.signOut()) - .then(() => browser.navigate().back()) - .then(() => { - expect(browser.getTitle()).toContain('Sign in'); - }); - }); - }); - - describe('on list views', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWithAdmin()) - .then(done); - }); - - afterAll(done => { - logoutPage.load() - .then(done); - }); - - it('Personal Files page', () => { - const label = SIDEBAR_LABELS.PERSONAL_FILES; - - page.sidenav.navigateToLinkByLabel(label) - .then(() => { - expect(browser.getTitle()).toContain(label); - }); - }); - - it('File Libraries page', () => { - const label = SIDEBAR_LABELS.FILE_LIBRARIES; - - page.sidenav.navigateToLinkByLabel(label) - .then(() => { - expect(browser.getTitle()).toContain(label); - }); - }); - - it('Shared Files page', () => { - const label = SIDEBAR_LABELS.SHARED_FILES; - - page.sidenav.navigateToLinkByLabel(label) - .then(() => { - expect(browser.getTitle()).toContain(label); - }); - }); - - it('Recent Files page', () => { - const label = SIDEBAR_LABELS.RECENT_FILES; - - page.sidenav.navigateToLinkByLabel(label) - .then(() => { - expect(browser.getTitle()).toContain(label); - }); - }); - - it('Favorites page', () => { - const label = SIDEBAR_LABELS.FAVORITES; - - page.sidenav.navigateToLinkByLabel(label) - .then(() => { - expect(browser.getTitle()).toContain(label); - }); - }); - - it('Trash page', () => { - const label = SIDEBAR_LABELS.TRASH; - - page.sidenav.navigateToLinkByLabel(label) - .then(() => { - expect(browser.getTitle()).toContain(label); - }); - }); - }); -}); diff --git a/e2e/suites/authentication/login.test.ts b/e2e/suites/authentication/login.test.ts deleted file mode 100644 index 50f976259..000000000 --- a/e2e/suites/authentication/login.test.ts +++ /dev/null @@ -1,179 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser } from 'protractor'; - -import { APP_ROUTES } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; -import { RepoClient } from '../../utilities/repo-client/repo-client'; - -describe('Login', () => { - const peopleApi = new RepoClient().people; - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - - const testUser = `user-${Utils.random()}@alfness`; - - const russianUser = { - username: `пользвате${Utils.random()}`, - password: '密碼中國' - }; - - const johnDoe = { - username: `user-${Utils.random()}`, - get password() { return this.username; }, - firstName: 'John', - lastName: 'Doe' - }; - - beforeAll(done => { - Promise - .all([ - peopleApi.createUser(testUser), - peopleApi.createUser(russianUser.username, russianUser.password), - peopleApi.createUser(johnDoe.username, johnDoe.password, { - firstName: johnDoe.firstName, - lastName: johnDoe.lastName - }) - ]) - .then(done); - }); - - beforeEach(done => { - loginPage.load().then(done); - }); - - afterEach(done => { - logoutPage.load() - .then(() => Utils.clearLocalStorage()) - .then(done); - }); - - xit(''); - - describe('with valid credentials', () => { - it('navigate to "Personal Files"', () => { - const { username } = johnDoe; - - loginPage.loginWith(username) - .then(() => { - expect(browser.getCurrentUrl()).toContain(APP_ROUTES.PERSONAL_FILES); - }); - }); - - it(`displays user's name in header`, () => { - const { userInfo } = new BrowsingPage(APP_ROUTES.PERSONAL_FILES).header; - const { username, firstName, lastName } = johnDoe; - - loginPage.loginWith(username) - .then(() => { - expect(userInfo.name).toEqual(`${firstName} ${lastName}`); - }); - }); - - it(`logs in with user having username containing "@"`, () => { - loginPage - .loginWith(testUser) - .then(() => { - expect(browser.getCurrentUrl()).toContain(APP_ROUTES.PERSONAL_FILES); - }); - }); - - it('logs in with user with non-latin characters', () => { - const { username, password } = russianUser; - - loginPage - .loginWith(username, password) - .then(() => { - expect(browser.getCurrentUrl()).toContain(APP_ROUTES.PERSONAL_FILES); - }); - }); - - it('redirects to Home Page when navigating to the Login page while already logged in', () => { - const { username } = johnDoe; - - loginPage - .loginWith(username) - .then(() => browser.get(APP_ROUTES.LOGIN) - .then(() => { - expect(browser.getCurrentUrl()).toContain(APP_ROUTES.PERSONAL_FILES); - }) - ); - }); - - it('redirects to Personal Files when pressing browser Back while already logged in ', () => { - const { username } = johnDoe; - - loginPage - .loginWith(username) - .then(() => browser.navigate().back()) - .then(() => { - expect(browser.getCurrentUrl()).toContain(APP_ROUTES.PERSONAL_FILES); - }); - }); - }); - - describe('with invalid credentials', () => { - const { login: loginComponent } = loginPage; - const { submitButton, errorMessage } = loginComponent; - - it('disabled submit button when no credentials are entered', () => { - expect(submitButton.isEnabled()).toBe(false); - }); - - it('disabled submit button when password is empty', () => { - loginComponent.enterUsername('any-username'); - - expect(submitButton.isEnabled()).toBe(false); - }); - - it('disabled submit button when username is empty', () => { - loginPage.login.enterPassword('any-password'); - - expect(submitButton.isEnabled()).toBe(false); - }); - - it('shows error when entering nonexistent user', () => { - loginPage - .tryLoginWith('nonexistent-user', 'any-password') - .then(() => { - expect(browser.getCurrentUrl()).toContain(APP_ROUTES.LOGIN); - expect(errorMessage.isDisplayed()).toBe(true); - }); - }); - - it('shows error when entering invalid password', () => { - const { username } = johnDoe; - - loginPage - .tryLoginWith(username, 'incorrect-password') - .then(() => { - expect(browser.getCurrentUrl()).toContain(APP_ROUTES.LOGIN); - expect(errorMessage.isDisplayed()).toBe(true); - }); - }); - }); -}); diff --git a/e2e/suites/authentication/logout.test.ts b/e2e/suites/authentication/logout.test.ts deleted file mode 100644 index 4e4a78212..000000000 --- a/e2e/suites/authentication/logout.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser } from 'protractor'; - -import { APP_ROUTES, BROWSER_WAIT_TIMEOUT } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; -import { RepoClient } from '../../utilities/repo-client/repo-client'; - -describe('Logout', () => { - const page = new BrowsingPage(); - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - - const peopleApi = new RepoClient().people; - - const johnDoe = `user-${Utils.random()}`; - - beforeAll((done) => { - peopleApi - .createUser(johnDoe) - .then(done); - }); - - beforeEach((done) => { - loginPage.load() - .then(() => loginPage.loginWith(johnDoe)) - .then(done); - }); - - afterEach((done) => { - logoutPage.load() - .then(() => Utils.clearLocalStorage()) - .then(done); - }); - - it('redirects to Login page, on sign out', () => { - page.signOut() - .then(() => { - expect(browser.getCurrentUrl()).toContain(APP_ROUTES.LOGIN); - }); - }); - - it('redirects to Login page when pressing browser Back after logout', () => { - page.signOut() - .then(() => browser.navigate().back()) - .then(() => { - expect(browser.getCurrentUrl()).toContain(APP_ROUTES.LOGIN); - }); - }); -}); diff --git a/e2e/suites/list-views/empty-list.test.ts b/e2e/suites/list-views/empty-list.test.ts deleted file mode 100644 index 5e20cb87f..000000000 --- a/e2e/suites/list-views/empty-list.test.ts +++ /dev/null @@ -1,109 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; -import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client'; - -describe('Empty list views', () => { - const username = `user-${Utils.random()}`; - const password = username; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, password) - }; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const page = new BrowsingPage(); - const { dataTable } = page; - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => loginPage.load()) - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('empty Personal Files', () => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES) - .then(() => { - expect(dataTable.isEmptyList()).toBe(true, 'list is not empty'); - expect(dataTable.getEmptyDragAndDropText()).toContain('Drag and drop'); - }); - }); - - it('empty File Libraries', () => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES) - .then(() => { - expect(dataTable.isEmptyList()).toBe(true, 'list is not empty'); - expect(dataTable.getEmptyStateTitle()).toContain(`You aren't a member of any File Libraries yet`); - expect(dataTable.getEmptyStateText()).toContain('Join sites to upload, view, and share files.'); - }); - }); - - it('empty Shared Files', () => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.SHARED_FILES) - .then(() => { - expect(dataTable.isEmptyList()).toBe(true, 'list is not empty'); - expect(dataTable.getEmptyStateTitle()).toContain('No shared files or folders'); - expect(dataTable.getEmptyStateText()).toContain('Items you share using the Share option are shown here.'); - }); - }); - - it('empty Recent Files', () => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.RECENT_FILES) - .then(() => { - expect(dataTable.isEmptyList()).toBe(true, 'list is not empty'); - expect(dataTable.getEmptyStateTitle()).toContain('No recent files'); - expect(dataTable.getEmptyStateText()).toContain('Items you upload or edit in the last 30 days are shown here.'); - }); - }); - - it('empty Favorites', () => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES) - .then(() => { - expect(dataTable.isEmptyList()).toBe(true, 'list is not empty'); - expect(dataTable.getEmptyStateTitle()).toContain('No favorite files or folders'); - expect(dataTable.getEmptyStateText()).toContain('Favorite items that you want to easily find later.'); - }); - }); - - it('empty Trash', () => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH) - .then(() => { - expect(dataTable.isEmptyList()).toBe(true, 'list is not empty'); - expect(dataTable.getEmptyStateTitle()).toContain('Trash is empty'); - expect(dataTable.getEmptyStateText()).toContain('Items you delete are moved to the Trash.'); - expect(dataTable.getEmptyStateText()).toContain('Empty Trash to permanently delete items.'); - }); - }); -}); diff --git a/e2e/suites/list-views/favorites.test.ts b/e2e/suites/list-views/favorites.test.ts deleted file mode 100644 index 8073b7d96..000000000 --- a/e2e/suites/list-views/favorites.test.ts +++ /dev/null @@ -1,157 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, by } from 'protractor'; - -import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; -import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client'; - -describe('Favorites', () => { - const username = `user-${Utils.random()}`; - const password = username; - - const siteName = `site-${Utils.random()}`; - const folderName = `folder-${Utils.random()}`; - const fileName1 = `file-${Utils.random()}.txt`; - const fileName2 = `file-${Utils.random()}.txt`; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, password) - }; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const favoritesPage = new BrowsingPage(); - const { dataTable } = favoritesPage; - const { breadcrumb } = favoritesPage.toolbar; - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PUBLIC)) - .then(() => apis.admin.sites.addSiteMember(siteName, username, SITE_ROLES.SITE_MANAGER)) - .then(() => apis.admin.nodes.createFiles([ fileName1 ], `Sites/${siteName}/documentLibrary`) - .then(resp => apis.user.favorites.addFavoriteById('file', resp.data.entry.id))) - .then(() => apis.user.nodes.createFolders([ folderName ]) - .then(resp => apis.user.favorites.addFavoriteById('folder', resp.data.entry.id))) - .then(() => apis.user.nodes.createFiles([ fileName2 ], folderName) - .then(resp => apis.user.favorites.addFavoriteById('file', resp.data.entry.id))) - .then(() => loginPage.load()) - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - favoritesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - Promise.all([ - apis.admin.sites.deleteSite(siteName), - apis.user.nodes.deleteNodes([ folderName ]), - logoutPage.load() - ]) - .then(done); - }); - - it('has the correct columns', () => { - const labels = [ 'Name', 'Location', 'Size', 'Modified', 'Modified by' ]; - const elements = labels.map(label => dataTable.getColumnHeaderByLabel(label)); - - expect(dataTable.getColumnHeaders().count()).toBe(5 + 1, 'Incorrect number of columns'); - - elements.forEach((element, index) => { - expect(element.isPresent()).toBe(true, `"${labels[index]}" is missing`); - }); - }); - - it('displays the favorite files and folders', () => { - expect(dataTable.countRows()).toEqual(3, 'Incorrect number of items displayed'); - expect(dataTable.getRowByName(fileName1).isPresent()).toBe(true, `${fileName1} not displayed`); - expect(dataTable.getRowByName(fileName2).isPresent()).toBe(true, `${fileName2} not displayed`); - expect(dataTable.getRowByName(folderName).isPresent()).toBe(true, `${folderName} not displayed`); - }); - - it('Location column displays the parent folder of the files', () => { - const itemsLocations = { - [fileName1]: siteName, - [fileName2]: folderName, - [folderName]: 'Personal Files' - }; - - dataTable.getRows() - .map((row) => { - return row.all(dataTable.cell).map(cell => cell.getText()); - }) - .then((rowCells) => { - return rowCells.reduce((acc, cell) => { - acc[cell[1]] = cell[2]; - return acc; - }, {}); - }) - .then((favoritesList) => { - Object.keys(itemsLocations).forEach((item) => { - expect(favoritesList[item]).toEqual(itemsLocations[item]); - }); - }); - }); - - it('Location column redirect - item in user Home', () => { - dataTable.clickItemLocation(folderName) - .then(() => breadcrumb.getCurrentItemName()) - .then(name => { - expect(name).toBe('Personal Files'); - }); - }); - - it('Location column redirect - file in folder', () => { - dataTable.clickItemLocation(fileName2) - .then(() => breadcrumb.getCurrentItemName()) - .then(name => { - expect(name).toBe(folderName); - }) - .then(() => breadcrumb.getFirstItemName()) - .then(name => { - expect(name).toBe('Personal Files'); - }); - }); - - it('Location column redirect - file in site', () => { - dataTable.clickItemLocation(fileName1) - .then(() => breadcrumb.getCurrentItemName()) - .then(name => { - expect(name).toBe(siteName); - }) - .then(() => breadcrumb.getFirstItemName()) - .then(name => { - expect(name).toBe('File Libraries'); - }); - }); - -}); diff --git a/e2e/suites/list-views/file-libraries.test.ts b/e2e/suites/list-views/file-libraries.test.ts deleted file mode 100644 index 89ac75a5b..000000000 --- a/e2e/suites/list-views/file-libraries.test.ts +++ /dev/null @@ -1,131 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, by } from 'protractor'; - -import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; -import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client'; - -describe('File Libraries', () => { - const username = `user-${Utils.random()}`; - const password = username; - - const sitePrivate = `private-${Utils.random()}`; - const siteModerated = `moderated-${Utils.random()}`; - const sitePublic = `public-${Utils.random()}`; - - const adminSite = `admin-${Utils.random()}`; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, password) - }; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const fileLibrariesPage = new BrowsingPage(APP_ROUTES.FILE_LIBRARIES); - const { dataTable } = fileLibrariesPage; - - beforeAll(done => { - Promise - .all([ - apis.admin.people.createUser(username), - apis.admin.sites.createSite(sitePublic, SITE_VISIBILITY.PUBLIC), - apis.admin.sites.createSite(siteModerated, SITE_VISIBILITY.MODERATED), - apis.admin.sites.createSite(sitePrivate, SITE_VISIBILITY.PRIVATE), - apis.admin.sites.createSite(adminSite, SITE_VISIBILITY.PUBLIC) - ]) - .then(() => apis.admin.sites.addSiteMember(sitePublic, username, SITE_ROLES.SITE_CONSUMER)) - .then(() => apis.admin.sites.addSiteMember(siteModerated, username, SITE_ROLES.SITE_MANAGER)) - .then(() => apis.admin.sites.addSiteMember(sitePrivate, username, SITE_ROLES.SITE_CONTRIBUTOR)) - - .then(() => loginPage.load()) - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - fileLibrariesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - Promise.all([ - apis.admin.sites.deleteSite(sitePublic), - apis.admin.sites.deleteSite(siteModerated), - apis.admin.sites.deleteSite(sitePrivate), - apis.admin.sites.deleteSite(adminSite), - logoutPage.load() - ]) - .then(done); - }); - - it('has the correct columns', () => { - const labels = [ 'Title', 'Status' ]; - const elements = labels.map(label => dataTable.getColumnHeaderByLabel(label)); - - expect(dataTable.getColumnHeaders().count()).toBe(2 + 1, 'Incorrect number of columns'); - - elements.forEach((element, index) => { - expect(element.isPresent()).toBe(true, `"${labels[index]}" is missing`); - }); - }); - - it('User can see only the sites he is a member of', () => { - const sitesCount = dataTable.countRows(); - - const expectedSites = { - [sitePrivate]: SITE_VISIBILITY.PRIVATE, - [siteModerated]: SITE_VISIBILITY.MODERATED, - [sitePublic]: SITE_VISIBILITY.PUBLIC - }; - - expect(sitesCount).toEqual(3, 'Incorrect number of sites displayed'); - expect(dataTable.getRowByName(adminSite).isPresent()).toBe(false, 'Incorrect site appears in list'); - - dataTable.getRows() - .map((row) => { - return row.all(by.css('td')).map(cell => cell.getText()); - }) - .then((rowCells) => { - return rowCells.reduce((acc, cell) => { - acc[cell[1]] = cell[2].toUpperCase(); - return acc; - }, {}); - }) - .then((sitesList) => { - Object.keys(expectedSites).forEach((site) => { - expect(sitesList[site]).toEqual(expectedSites[site]); - }); - }); - }); - - // it('Site ID is displayed when two sites have the same name', () => { - // // cannot be implemented until ACA-987 is fixed - // }); -}); diff --git a/e2e/suites/list-views/personal-files.test.ts b/e2e/suites/list-views/personal-files.test.ts deleted file mode 100644 index 7a26d04eb..000000000 --- a/e2e/suites/list-views/personal-files.test.ts +++ /dev/null @@ -1,159 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser } from 'protractor'; - -import { SIDEBAR_LABELS } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; -import { RepoClient } from '../../utilities/repo-client/repo-client'; - -describe('Personal Files', () => { - const username = `user-${Utils.random()}`; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, username) - }; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const personalFilesPage = new BrowsingPage(); - const { dataTable } = personalFilesPage; - - const adminFolder = `admin-folder-${Utils.random()}`; - - const userFolder = `user-folder-${Utils.random()}`; - const userFile = `file-${Utils.random()}.txt`; - - beforeAll(done => { - Promise - .all([ - apis.admin.people.createUser(username), - apis.admin.nodes.createFolders([ adminFolder ]) - ]) - .then(() => apis.user.nodes.createFolders([ userFolder ])) - .then(() => apis.user.nodes.createFiles([ userFile ], userFolder)) - .then(done); - }); - - afterAll(done => { - Promise - .all([ - apis.admin.nodes.deleteNodes([ adminFolder ]), - apis.user.nodes.deleteNodes([ userFolder ]) - ]) - .then(done); - }); - - xit(''); - - describe(`Admin user's personal files`, () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWithAdmin()) - .then(done); - }); - - beforeEach(done => { - personalFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('has "Data Dictionary" folder', () => { - expect(dataTable.getRowByName('Data Dictionary').isPresent()).toBe(true); - }); - - it('has created content', () => { - expect(dataTable.getRowByName(adminFolder).isPresent()).toBe(true); - }); - }); - - describe(`Regular user's personal files`, () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - personalFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('has the correct columns', () => { - const labels = [ 'Name', 'Size', 'Modified', 'Modified by' ]; - const elements = labels.map(label => dataTable.getColumnHeaderByLabel(label)); - - expect(dataTable.getColumnHeaders().count()).toBe(4 + 1, 'Incorrect number of columns'); - - elements.forEach((element, index) => { - expect(element.isPresent()).toBe(true, `"${labels[index]}" is missing`); - }); - }); - - it('has default sorted column', () => { - expect(dataTable.getSortedColumnHeader().getText()).toBe('Modified'); - }); - - it('has user created content', () => { - expect(dataTable.getRowByName(userFolder).isPresent()) - .toBe(true); - }); - - it('navigates to folder', () => { - const getNodeIdPromise = apis.user.nodes - .getNodeByPath(`/${userFolder}`) - .then(response => response.data.entry.id); - - const navigatePromise = dataTable - .doubleClickOnItemName(userFolder) - .then(() => dataTable.waitForHeader()); - - Promise - .all([ - getNodeIdPromise, - navigatePromise - ]) - .then(([ nodeId ]) => { - expect(browser.getCurrentUrl()) - .toContain(nodeId, 'Node ID is not in the URL'); - - expect(dataTable.getRowByName(userFile).isPresent()) - .toBe(true, 'user file is missing'); - }); - }); - }); -}); diff --git a/e2e/suites/list-views/recent-files.test.ts b/e2e/suites/list-views/recent-files.test.ts deleted file mode 100644 index 6ce587ec5..000000000 --- a/e2e/suites/list-views/recent-files.test.ts +++ /dev/null @@ -1,149 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, by } from 'protractor'; - -import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; -import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client'; - -describe('Recent Files', () => { - const username = `user-${Utils.random()}`; - const password = username; - - const folderName = `folder-${Utils.random()}`; - let folderId; - const fileName1 = `file-${Utils.random()}.txt`; - - const fileName2 = `file-${Utils.random()}.txt`; - let file2Id; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, password) - }; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const recentFilesPage = new BrowsingPage(); - const { dataTable } = recentFilesPage; - const { breadcrumb } = recentFilesPage.toolbar; - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => apis.user.nodes.createFolders([ folderName ])) - .then(resp => folderId = resp.data.entry.id) - .then(() => apis.user.nodes.createFiles([ fileName1 ], folderName)) - - .then(() => apis.user.nodes.createFiles([ fileName2 ])) - .then(resp => file2Id = resp.data.entry.id) - - .then(() => loginPage.load()) - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - recentFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.RECENT_FILES) - .then(() => dataTable.isEmptyList()) - .then(empty => { - if (empty) { - browser.sleep(5000); - recentFilesPage.refresh(); - } - }) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - Promise.all([ - apis.user.nodes.deleteNodesById([ folderId, file2Id ]), - logoutPage.load() - ]) - .then(done); - }); - - it('has the correct columns', () => { - const labels = [ 'Name', 'Location', 'Size', 'Modified' ]; - const elements = labels.map(label => dataTable.getColumnHeaderByLabel(label)); - - expect(dataTable.getColumnHeaders().count()).toBe(4 + 1, 'Incorrect number of columns'); - - elements.forEach((element, index) => { - expect(element.isPresent()).toBe(true, `"${labels[index]}" is missing`); - }); - }); - - it('displays the files added by the current user in the last 30 days', () => { - expect(dataTable.countRows()).toEqual(2, 'Incorrect number of sites displayed'); - expect(dataTable.getRowByName(fileName1).isPresent()).toBe(true, `${fileName1} not displayed`); - expect(dataTable.getRowByName(fileName2).isPresent()).toBe(true, `${fileName2} not displayed`); - }); - - it('Location column displays the parent folder of the file', () => { - const itemsLocations = { - [fileName2]: 'Personal Files', - [fileName1]: folderName - }; - - dataTable.getRows() - .map((row) => { - return row.all(dataTable.cell).map(cell => cell.getText()); - }) - .then((rowCells) => { - return rowCells.reduce((acc, cell) => { - acc[cell[1]] = cell[2]; - return acc; - }, {}); - }) - .then((recentList) => { - Object.keys(itemsLocations).forEach((item) => { - expect(recentList[item]).toEqual(itemsLocations[item]); - }); - }); - }); - - it('Location column redirect - file in user Home', () => { - dataTable.clickItemLocation(fileName1) - .then(() => breadcrumb.getCurrentItemName()) - .then(name => { - expect(name).toBe(folderName); - }) - .then(() => breadcrumb.getFirstItemName()) - .then(name => { - expect(name).toBe('Personal Files'); - }); - }); - - it('Location column redirect - file in folder', () => { - dataTable.clickItemLocation(fileName2) - .then(() => breadcrumb.getCurrentItemName()) - .then(name => { - expect(name).toBe('Personal Files'); - }); - }); -}); diff --git a/e2e/suites/list-views/shared-files.test.ts b/e2e/suites/list-views/shared-files.test.ts deleted file mode 100644 index c4bb2cddc..000000000 --- a/e2e/suites/list-views/shared-files.test.ts +++ /dev/null @@ -1,155 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, by } from 'protractor'; - -import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; -import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client'; - -describe('Shared Files', () => { - const username = `user-${Utils.random()}`; - const password = username; - - const siteName = `site-${Utils.random()}`; - const fileAdmin = `file-${Utils.random()}.txt`; - - const folderUser = `folder-${Utils.random()}`; - const fileUser = `file-${Utils.random()}.txt`; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, password) - }; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const sharedFilesPage = new BrowsingPage(); - const { dataTable } = sharedFilesPage; - const { breadcrumb } = sharedFilesPage.toolbar; - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PUBLIC)) - .then(() => apis.admin.sites.addSiteMember(siteName, username, SITE_ROLES.SITE_CONSUMER)) - .then(() => apis.admin.nodes.createFiles([ fileAdmin ], `Sites/${siteName}/documentLibrary`)) - .then(resp => apis.admin.shared.shareFileById(resp.data.entry.id)) - - .then(() => apis.user.nodes.createFolders([ folderUser ])) - .then(() => apis.user.nodes.createFiles([ fileUser ], folderUser)) - .then(resp => apis.user.shared.shareFileById(resp.data.entry.id)) - - .then(() => loginPage.load()) - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - sharedFilesPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.SHARED_FILES) - .then(() => dataTable.isEmptyList()) - .then(empty => { - if (empty) { - browser.sleep(5000); - sharedFilesPage.refresh(); - } - }) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - Promise.all([ - apis.admin.sites.deleteSite(siteName), - apis.user.nodes.deleteNodes([ folderUser ]), - logoutPage.load() - ]) - .then(done); - }); - - it('has the correct columns', () => { - const labels = [ 'Name', 'Location', 'Size', 'Modified', 'Modified by', 'Shared by' ]; - const elements = labels.map(label => dataTable.getColumnHeaderByLabel(label)); - - expect(dataTable.getColumnHeaders().count()).toBe(6 + 1, 'Incorrect number of columns'); - - elements.forEach((element, index) => { - expect(element.isPresent()).toBe(true, `"${labels[index]}" is missing`); - }); - }); - - it('displays the files shared by everyone', () => { - expect(dataTable.countRows()).toEqual(2, 'Incorrect number of items displayed'); - expect(dataTable.getRowByName(fileAdmin).isPresent()).toBe(true, `${fileAdmin} not displayed`); - expect(dataTable.getRowByName(fileUser).isPresent()).toBe(true, `${fileUser} not displayed`); - }); - - it('Location column displays the parent folder of the file', () => { - const itemsLocations = { - [fileAdmin]: siteName, - [fileUser]: folderUser - }; - - dataTable.getRows() - .map((row) => { - return row.all(dataTable.cell).map(cell => cell.getText()); - }) - .then((rowCells) => { - return rowCells.reduce((acc, cell) => { - acc[cell[1]] = cell[2]; - return acc; - }, {}); - }) - .then((recentList) => { - Object.keys(itemsLocations).forEach((item) => { - expect(recentList[item]).toEqual(itemsLocations[item]); - }); - }); - }); - - it('Location column redirect - file in user Home', () => { - dataTable.clickItemLocation(fileUser) - .then(() => breadcrumb.getCurrentItemName()) - .then(name => { - expect(name).toBe(folderUser); - }) - .then(() => breadcrumb.getFirstItemName()) - .then(name => { - expect(name).toBe('Personal Files'); - }); - }); - - it('Location column redirect - file in site', () => { - dataTable.clickItemLocation(fileAdmin) - .then(() => breadcrumb.getCurrentItemName()) - .then(name => { - expect(name).toBe(siteName); - }) - .then(() => breadcrumb.getFirstItemName()) - .then(name => { - expect(name).toBe('File Libraries'); - }); - }); -}); diff --git a/e2e/suites/list-views/trash.test.ts b/e2e/suites/list-views/trash.test.ts deleted file mode 100644 index 7c4969bc4..000000000 --- a/e2e/suites/list-views/trash.test.ts +++ /dev/null @@ -1,188 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, by } from 'protractor'; - -import { APP_ROUTES, SITE_VISIBILITY, SITE_ROLES, SIDEBAR_LABELS } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; -import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client'; - -describe('Trash', () => { - const username = `user-${Utils.random()}`; - - const siteName = `site-${Utils.random()}`; - const fileSite = `file-${Utils.random()}.txt`; - let fileSiteId; - - const folderAdmin = `folder-${Utils.random()}`; - let folderAdminId; - const fileAdmin = `file-${Utils.random()}.txt`; - let fileAdminId; - - const folderUser = `folder-${Utils.random()}`; - let folderUserId; - const fileUser = `file-${Utils.random()}.txt`; - let fileUserId; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, username) - }; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const trashPage = new BrowsingPage(); - const { dataTable } = trashPage; - const { breadcrumb } = trashPage.toolbar; - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => apis.admin.nodes.createFiles([ fileAdmin ]) - .then(resp => fileAdminId = resp.data.entry.id)) - .then(() => apis.admin.nodes.createFolders([ folderAdmin ]) - .then(resp => folderAdminId = resp.data.entry.id)) - .then(() => apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PUBLIC)) - .then(() => apis.admin.sites.addSiteMember(siteName, username, SITE_ROLES.SITE_MANAGER)) - .then(() => apis.admin.nodes.createFiles([ fileSite ], `Sites/${siteName}/documentLibrary`) - .then(resp => fileSiteId = resp.data.entry.id)) - .then(() => apis.user.nodes.createFiles([ fileUser ]) - .then(resp => fileUserId = resp.data.entry.id)) - .then(() => apis.user.nodes.createFolders([ folderUser ]) - .then(resp => folderUserId = resp.data.entry.id)) - - .then(() => apis.admin.nodes.deleteNodesById([ fileAdminId, folderAdminId ], false)) - .then(() => apis.user.nodes.deleteNodesById([ fileSiteId, fileUserId, folderUserId ], false)) - - .then(done); - }); - - afterAll(done => { - Promise.all([ - apis.admin.sites.deleteSite(siteName), - apis.admin.trashcan.emptyTrash() - ]) - .then(done); - }); - - xit(''); - - describe('as admin', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWithAdmin()) - .then(done); - }); - - beforeEach(done => { - trashPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('has the correct columns', () => { - const labels = [ 'Name', 'Location', 'Size', 'Deleted', 'Deleted by' ]; - const elements = labels.map(label => dataTable.getColumnHeaderByLabel(label)); - - expect(dataTable.getColumnHeaders().count()).toBe(5 + 1, 'Incorrect number of columns'); - - elements.forEach((element, index) => { - expect(element.isPresent()).toBe(true, `"${labels[index]}" is missing`); - }); - }); - - it('displays the files and folders deleted by everyone', () => { - expect(dataTable.countRows()).toEqual(5, 'Incorrect number of deleted items displayed'); - - expect(dataTable.getRowByName(fileAdmin).isPresent()).toBe(true, `${fileAdmin} not displayed`); - expect(dataTable.getRowByName(folderAdmin).isPresent()).toBe(true, `${folderAdmin} not displayed`); - expect(dataTable.getRowByName(fileUser).isPresent()).toBe(true, `${fileUser} not displayed`); - expect(dataTable.getRowByName(folderUser).isPresent()).toBe(true, `${folderUser} not displayed`); - expect(dataTable.getRowByName(fileSite).isPresent()).toBe(true, `${fileSite} not displayed`); - }); - }); - - describe('as user', () => { - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - trashPage.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('has the correct columns', () => { - const labels = [ 'Name', 'Location', 'Size', 'Deleted', 'Deleted by' ]; - const elements = labels.map(label => dataTable.getColumnHeaderByLabel(label)); - - expect(dataTable.getColumnHeaders().count()).toBe(5 + 1, 'Incorrect number of columns'); - - elements.forEach((element, index) => { - expect(element.isPresent()).toBe(true, `"${labels[index]}" is missing`); - }); - }); - - it('displays the files and folders deleted by the user', () => { - expect(dataTable.countRows()).toEqual(3, 'Incorrect number of deleted items displayed'); - - expect(dataTable.getRowByName(fileSite).isPresent()).toBe(true, `${fileSite} not displayed`); - expect(dataTable.getRowByName(fileUser).isPresent()).toBe(true, `${fileUser} not displayed`); - expect(dataTable.getRowByName(folderUser).isPresent()).toBe(true, `${folderUser} not displayed`); - expect(dataTable.getRowByName(fileAdmin).isPresent()).toBe(false, `${fileAdmin} is displayed`); - }); - - it('Location column redirect - file in user Home', () => { - dataTable.clickItemLocation(fileUser) - .then(() => breadcrumb.getCurrentItemName()) - .then(name => { - expect(name).toBe('Personal Files'); - }); - }); - - it('Location column redirect - file in site', () => { - dataTable.clickItemLocation(fileSite) - .then(() => breadcrumb.getCurrentItemName()) - .then(name => { - expect(name).toBe(siteName); - }) - .then(() => breadcrumb.getFirstItemName()) - .then(name => { - expect(name).toBe('File Libraries'); - }); - }); - }); -}); diff --git a/e2e/suites/navigation/side-navigation.test.ts b/e2e/suites/navigation/side-navigation.test.ts deleted file mode 100644 index 569c0fc5b..000000000 --- a/e2e/suites/navigation/side-navigation.test.ts +++ /dev/null @@ -1,129 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser } from 'protractor'; - -import { APP_ROUTES, SIDEBAR_LABELS } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; - -describe('Side navigation', () => { - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const page = new BrowsingPage(); - - beforeAll(done => { - loginPage.load() - .then(() => loginPage.loginWithAdmin()) - .then(done); - }); - - beforeEach(done => { - page.dataTable.wait().then(done); - }); - - afterAll(done => { - logoutPage.load().then(done); - }); - - it('has "Personal Files" as default', () => { - expect(browser.getCurrentUrl()) - .toContain(APP_ROUTES.PERSONAL_FILES); - - expect(page.sidenav.isActiveByLabel('Personal Files')) - .toBe(true, 'Active link'); - }); - - it('navigates to "File Libraries"', () => { - const { sidenav, dataTable } = page; - - sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FILE_LIBRARIES) - .then(() => dataTable.wait()) - .then(() => browser.getCurrentUrl()) - .then(url => { - expect(url).toContain(APP_ROUTES.FILE_LIBRARIES); - expect(sidenav.isActiveByLabel(SIDEBAR_LABELS.FILE_LIBRARIES)).toBe(true); - }); - }); - - it('navigates to "Personal Files"', () => { - const { sidenav, dataTable } = page; - - sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES) - .then(() => dataTable.wait()) - .then(() => browser.getCurrentUrl()) - .then(url => { - expect(url).toContain(APP_ROUTES.PERSONAL_FILES); - expect(sidenav.isActiveByLabel(SIDEBAR_LABELS.PERSONAL_FILES)).toBe(true); - }); - }); - - it('navigates to "Shared Files"', () => { - const { sidenav, dataTable } = page; - - sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.SHARED_FILES) - .then(() => dataTable.wait()) - .then(() => browser.getCurrentUrl()) - .then(url => { - expect(url).toContain(APP_ROUTES.SHARED_FILES); - expect(sidenav.isActiveByLabel(SIDEBAR_LABELS.SHARED_FILES)).toBe(true); - }); - }); - - it('navigates to "Recent Files"', () => { - const { sidenav, dataTable } = page; - - sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.RECENT_FILES) - .then(() => dataTable.wait()) - .then(() => browser.getCurrentUrl()) - .then(url => { - expect(url).toContain(APP_ROUTES.RECENT_FILES); - expect(sidenav.isActiveByLabel(SIDEBAR_LABELS.RECENT_FILES)).toBe(true); - }); - }); - - it('navigates to "Favorites"', () => { - const { sidenav, dataTable } = page; - - sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES) - .then(() => dataTable.wait()) - .then(() => browser.getCurrentUrl()) - .then(url => { - expect(url).toContain(APP_ROUTES.FAVORITES); - expect(sidenav.isActiveByLabel(SIDEBAR_LABELS.FAVORITES)).toBe(true); - }); - }); - - it('navigates to "Trash"', () => { - const { sidenav, dataTable } = page; - - sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH) - .then(() => dataTable.wait()) - .then(() => browser.getCurrentUrl()) - .then(url => { - expect(url).toContain(APP_ROUTES.TRASHCAN); - expect(sidenav.isActiveByLabel(SIDEBAR_LABELS.TRASH)).toBe(true); - }); - }); -}); diff --git a/e2e/suites/pagination/pag-favorites.test.ts b/e2e/suites/pagination/pag-favorites.test.ts deleted file mode 100644 index 18c86311d..000000000 --- a/e2e/suites/pagination/pag-favorites.test.ts +++ /dev/null @@ -1,186 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, protractor, promise } from 'protractor'; -import { SIDEBAR_LABELS, SITE_VISIBILITY } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; -import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client'; - -describe('Pagination on Favorites', () => { - const username = `user-${Utils.random()}`; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, username) - }; - const { nodes: nodesApi, favorites: favoritesApi } = apis.user; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const page = new BrowsingPage(); - const { dataTable, pagination } = page; - - const parent = `parent-${Utils.random()}`; - const files = Array(101) - .fill('file') - .map((name, index): string => `${name}-${index + 1}.txt`); - let filesIds; - - function resetToDefaultPageSize(): promise.Promise { - return pagination.openMaxItemsMenu() - .then(menu => menu.clickMenuItem('25')) - .then(() => dataTable.waitForHeader()); - } - - function resetToDefaultPageNumber(): promise.Promise { - return pagination.openCurrentPageMenu() - .then(menu => menu.clickMenuItem('1')) - .then(() => dataTable.waitForHeader()); - } - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => nodesApi.createFiles(files, parent)) - .then(resp => filesIds = resp.data.list.entries.map(entries => entries.entry.id)) - - .then(() => favoritesApi.addFavoritesByIds('file', filesIds)) - - .then(() => loginPage.load()) - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.FAVORITES) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterEach(done => { - browser.actions().sendKeys(protractor.Key.ESCAPE).perform().then(done); - }); - - afterAll(done => { - Promise.all([ - nodesApi.deleteNodes([ parent ]), - logoutPage.load() - ]) - .then(done); - }); - - it('default values', () => { - expect(pagination.range.getText()).toContain('1-25 of 101'); - expect(pagination.maxItems.getText()).toContain('25'); - expect(pagination.currentPage.getText()).toContain('Page 1'); - expect(pagination.totalPages.getText()).toContain('of 5'); - expect(pagination.previousButton.isEnabled()).toBe(false, 'Previous button is enabled'); - expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled'); - }); - - it('page sizes', () => { - pagination.openMaxItemsMenu() - .then(menu => { - const [ first, second, third ] = [1, 2, 3] - .map(nth => menu.getNthItem(nth).getText()); - expect(first).toBe('25'); - expect(second).toBe('50'); - expect(third).toBe('100'); - }); - }); - - it('change the page size', () => { - pagination.openMaxItemsMenu() - .then(menu => menu.clickMenuItem('50')) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.maxItems.getText()).toContain('50'); - expect(pagination.totalPages.getText()).toContain('of 3'); - }) - - .then(() => resetToDefaultPageSize()); - }); - - it('current page menu items', () => { - pagination.openCurrentPageMenu() - .then(menu => { - expect(menu.getItemsCount()).toBe(5); - }); - }); - - it('change the current page from menu', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(3)) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('51-75 of 101'); - expect(pagination.currentPage.getText()).toContain('Page 3'); - expect(pagination.previousButton.isEnabled()).toBe(true, 'Previous button is not enabled'); - expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled'); - expect(dataTable.getRowByName('file-40.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('navigate to next page', () => { - pagination.nextButton.click() - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('26-50 of 101'); - expect(dataTable.getRowByName('file-70.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('navigate to previous page', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(2)) - .then(() => dataTable.waitForHeader()) - .then(() => pagination.previousButton.click()) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('1-25 of 101'); - expect(dataTable.getRowByName('file-88.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('last page', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(5)) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(dataTable.countRows()).toBe(1, 'Incorrect number of items on the last page'); - expect(pagination.currentPage.getText()).toContain('Page 5'); - expect(pagination.nextButton.isEnabled()).toBe(false, 'Next button is enabled'); - }); - }); -}); diff --git a/e2e/suites/pagination/pag-personal-files.test.ts b/e2e/suites/pagination/pag-personal-files.test.ts deleted file mode 100644 index aed53568d..000000000 --- a/e2e/suites/pagination/pag-personal-files.test.ts +++ /dev/null @@ -1,183 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, protractor, promise } from 'protractor'; -import { SIDEBAR_LABELS, SITE_VISIBILITY } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; -import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client'; - -describe('Pagination on Personal Files', () => { - const username = `user-${Utils.random()}`; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, username) - }; - const { nodes: nodesApi } = apis.user; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const page = new BrowsingPage(); - const { dataTable, pagination } = page; - - const parent = `parent-${Utils.random()}`; - const files = Array(101) - .fill('file') - .map((name, index): string => `${name}-${index + 1}.txt`); - - function resetToDefaultPageSize(): promise.Promise { - return pagination.openMaxItemsMenu() - .then(menu => menu.clickMenuItem('25')) - .then(() => dataTable.waitForHeader()); - } - - function resetToDefaultPageNumber(): promise.Promise { - return pagination.openCurrentPageMenu() - .then(menu => menu.clickMenuItem('1')) - .then(() => dataTable.waitForHeader()); - } - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => nodesApi.createFiles(files, parent)) - - .then(() => loginPage.load()) - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES) - .then(() => dataTable.waitForHeader()) - .then(() => dataTable.doubleClickOnItemName(parent)) - .then(done); - }); - - afterEach(done => { - browser.actions().sendKeys(protractor.Key.ESCAPE).perform().then(done); - }); - - afterAll(done => { - Promise.all([ - nodesApi.deleteNodes([ parent ]), - logoutPage.load() - ]) - .then(done); - }); - - it('default values', () => { - expect(pagination.range.getText()).toContain('1-25 of 101'); - expect(pagination.maxItems.getText()).toContain('25'); - expect(pagination.currentPage.getText()).toContain('Page 1'); - expect(pagination.totalPages.getText()).toContain('of 5'); - expect(pagination.previousButton.isEnabled()).toBe(false, 'Previous button is enabled'); - expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled'); - }); - - it('page sizes', () => { - pagination.openMaxItemsMenu() - .then(menu => { - const [ first, second, third ] = [1, 2, 3] - .map(nth => menu.getNthItem(nth).getText()); - expect(first).toBe('25'); - expect(second).toBe('50'); - expect(third).toBe('100'); - }); - }); - - it('change the page size', () => { - pagination.openMaxItemsMenu() - .then(menu => menu.clickMenuItem('50')) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.maxItems.getText()).toContain('50'); - expect(pagination.totalPages.getText()).toContain('of 3'); - }) - - .then(() => resetToDefaultPageSize()); - }); - - it('current page menu items', () => { - pagination.openCurrentPageMenu() - .then(menu => { - expect(menu.getItemsCount()).toBe(5); - }); - }); - - it('change the current page from menu', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(3)) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('51-75 of 101'); - expect(pagination.currentPage.getText()).toContain('Page 3'); - expect(pagination.previousButton.isEnabled()).toBe(true, 'Previous button is not enabled'); - expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled'); - expect(dataTable.getRowByName('file-60.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('navigate to next page', () => { - pagination.nextButton.click() - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('26-50 of 101'); - expect(dataTable.getRowByName('file-30.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('navigate to previous page', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(2)) - .then(() => dataTable.waitForHeader()) - .then(() => pagination.previousButton.click()) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('1-25 of 101'); - expect(dataTable.getRowByName('file-12.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('last page', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(5)) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(dataTable.countRows()).toBe(1, 'Incorrect number of items on the last page'); - expect(pagination.currentPage.getText()).toContain('Page 5'); - expect(pagination.nextButton.isEnabled()).toBe(false, 'Next button is enabled'); - }); - }); -}); diff --git a/e2e/suites/pagination/pag-recent-files.test.ts b/e2e/suites/pagination/pag-recent-files.test.ts deleted file mode 100644 index 7a1089e12..000000000 --- a/e2e/suites/pagination/pag-recent-files.test.ts +++ /dev/null @@ -1,189 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, protractor, promise } from 'protractor'; -import { SIDEBAR_LABELS, SITE_VISIBILITY } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; -import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client'; - -describe('Pagination on Recent Files', () => { - const username = `user-${Utils.random()}`; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, username) - }; - const { nodes: nodesApi } = apis.user; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const page = new BrowsingPage(); - const { dataTable, pagination } = page; - - const parent = `parent-${Utils.random()}`; - const files = Array(101) - .fill('file') - .map((name, index): string => `${name}-${index + 1}.txt`); - - function resetToDefaultPageSize(): promise.Promise { - return pagination.openMaxItemsMenu() - .then(menu => menu.clickMenuItem('25')) - .then(() => dataTable.waitForHeader()); - } - - function resetToDefaultPageNumber(): promise.Promise { - return pagination.openCurrentPageMenu() - .then(menu => menu.clickMenuItem('1')) - .then(() => dataTable.waitForHeader()); - } - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => nodesApi.createFiles(files, parent)) - - .then(() => loginPage.load()) - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.RECENT_FILES) - .then(() => dataTable.isEmptyList()) - .then(empty => { - if (empty) { - browser.sleep(3000); - page.refresh(); - } - }) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterEach(done => { - browser.actions().sendKeys(protractor.Key.ESCAPE).perform().then(done); - }); - - afterAll(done => { - Promise.all([ - nodesApi.deleteNodes([ parent ]), - logoutPage.load() - ]) - .then(done); - }); - - it('default values', () => { - expect(pagination.range.getText()).toContain('1-25 of 101'); - expect(pagination.maxItems.getText()).toContain('25'); - expect(pagination.currentPage.getText()).toContain('Page 1'); - expect(pagination.totalPages.getText()).toContain('of 5'); - expect(pagination.previousButton.isEnabled()).toBe(false, 'Previous button is enabled'); - expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled'); - }); - - it('page sizes', () => { - pagination.openMaxItemsMenu() - .then(menu => { - const [ first, second, third ] = [1, 2, 3] - .map(nth => menu.getNthItem(nth).getText()); - expect(first).toBe('25'); - expect(second).toBe('50'); - expect(third).toBe('100'); - }); - }); - - it('change the page size', () => { - pagination.openMaxItemsMenu() - .then(menu => menu.clickMenuItem('50')) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.maxItems.getText()).toContain('50'); - expect(pagination.totalPages.getText()).toContain('of 3'); - }) - - .then(() => resetToDefaultPageSize()); - }); - - it('current page menu items', () => { - pagination.openCurrentPageMenu() - .then(menu => { - expect(menu.getItemsCount()).toBe(5); - }); - }); - - it('change the current page from menu', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(3)) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('51-75 of 101'); - expect(pagination.currentPage.getText()).toContain('Page 3'); - expect(pagination.previousButton.isEnabled()).toBe(true, 'Previous button is not enabled'); - expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled'); - expect(dataTable.getRowByName('file-40.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('navigate to next page', () => { - pagination.nextButton.click() - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('26-50 of 101'); - expect(dataTable.getRowByName('file-70.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('navigate to previous page', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(2)) - .then(() => dataTable.waitForHeader()) - .then(() => pagination.previousButton.click()) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('1-25 of 101'); - expect(dataTable.getRowByName('file-88.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('last page', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(5)) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(dataTable.countRows()).toBe(1, 'Incorrect number of items on the last page'); - expect(pagination.currentPage.getText()).toContain('Page 5'); - expect(pagination.nextButton.isEnabled()).toBe(false, 'Next button is enabled'); - }); - }); -}); diff --git a/e2e/suites/pagination/pag-shared-files.test.ts b/e2e/suites/pagination/pag-shared-files.test.ts deleted file mode 100644 index ac6faca9c..000000000 --- a/e2e/suites/pagination/pag-shared-files.test.ts +++ /dev/null @@ -1,193 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, protractor, promise } from 'protractor'; -import { SIDEBAR_LABELS, SITE_VISIBILITY } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; -import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client'; - -describe('Pagination on Shared Files', () => { - const username = `user-${Utils.random()}`; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, username) - }; - const { nodes: nodesApi, shared: sharedApi } = apis.user; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const page = new BrowsingPage(); - const { dataTable, pagination } = page; - - const parent = `parent-${Utils.random()}`; - const files = Array(101) - .fill('file') - .map((name, index): string => `${name}-${index + 1}.txt`); - let filesIds; - - function resetToDefaultPageSize(): promise.Promise { - return pagination.openMaxItemsMenu() - .then(menu => menu.clickMenuItem('25')) - .then(() => dataTable.waitForHeader()); - } - - function resetToDefaultPageNumber(): promise.Promise { - return pagination.openCurrentPageMenu() - .then(menu => menu.clickMenuItem('1')) - .then(() => dataTable.waitForHeader()); - } - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => nodesApi.createFiles(files, parent)) - .then(resp => filesIds = resp.data.list.entries.map(entries => entries.entry.id)) - - .then(() => sharedApi.shareFilesByIds(filesIds)) - - .then(() => loginPage.load()) - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.SHARED_FILES) - .then(() => dataTable.isEmptyList()) - .then(empty => { - if (empty) { - browser.sleep(6000); - page.refresh(); - } - }) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterEach(done => { - browser.actions().sendKeys(protractor.Key.ESCAPE).perform().then(done); - }); - - afterAll(done => { - Promise.all([ - nodesApi.deleteNodes([ parent ]), - logoutPage.load() - ]) - .then(done); - }); - - it('default values', () => { - expect(pagination.range.getText()).toContain('1-25 of 101'); - expect(pagination.maxItems.getText()).toContain('25'); - expect(pagination.currentPage.getText()).toContain('Page 1'); - expect(pagination.totalPages.getText()).toContain('of 5'); - expect(pagination.previousButton.isEnabled()).toBe(false, 'Previous button is enabled'); - expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled'); - }); - - it('page sizes', () => { - pagination.openMaxItemsMenu() - .then(menu => { - const [ first, second, third ] = [1, 2, 3] - .map(nth => menu.getNthItem(nth).getText()); - expect(first).toBe('25'); - expect(second).toBe('50'); - expect(third).toBe('100'); - }); - }); - - it('change the page size', () => { - pagination.openMaxItemsMenu() - .then(menu => menu.clickMenuItem('50')) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.maxItems.getText()).toContain('50'); - expect(pagination.totalPages.getText()).toContain('of 3'); - }) - - .then(() => resetToDefaultPageSize()); - }); - - it('current page menu items', () => { - pagination.openCurrentPageMenu() - .then(menu => { - expect(menu.getItemsCount()).toBe(5); - }); - }); - - it('change the current page from menu', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(3)) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('51-75 of 101'); - expect(pagination.currentPage.getText()).toContain('Page 3'); - expect(pagination.previousButton.isEnabled()).toBe(true, 'Previous button is not enabled'); - expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled'); - expect(dataTable.getRowByName('file-40.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('navigate to next page', () => { - pagination.nextButton.click() - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('26-50 of 101'); - expect(dataTable.getRowByName('file-70.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('navigate to previous page', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(2)) - .then(() => dataTable.waitForHeader()) - .then(() => pagination.previousButton.click()) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('1-25 of 101'); - expect(dataTable.getRowByName('file-88.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('last page', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(5)) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(dataTable.countRows()).toBe(1, 'Incorrect number of items on the last page'); - expect(pagination.currentPage.getText()).toContain('Page 5'); - expect(pagination.nextButton.isEnabled()).toBe(false, 'Next button is enabled'); - }); - }); -}); diff --git a/e2e/suites/pagination/pag-trash.test.ts b/e2e/suites/pagination/pag-trash.test.ts deleted file mode 100644 index 4f318877c..000000000 --- a/e2e/suites/pagination/pag-trash.test.ts +++ /dev/null @@ -1,184 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, protractor, promise } from 'protractor'; -import { SIDEBAR_LABELS, SITE_VISIBILITY } from '../../configs'; -import { LoginPage, LogoutPage, BrowsingPage } from '../../pages/pages'; -import { Utils } from '../../utilities/utils'; -import { RepoClient, NodeContentTree } from '../../utilities/repo-client/repo-client'; - -describe('Pagination on Trash', () => { - const username = `user-${Utils.random()}`; - - const apis = { - admin: new RepoClient(), - user: new RepoClient(username, username) - }; - const { nodes: nodesApi, trashcan: trashApi } = apis.user; - - const loginPage = new LoginPage(); - const logoutPage = new LogoutPage(); - const page = new BrowsingPage(); - const { dataTable, pagination } = page; - - const filesForDelete = Array(101) - .fill('file') - .map((name, index): string => `${name}-${index + 1}.txt`); - let filesDeletedIds; - - function resetToDefaultPageSize(): promise.Promise { - return pagination.openMaxItemsMenu() - .then(menu => menu.clickMenuItem('25')) - .then(() => dataTable.waitForHeader()); - } - - function resetToDefaultPageNumber(): promise.Promise { - return pagination.openCurrentPageMenu() - .then(menu => menu.clickMenuItem('1')) - .then(() => dataTable.waitForHeader()); - } - - beforeAll(done => { - apis.admin.people.createUser(username) - .then(() => nodesApi.createFiles(filesForDelete)) - .then(resp => filesDeletedIds = resp.data.list.entries.map(entries => entries.entry.id)) - .then(() => nodesApi.deleteNodesById(filesDeletedIds, false)) - - .then(() => loginPage.load()) - .then(() => loginPage.loginWith(username)) - .then(done); - }); - - beforeEach(done => { - page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.TRASH) - .then(() => dataTable.waitForHeader()) - .then(done); - }); - - afterEach(done => { - browser.actions().sendKeys(protractor.Key.ESCAPE).perform().then(done); - }); - - afterAll(done => { - Promise.all([ - trashApi.emptyTrash(), - logoutPage.load() - ]) - .then(done); - }); - - it('default values', () => { - expect(pagination.range.getText()).toContain('1-25 of 101'); - expect(pagination.maxItems.getText()).toContain('25'); - expect(pagination.currentPage.getText()).toContain('Page 1'); - expect(pagination.totalPages.getText()).toContain('of 5'); - expect(pagination.previousButton.isEnabled()).toBe(false, 'Previous button is enabled'); - expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled'); - }); - - it('page sizes', () => { - pagination.openMaxItemsMenu() - .then(menu => { - const [ first, second, third ] = [1, 2, 3] - .map(nth => menu.getNthItem(nth).getText()); - expect(first).toBe('25'); - expect(second).toBe('50'); - expect(third).toBe('100'); - }); - }); - - it('change the page size', () => { - pagination.openMaxItemsMenu() - .then(menu => menu.clickMenuItem('50')) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.maxItems.getText()).toContain('50'); - expect(pagination.totalPages.getText()).toContain('of 3'); - }) - - .then(() => resetToDefaultPageSize()); - }); - - it('current page menu items', () => { - pagination.openCurrentPageMenu() - .then(menu => { - expect(menu.getItemsCount()).toBe(5); - }); - }); - - it('change the current page from menu', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(3)) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('51-75 of 101'); - expect(pagination.currentPage.getText()).toContain('Page 3'); - expect(pagination.previousButton.isEnabled()).toBe(true, 'Previous button is not enabled'); - expect(pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled'); - expect(dataTable.getRowByName('file-40.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('navigate to next page', () => { - pagination.nextButton.click() - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('26-50 of 101'); - expect(dataTable.getRowByName('file-70.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('navigate to previous page', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(2)) - .then(() => dataTable.waitForHeader()) - .then(() => pagination.previousButton.click()) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(pagination.range.getText()).toContain('1-25 of 101'); - expect(dataTable.getRowByName('file-88.txt').isPresent()) - .toBe(true, 'File not found on page'); - }) - - .then(() => resetToDefaultPageNumber()); - }); - - it('last page', () => { - pagination.openCurrentPageMenu() - .then(menu => menu.clickNthItem(5)) - .then(() => dataTable.waitForHeader()) - .then(() => { - expect(dataTable.countRows()).toBe(1, 'Incorrect number of items on the last page'); - expect(pagination.currentPage.getText()).toContain('Page 5'); - expect(pagination.nextButton.isEnabled()).toBe(false, 'Next button is enabled'); - }); - }); -}); diff --git a/e2e/utilities/repo-client/apis/favorites/favorites-api.ts b/e2e/utilities/repo-client/apis/favorites/favorites-api.ts deleted file mode 100644 index dd1cd7b47..000000000 --- a/e2e/utilities/repo-client/apis/favorites/favorites-api.ts +++ /dev/null @@ -1,86 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { promise } from 'protractor'; -import { RepoApi } from '../repo-api'; -import { NodesApi } from '../nodes/nodes-api'; -import { RepoClient } from './../../repo-client'; - -export class FavoritesApi extends RepoApi { - - addFavorite(api: RepoClient, nodeType: string, name: string): Promise { - return api.nodes.getNodeByPath(name) - .then((response) => { - const { id } = response.data.entry; - return ([{ - target: { - [nodeType]: { - guid: id - } - } - }]); - }) - .then((data) => { - return this.post(`/people/-me-/favorites`, { data }); - }) - .catch(this.handleError); - } - - addFavoriteById(nodeType: string, id: string): Promise { - const data = [{ - target: { - [nodeType]: { - guid: id - } - } - }]; - return this.post(`/people/-me-/favorites`, { data }) - .catch(this.handleError); - } - - addFavoritesByIds(nodeType: string, ids: string[]): Promise { - return ids.reduce((previous, current) => ( - previous.then(() => this.addFavoriteById(nodeType, current)) - ), Promise.resolve()); - } - - getFavorite(api: RepoClient, name: string): Promise { - return api.nodes.getNodeByPath(name) - .then((response) => { - const { id } = response.data.entry; - return this.get(`/people/-me-/favorites/${id}`); - }) - .catch((response) => Promise.resolve(response)); - } - - removeFavorite(api: RepoClient, nodeType: string, name: string): Promise { - return api.nodes.getNodeByPath(name) - .then((response) => { - const { id } = response.data.entry; - return this.delete(`/people/-me-/favorites/${id}`); - }) - .catch(this.handleError); - } -} diff --git a/e2e/utilities/repo-client/apis/nodes/node-body-create.ts b/e2e/utilities/repo-client/apis/nodes/node-body-create.ts deleted file mode 100644 index 31c369d34..000000000 --- a/e2e/utilities/repo-client/apis/nodes/node-body-create.ts +++ /dev/null @@ -1,38 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -export const NODE_TYPE_FILE = 'cm:content'; -export const NODE_TYPE_FOLDER = 'cm:folder'; -export const NODE_TITLE = 'cm:title'; -export const NODE_DESCRIPTION = 'cm:description'; - -export class NodeBodyCreate { - constructor( - public name: string, - public nodeType: string, - public relativePath: string = '/', - public properties?: any[] - ) {} -} diff --git a/e2e/utilities/repo-client/apis/nodes/node-content-tree.ts b/e2e/utilities/repo-client/apis/nodes/node-content-tree.ts deleted file mode 100644 index 45516429b..000000000 --- a/e2e/utilities/repo-client/apis/nodes/node-content-tree.ts +++ /dev/null @@ -1,85 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { NodeBodyCreate, NODE_TYPE_FILE, NODE_TYPE_FOLDER, NODE_TITLE, NODE_DESCRIPTION } from './node-body-create'; - -export interface NodeContentTree { - name?: string; - files?: string[]; - folders?: (string|NodeContentTree)[]; - title?: string; - description?: string; -} - -export function flattenNodeContentTree(content: NodeContentTree, relativePath: string = '/'): NodeBodyCreate[] { - const { name, files, folders, title, description } = content; - let data: NodeBodyCreate[] = []; - let properties: any; - - properties = { - [NODE_TITLE]: title, - [NODE_DESCRIPTION]: description - }; - - if (name) { - data = data.concat([{ - nodeType: NODE_TYPE_FOLDER, - name, - relativePath, - properties - }]); - - relativePath = (relativePath === '/') - ? `/${name}` - : `${relativePath}/${name}`; - } - - if (folders) { - const foldersData: NodeBodyCreate[] = folders - .map((folder: (string|NodeContentTree)): NodeBodyCreate[] => { - const folderData: NodeContentTree = (typeof folder === 'string') - ? { name: folder } - : folder; - - return flattenNodeContentTree(folderData, relativePath); - }) - .reduce((nodesData: NodeBodyCreate[], folderData: NodeBodyCreate[]) => nodesData.concat(folderData), []); - - data = data.concat(foldersData); - } - - if (files) { - const filesData: NodeBodyCreate[] = files - .map((filename: string): NodeBodyCreate => ({ - nodeType: NODE_TYPE_FILE, - name: filename, - relativePath - })); - - data = data.concat(filesData); - } - - return data; -} diff --git a/e2e/utilities/repo-client/apis/nodes/nodes-api.ts b/e2e/utilities/repo-client/apis/nodes/nodes-api.ts deleted file mode 100644 index 410cebc92..000000000 --- a/e2e/utilities/repo-client/apis/nodes/nodes-api.ts +++ /dev/null @@ -1,104 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { RepoApi } from '../repo-api'; -import { NodeBodyCreate, NODE_TYPE_FILE, NODE_TYPE_FOLDER } from './node-body-create'; -import { NodeContentTree, flattenNodeContentTree } from './node-content-tree'; - -export class NodesApi extends RepoApi { - // nodes - getNodeByPath(relativePath: string = '/'): Promise { - return this - .get(`/nodes/-my-`, { parameters: { relativePath } }) - .catch(this.handleError); - } - - getNodeById(id: string): Promise { - return this - .get(`/nodes/${id}`) - .catch(this.handleError); - } - - getNodeDescription(name: string): Promise { - return this.getNodeByPath(name) - .then(response => response.data.entry.properties['cm:description']) - .catch(() => Promise.resolve('')); - } - - deleteNodeById(id: string, permanent: boolean = true): Promise { - return this - .delete(`/nodes/${id}?permanent=${permanent}`) - .catch(this.handleError); - } - - deleteNodeByPath(path: string, permanent: boolean = true): Promise { - return this - .getNodeByPath(path) - .then((response: any): string => response.data.entry.id) - .then((id: string): any => this.deleteNodeById(id, permanent)) - .catch(this.handleError); - } - - deleteNodes(names: string[], relativePath: string = '', permanent: boolean = true): Promise { - return names.reduce((previous, current) => ( - previous.then(() => this.deleteNodeByPath(`${relativePath}/${current}`, permanent)) - ), Promise.resolve()); - } - - deleteNodesById(ids: string[], permanent: boolean = true): Promise { - return ids.reduce((previous, current) => ( - previous.then(() => this.deleteNodeById(current, permanent)) - ), Promise.resolve()); - } - - // children - getNodeChildren(nodeId: string): Promise { - return this - .get(`/nodes/${nodeId}/children`) - .catch(this.handleError); - } - - createChildren(data: NodeBodyCreate[]): Promise { - return this - .post(`/nodes/-my-/children`, { data }) - .catch(this.handleError); - } - - createContent(content: NodeContentTree, relativePath: string = '/'): Promise { - return this.createChildren(flattenNodeContentTree(content, relativePath)); - } - - createNodeWithProperties(name: string, title?: string, description?: string, relativePath: string = '/'): Promise { - return this.createContent({ name, title, description }, relativePath); - } - - createFolders(names: string[], relativePath: string = '/'): Promise { - return this.createContent({ folders: names }, relativePath); - } - - createFiles(names: string[], relativePath: string = '/'): Promise { - return this.createContent({ files: names }, relativePath); - } -} diff --git a/e2e/utilities/repo-client/apis/people/people-api-models.ts b/e2e/utilities/repo-client/apis/people/people-api-models.ts deleted file mode 100644 index d00dc7dd4..000000000 --- a/e2e/utilities/repo-client/apis/people/people-api-models.ts +++ /dev/null @@ -1,43 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -export class Person { - id?: string; - password?: string; - firstName?: string; - lastName?: string; - email?: string; - properties?: any; - - constructor(username: string, password: string, details: Person) { - this.id = username; - this.password = password || username; - this.firstName = username; - this.lastName = username; - this.email = `${username}@alfresco.com`; - - Object.assign(this, details); - } -} diff --git a/e2e/utilities/repo-client/apis/people/people-api.ts b/e2e/utilities/repo-client/apis/people/people-api.ts deleted file mode 100644 index b13811080..000000000 --- a/e2e/utilities/repo-client/apis/people/people-api.ts +++ /dev/null @@ -1,60 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { RepoApi } from '../repo-api'; -import { Person } from './people-api-models'; - -export class PeopleApi extends RepoApi { - getUser(username: string) { - return this - .get(`/people/${username}`) - .catch(this.handleError); - } - - updateUser(username: string, details?: Person): Promise { - if (details.id) { - delete details.id; - } - - return this - .put(`/people/${username}`, { data: details }) - .catch(this.handleError); - } - - createUser(username: string, password?: string, details?: Person): Promise { - const person: Person = new Person(username, password, details); - const onSuccess = (response) => response; - const onError = (response) => { - return (response.statusCode === 409) - ? Promise.resolve(this.updateUser(username, person)) - : Promise.reject(response); - }; - - return this - .post(`/people`, { data: person }) - .then(onSuccess, onError) - .catch(this.handleError); - } -} diff --git a/e2e/utilities/repo-client/apis/repo-api.ts b/e2e/utilities/repo-client/apis/repo-api.ts deleted file mode 100644 index 0a7993f9c..000000000 --- a/e2e/utilities/repo-client/apis/repo-api.ts +++ /dev/null @@ -1,71 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { RestClient, RestClientArgs, RestClientResponse } from '../../rest-client/rest-client'; -import { RepoClientAuth, RepoClientConfig } from '../repo-client-models'; - -export abstract class RepoApi { - private client: RestClient; - private defaults: RepoClientConfig = new RepoClientConfig(); - - constructor( - auth: RepoClientAuth = new RepoClientAuth(), - private config?: RepoClientConfig - ) { - const { username, password } = auth; - - this.client = new RestClient(username, password); - } - - private createEndpointUri(endpoint: string): string { - const { defaults, config } = this; - const { host, tenant } = Object.assign(defaults, config); - - return `${host}/alfresco/api/${tenant}/public/alfresco/versions/1${endpoint}`; - } - - protected handleError(response: RestClientResponse) { - const { request: { method, path, data }, data: error } = response; - - console.log(`ERROR on ${method}\n${path}\n${data}`); - console.log(error); - } - - protected get(endpoint: string, args: RestClientArgs = {}) { - return this.client.get(this.createEndpointUri(endpoint), args); - } - - protected post(endpoint: string, args: RestClientArgs = {}) { - return this.client.post(this.createEndpointUri(endpoint), args); - } - - protected put(endpoint: string, args: RestClientArgs = {}) { - return this.client.put(this.createEndpointUri(endpoint), args); - } - - protected delete(endpoint: string, args: RestClientArgs = {}) { - return this.client.delete(this.createEndpointUri(endpoint), args); - } -} diff --git a/e2e/utilities/repo-client/apis/shared-links/shared-links-api.ts b/e2e/utilities/repo-client/apis/shared-links/shared-links-api.ts deleted file mode 100644 index 537aef7a5..000000000 --- a/e2e/utilities/repo-client/apis/shared-links/shared-links-api.ts +++ /dev/null @@ -1,50 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { RepoApi } from '../repo-api'; -import { NodesApi } from '../nodes/nodes-api'; -import { RepoClient } from './../../repo-client'; - -export class SharedLinksApi extends RepoApi { - - shareFileById(id: string): Promise { - const data = [{ nodeId: id }]; - - return this.post(`/shared-links`, { data }) - .catch(this.handleError); - } - - shareFilesByIds(ids: string[]): Promise { - return ids.reduce((previous, current) => ( - previous.then(() => this.shareFileById(current)) - ), Promise.resolve()); - } - - getSharedLinks(): Promise { - return this.get(`/shared-links`) - .catch(this.handleError); - } - -} diff --git a/e2e/utilities/repo-client/apis/sites/sites-api-models.ts b/e2e/utilities/repo-client/apis/sites/sites-api-models.ts deleted file mode 100644 index f6729c1d7..000000000 --- a/e2e/utilities/repo-client/apis/sites/sites-api-models.ts +++ /dev/null @@ -1,42 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { SITE_VISIBILITY } from '../../../../configs'; - -export class Site { - title?: string; - visibility?: string = SITE_VISIBILITY.PUBLIC; - id?: string; - description?: string; - - constructor(title: string, visibility: string, details: Site) { - this.title = title; - this.visibility = visibility; - this.id = title; - this.description = `${title} description`; - - Object.assign(this, details); - } -} diff --git a/e2e/utilities/repo-client/apis/sites/sites-api.ts b/e2e/utilities/repo-client/apis/sites/sites-api.ts deleted file mode 100644 index acf25c04b..000000000 --- a/e2e/utilities/repo-client/apis/sites/sites-api.ts +++ /dev/null @@ -1,111 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { RepoApi } from '../repo-api'; -import { Site } from './sites-api-models'; - -export class SitesApi extends RepoApi { - getSite(id: string) { - return this - .get(`/sites/${id}`) - .catch(this.handleError); - } - - updateSite(id: string, details?: Site): Promise { - if (details.id) { - delete details.id; - } - - return this - .put(`/sites/${id}`, { data: details }) - .catch(this.handleError); - } - - createOrUpdateSite(title: string, visibility: string, details?: Site): Promise { - const site: Site = new Site(title, visibility, details); - const onSuccess = (response) => response; - const onError = (response) => { - return (response.statusCode === 409) - ? Promise.resolve(this.updateSite(site.id, site)) - : Promise.reject(response); - }; - - return this - .post(`/sites`, { data: site }) - .then(onSuccess, onError) - .catch(this.handleError); - } - - createSite(title: string, visibility: string, details?: Site): Promise { - const site: Site = new Site(title, visibility, details); - return this - .post(`/sites`, { data: site }) - .catch(this.handleError); - } - - createSites(titles: string[], visibility: string): Promise { - return titles.reduce((previous, current) => ( - previous.then(() => this.createSite(current, visibility)) - ), Promise.resolve()); - } - - deleteSite(id: string, permanent: boolean = true): Promise { - return this - .delete(`/sites/${id}?permanent=${permanent}`) - .catch(this.handleError); - } - - deleteSites(ids: string[], permanent: boolean = true): Promise { - return ids.reduce((previous, current) => ( - previous.then(() => this.deleteSite(current)) - ), Promise.resolve()); - } - - updateSiteMember(siteId: string, userId: string, role: string): Promise { - return this - .put(`/sites/${siteId}/members/${userId}`, { data: { role } }) - .catch(this.handleError); - } - - addSiteMember(siteId: string, userId: string, role: string): Promise { - const onSuccess = (response) => response; - const onError = (response) => { - return (response.statusCode === 409) - ? Promise.resolve(this.updateSiteMember(siteId, userId, role)) - : Promise.reject(response); - }; - - return this - .post(`/sites/${siteId}/members`, { data: { role, id: userId } }) - .then(onSuccess, onError) - .catch(this.handleError); - } - - deleteSiteMember(siteId: string, userId: string): Promise { - return this - .delete(`/sites/${siteId}/members/${userId}`) - .catch(this.handleError); - } -} diff --git a/e2e/utilities/repo-client/apis/trashcan/trashcan-api.ts b/e2e/utilities/repo-client/apis/trashcan/trashcan-api.ts deleted file mode 100644 index 935fc19b5..000000000 --- a/e2e/utilities/repo-client/apis/trashcan/trashcan-api.ts +++ /dev/null @@ -1,54 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { RepoApi } from '../repo-api'; - -export class TrashcanApi extends RepoApi { - permanentlyDelete(id: string): Promise { - return this - .delete(`/deleted-nodes/${id}`) - .catch(this.handleError); - } - - getDeletedNodes(): Promise { - return this - .get(`/deleted-nodes?maxItems=1000`) - .catch(this.handleError); - } - - emptyTrash(): Promise { - return this.getDeletedNodes() - .then(resp => { - return resp.data.list.entries.map(entries => entries.entry.id); - }) - .then(ids => { - return ids.reduce((previous, current) => ( - previous.then(() => this.permanentlyDelete(current)) - ), Promise.resolve()); - }) - .catch(this.handleError); - } - -} diff --git a/e2e/utilities/repo-client/repo-client-models.ts b/e2e/utilities/repo-client/repo-client-models.ts deleted file mode 100644 index 46222947b..000000000 --- a/e2e/utilities/repo-client/repo-client-models.ts +++ /dev/null @@ -1,46 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { - ADMIN_USERNAME, - ADMIN_PASSWORD, - REPO_API_HOST, - REPO_API_TENANT -} from '../../configs'; - -export class RepoClientAuth { - static DEFAULT_USERNAME: string = ADMIN_USERNAME; - static DEFAULT_PASSWORD: string = ADMIN_PASSWORD; - - constructor( - public username: string = RepoClientAuth.DEFAULT_USERNAME, - public password: string = RepoClientAuth.DEFAULT_PASSWORD - ) {} -} - -export class RepoClientConfig { - host?: string = REPO_API_HOST; - tenant?: string = REPO_API_TENANT; -} diff --git a/e2e/utilities/repo-client/repo-client.ts b/e2e/utilities/repo-client/repo-client.ts deleted file mode 100644 index 8ffe00b95..000000000 --- a/e2e/utilities/repo-client/repo-client.ts +++ /dev/null @@ -1,57 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { RepoClientAuth, RepoClientConfig } from './repo-client-models'; - -import { PeopleApi } from './apis/people/people-api'; -import { NodesApi } from './apis/nodes/nodes-api'; -import { SitesApi } from './apis/sites/sites-api'; -import { FavoritesApi } from './apis/favorites/favorites-api'; -import { SharedLinksApi } from './apis/shared-links/shared-links-api'; -import { TrashcanApi } from './apis/trashcan/trashcan-api'; - -export class RepoClient { - public people: PeopleApi = new PeopleApi(this.auth, this.config); - public nodes: NodesApi = new NodesApi(this.auth, this.config); - public sites: SitesApi = new SitesApi(this.auth, this.config); - public favorites: FavoritesApi = new FavoritesApi(this.auth, this.config); - public shared: SharedLinksApi = new SharedLinksApi(this.auth, this.config); - public trashcan: TrashcanApi = new TrashcanApi(this.auth, this.config); - - constructor( - private username: string = RepoClientAuth.DEFAULT_USERNAME, - private password: string = RepoClientAuth.DEFAULT_PASSWORD, - private config?: RepoClientConfig - ) {} - - private get auth(): RepoClientAuth { - const { username, password } = this; - return { username, password }; - } -} - -export * from './apis/nodes/node-body-create'; -export * from './apis/nodes/node-content-tree'; -export * from './apis/nodes/nodes-api'; diff --git a/e2e/utilities/reporters/console/console-logger.ts b/e2e/utilities/reporters/console/console-logger.ts deleted file mode 100644 index 8b82d83da..000000000 --- a/e2e/utilities/reporters/console/console-logger.ts +++ /dev/null @@ -1,79 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -/* tslint:disable */ -const chalk = require('chalk'); -/* tslint:enable */ - -export const log = { - i: 0, - - get indentation(): string { - return new Array(this.i).fill(' ').join(''); - }, - - indent() { - this.i++; - return this; - }, - - dedent() { - this.i--; - return this; - }, - - log(message: string = '', options: any = { ignoreIndentation: false }) { - const indentation = (!options.ignoreIndentation) - ? this.indentation - : ''; - - console.log(`${indentation}${message}`); - - return this; - }, - - blank() { - return this.log(); - }, - - info(message: string = '', options: any = { bold: false, title: false }) { - const { bold } = options; - const style = (bold ? chalk.bold : chalk).gray; - - return this.log(style(message), options); - }, - - success(message: string = '', options: any = { bold: false }) { - const style = options.bold ? chalk.bold.green : chalk.green; - - return this.log(style(message), options); - }, - - error(message: string = '', options: any = { bold: false }) { - const style = options.bold ? chalk.bold.red : chalk.red; - - return this.log(style(message), options); - } -}; diff --git a/e2e/utilities/reporters/console/console.ts b/e2e/utilities/reporters/console/console.ts deleted file mode 100644 index 7985e52c5..000000000 --- a/e2e/utilities/reporters/console/console.ts +++ /dev/null @@ -1,90 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { log } from './console-logger'; - -const errors = []; - -export const consoleReporter = { - jasmineStarted(suiteInfo) { - log.blank().info( - `Running ${suiteInfo.totalSpecsDefined} tests`, - { bold: true, title: true } - ).blank(); - }, - - suiteStarted(suite) { - log.info(suite.description).indent(); - }, - - specDone: (spec) => { - const { - status, - description, - failedExpectations - } = spec; - - if (status === 'passed') { - log.success(`∙ ${description}`); - } - - if (status === 'failed') { - log.error(`✕ ${description}`, { bold: true }); - - errors.push(spec); - - failedExpectations.forEach((failed) => { - log.error(` ${failed.message}`); - }); - } - }, - - suiteDone: (result) => { - log.dedent(); - }, - - jasmineDone: (result) => { - if (!!errors.length) { - log .blank() - .blank() - .info(`${errors.length} failing tests`, { bold: true, title: true }); - - errors.forEach(error => { - log .blank() - .error(`✕ ${error.fullName}`, { bold: true }); - - error.failedExpectations.forEach(failed => { - log .info(`${failed.message}`) - .blank() - .error(`${failed.stack}`); - }); - }); - } else { - log.success(`All tests passed!`, { bold: true }); - } - - log.blank().blank(); - } -}; diff --git a/e2e/utilities/rest-client/rest-client-models.ts b/e2e/utilities/rest-client/rest-client-models.ts deleted file mode 100644 index 89e3c9916..000000000 --- a/e2e/utilities/rest-client/rest-client-models.ts +++ /dev/null @@ -1,63 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -interface RequestConfig { - timeout?: number; - noDelay?: boolean; - keepAlive?: boolean; - keepAliveDelay?: number; -} - -interface ResponseConfig { - timeout?: number; -} - -interface ResponseRequest { - method: string; - path: string; - data: string; -} - -export interface NodeRestClient { - get(uri: string, callback: Function): Function; - post(uri: string, callback: Function): Function; - put(uri: string, callback: Function): Function; - delete(uri: string, callback: Function): Function; -} - -export interface RestClientArgs { - data?: any; - parameters?: any; - headers?: any; - requestConfig?: RequestConfig; - responseConfig?: ResponseConfig; -} - -export interface RestClientResponse { - request: ResponseRequest; - data: any; - statusMessage: string; - statusCode: number; -} diff --git a/e2e/utilities/rest-client/rest-client.ts b/e2e/utilities/rest-client/rest-client.ts deleted file mode 100644 index 45b4c1ca8..000000000 --- a/e2e/utilities/rest-client/rest-client.ts +++ /dev/null @@ -1,89 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { Client } from 'node-rest-client'; -import { NodeRestClient, RestClientArgs, RestClientResponse } from './rest-client-models'; - -export * from './rest-client-models'; - -export class RestClient { - private static DEFAULT_HEADERS = { - 'Content-Type': 'application/json', - 'Accept': 'application/json' - }; - - private client: NodeRestClient; - - constructor(user: string, password: string) { - this.client = (new Client({ user, password })); - } - - get(uri: string, args: RestClientArgs = {}): Promise { - return this.promisify('get', uri, args); - } - - post(uri: string, args: RestClientArgs = {}): Promise { - return this.promisify('post', uri, args); - } - - put(uri: string, args: RestClientArgs = {}): Promise { - return this.promisify('put', uri, args); - } - - delete(uri: string, args: RestClientArgs = {}): Promise { - return this.promisify('delete', uri, args); - } - - private createArgs(args: RestClientArgs = {}): RestClientArgs { - const data = JSON.stringify(args.data); - - return Object.assign({}, RestClient.DEFAULT_HEADERS, args, { data }); - } - - private promisify(fnName: string, uri: string, args: RestClientArgs): Promise { - const fn: Function = this.client[fnName]; - const fnArgs = [ encodeURI(uri), this.createArgs(args) ]; - - return new Promise((resolve, reject) => { - const fnCallback = (data, rawResponse) => { - const { - statusCode, statusMessage, - req: { method, path } - } = rawResponse; - - const response: RestClientResponse = { - data, statusCode, statusMessage, - request: { method, path, data: args.data } - }; - - (response.statusCode >= 400) - ? reject(response) - : resolve(response); - }; - - fn(...fnArgs, fnCallback); - }); - } -} diff --git a/e2e/utilities/utils.ts b/e2e/utilities/utils.ts deleted file mode 100644 index 368b7aa43..000000000 --- a/e2e/utilities/utils.ts +++ /dev/null @@ -1,44 +0,0 @@ -/*! - * @license - * Alfresco Example Content Application - * - * Copyright (C) 2005 - 2017 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 . - */ - -import { browser, promise } from 'protractor'; - -export class Utils { - // generate a random value - static random(): string { - return Math.random().toString(36).substring(3, 10); - } - - // local storage - static clearLocalStorage(): promise.Promise { - return browser.executeScript('window.localStorage.clear();'); - } - - // session storage - static clearSessionStorage(): promise.Promise { - return browser.executeScript('window.sessionStorage.clear();'); - } - -} diff --git a/package.json b/package.json index 223ae2c09..3e582ae2a 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,6 @@ "karma-coverage-istanbul-reporter": "^1.2.1", "karma-jasmine": "~1.1.0", "karma-jasmine-html-reporter": "^0.2.2", - "node-rest-client": "^3.1.0", "protractor": "^5.1.2", "rimraf": "2.6.2", "ts-node": "~3.2.0", diff --git a/protractor.conf.js b/protractor.conf.js index ba46ec01b..bc0ae870c 100644 --- a/protractor.conf.js +++ b/protractor.conf.js @@ -14,12 +14,6 @@ exports.config = { allScriptsTimeout: 30000, specs: [ - './e2e/suites/authentication/*.test.ts', - './e2e/suites/list-views/*.test.ts', - './e2e/suites/application/page-titles.test.ts', - './e2e/suites/navigation/side-navigation.test.ts', - './e2e/suites/pagination/*.test.ts', - './e2e/suites/actions/*.test.ts' ], capabilities: { diff --git a/yarn.lock b/yarn.lock index 58008d198..afc2765ba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -68,26 +68,27 @@ zone.js "0.8.14" "@angular-devkit/build-optimizer@~0.0.31": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.0.33.tgz#d040f283ed7300b5be8bc970228b835ed02df42f" + version "0.0.36" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.0.36.tgz#e816ee9be22dbb777724f0281acfa72cfff184b7" dependencies: loader-utils "^1.1.0" source-map "^0.5.6" - typescript "^2.3.3" + typescript "~2.6.1" webpack-sources "^1.0.1" -"@angular-devkit/core@0.0.21": - version "0.0.21" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-0.0.21.tgz#e2ba4ac0a4e1156f884c083b15eb1c26ddfb2ba8" +"@angular-devkit/core@0.0.22": + version "0.0.22" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-0.0.22.tgz#e90f46bf7ff47d260a767959267bc65ffee39ef1" dependencies: source-map "^0.5.6" "@angular-devkit/schematics@~0.0.34": - version "0.0.37" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-0.0.37.tgz#d86ff93b14a44b766e72bcea1569b5d36063210e" + version "0.0.42" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-0.0.42.tgz#34eea7136455545c8abd21edf94a36870a073fea" dependencies: - "@angular-devkit/core" "0.0.21" + "@angular-devkit/core" "0.0.22" "@ngtools/json-schema" "^1.1.0" + "@schematics/schematics" "0.0.11" minimist "^1.2.0" rxjs "^5.5.2" @@ -216,8 +217,8 @@ resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-4.4.5.tgz#ccef139b8d3e1684b01afa35c6fbf2172e2bb676" "@angular/material-moment-adapter@^5.0.0-rc0": - version "5.0.0-rc0" - resolved "https://registry.yarnpkg.com/@angular/material-moment-adapter/-/material-moment-adapter-5.0.0-rc0.tgz#d0357aae1fef9e9181ee80ee444c2dfe9ce1df08" + version "5.0.1" + resolved "https://registry.yarnpkg.com/@angular/material-moment-adapter/-/material-moment-adapter-5.0.1.tgz#058371d4d60bb91555bc89e9044c9e6412bbda71" dependencies: tslib "^1.7.1" @@ -266,10 +267,14 @@ resolved "https://registry.yarnpkg.com/@ngx-translate/core/-/core-8.0.0.tgz#751fd6b512d80f3a748d2de8dfc96dfefa29afe0" "@schematics/angular@~0.1.0": - version "0.1.7" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-0.1.7.tgz#2306aeec118ca185e180882eff54f5116de4ef05" + version "0.1.11" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-0.1.11.tgz#b5f15320bbb60969d66c76a8ef6545058ac81ece" dependencies: - "@angular-devkit/core" "0.0.21" + "@angular-devkit/core" "0.0.22" + +"@schematics/schematics@0.0.11": + version "0.0.11" + resolved "https://registry.yarnpkg.com/@schematics/schematics/-/schematics-0.0.11.tgz#c8f70f270ed38f29b2873248126fd59abd635862" "@types/jasmine@*", "@types/jasmine@^2.5.53": version "2.8.2" @@ -282,8 +287,8 @@ "@types/jasmine" "*" "@types/node@^6.0.46", "@types/node@~6.0.60": - version "6.0.92" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.92.tgz#e7f721ae282772e12ba2579968c00d9cce422c5d" + version "6.0.94" + resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.94.tgz#70e509b07ed9f961c8f6f4a73a61d922be5029a7" "@types/q@^0.0.32": version "0.0.32" @@ -356,8 +361,8 @@ ajv@^4.9.1: json-stable-stringify "^1.0.1" ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5: - version "5.5.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.0.tgz#eb2840746e9dc48bd5e063a36e3fd400c5eab5a9" + version "5.5.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.1.tgz#b38bb8876d9e86bee994956a04e721e88b248eb2" dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" @@ -494,7 +499,7 @@ arraybuffer.slice@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" -arrify@^1.0.0: +arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -706,13 +711,13 @@ block-stream@*: dependencies: inherits "~2.0.0" -blocking-proxy@0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-0.0.5.tgz#462905e0dcfbea970f41aa37223dda9c07b1912b" +blocking-proxy@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/blocking-proxy/-/blocking-proxy-1.0.1.tgz#81d6fd1fe13a4c0d6957df7f91b75e98dac40cb2" dependencies: minimist "^1.2.0" -bluebird@^3.3.0, bluebird@^3.4.7, bluebird@^3.5.0, bluebird@^3.5.1: +bluebird@^3.3.0, bluebird@^3.4.7, bluebird@^3.5.0: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -880,7 +885,7 @@ bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" -cacache@^10.0.0: +cacache@^10.0.0, cacache@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.1.tgz#3e05f6e616117d9b54665b1b20c8aeb93ea5d36f" dependencies: @@ -942,8 +947,8 @@ caniuse-api@^1.5.2: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000775" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000775.tgz#04bccdd0214edf25b97f61a096609f7ad6904333" + version "1.0.30000783" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000783.tgz#16b30d47266a4f515cc69ae0316b670c9603cdbe" caseless@~0.11.0: version "0.11.0" @@ -1292,23 +1297,27 @@ copy-concurrently@^1.0.0: run-queue "^1.0.0" copy-webpack-plugin@^4.1.1: - version "4.2.3" - resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.2.3.tgz#4a3c61089f3b635777f0f0af346c338b39d63755" + version "4.3.0" + resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.3.0.tgz#cfdf4d131c78d66917a1bb863f86630497aacf42" dependencies: - bluebird "^3.5.1" - glob "^7.1.2" + cacache "^10.0.1" + find-cache-dir "^1.0.0" + globby "^7.1.1" is-glob "^4.0.0" loader-utils "^0.2.15" lodash "^4.3.0" minimatch "^3.0.4" + p-limit "^1.0.0" + pify "^3.0.0" + serialize-javascript "^1.4.0" core-js@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" core-js@^2.2.0, core-js@^2.4.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + version "2.5.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" core-js@~2.3.0: version "2.3.0" @@ -1560,7 +1569,7 @@ debug@2, debug@2.6.9, debug@^2.2.0, debug@^2.6.6, debug@^2.6.8: dependencies: ms "2.0.0" -debug@2.2.0, debug@~2.2.0: +debug@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: @@ -1681,6 +1690,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dir-glob@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" + dependencies: + arrify "^1.0.1" + path-type "^3.0.0" + directory-encoder@^0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/directory-encoder/-/directory-encoder-0.7.2.tgz#59b4e2aa4f25422f6c63b527b462f5e2d0dd2c58" @@ -1783,8 +1799,8 @@ ejs@^2.5.7: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" electron-to-chromium@^1.2.7: - version "1.3.27" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" + version "1.3.28" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.28.tgz#8dd4e6458086644e9f9f0a1cf32e2a1f9dffd9ee" elliptic@^6.0.0: version "6.4.0" @@ -1873,10 +1889,10 @@ entities@~1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" errno@^0.1.1, errno@^0.1.3, errno@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + version "0.1.6" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026" dependencies: - prr "~0.0.0" + prr "~1.0.1" error-ex@^1.2.0: version "1.3.1" @@ -2145,10 +2161,14 @@ extract-text-webpack-plugin@3.0.0: schema-utils "^0.3.0" webpack-sources "^1.0.1" -extsprintf@1.3.0, extsprintf@^1.2.0: +extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" @@ -2257,12 +2277,6 @@ flush-write-stream@^1.0.0: inherits "^2.0.1" readable-stream "^2.0.4" -follow-redirects@>=1.2.0: - version "1.2.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.2.6.tgz#4dcdc7e4ab3dd6765a97ff89c3b4c258117c79bf" - dependencies: - debug "^3.1.0" - for-in@^0.1.3: version "0.1.8" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" @@ -2352,8 +2366,8 @@ fs-extra@^0.26.5: rimraf "^2.2.8" fs-extra@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -2517,6 +2531,17 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" +globby@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" + dependencies: + array-union "^1.0.1" + dir-glob "^2.0.0" + glob "^7.1.2" + ignore "^3.3.5" + pify "^3.0.0" + slash "^1.0.0" + globule@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/globule/-/globule-1.2.0.tgz#1dc49c6822dd9e8a2fa00ba2a295006e8664bd09" @@ -2821,6 +2846,10 @@ iferr@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" +ignore@^3.3.5: + version "3.3.7" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" + image-size@~0.5.0: version "0.5.5" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" @@ -3039,8 +3068,8 @@ is-path-in-cwd@^1.0.0: is-path-inside "^1.0.0" is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" dependencies: path-is-inside "^1.0.1" @@ -3238,8 +3267,8 @@ jasminewd2@^2.1.0: resolved "https://registry.yarnpkg.com/jasminewd2/-/jasminewd2-2.2.0.tgz#e37cf0b17f199cce23bea71b2039395246b4ec4e" js-base64@^2.1.5, js-base64@^2.1.8, js-base64@^2.1.9: - version "2.3.2" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf" + version "2.4.0" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.0.tgz#9e566fee624751a1d720c966cd6226d29d4025aa" js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" @@ -3367,8 +3396,8 @@ karma-jasmine-html-reporter@^0.2.2: karma-jasmine "^1.0.2" karma-jasmine@^1.0.2, karma-jasmine@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.0.tgz#22e4c06bf9a182e5294d1f705e3733811b810acf" + version "1.1.1" + resolved "https://registry.yarnpkg.com/karma-jasmine/-/karma-jasmine-1.1.1.tgz#6fe840e75a11600c9d91e84b33c458e1c46a3529" karma-source-map-support@^1.2.0: version "1.2.0" @@ -3718,8 +3747,8 @@ miller-rabin@^4.0.0: brorand "^1.0.1" "mime-db@>= 1.30.0 < 2": - version "1.31.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.31.0.tgz#a49cd8f3ebf3ed1a482b60561d9105ad40ca74cb" + version "1.32.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" mime-db@~1.30.0: version "1.30.0" @@ -3804,8 +3833,8 @@ moment-es6@1.0.0: moment "*" moment@*, moment@^2.10.6: - version "2.19.3" - resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.3.tgz#bdb99d270d6d7fda78cc0fbace855e27fe7da69f" + version "2.19.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.4.tgz#17e5e2c6ead8819c8ecfad83a0acccb312e94682" moment@2.15.2: version "2.15.2" @@ -3949,14 +3978,6 @@ node-pre-gyp@^0.6.39: tar "^2.2.1" tar-pack "^3.4.0" -node-rest-client@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/node-rest-client/-/node-rest-client-3.1.0.tgz#e0beb6dda7b20cc0b67a7847cf12c5fc419c37c3" - dependencies: - debug "~2.2.0" - follow-redirects ">=1.2.0" - xml2js ">=0.2.4" - node-sass@^4.3.0: version "4.7.2" resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.7.2.tgz#9366778ba1469eb01438a9e8592f4262bcb6794e" @@ -4168,7 +4189,7 @@ p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" -p-limit@^1.1.0: +p-limit@^1.0.0, p-limit@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" @@ -4299,6 +4320,12 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + dependencies: + pify "^3.0.0" + pbkdf2@^3.0.3: version "3.0.14" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.14.tgz#a35e13c64799b06ce15320f459c230e68e73bade" @@ -4686,13 +4713,13 @@ promise@^7.1.1: asap "~2.0.3" protractor@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.2.0.tgz#d3f39b195e85f3539ad9d8cb6560a9d2b63297c4" + version "5.2.2" + resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.2.2.tgz#80eff170761455eff6e2f111088a03c438844a41" dependencies: "@types/node" "^6.0.46" "@types/q" "^0.0.32" "@types/selenium-webdriver" "~2.53.39" - blocking-proxy "0.0.5" + blocking-proxy "^1.0.0" chalk "^1.1.3" glob "^7.0.3" jasmine "^2.5.3" @@ -4712,9 +4739,9 @@ proxy-addr@~2.0.2: forwarded "~0.1.2" ipaddr.js "1.5.2" -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" pseudomap@^1.0.2: version "1.0.2" @@ -4953,8 +4980,8 @@ regenerate@^1.2.1: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" regenerator-runtime@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" regex-cache@^0.4.2: version "0.4.4" @@ -5152,12 +5179,18 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@5.5.2, rxjs@^5.5.2: +rxjs@5.5.2: version "5.5.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.2.tgz#28d403f0071121967f18ad665563255d54236ac3" dependencies: symbol-observable "^1.0.1" +rxjs@^5.5.2: + version "5.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.5.tgz#e164f11d38eaf29f56f08c3447f74ff02dd84e97" + dependencies: + symbol-observable "1.0.1" + safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -5281,6 +5314,10 @@ send@0.16.1: range-parser "~1.2.0" statuses "~1.3.1" +serialize-javascript@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.4.0.tgz#7c958514db6ac2443a8abc062dc9f7886a7f6005" + serve-index@^1.7.2: version "1.9.1" resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" @@ -5358,6 +5395,10 @@ silent-error@^1.0.0: dependencies: debug "^2.2.0" +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -5724,6 +5765,10 @@ svgo@^0.7.0: sax "~1.2.1" whet.extend "~0.9.9" +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + symbol-observable@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.1.0.tgz#5c68fd8d54115d9dfb72a84720549222e8db9b32" @@ -5878,8 +5923,8 @@ tsickle@^0.24.0: source-map-support "^0.4.2" tslib@^1.7.1: - version "1.8.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.0.tgz#dc604ebad64bcbf696d613da6c954aa0e7ea1eb6" + version "1.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.1.tgz#6946af2d1d651a7b1863b531d6e5afa41aa44eac" tslint@~5.7.0: version "5.7.0" @@ -5931,24 +5976,24 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -typescript@^2.3.3: - version "2.6.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" - typescript@~2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.4.2.tgz#f8395f85d459276067c988aa41837a8f82870844" +typescript@~2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" + uglify-es@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.2.0.tgz#fbbfb9dc465ec7e5065701b9720d0de977d0bc24" + version "3.2.2" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.2.2.tgz#15c62b7775002c81b7987a1c49ecd3f126cace73" dependencies: commander "~2.12.1" source-map "~0.6.1" uglify-js@3.2.x: - version "3.2.0" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.2.0.tgz#cb411ee4ca0e0cadbfe3a4e1a1da97e6fa0d19c1" + version "3.2.2" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.2.2.tgz#870e4b34ed733d179284f9998efd3293f7fd73f6" dependencies: commander "~2.12.1" source-map "~0.6.1" @@ -6215,8 +6260,8 @@ webpack-dev-middleware@^1.11.0, webpack-dev-middleware@~1.12.0: time-stamp "^2.0.0" webpack-dev-server@~2.9.3: - version "2.9.5" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.9.5.tgz#79336fba0087a66ae491f4869f6545775b18daa8" + version "2.9.7" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.9.7.tgz#100ad6a14775478924d417ca6dcfb9d52a98faed" dependencies: ansi-html "0.0.7" array-includes "^3.0.3" @@ -6260,8 +6305,8 @@ webpack-sources@^1.0.0, webpack-sources@^1.0.1: source-map "~0.6.1" webpack-subresource-integrity@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.1.tgz#1fc09d46497da66e46743a2a51d2cc385b9cb0ed" + version "1.0.3" + resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.0.3.tgz#c0606d40090b070cde428bec8df3603216e472eb" dependencies: webpack-core "^0.6.8" @@ -6394,7 +6439,7 @@ xml2js@0.4.4: sax "0.6.x" xmlbuilder ">=1.0.0" -xml2js@>=0.2.4, xml2js@^0.4.17: +xml2js@^0.4.17: version "0.4.19" resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7" dependencies: