diff --git a/e2e/pages/page.ts b/e2e/pages/page.ts index f3ae39138..324fb8f57 100755 --- a/e2e/pages/page.ts +++ b/e2e/pages/page.ts @@ -33,10 +33,14 @@ export abstract class Page { app: by.css('app-root'), layout: by.css('app-layout'), overlay: by.css('.cdk-overlay-container'), - dialogContainer: by.css('.mat-dialog-container'), + dialogContainer: by.css('.mat-dialog-container[role]'), snackBarContainer: '.cdk-overlay-pane .mat-snack-bar-container', snackBar: '.mat-simple-snackbar', - snackBarAction: '.mat-simple-snackbar-action button' + snackBarAction: '.mat-simple-snackbar-action button', + + genericError: 'aca-generic-error', + genericErrorIcon: 'aca-generic-error .mat-icon', + genericErrorTitle: '.generic-error__title' }; public app: ElementFinder = element(this.locators.app); @@ -47,6 +51,10 @@ export abstract class Page { snackBarContainer: ElementFinder = browser.$(this.locators.snackBarContainer); snackBarAction: ElementFinder = browser.$(this.locators.snackBarAction); + genericError: ElementFinder = browser.$(this.locators.genericError); + genericErrorIcon: ElementFinder = browser.$(this.locators.genericErrorIcon); + genericErrorTitle: ElementFinder = browser.$(this.locators.genericErrorTitle); + constructor(public url: string = '') {} get title(): promise.Promise { @@ -110,4 +118,12 @@ export abstract class Page { }, this.snackBarAction); }); } + + isGenericErrorDisplayed() { + return this.genericError.isDisplayed(); + } + + getGenericErrorTitle() { + return this.genericErrorTitle.getText(); + } } diff --git a/e2e/suites/list-views/generic-errors.test.ts b/e2e/suites/list-views/generic-errors.test.ts new file mode 100755 index 000000000..db563be80 --- /dev/null +++ b/e2e/suites/list-views/generic-errors.test.ts @@ -0,0 +1,108 @@ +/*! + * @license + * Alfresco Example Content Application + * + * Copyright (C) 2005 - 2018 Alfresco Software Limited + * + * This file is part of the Alfresco Example Content Application. + * If the software was purchased under a paid Alfresco license, the terms of + * the paid license agreement will prevail. Otherwise, the software is + * provided under the following open source license terms: + * + * The Alfresco Example Content Application is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The Alfresco Example Content Application is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ + +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('Generic errors', () => { + const username = `user-${Utils.random()}`; + + const username2 = `user2-${Utils.random()}`; + + const parent = `folder-${Utils.random()}`; let parentId; + const file1 = `file1-${Utils.random()}.txt`; let file1Id; + const file2 = `file2-${Utils.random()}.txt`; + + const apis = { + admin: new RepoClient(), + user: new RepoClient(username, username) + }; + + const loginPage = new LoginPage(); + const logoutPage = new LogoutPage(); + const page = new BrowsingPage(); + const { dataTable } = page; + + beforeAll(async (done) => { + await apis.admin.people.createUser({ username }); + await apis.admin.people.createUser({ username: username2 }); + parentId = (await apis.user.nodes.createFolder(parent)).entry.id; + file1Id = (await apis.user.nodes.createFile(file1, parentId)).entry.id; + await apis.user.nodes.createFile(file2, parentId); + + await loginPage.loginWith(username); + done(); + }); + + afterAll(async (done) => { + await Promise.all([ + apis.user.nodes.deleteNodeById(parentId), + apis.user.trashcan.emptyTrash(), + logoutPage.load() + ]); + done(); + }); + + it('File / folder not found - [C217313]', async () => { + await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES); + await dataTable.waitForHeader(); + await dataTable.doubleClickOnRowByName(parent); + await dataTable.doubleClickOnRowByName(file1); + const URL = await browser.getCurrentUrl(); + await apis.user.nodes.deleteNodeById(file1Id, false); + await browser.get(URL); + + expect(page.isGenericErrorDisplayed()).toBe(true, 'Generic error page not displayed'); + expect(page.getGenericErrorTitle()).toContain(`This file or folder no longer exists or you don't have permission to view it.`); + }); + + it('Invalid URL - [C217315]', async () => { + await page.load('invalid page'); + + expect(page.isGenericErrorDisplayed()).toBe(true, 'Generic error page not displayed'); + expect(page.getGenericErrorTitle()).toContain(`This file or folder no longer exists or you don't have permission to view it.`); + + }); + + it('Permission denied - [C217314]', async () => { + await page.sidenav.navigateToLinkByLabel(SIDEBAR_LABELS.PERSONAL_FILES); + await dataTable.waitForHeader(); + await dataTable.doubleClickOnRowByName(parent); + await dataTable.doubleClickOnRowByName(file2); + const URL = await browser.getCurrentUrl(); + await logoutPage.load(); + await loginPage.loginWith(username2); + await browser.get(URL); + + expect(page.isGenericErrorDisplayed()).toBe(true, 'Generic error page not displayed'); + expect(page.getGenericErrorTitle()).toContain(`This file or folder no longer exists or you don't have permission to view it.`); + + await logoutPage.load(); + await loginPage.loginWith(username); + }); +});