diff --git a/e2e/components/data-table/data-table.ts b/e2e/components/data-table/data-table.ts index 79d23fda3..645e7273b 100755 --- a/e2e/components/data-table/data-table.ts +++ b/e2e/components/data-table/data-table.ts @@ -46,6 +46,7 @@ export class DataTable extends Component { cell: '.adf-data-table-cell', locationLink: '.aca-location-link', nameLink: '.dl-link', + libraryRole: 'app-library-role-column', selectedIcon: '.mat-icon', @@ -199,7 +200,6 @@ export class DataTable extends Component { async selectItem(name: string) { try{ const item = this.getRowFirstCell(name); - // await Utils.waitUntilElementClickable(item); await item.click(); } catch (e) { @@ -315,4 +315,8 @@ export class DataTable extends Component { const count = await this.menu.getItemsCount(); return count > 0; } + + async getLibraryRole(name: string) { + return await this.getRowByName(name).element(by.css(DataTable.selectors.libraryRole)).getText(); + } } diff --git a/e2e/components/menu/menu.ts b/e2e/components/menu/menu.ts index 59d5fd23e..42f85783c 100755 --- a/e2e/components/menu/menu.ts +++ b/e2e/components/menu/menu.ts @@ -58,11 +58,6 @@ export class Menu extends Component { } async closeMenu() { - // if (await this.backdrop.isPresent()) { - // return await this.backdrop.click(); - // } else { - // return await browser.actions().mouseMove(browser.$('body'), { x: 0, y: 0 }).click().perform(); - // } return Utils.pressEscape(); } @@ -148,7 +143,7 @@ export class Menu extends Component { } async isMenuItemPresent(title: string) { - return await this.component.element(by.cssContainingText(Menu.selectors.item, title)).isPresent(); + return await browser.element(by.cssContainingText(Menu.selectors.item, title)).isPresent(); } async isSubMenuItemPresent(title: string) { diff --git a/e2e/components/toolbar/toolbar.ts b/e2e/components/toolbar/toolbar.ts index 0a0a7e209..c5aad0cca 100755 --- a/e2e/components/toolbar/toolbar.ts +++ b/e2e/components/toolbar/toolbar.ts @@ -30,7 +30,8 @@ import { Component } from '../component'; export class Toolbar extends Component { private static selectors = { root: '.adf-toolbar', - button: '.mat-icon-button' + // button: '.mat-icon-button' + button: 'button' }; menu: Menu = new Menu(); diff --git a/e2e/suites/actions/context-menu-multiple-selection.test.ts b/e2e/suites/actions/context-menu-multiple-selection.test.ts index 707cb0134..85a472b04 100755 --- a/e2e/suites/actions/context-menu-multiple-selection.test.ts +++ b/e2e/suites/actions/context-menu-multiple-selection.test.ts @@ -66,7 +66,7 @@ describe('Context menu actions - multiple selection : ', () => { folder2Id = (await apis.user.nodes.createFolder(folder2)).entry.id; await apis.user.sites.createSite(siteName, SITE_VISIBILITY.PUBLIC); - const docLibId = (await apis.user.sites.getDocLibId(siteName)); + const docLibId = await apis.user.sites.getDocLibId(siteName); await apis.user.nodes.createFile(file1Site, docLibId); await apis.user.nodes.createFile(file2Site, docLibId); await apis.user.nodes.createFolder(folder1Site, docLibId); diff --git a/e2e/suites/actions/context-menu-single-selection.test.ts b/e2e/suites/actions/context-menu-single-selection.test.ts index 94710c739..e297fd772 100755 --- a/e2e/suites/actions/context-menu-single-selection.test.ts +++ b/e2e/suites/actions/context-menu-single-selection.test.ts @@ -40,6 +40,9 @@ describe('Context menu actions - single selection : ', () => { const fileSiteUser = `fileUser-${Utils.random()}.txt`; const folderSiteUser = `folderUser-${Utils.random()}`; + const adminPublic = `admin-public-${Utils.random()}`; + const adminModerated = `admin-moderated-${Utils.random()}`; + const apis = { admin: new RepoClient(), user: new RepoClient(username, username) @@ -73,6 +76,12 @@ describe('Context menu actions - single selection : ', () => { await apis.user.favorites.addFavoriteById('folder', folderUserId); await apis.user.favorites.waitForApi({ expect: 3 }); + await apis.admin.sites.createSite(adminPublic); + await apis.admin.sites.createSite(adminModerated, SITE_VISIBILITY.MODERATED); + await apis.user.favorites.addFavoriteById('site', adminPublic); + await apis.user.favorites.addFavoriteById('site', adminModerated); + await apis.user.sites.requestToJoin(adminModerated); + await loginPage.loginWith(username); done(); }); @@ -81,6 +90,8 @@ describe('Context menu actions - single selection : ', () => { await apis.user.nodes.deleteNodeById(fileUserId); await apis.user.nodes.deleteNodeById(folderUserId); await apis.user.sites.deleteSite(siteName); + await apis.admin.sites.deleteSite(adminPublic); + await apis.admin.sites.deleteSite(adminModerated); await apis.user.trashcan.emptyTrash(); done(); }); @@ -125,12 +136,6 @@ describe('Context menu actions - single selection : ', () => { await page.sidenav.getActiveLink().click(); expect(await dataTable.hasContextMenu()).toBe(false, 'Context menu is displayed'); }); - - it('Context menu appears for a library - [C286276]', async () => { - await page.clickFileLibrariesAndWait(); - await dataTable.rightClickOnItem(siteName); - expect(await dataTable.hasContextMenu()).toBe(true, 'Context menu is displayed for a site'); - }); }); describe('on Personal Files', () => { @@ -171,7 +176,7 @@ describe('Context menu actions - single selection : ', () => { }); }); - describe('File Libraries', () => { + describe('on File Libraries', () => { beforeEach(async (done) => { await Utils.pressEscape(); await page.clickFileLibrariesAndWait(); @@ -210,7 +215,51 @@ describe('Context menu actions - single selection : ', () => { }); }); - describe('Shared Files', () => { + describe('on a library', () => { + beforeEach(async (done) => { + await Utils.pressEscape(); + await dataTable.clearSelection(); + done(); + }); + + it('Available actions when a library is selected - My Libraries - [C290080]', async () => { + await page.goToMyLibraries(); + await dataTable.rightClickOnItem(siteName); + expect(await dataTable.hasContextMenu()).toBe(true, 'Context menu is not displayed'); + expect(await contextMenu.isMenuItemPresent('Leave library')).toBe(true, `Leave is not displayed for ${siteName}`); + expect(await contextMenu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${siteName}`); + expect(await contextMenu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${siteName}`); + }); + + it('Available actions when a library is selected - Favorite Libraries - user is a member - [C290081]', async () => { + await page.goToFavoriteLibraries(); + await dataTable.rightClickOnItem(siteName); + expect(await dataTable.hasContextMenu()).toBe(true, 'Context menu is not displayed'); + expect(await contextMenu.isMenuItemPresent('Leave library')).toBe(true, `Leave is not displayed for ${siteName}`); + expect(await contextMenu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${siteName}`); + expect(await contextMenu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${siteName}`); + }); + + it('Available actions when a library is selected - Favorite Libraries - user is not a member - [C290082]', async () => { + await page.goToFavoriteLibraries(); + await dataTable.rightClickOnItem(adminPublic); + expect(await dataTable.hasContextMenu()).toBe(true, 'Context menu is not displayed'); + expect(await contextMenu.isMenuItemPresent('Join')).toBe(true, `Join is not displayed for ${adminPublic}`); + expect(await contextMenu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${adminPublic}`); + expect(await contextMenu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${adminPublic}`); + }); + + it('Available actions when a library is selected - Favorite Libraries - user requested to join - [C290089]', async () => { + await page.goToFavoriteLibraries(); + await dataTable.rightClickOnItem(adminModerated); + expect(await dataTable.hasContextMenu()).toBe(true, 'Context menu is not displayed'); + expect(await contextMenu.isMenuItemPresent('Cancel join')).toBe(true, `Cancel join is not displayed for ${adminModerated}`); + expect(await contextMenu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${adminModerated}`); + expect(await contextMenu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${adminModerated}`); + }); + }); + + describe('on Shared Files', () => { beforeEach(async (done) => { await Utils.pressEscape(); await page.clickSharedFilesAndWait(); @@ -234,7 +283,7 @@ describe('Context menu actions - single selection : ', () => { }); }); - describe('Recent Files', () => { + describe('on Recent Files', () => { beforeEach(async (done) => { await Utils.pressEscape(); await page.clickRecentFilesAndWait(); @@ -257,7 +306,7 @@ describe('Context menu actions - single selection : ', () => { }); }); - describe('Favorites', () => { + describe('on Favorites', () => { beforeEach(async (done) => { await Utils.pressEscape(); await page.clickFavoritesAndWait(); @@ -296,7 +345,7 @@ describe('Context menu actions - single selection : ', () => { }); }); - describe('Trash', () => { + describe('on Trash', () => { beforeEach(async (done) => { await Utils.pressEscape(); await page.clickTrashAndWait(); diff --git a/e2e/suites/actions/create-folder.test.ts b/e2e/suites/actions/create-folder.test.ts index 03a588e91..76601f9ea 100755 --- a/e2e/suites/actions/create-folder.test.ts +++ b/e2e/suites/actions/create-folder.test.ts @@ -23,11 +23,9 @@ * along with Alfresco. If not, see . */ -import { browser } from 'protractor'; import { SITE_VISIBILITY, SITE_ROLES } from '../../configs'; import { LoginPage, BrowsingPage } from '../../pages/pages'; import { CreateOrEditFolderDialog } from '../../components/dialog/create-edit-folder-dialog'; -import { Menu } from '../../components/menu/menu'; import { Utils } from '../../utilities/utils'; import { RepoClient } from '../../utilities/repo-client/repo-client'; @@ -41,7 +39,12 @@ describe('Create folder', () => { const duplicateFolderName = `folder-${Utils.random()}`; const nameWithSpaces = ` folder-${Utils.random()} `; - const siteName = `site-private-${Utils.random()}`; + const sitePrivate = `site-private-${Utils.random()}`; + const siteName = `site-${Utils.random()}`; + + const folderSite = `folder-site-${Utils.random()}`; + const duplicateFolderSite = `folder-${Utils.random()}`; + let docLibUserSite; const apis = { admin: new RepoClient(), @@ -52,22 +55,29 @@ describe('Create folder', () => { const page = new BrowsingPage(); const createDialog = new CreateOrEditFolderDialog(); const { dataTable } = page; - const menu = new Menu(); beforeAll(async (done) => { await apis.admin.people.createUser({ username }); - await apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PRIVATE); - const docLibId = (await apis.admin.sites.getDocLibId(siteName)); + + await apis.admin.sites.createSite(sitePrivate, SITE_VISIBILITY.PRIVATE); + const docLibId = await apis.admin.sites.getDocLibId(sitePrivate); await apis.admin.nodes.createFolder(folderName1, docLibId); - await apis.admin.sites.addSiteMember(siteName, username, SITE_ROLES.SITE_CONSUMER.ROLE); + await apis.admin.sites.addSiteMember(sitePrivate, username, SITE_ROLES.SITE_CONSUMER.ROLE); + parentId = (await apis.user.nodes.createFolder(parent)).entry.id; await apis.user.nodes.createFolder(duplicateFolderName, parentId); + + await apis.user.sites.createSite(siteName); + docLibUserSite = await apis.user.sites.getDocLibId(siteName); + await apis.user.nodes.createFolder(duplicateFolderSite, docLibUserSite); + await loginPage.loginWith(username); done(); }); afterAll(async (done) => { - await apis.admin.sites.deleteSite(siteName); + await apis.admin.sites.deleteSite(sitePrivate); + await apis.user.sites.deleteSite(siteName); await apis.user.nodes.deleteNodeById(parentId); done(); }); @@ -83,13 +93,6 @@ describe('Create folder', () => { done(); }); - it('option is enabled when having enough permissions - [C216339]', async () => { - await page.dataTable.doubleClickOnRowByName(parent); - await page.sidenav.openNewMenu(); - const isEnabled = await menu.getItemByLabel('Create folder').isEnabled(); - expect(isEnabled).toBe(true, 'Create folder is not enabled'); - }); - it('creates new folder with name - [C216341]', async () => { await page.dataTable.doubleClickOnRowByName(parent); await page.sidenav.openCreateFolderDialog(); @@ -112,18 +115,11 @@ describe('Create folder', () => { await createDialog.waitForDialogToClose(); await dataTable.waitForHeader(); expect(await dataTable.getRowByName(folderName2).isPresent()).toBe(true, 'Folder not displayed'); - const desc = await apis.user.nodes.getNodeDescription(folderName2, parent); + const desc = await apis.user.nodes.getNodeDescription(folderName2, parentId); expect(desc).toEqual(folderDescription); done(); }); - it('enabled option tooltip - [C216342]', async () => { - await page.dataTable.doubleClickOnRowByName(parent); - await page.sidenav.openNewMenu(); - await browser.actions().mouseMove(menu.getItemByLabel('Create folder')).perform(); - expect(await menu.getItemTooltip('Create folder')).toContain('Create new folder'); - }); - it('dialog UI elements - [C216345]', async () => { await page.dataTable.doubleClickOnRowByName(parent); await page.sidenav.openCreateFolderDialog(); @@ -238,21 +234,39 @@ describe('Create folder', () => { done(); }); - it('option is disabled when not enough permissions - [C280397]', async () => { - await fileLibrariesPage.dataTable.doubleClickOnRowByName(siteName); - await fileLibrariesPage.dataTable.doubleClickOnRowByName(folderName1); - await fileLibrariesPage.sidenav.openNewMenu(); - const isEnabled = await menu.getItemByLabel('Create folder').isEnabled(); - expect(isEnabled).toBe(false, 'Create folder is not disabled'); + it('creates new folder with name and description - [C280394]', async () => { + await page.dataTable.doubleClickOnRowByName(siteName); + await page.sidenav.openCreateFolderDialog(); + await createDialog.waitForDialogToOpen(); + await createDialog.enterName(folderSite); + await createDialog.enterDescription(folderDescription); + await createDialog.clickCreate(); + await createDialog.waitForDialogToClose(); + await dataTable.waitForHeader(); + expect(await dataTable.getRowByName(folderSite).isPresent()).toBe(true, 'Folder not displayed'); + const desc = await apis.user.nodes.getNodeDescription(folderSite, docLibUserSite); + expect(desc).toEqual(folderDescription); }); - it('disabled option tooltip - [C280398]', async () => { - await fileLibrariesPage.dataTable.doubleClickOnRowByName(siteName); - await fileLibrariesPage.dataTable.doubleClickOnRowByName(folderName1); - await fileLibrariesPage.sidenav.openNewMenu(); - await browser.actions().mouseMove(menu.getItemByLabel('Create folder')).perform(); - const tooltip = await menu.getItemTooltip('Create folder'); - expect(tooltip).toContain(`Folders cannot be created whilst viewing the current items`); + it('cancel folder creation - [C280403]', async () => { + await page.dataTable.doubleClickOnRowByName(siteName); + await page.sidenav.openCreateFolderDialog(); + await createDialog.waitForDialogToOpen(); + await createDialog.enterName('test'); + await createDialog.enterDescription('test description'); + await createDialog.clickCancel(); + expect(await createDialog.isDialogOpen()).not.toBe(true, 'dialog is not closed'); + }); + + it('duplicate folder name - [C280404]', async () => { + await page.dataTable.doubleClickOnRowByName(siteName); + await page.sidenav.openCreateFolderDialog(); + await createDialog.waitForDialogToOpen(); + await createDialog.enterName(duplicateFolderSite); + await createDialog.clickCreate(); + const message = await page.getSnackBarMessage(); + expect(message).toEqual(`There's already a folder with this name. Try a different name.`); + expect(await createDialog.isDialogOpen()).toBe(true, 'dialog is not present'); }); }); diff --git a/e2e/suites/actions/create-library.test.ts b/e2e/suites/actions/create-library.test.ts index 4d956fb56..1d1fabc1c 100755 --- a/e2e/suites/actions/create-library.test.ts +++ b/e2e/suites/actions/create-library.test.ts @@ -23,11 +23,9 @@ * along with Alfresco. If not, see . */ -import { browser } from 'protractor'; import { SITE_VISIBILITY } from '../../configs'; import { LoginPage, BrowsingPage } from '../../pages/pages'; import { CreateLibraryDialog } from '../../components/dialog/create-library-dialog'; -import { Menu } from '../../components/menu/menu'; import { Utils } from '../../utilities/utils'; import { RepoClient } from '../../utilities/repo-client/repo-client'; @@ -62,7 +60,6 @@ describe('Create library', () => { const loginPage = new LoginPage(); const page = new BrowsingPage(); const createDialog = new CreateLibraryDialog(); - const menu = new Menu(); const { dataTable } = page; beforeAll(async (done) => { @@ -215,10 +212,4 @@ describe('Create library', () => { expect(await apis.user.sites.getTitle(`${duplicateSite.id}-2`)).toEqual(duplicateSite.name); }); - it('Tooltip for "Create Library" button - [C286526]', async () => { - await page.sidenav.openNewMenu(); - await browser.actions().mouseMove(menu.getItemByLabel('Create Library')).perform(); - expect(await menu.getItemTooltip('Create Library')).toContain('Create a new File Library'); - }); - }); diff --git a/e2e/suites/actions/edit-folder.test.ts b/e2e/suites/actions/edit-folder.test.ts index 234bea58f..5342bac45 100755 --- a/e2e/suites/actions/edit-folder.test.ts +++ b/e2e/suites/actions/edit-folder.test.ts @@ -23,7 +23,6 @@ * along with Alfresco. If not, see . */ -import { protractor, browser } from 'protractor'; import { LoginPage, BrowsingPage } from '../../pages/pages'; import { SITE_VISIBILITY, SITE_ROLES } from '../../configs'; import { RepoClient } from '../../utilities/repo-client/repo-client'; @@ -43,7 +42,17 @@ describe('Edit folder', () => { const folderNameEdited = `folder-${Utils.random()}`; const folderDescriptionEdited = 'description edited'; - const siteName = `site-private-${Utils.random()}`; + const sitePrivate = `site-private-${Utils.random()}`; + const siteName = `site-${Utils.random()}`; + + const folderSite = `folder-site-${Utils.random()}`; + const folderSiteToEdit = `folder-site-${Utils.random()}`; let folderSiteToEditId; + const duplicateFolderSite = `folder-${Utils.random()}`; + let docLibUserSite; + + const folderFavorite = `folder-fav-${Utils.random()}`; let folderFavoriteId; + const folderFavoriteToEdit = `folder-fav-${Utils.random()}`; let folderFavoriteToEditId; + const folderFavoriteDuplicate = `folder-fav-${Utils.random()}`; let folderFavoriteDuplicateId; const apis = { admin: new RepoClient(), @@ -58,41 +67,50 @@ describe('Edit folder', () => { beforeAll(async (done) => { await apis.admin.people.createUser({ username }); - await apis.admin.sites.createSite(siteName, SITE_VISIBILITY.PRIVATE); - const docLibId = await apis.admin.sites.getDocLibId(siteName); + await apis.admin.sites.createSite(sitePrivate, SITE_VISIBILITY.PRIVATE); + const docLibId = await apis.admin.sites.getDocLibId(sitePrivate); await apis.admin.nodes.createFolder(folderName, docLibId); - await apis.admin.sites.addSiteMember(siteName, username, SITE_ROLES.SITE_CONSUMER.ROLE); + await apis.admin.sites.addSiteMember(sitePrivate, username, SITE_ROLES.SITE_CONSUMER.ROLE); parentId = (await apis.user.nodes.createFolder(parent)).entry.id; await apis.user.nodes.createFolder(folderName, parentId, '', folderDescription); await apis.user.nodes.createFolder(folderNameToEdit, parentId); await apis.user.nodes.createFolder(duplicateFolderName, parentId); + await apis.user.sites.createSite(siteName); + docLibUserSite = await apis.user.sites.getDocLibId(siteName); + await apis.user.nodes.createFolder(folderSite, docLibUserSite); + folderSiteToEditId = (await apis.user.nodes.createFolder(folderSiteToEdit, docLibUserSite)).entry.id; + await apis.user.nodes.createFolder(duplicateFolderSite, docLibUserSite); + + folderFavoriteId = (await apis.user.nodes.createFolder(folderFavorite)).entry.id; + folderFavoriteToEditId = (await apis.user.nodes.createFolder(folderFavoriteToEdit)).entry.id; + folderFavoriteDuplicateId = (await apis.user.nodes.createFolder(folderFavoriteDuplicate)).entry.id; + + await apis.user.favorites.addFavoriteById('folder', folderFavoriteId); + await apis.user.favorites.addFavoriteById('folder', folderFavoriteToEditId); + await apis.user.favorites.addFavoriteById('folder', folderFavoriteDuplicateId); + await loginPage.loginWith(username); done(); }); - beforeEach(async (done) => { - await page.clickPersonalFilesAndWait(); - await dataTable.doubleClickOnRowByName(parent); - await dataTable.waitForHeader(); - done(); - }); - - afterEach(async (done) => { - await browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); - done(); - }); - afterAll(async (done) => { await Promise.all([ - apis.admin.sites.deleteSite(siteName), - apis.user.nodes.deleteNodeById(parentId) + apis.admin.sites.deleteSite(sitePrivate), + apis.user.sites.deleteSite(siteName), + apis.user.nodes.deleteNodesById([ parentId, folderFavoriteToEditId, folderFavoriteDuplicateId ]) ]); done(); }); + afterEach(async (done) => { + await Utils.pressEscape(); + done(); + }); + it('dialog UI defaults - [C216331]', async () => { + await dataTable.doubleClickOnRowByName(parent); await dataTable.selectItem(folderName); await editButton.click(); expect(await editDialog.getTitle()).toEqual('Edit folder'); @@ -102,77 +120,153 @@ describe('Edit folder', () => { expect(await editDialog.cancelButton.isEnabled()).toBe(true, 'cancel button is not enabled'); }); - it('properties are modified when pressing OK - [C216335]', async (done) => { - await dataTable.selectItem(folderNameToEdit); - await editButton.click(); - await editDialog.waitForDialogToOpen(); - await editDialog.enterDescription(folderDescriptionEdited); - await editDialog.enterName(folderNameEdited); - await editDialog.clickUpdate(); - await editDialog.waitForDialogToClose(); - await dataTable.waitForHeader(); - expect(await dataTable.getRowByName(folderNameEdited).isPresent()).toBe(true, 'Folder not displayed'); - const desc = await apis.user.nodes.getNodeDescription(folderNameEdited, parent); - expect(desc).toEqual(folderDescriptionEdited); - done(); + describe('on Personal Files', () => { + beforeEach(async (done) => { + await page.clickPersonalFilesAndWait(); + await dataTable.doubleClickOnRowByName(parent); + await dataTable.waitForHeader(); + done(); + }); + + it('properties are modified when pressing OK - [C216335]', async (done) => { + await dataTable.selectItem(folderNameToEdit); + await editButton.click(); + await editDialog.waitForDialogToOpen(); + await editDialog.enterDescription(folderDescriptionEdited); + await editDialog.enterName(folderNameEdited); + await editDialog.clickUpdate(); + await editDialog.waitForDialogToClose(); + await dataTable.waitForHeader(); + expect(await dataTable.getRowByName(folderNameEdited).isPresent()).toBe(true, 'Folder not displayed'); + const desc = await apis.user.nodes.getNodeDescription(folderNameEdited, parentId); + expect(desc).toEqual(folderDescriptionEdited); + done(); + }); + + it('with empty folder name - [C216332]', async () => { + await dataTable.selectItem(folderName); + await editButton.click(); + await editDialog.deleteNameWithBackspace(); + expect(await editDialog.updateButton.isEnabled()).toBe(false, 'upload button is not enabled'); + expect(await editDialog.getValidationMessage()).toMatch('Folder name is required'); + }); + + it('with name with special characters - [C216333]', async () => { + const namesWithSpecialChars = [ 'a*a', 'a"a', 'aa', `a\\a`, 'a/a', 'a?a', 'a:a', 'a|a' ]; + + await dataTable.selectItem(folderName); + await editButton.click(); + + for (const name of namesWithSpecialChars) { + await editDialog.enterName(name); + expect(await editDialog.updateButton.isEnabled()).toBe(false, 'upload button is not disabled'); + expect(await editDialog.getValidationMessage()).toContain(`Folder name can't contain these characters`); + } + }); + + it('with name ending with a dot - [C216334]', async () => { + await dataTable.selectItem(folderName); + await editButton.click(); + await editDialog.waitForDialogToOpen(); + await editDialog.nameInput.sendKeys('.'); + expect(await editDialog.updateButton.isEnabled()).toBe(false, 'upload button is not enabled'); + expect(await editDialog.getValidationMessage()).toMatch(`Folder name can't end with a period .`); + }); + + it('Cancel button - [C216336]', async () => { + await dataTable.selectItem(folderName); + await editButton.click(); + await editDialog.waitForDialogToOpen(); + await editDialog.clickCancel(); + expect(await editDialog.isDialogOpen()).not.toBe(true, 'dialog is not closed'); + }); + + it('with duplicate folder name - [C216337]', async () => { + await dataTable.selectItem(folderName); + await editButton.click(); + await editDialog.waitForDialogToOpen(); + await editDialog.enterName(duplicateFolderName); + await editDialog.clickUpdate(); + const message = await page.getSnackBarMessage(); + expect(message).toEqual(`There's already a folder with this name. Try a different name.`); + expect(await editDialog.isDialogOpen()).toBe(true, 'dialog is not present'); + }); + + it('trim ending spaces - [C216338]', async () => { + await dataTable.selectItem(folderName); + await editButton.click(); + await editDialog.nameInput.sendKeys(' '); + await editDialog.clickUpdate(); + await editDialog.waitForDialogToClose(); + expect(await page.snackBar.isPresent()).not.toBe(true, 'notification appears'); + expect(await dataTable.getRowByName(folderName).isPresent()).toBe(true, 'Folder not displayed in list view'); + }); }); - it('with empty folder name - [C216332]', async () => { - await dataTable.selectItem(folderName); - await editButton.click(); - await editDialog.deleteNameWithBackspace(); - expect(await editDialog.updateButton.isEnabled()).toBe(false, 'upload button is not enabled'); - expect(await editDialog.getValidationMessage()).toMatch('Folder name is required'); + describe('on Favorites', () => { + beforeEach(async (done) => { + await page.clickFavoritesAndWait(); + done(); + }); + + it('properties are modified when pressing OK - [C280384]', async (done) => { + await dataTable.selectItem(folderFavoriteToEdit); + await editButton.click(); + await editDialog.waitForDialogToOpen(); + await editDialog.enterDescription(folderDescriptionEdited); + await editDialog.enterName(folderNameEdited); + await editDialog.clickUpdate(); + await editDialog.waitForDialogToClose(); + await dataTable.waitForHeader(); + expect(await dataTable.getRowByName(folderNameEdited).isPresent()).toBe(true, 'Folder not displayed'); + const desc = await apis.user.nodes.getNodeProperty(folderFavoriteToEditId, 'cm:description'); + expect(desc).toEqual(folderDescriptionEdited); + done(); + }); + + it('with duplicate folder name - [C280386]', async () => { + await dataTable.selectItem(folderFavorite); + await editButton.click(); + await editDialog.waitForDialogToOpen(); + await editDialog.enterName(folderFavoriteDuplicate); + await editDialog.clickUpdate(); + const message = await page.getSnackBarMessage(); + expect(message).toEqual(`There's already a folder with this name. Try a different name.`); + expect(await editDialog.isDialogOpen()).toBe(true, 'dialog is not present'); + }); }); - it('with name with special characters - [C216333]', async () => { - const namesWithSpecialChars = [ 'a*a', 'a"a', 'aa', `a\\a`, 'a/a', 'a?a', 'a:a', 'a|a' ]; + describe('on My Libraries', () => { + beforeEach(async (done) => { + await page.clickFileLibrariesAndWait(); + await dataTable.doubleClickOnRowByName(siteName); + done(); + }); - await dataTable.selectItem(folderName); - await editButton.click(); + it('properties are modified when pressing OK - [C280509]', async (done) => { + await dataTable.selectItem(folderSiteToEdit); + await editButton.click(); + await editDialog.waitForDialogToOpen(); + await editDialog.enterDescription(folderDescriptionEdited); + await editDialog.enterName(folderNameEdited); + await editDialog.clickUpdate(); + await editDialog.waitForDialogToClose(); + await dataTable.waitForHeader(); + expect(await dataTable.getRowByName(folderNameEdited).isPresent()).toBe(true, 'Folder not displayed'); + const desc = await apis.user.nodes.getNodeProperty(folderSiteToEditId, 'cm:description'); + expect(desc).toEqual(folderDescriptionEdited); + done(); + }); - for (const name of namesWithSpecialChars) { - await editDialog.enterName(name); - expect(await editDialog.updateButton.isEnabled()).toBe(false, 'upload button is not disabled'); - expect(await editDialog.getValidationMessage()).toContain(`Folder name can't contain these characters`); - } - }); - - it('with name ending with a dot - [C216334]', async () => { - await dataTable.selectItem(folderName); - await editButton.click(); - await editDialog.waitForDialogToOpen(); - await editDialog.nameInput.sendKeys('.'); - expect(await editDialog.updateButton.isEnabled()).toBe(false, 'upload button is not enabled'); - expect(await editDialog.getValidationMessage()).toMatch(`Folder name can't end with a period .`); - }); - - it('Cancel button - [C216336]', async () => { - await dataTable.selectItem(folderName); - await editButton.click(); - await editDialog.waitForDialogToOpen(); - await editDialog.clickCancel(); - expect(await editDialog.isDialogOpen()).not.toBe(true, 'dialog is not closed'); - }); - - it('with duplicate folder name - [C216337]', async () => { - await dataTable.selectItem(folderName); - await editButton.click(); - await editDialog.waitForDialogToOpen(); - await editDialog.enterName(duplicateFolderName); - await editDialog.clickUpdate(); - const message = await page.getSnackBarMessage(); - expect(message).toEqual(`There's already a folder with this name. Try a different name.`); - expect(await editDialog.isDialogOpen()).toBe(true, 'dialog is not present'); - }); - - it('trim ending spaces - [C216338]', async () => { - await dataTable.selectItem(folderName); - await editButton.click(); - await editDialog.nameInput.sendKeys(' '); - await editDialog.clickUpdate(); - await editDialog.waitForDialogToClose(); - expect(await page.snackBar.isPresent()).not.toBe(true, 'notification appears'); - expect(await dataTable.getRowByName(folderName).isPresent()).toBe(true, 'Folder not displayed in list view'); + it('with duplicate folder name - [C280511]', async () => { + await dataTable.selectItem(folderSite); + await editButton.click(); + await editDialog.waitForDialogToOpen(); + await editDialog.enterName(duplicateFolderSite); + await editDialog.clickUpdate(); + const message = await page.getSnackBarMessage(); + expect(message).toEqual(`There's already a folder with this name. Try a different name.`); + expect(await editDialog.isDialogOpen()).toBe(true, 'dialog is not present'); + }); }); }); diff --git a/e2e/suites/actions/library-actions.test.ts b/e2e/suites/actions/library-actions.test.ts new file mode 100755 index 000000000..950acd58e --- /dev/null +++ b/e2e/suites/actions/library-actions.test.ts @@ -0,0 +1,187 @@ +/*! + * @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 { SITE_VISIBILITY, SITE_ROLES } from '../../configs'; +import { LoginPage, BrowsingPage } from '../../pages/pages'; +import { Utils } from '../../utilities/utils'; +import { ConfirmDialog } from './../../components/components'; +import { RepoClient } from '../../utilities/repo-client/repo-client'; + +describe('Library actions', () => { + const username = `user-${Utils.random()}`; + + const sitePublic1Admin = `admin-public1-${Utils.random()}`; + const sitePublic2Admin = `admin-public2-${Utils.random()}`; + const sitePublic3Admin = `admin-public3-${Utils.random()}`; + const sitePublic4Admin = `admin-public4-${Utils.random()}`; + const siteModerated1Admin = `admin-moderated1-${Utils.random()}`; + const siteModerated2Admin = `admin-moderated2-${Utils.random()}`; + + const sitePublicUser = `user-public-${Utils.random()}`; + + const apis = { + admin: new RepoClient(), + user: new RepoClient(username, username) + }; + + const loginPage = new LoginPage(); + const page = new BrowsingPage(); + const { dataTable, toolbar } = page; + + const confirmDialog = new ConfirmDialog(); + + beforeAll(async (done) => { + await apis.admin.people.createUser({ username }); + await apis.admin.sites.createSite(sitePublic1Admin); + await apis.admin.sites.createSite(sitePublic2Admin); + await apis.admin.sites.createSite(sitePublic3Admin); + await apis.admin.sites.createSite(sitePublic4Admin); + await apis.admin.sites.createSite(siteModerated1Admin, SITE_VISIBILITY.MODERATED); + await apis.admin.sites.createSite(siteModerated2Admin, SITE_VISIBILITY.MODERATED); + + await apis.user.sites.createSite(sitePublicUser); + + await apis.admin.sites.addSiteMember(sitePublic2Admin, username, SITE_ROLES.SITE_COLLABORATOR.ROLE); + await apis.admin.sites.addSiteMember(sitePublic3Admin, username, SITE_ROLES.SITE_MANAGER.ROLE); + await apis.admin.sites.addSiteMember(sitePublic4Admin, username, SITE_ROLES.SITE_MANAGER.ROLE); + + await apis.user.favorites.addFavoriteById('site', sitePublic1Admin); + await apis.user.favorites.addFavoriteById('site', sitePublic3Admin); + await apis.user.favorites.addFavoriteById('site', siteModerated1Admin); + await apis.user.favorites.addFavoriteById('site', siteModerated2Admin); + + await apis.user.sites.requestToJoin(siteModerated2Admin); + + await loginPage.loginWith(username); + done(); + }); + + afterEach(async (done) => { + await Utils.pressEscape(); + await dataTable.clearSelection(); + done(); + }); + + afterAll(async (done) => { + await apis.admin.sites.deleteSite(sitePublic1Admin); + await apis.admin.sites.deleteSite(sitePublic2Admin); + await apis.admin.sites.deleteSite(sitePublic3Admin); + await apis.admin.sites.deleteSite(sitePublic4Admin); + await apis.admin.sites.deleteSite(siteModerated1Admin); + await apis.admin.sites.deleteSite(siteModerated2Admin); + await apis.user.sites.deleteSite(sitePublicUser); + done(); + }); + + it('Join a public library - Favorite Libraries - [C290105]', async () => { + await page.goToFavoriteLibraries(); + await dataTable.selectItem(sitePublic1Admin); + await toolbar.clickButton('Join'); + const role = await dataTable.getLibraryRole(sitePublic1Admin); + expect(role).toEqual('Consumer'); + }); + + it('Join a moderated library - Favorite Libraries - [C290109]', async () => { + await page.goToFavoriteLibraries(); + await dataTable.selectItem(siteModerated1Admin); + await toolbar.clickButton('Join'); + const role = await dataTable.getLibraryRole(siteModerated1Admin); + expect(role).toEqual(''); + const hasJoinRequest = await apis.user.sites.hasMembershipRequest(siteModerated1Admin); + expect(hasJoinRequest).toBe(true, `Join request does not exist on ${siteModerated1Admin}`); + }); + + it('Leave a library - My Libraries - [C290106]', async () => { + await page.goToMyLibraries(); + await dataTable.selectItem(sitePublic2Admin); + await toolbar.clickButton('Leave library'); + await page.waitForDialog(); + await confirmDialog.clickButton('OK'); + const text = await page.getSnackBarMessage(); + + expect(text).toEqual(`You have left the library`); + expect(await dataTable.getRowByName(sitePublic2Admin).isPresent()).toBe(false, `${sitePublic2Admin} is displayed`); + }); + + it('Leave a library - Favorite Libraries - [C290110]', async () => { + await page.goToFavoriteLibraries(); + await dataTable.selectItem(sitePublic3Admin); + await toolbar.clickButton('Leave library'); + await page.waitForDialog(); + await confirmDialog.clickButton('OK'); + const text = await page.getSnackBarMessage(); + + expect(text).toEqual(`You have left the library`); + expect(await dataTable.getRowByName(sitePublic3Admin).isPresent()).toBe(true, `${sitePublic3Admin} is not displayed`); + }); + + it('Confirmation dialog UI - [C290136]', async () => { + await page.goToMyLibraries(); + await dataTable.selectItem(sitePublic4Admin); + await toolbar.clickButton('Leave library'); + await page.waitForDialog(); + + expect(await confirmDialog.isDialogOpen()).toBe(true, 'Confirm delete dialog not open'); + expect(await confirmDialog.getTitle()).toContain('Leave this library?'); + expect(await confirmDialog.getText()).toContain('This will remove you as a member of this library.'); + expect(await confirmDialog.isButtonEnabled('OK')).toBe(true, 'OK button is not enabled'); + expect(await confirmDialog.isButtonEnabled('Cancel')).toBe(true, 'Cancel button is not enabled'); + }); + + it('Cancel Leave library - [C290111]', async () => { + await page.goToMyLibraries(); + await dataTable.selectItem(sitePublic4Admin); + await toolbar.clickButton('Leave library'); + await page.waitForDialog(); + + expect(await confirmDialog.isButtonEnabled('Cancel')).toBe(true, 'Cancel button is not enabled'); + await confirmDialog.clickButton('Cancel'); + expect(await dataTable.getRowByName(sitePublic4Admin).isPresent()).toBe(true, `${sitePublic4Admin} was deleted`); + }); + + it('Leave a library - failure notification - [C290107]', async () => { + await page.goToMyLibraries(); + await dataTable.selectItem(sitePublicUser); + await toolbar.clickButton('Leave library'); + await page.waitForDialog(); + await confirmDialog.clickButton('OK'); + const text = await page.getSnackBarMessage(); + + expect(text).toEqual(`Cannot leave this library`); + }); + + it('Cancel join - Favorite Libraries - [C290108]', async () => { + await page.goToFavoriteLibraries(); + await dataTable.selectItem(siteModerated2Admin); + await toolbar.clickButton('Cancel join'); + + const text = await page.getSnackBarMessage(); + expect(text).toEqual(`Canceled the request to join the library`); + + const hasJoinRequest = await apis.user.sites.hasMembershipRequest(siteModerated2Admin); + expect(hasJoinRequest).toBe(false, `Join request exists on ${siteModerated2Admin}`); + }); + +}); diff --git a/e2e/suites/actions/new-menu.test.ts b/e2e/suites/actions/new-menu.test.ts new file mode 100755 index 000000000..5ea766fe4 --- /dev/null +++ b/e2e/suites/actions/new-menu.test.ts @@ -0,0 +1,181 @@ +/*! + * @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 { LoginPage, BrowsingPage } from '../../pages/pages'; +import { SITE_ROLES } from '../../configs'; +import { RepoClient } from '../../utilities/repo-client/repo-client'; +import { Utils } from '../../utilities/utils'; + +describe('New menu', () => { + const username = `user-${Utils.random()}`; + + const siteUser = `site-user-${Utils.random()}`; + const siteAdmin = `site-admin-${Utils.random()}`; + + const apis = { + admin: new RepoClient(), + user: new RepoClient(username, username) + }; + + const loginPage = new LoginPage(); + const page = new BrowsingPage(); + const { dataTable, sidenav } = page; + + + beforeAll(async (done) => { + await apis.admin.people.createUser({ username }); + await apis.admin.sites.createSite(siteAdmin); + await apis.admin.sites.addSiteMember(siteAdmin, username, SITE_ROLES.SITE_CONSUMER.ROLE); + + await apis.user.sites.createSite(siteUser); + + await loginPage.loginWith(username); + done(); + }); + + afterAll(async (done) => { + await apis.user.sites.deleteSite(siteUser); + await apis.admin.sites.deleteSite(siteAdmin); + done(); + }); + + afterEach(async (done) => { + await Utils.pressEscape(); + done(); + }); + + it('has correct actions - [C286524]', async () => { + await page.clickPersonalFiles(); + await sidenav.openNewMenu(); + + expect(await sidenav.menu.isMenuItemPresent('Create folder')).toBe(true, 'Create Folder option not present'); + expect(await sidenav.menu.isMenuItemPresent('Create Library')).toBe(true, 'Create Library option not present'); + expect(await sidenav.menu.isMenuItemPresent('Upload file')).toBe(true, 'Upload File option not present'); + expect(await sidenav.menu.isMenuItemPresent('Upload folder')).toBe(true, 'Upload Folder option not present'); + + expect(await sidenav.menu.getItemByLabel('Create Library').isEnabled()).toBe(true, 'Create Library is not enabled'); + }); + + it('Create folder is enabled when having enough permissions - Personal Files - [C216339]', async () => { + await page.clickPersonalFiles(); + await page.sidenav.openNewMenu(); + + const isEnabled = await sidenav.menu.getItemByLabel('Create folder').isEnabled(); + expect(isEnabled).toBe(true, 'Create folder is not enabled'); + }); + + it('Create folder is enabled when having enough permissions - File Libraries - [C280393]', async () => { + await page.clickFileLibraries(); + await page.dataTable.doubleClickOnRowByName(siteUser); + await page.sidenav.openNewMenu(); + const isEnabled = await sidenav.menu.getItemByLabel('Create folder').isEnabled(); + expect(isEnabled).toBe(true, 'Create folder is not enabled'); + }); + + it('Create folder is disabled when not enough permissions - [C280397]', async () => { + await page.clickFileLibraries(); + await dataTable.doubleClickOnRowByName(siteAdmin); + await sidenav.openNewMenu(); + const isEnabled = await sidenav.menu.getItemByLabel('Create folder').isEnabled(); + expect(isEnabled).toBe(false, 'Create folder is not disabled'); + }); + + it('Upload File option is enabled when having enough permissions - on Personal Files - [C217145]', async () => { + await page.clickPersonalFiles(); + await sidenav.openNewMenu(); + + const isEnabled = await sidenav.menu.getItemByLabel('Upload file').isEnabled(); + expect(isEnabled).toBe(true, 'Upload file is not enabled in Personal Files'); + }); + + it('Upload File option is enabled when having permissions - on File Libraries - [C290142]', async () => { + await page.clickFileLibraries(); + await dataTable.doubleClickOnRowByName(siteUser); + await sidenav.openNewMenu(); + + const isEnabled = await sidenav.menu.getItemByLabel('Upload file').isEnabled(); + expect(isEnabled).toBe(true, 'Upload file is not enabled in File Libraries'); + }); + + it('Upload File option is disabled when user cannot create content in that location - [C217146]', async () => { + await page.clickFileLibraries(); + await dataTable.doubleClickOnRowByName(siteAdmin); + await sidenav.openNewMenu(); + + const isEnabled = await sidenav.menu.getItemByLabel('Upload file').isEnabled(); + expect(isEnabled).toBe(false, 'Upload file is not disabled'); + }); + + it('Upload Folder option is enabled when having enough permissions - on Personal Files - [C213196]', async () => { + await page.clickPersonalFiles(); + await sidenav.openNewMenu(); + + const isEnabled = await sidenav.menu.getItemByLabel('Upload folder').isEnabled(); + expect(isEnabled).toBe(true, 'Upload folder is not enabled in Personal Files'); + }); + + it('Upload Folder option is enabled when having permissions - on File Libraries - [C290146]', async () => { + await page.clickFileLibraries(); + await dataTable.doubleClickOnRowByName(siteUser); + await sidenav.openNewMenu(); + + const isEnabled = await sidenav.menu.getItemByLabel('Upload folder').isEnabled(); + expect(isEnabled).toBe(true, 'Upload folder is not enabled in File Libraries'); + }); + + it('Upload Folder option is disabled when user cannot create content in that location - [C213193]', async () => { + await page.clickFileLibraries(); + await dataTable.doubleClickOnRowByName(siteAdmin); + await sidenav.openNewMenu(); + + const isEnabled = await sidenav.menu.getItemByLabel('Upload folder').isEnabled(); + expect(isEnabled).toBe(false, 'Upload folder is not disabled'); + }); + + it('Create folder enabled button tooltip - [C216342]', async () => { + await page.clickPersonalFiles(); + await sidenav.openNewMenu(); + + const tooltip = await sidenav.menu.getItemTooltip('Create folder'); + expect(tooltip).toContain('Create new folder'); + }); + + it('Create folder disabled button tooltip - [C280398]', async () => { + await page.clickFileLibraries(); + await dataTable.doubleClickOnRowByName(siteAdmin); + await sidenav.openNewMenu(); + + const tooltip = await sidenav.menu.getItemTooltip('Create folder'); + expect(tooltip).toContain(`Folders cannot be created whilst viewing the current items`); + }); + + it('Create Library button tooltip - [C286526]', async () => { + await sidenav.openNewMenu(); + + const tooltip = await sidenav.menu.getItemTooltip('Create Library'); + expect(tooltip).toContain('Create a new File Library'); + }); + +}); diff --git a/e2e/suites/actions/permanently-delete.test.ts b/e2e/suites/actions/permanently-delete.test.ts index 0af57a469..68427f3af 100755 --- a/e2e/suites/actions/permanently-delete.test.ts +++ b/e2e/suites/actions/permanently-delete.test.ts @@ -40,6 +40,8 @@ describe('Permanently delete from Trash', () => { const folder2 = `folder2-${Utils.random()}`; let foldersIds; + const site = `site-${Utils.random()}`; + const apis = { admin: new RepoClient(), user: new RepoClient(username, username) @@ -55,8 +57,11 @@ describe('Permanently delete from Trash', () => { await apis.admin.people.createUser({ username }); filesIds = (await apis.user.nodes.createFiles([ file1, file2, file3 ])).list.entries.map(entries => entries.entry.id); foldersIds = (await apis.user.nodes.createFolders([ folder1, folder2 ])).list.entries.map(entries => entries.entry.id); + await apis.user.sites.createSite(site); + await apis.user.nodes.deleteNodesById(filesIds, false); await apis.user.nodes.deleteNodesById(foldersIds, false); + await apis.user.sites.deleteSite(site, false); await loginPage.loginWith(username); done(); @@ -72,7 +77,7 @@ describe('Permanently delete from Trash', () => { done(); }); - it('delete file - [C217091]', async () => { + it('delete a file - [C217091]', async () => { await dataTable.selectItem(file1); await toolbar.getButtonByTitleAttribute('Permanently delete').click(); await page.waitForDialog(); @@ -83,7 +88,7 @@ describe('Permanently delete from Trash', () => { expect(await dataTable.getRowByName(file1).isPresent()).toBe(false, 'Item was not deleted'); }); - it('delete folder - [C280416]', async () => { + it('delete a folder - [C280416]', async () => { await dataTable.selectItem(folder1); await toolbar.getButtonByTitleAttribute('Permanently delete').click(); await page.waitForDialog(); @@ -94,6 +99,17 @@ describe('Permanently delete from Trash', () => { expect(await dataTable.getRowByName(folder1).isPresent()).toBe(false, 'Item was not deleted'); }); + it('delete a library - [C290103]', async () => { + await dataTable.selectItem(site); + await toolbar.getButtonByTitleAttribute('Permanently delete').click(); + await page.waitForDialog(); + await confirmDialog.clickButton('Delete'); + const text = await page.getSnackBarMessage(); + + expect(text).toEqual(`${site} deleted`); + expect(await dataTable.getRowByName(site).isPresent()).toBe(false, `${site} was not deleted`); + }); + it('delete multiple items - [C280417]', async () => { await dataTable.selectMultipleItems([ file2, folder2 ]); await toolbar.getButtonByTitleAttribute('Permanently delete').click(); diff --git a/e2e/suites/actions/restore.test.ts b/e2e/suites/actions/restore.test.ts index 787d8f630..7d4499c19 100755 --- a/e2e/suites/actions/restore.test.ts +++ b/e2e/suites/actions/restore.test.ts @@ -55,15 +55,17 @@ describe('Restore from Trash', () => { xit(''); describe('successful restore', () => { - const file = `file-${Utils.random()}.txt`; - let fileId; - const folder = `folder-${Utils.random()}`; - let folderId; + const file = `file-${Utils.random()}.txt`; let fileId; + const folder = `folder-${Utils.random()}`; let folderId; + const site = `site-${Utils.random()}`; beforeAll(async (done) => { fileId = (await apis.user.nodes.createFile(file)).entry.id; folderId = (await apis.user.nodes.createFolder(folder)).entry.id; + await apis.user.sites.createSite(site); + await apis.user.nodes.deleteNodesById([fileId, folderId], false); + await apis.user.sites.deleteSite(site, false); done(); }); @@ -103,6 +105,17 @@ describe('Restore from Trash', () => { await apis.user.nodes.deleteNodeById(folderId, false); }); + it('restore library - [C290104]', async () => { + await dataTable.selectItem(site); + await toolbar.getButtonByTitleAttribute('Restore').click(); + const text = await page.getSnackBarMessage(); + expect(text).toContain(`${site} restored`); + expect(text).toContain(`View`); + expect(await dataTable.getRowByName(site).isPresent()).toBe(false, `${site} was not removed from list`); + await page.clickFileLibrariesAndWait(); + expect(await page.dataTable.getRowByName(site).isPresent()).toBe(true, `${site} not displayed in list`); + }); + it('restore multiple items - [C217182]', async () => { await dataTable.selectMultipleItems([file, folder]); await toolbar.getButtonByTitleAttribute('Restore').click(); diff --git a/e2e/suites/actions/toolbar-single-selection.test.ts b/e2e/suites/actions/toolbar-single-selection.test.ts index 895f8372f..da46d6119 100755 --- a/e2e/suites/actions/toolbar-single-selection.test.ts +++ b/e2e/suites/actions/toolbar-single-selection.test.ts @@ -40,6 +40,9 @@ describe('Toolbar actions - single selection : ', () => { const fileInSite = `fileAdmin-${Utils.random()}.txt`; const folderInSite = `folderAdmin-${Utils.random()}`; + const adminPublic = `admin-public-${Utils.random()}`; + const adminModerated = `admin-moderated-${Utils.random()}`; + const apis = { admin: new RepoClient(), user: new RepoClient(username, username) @@ -66,13 +69,18 @@ describe('Toolbar actions - single selection : ', () => { await apis.user.sites.createSite(siteName, SITE_VISIBILITY.PRIVATE); const docLibId = await apis.user.sites.getDocLibId(siteName); - await apis.user.nodes.createFile(fileInSite, docLibId); await apis.user.nodes.createFolder(folderInSite, docLibId); await apis.user.nodes.deleteNodeById(fileForDeleteId, false); await apis.user.nodes.deleteNodeById(folderForDeleteId, false); + await apis.admin.sites.createSite(adminPublic); + await apis.admin.sites.createSite(adminModerated, SITE_VISIBILITY.MODERATED); + await apis.user.favorites.addFavoriteById('site', adminPublic); + await apis.user.favorites.addFavoriteById('site', adminModerated); + await apis.user.sites.requestToJoin(adminModerated); + await loginPage.loginWith(username); done(); }); @@ -82,6 +90,8 @@ describe('Toolbar actions - single selection : ', () => { apis.user.nodes.deleteNodeById(fileUserId), apis.user.nodes.deleteNodeById(folderUserId), apis.user.sites.deleteSite(siteName), + apis.admin.sites.deleteSite(adminPublic), + apis.admin.sites.deleteSite(adminModerated), apis.user.trashcan.emptyTrash() ]); done(); @@ -96,26 +106,6 @@ describe('Toolbar actions - single selection : ', () => { done(); }); - it('Correct actions appear when a library is selected - My Libraries - [C213135]', async () => { - await page.goToMyLibraries(); - await dataTable.selectItem(siteName); - expect(await toolbar.isEmpty()).toBe(false, 'toolbar not displayed'); - expect(await toolbar.isButtonPresent('View details')).toBe(true, `View details is not displayed for ${siteName}`); - await toolbar.openMoreMenu(); - expect(await toolbar.menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${siteName}`); - expect(await toolbar.menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${siteName}`); - }); - - it('Correct actions appear when a library is selected - Favorite Libraries - [C289892]', async () => { - await page.goToFavoriteLibraries(); - await dataTable.selectItem(siteName); - expect(await toolbar.isEmpty()).toBe(false, 'toolbar not displayed'); - expect(await toolbar.isButtonPresent('View details')).toBe(true, `View details is not displayed for ${siteName}`); - await toolbar.openMoreMenu(); - expect(await toolbar.menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${siteName}`); - expect(await toolbar.menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${siteName}`); - }); - it('selected row is marked with a check circle icon - [C213134]', async () => { await page.clickPersonalFilesAndWait(); await dataTable.selectItem(fileUser); @@ -207,6 +197,58 @@ describe('Toolbar actions - single selection : ', () => { }); }); + describe('on a library', () => { + beforeEach(async (done) => { + await Utils.pressEscape(); + await dataTable.clearSelection(); + done(); + }); + + it('Available actions when a library is selected - My Libraries - [C213135]', async () => { + await page.goToMyLibraries(); + await dataTable.selectItem(siteName); + expect(await toolbar.isEmpty()).toBe(false, 'toolbar not displayed'); + expect(await toolbar.isButtonPresent('View details')).toBe(true, `View details is not displayed for ${siteName}`); + expect(await toolbar.isButtonPresent('Leave library')).toBe(true, `Leave is not displayed for ${siteName}`); + await toolbar.openMoreMenu(); + expect(await toolbar.menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${siteName}`); + expect(await toolbar.menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${siteName}`); + }); + + it('Available actions when a library is selected - Favorite Libraries - user is a member - [C289892]', async () => { + await page.goToFavoriteLibraries(); + await dataTable.selectItem(siteName); + expect(await toolbar.isEmpty()).toBe(false, 'toolbar not displayed'); + expect(await toolbar.isButtonPresent('View details')).toBe(true, `View details is not displayed for ${siteName}`); + expect(await toolbar.isButtonPresent('Leave library')).toBe(true, `Leave is not displayed for ${siteName}`); + await toolbar.openMoreMenu(); + expect(await toolbar.menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${siteName}`); + expect(await toolbar.menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${siteName}`); + }); + + it('Available actions when a library is selected - Favorite Libraries - user is not a member - [C290090]', async () => { + await page.goToFavoriteLibraries(); + await dataTable.selectItem(adminPublic); + expect(await toolbar.isEmpty()).toBe(false, 'toolbar not displayed'); + expect(await toolbar.isButtonPresent('View details')).toBe(true, `View details is not displayed for ${adminPublic}`); + expect(await toolbar.isButtonPresent('Join')).toBe(true, `Join is not displayed for ${adminPublic}`); + await toolbar.openMoreMenu(); + expect(await toolbar.menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${adminPublic}`); + expect(await toolbar.menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${adminPublic}`); + }); + + it('Available actions when a library is selected - Favorite Libraries - user requested to join - [C290091]', async () => { + await page.goToFavoriteLibraries(); + await dataTable.selectItem(adminModerated); + expect(await toolbar.isEmpty()).toBe(false, 'toolbar not displayed'); + expect(await toolbar.isButtonPresent('View details')).toBe(true, `View details is not displayed for ${adminModerated}`); + expect(await toolbar.isButtonPresent('Cancel join')).toBe(true, `Cancel join is not displayed for ${adminModerated}`); + await toolbar.openMoreMenu(); + expect(await toolbar.menu.isMenuItemPresent('Delete')).toBe(true, `Delete is not displayed for ${adminModerated}`); + expect(await toolbar.menu.isMenuItemPresent('Favorite')).toBe(true, `Favorite is not displayed for ${adminModerated}`); + }); + }); + describe('on Shared Files', () => { beforeEach(async (done) => { await Utils.pressEscape(); diff --git a/e2e/suites/list-views/empty-list.test.ts b/e2e/suites/list-views/empty-list.test.ts index f4a79da48..879f12a49 100755 --- a/e2e/suites/list-views/empty-list.test.ts +++ b/e2e/suites/list-views/empty-list.test.ts @@ -39,6 +39,7 @@ describe('Empty list views', () => { const loginPage = new LoginPage(); const page = new BrowsingPage(); const { dataTable, pagination } = page; + const { searchInput } = page.header; beforeAll(async (done) => { await apis.admin.people.createUser({ username }); @@ -148,10 +149,25 @@ describe('Empty list views', () => { it('Trash - pagination controls not displayed - [C280120]', async () => { await page.clickTrash(); expect(await pagination.range.isPresent()).toBe(false); - expect(pagination.maxItems.isPresent()).toBe(false); - expect(pagination.currentPage.isPresent()).toBe(false); - expect(pagination.totalPages.isPresent()).toBe(false); - expect(pagination.previousButton.isPresent()).toBe(false); - expect(pagination.nextButton.isPresent()).toBe(false); + expect(await pagination.maxItems.isPresent()).toBe(false); + expect(await pagination.currentPage.isPresent()).toBe(false); + expect(await pagination.totalPages.isPresent()).toBe(false); + expect(await pagination.previousButton.isPresent()).toBe(false); + expect(await pagination.nextButton.isPresent()).toBe(false); + }); + + it('Search results - pagination controls not displayed - [C290123]', async () => { + await searchInput.clickSearchButton(); + await searchInput.checkOnlyFiles(); + /* cspell:disable-next-line */ + await searchInput.searchFor('qwertyuiop'); + await dataTable.waitForBody(); + + expect(await pagination.range.isPresent()).toBe(false); + expect(await pagination.maxItems.isPresent()).toBe(false); + expect(await pagination.currentPage.isPresent()).toBe(false); + expect(await pagination.totalPages.isPresent()).toBe(false); + expect(await pagination.previousButton.isPresent()).toBe(false); + expect(await pagination.nextButton.isPresent()).toBe(false); }); }); diff --git a/e2e/suites/pagination/pag-search-results.test.ts b/e2e/suites/pagination/pag-search-results.test.ts new file mode 100755 index 000000000..b5e64e92a --- /dev/null +++ b/e2e/suites/pagination/pag-search-results.test.ts @@ -0,0 +1,160 @@ +/*! + * @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 { LoginPage, BrowsingPage } from '../../pages/pages'; +import { Utils } from '../../utilities/utils'; +import { RepoClient } from '../../utilities/repo-client/repo-client'; + +describe('Pagination on multiple pages on Search Results', () => { + const username = `user-${Utils.random()}`; + + const parent = `parent-${Utils.random()}`; let parentId; + const files = Array(101) + .fill('myFile') + .map((name, index): string => `${name}-${index + 1}.txt`); + + const apis = { + admin: new RepoClient(), + user: new RepoClient(username, username) + }; + + const loginPage = new LoginPage(); + const page = new BrowsingPage(); + const { dataTable, pagination } = page; + const { searchInput } = page.header; + + beforeAll(async (done) => { + await apis.admin.people.createUser({ username }); + parentId = (await apis.user.nodes.createFolder(parent)).entry.id; + await apis.user.nodes.createFiles(files, parent); + await apis.user.search.waitForApi(username, { expect: 101 }); + await loginPage.loginWith(username); + + await searchInput.clickSearchButton(); + await searchInput.checkOnlyFiles(); + await searchInput.searchFor('myFile-'); + await dataTable.waitForBody(); + + done(); + }); + + afterEach(async (done) => { + await Utils.pressEscape(); + done(); + }); + + afterAll(async (done) => { + await apis.user.nodes.deleteNodeById(parentId); + done(); + }); + + it('Pagination control default values - [C290125]', async () => { + expect(await pagination.range.getText()).toContain('1-25 of 101'); + expect(await pagination.maxItems.getText()).toContain('25'); + expect(await pagination.currentPage.getText()).toContain('Page 1'); + expect(await pagination.totalPages.getText()).toContain('of 5'); + expect(await pagination.previousButton.isEnabled()).toBe(false, 'Previous button is enabled'); + expect(await pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled'); + }); + + it('Items per page values - [C290126]', async () => { + await pagination.openMaxItemsMenu(); + const [ first, second, third ] = [1, 2, 3] + .map(async nth => await pagination.menu.getNthItem(nth).getText()); + expect(first).toBe('25'); + expect(second).toBe('50'); + expect(third).toBe('100'); + await pagination.menu.closeMenu(); + }); + + it('current page menu items - [C290127]', async () => { + await pagination.openMaxItemsMenu(); + await pagination.menu.clickMenuItem('25'); + expect(await pagination.getText(pagination.maxItems)).toContain('25'); + expect(await pagination.getText(pagination.totalPages)).toContain('of 5'); + await pagination.openCurrentPageMenu(); + expect(await pagination.menu.getItemsCount()).toBe(5); + await pagination.menu.closeMenu(); + + await pagination.openMaxItemsMenu(); + await pagination.menu.clickMenuItem('50'); + expect(await pagination.getText(pagination.maxItems)).toContain('50'); + expect(await pagination.getText(pagination.totalPages)).toContain('of 3'); + await pagination.openCurrentPageMenu(); + expect(await pagination.menu.getItemsCount()).toBe(3); + await pagination.menu.closeMenu(); + + await pagination.openMaxItemsMenu(); + await pagination.menu.clickMenuItem('100'); + expect(await pagination.getText(pagination.maxItems)).toContain('100'); + expect(await pagination.getText(pagination.totalPages)).toContain('of 2'); + await pagination.openCurrentPageMenu(); + expect(await pagination.menu.getItemsCount()).toBe(2); + await pagination.menu.closeMenu(); + + await pagination.resetToDefaultPageSize(); + }); + + it('change the current page from menu - [C290128]', async () => { + await pagination.openCurrentPageMenu(); + await pagination.menu.clickNthItem(3); + await dataTable.waitForBody(); + expect(await pagination.range.getText()).toContain('51-75 of 101'); + expect(await pagination.currentPage.getText()).toContain('Page 3'); + expect(await pagination.previousButton.isEnabled()).toBe(true, 'Previous button is not enabled'); + expect(await pagination.nextButton.isEnabled()).toBe(true, 'Next button is not enabled'); + + await pagination.resetToDefaultPageNumber(); + }); + + it('navigate to next and previous pages - [C290131]', async () => { + await pagination.nextButton.click(); + await dataTable.waitForBody(); + expect(await pagination.range.getText()).toContain('26-50 of 101'); + await pagination.resetToDefaultPageNumber(); + + await pagination.openCurrentPageMenu(); + await pagination.menu.clickNthItem(2); + await dataTable.waitForBody(); + await pagination.previousButton.click(); + await dataTable.waitForBody(); + expect(pagination.range.getText()).toContain('1-25 of 101'); + + await pagination.resetToDefaultPageNumber(); + }); + + it('Previous button is disabled on first page - [C290129]', async () => { + expect(await pagination.currentPage.getText()).toContain('Page 1'); + expect(await pagination.previousButton.isEnabled()).toBe(false, 'Previous button is enabled on first page'); + }); + + it('Next button is disabled on last page - [C290130]', async () => { + await pagination.openCurrentPageMenu(); + await pagination.menu.clickNthItem(5); + expect(await dataTable.countRows()).toBe(1, 'Incorrect number of items on the last page'); + expect(await pagination.currentPage.getText()).toContain('Page 5'); + expect(await pagination.nextButton.isEnabled()).toBe(false, 'Next button is enabled on last page'); + }); +}); diff --git a/e2e/suites/pagination/pag-single-page.test.ts b/e2e/suites/pagination/pag-single-page.test.ts index fc912bb08..bffffc44a 100755 --- a/e2e/suites/pagination/pag-single-page.test.ts +++ b/e2e/suites/pagination/pag-single-page.test.ts @@ -42,7 +42,8 @@ describe('Pagination on single page', () => { const loginPage = new LoginPage(); const page = new BrowsingPage(); - const { pagination } = page; + const { pagination, dataTable } = page; + const { searchInput } = page.header; beforeAll(async (done) => { await apis.admin.people.createUser({ username }); @@ -108,4 +109,12 @@ describe('Pagination on single page', () => { expect(await pagination.pagesButton.isPresent()).toBe(false, 'page selector displayed'); }); + it('page selector not displayed on Search results - [C290124]', async () => { + await searchInput.clickSearchButton(); + await searchInput.checkOnlyFiles(); + await searchInput.searchFor(file); + await dataTable.waitForBody(); + expect(await pagination.pagesButton.isPresent()).toBe(false, 'page selector displayed'); + }); + }); diff --git a/e2e/utilities/repo-client/apis/nodes/nodes-api.ts b/e2e/utilities/repo-client/apis/nodes/nodes-api.ts index 58a7934ac..9a60adc78 100755 --- a/e2e/utilities/repo-client/apis/nodes/nodes-api.ts +++ b/e2e/utilities/repo-client/apis/nodes/nodes-api.ts @@ -46,12 +46,9 @@ export class NodesApi extends RepoApi { return await this.alfrescoJsApi.core.nodesApi.getNode(id); } - async getNodeDescription(name: string, relativePath: string = '/') { - relativePath = (relativePath === '/') - ? `${name}` - : `${relativePath}/${name}`; - - return (await this.getNodeByPath(`${relativePath}`)).entry.properties['cm:description']; + async getNodeDescription(name: string, parentId: string) { + const children = (await this.getNodeChildren(parentId)).list.entries; + return children.find(elem => elem.entry.name === name).entry.properties['cm:description']; } async getNodeProperty(nodeId: string, property: string) { @@ -93,8 +90,11 @@ export class NodesApi extends RepoApi { // children async getNodeChildren(nodeId: string) { + const opts = { + include: [ 'properties' ] + }; await this.apiAuth(); - return await this.alfrescoJsApi.core.nodesApi.getNodeChildren(nodeId); + return await this.alfrescoJsApi.core.nodesApi.getNodeChildren(nodeId, opts); } async deleteNodeChildren(parentId: string) { diff --git a/e2e/utilities/repo-client/apis/sites/sites-api.ts b/e2e/utilities/repo-client/apis/sites/sites-api.ts index 70b3040dd..6bb05507a 100755 --- a/e2e/utilities/repo-client/apis/sites/sites-api.ts +++ b/e2e/utilities/repo-client/apis/sites/sites-api.ts @@ -128,6 +128,24 @@ export class SitesApi extends RepoApi { return await this.alfrescoJsApi.core.sitesApi.removeSiteMember(siteId, userId); } + async requestToJoin(siteId: string) { + const body = { + id: siteId + }; + await this.apiAuth(); + try { + return await this.alfrescoJsApi.core.peopleApi.addSiteMembershipRequest('-me-', body); + } catch (error) { + console.log('====== requestToJoin catch ', error); + }; + } + + async hasMembershipRequest(siteId: string) { + await this.apiAuth(); + const requests = (await this.alfrescoJsApi.core.peopleApi.getSiteMembershipRequests('-me-')).list.entries.map(e => e.entry.id); + return requests.includes(siteId); + } + async waitForApi(data) { try { const sites = async () => {