diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index 65a487ee4..26d656e8e 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -167,6 +167,10 @@ jobs: id: 10 - name: "library-actions" id: 11 + - name: "info-drawer" + id: 12 + - name: "search" + id: 13 steps: - name: Checkout uses: actions/checkout@v3 diff --git a/e2e/playwright/info-drawer/src/tests/comments.spec.ts b/e2e/playwright/info-drawer/src/tests/comments.spec.ts index e198f612e..38c859801 100755 --- a/e2e/playwright/info-drawer/src/tests/comments.spec.ts +++ b/e2e/playwright/info-drawer/src/tests/comments.spec.ts @@ -48,20 +48,11 @@ test.describe('Info Drawer - Comments', () => { }); test.beforeEach(async ({ loginPage }) => { - try { - await loginPage.loginUser({ username, password: username }, { withNavigation: true, waitForLoading: true }); - } catch (error) { - console.error(`Main beforeEach failed: ${error}`); - } + await Utils.tryLoginUser(loginPage, username, username, 'beforeEach failed'); }); test.afterAll(async () => { - try { - await nodesApi.deleteCurrentUserNodes(); - await trashcanApi.emptyTrashcan(); - } catch (error) { - console.error(`Main afterAll failed: ${error}`); - } + await Utils.deleteNodesSitesEmptyTrashcan(nodesApi, trashcanApi, 'afterAll failed'); }); test('[C299173] from Personal Files - Comments tab default fields', async ({ personalFiles }) => { diff --git a/e2e/playwright/info-drawer/src/tests/file-folder-properties.spec.ts b/e2e/playwright/info-drawer/src/tests/file-folder-properties.spec.ts index ea03d8eef..35a1e3e37 100755 --- a/e2e/playwright/info-drawer/src/tests/file-folder-properties.spec.ts +++ b/e2e/playwright/info-drawer/src/tests/file-folder-properties.spec.ts @@ -44,21 +44,12 @@ test.describe('Info Drawer - File Folder Properties', () => { } }); - test.afterAll(async () => { - try { - await nodesApi.deleteCurrentUserNodes(); - await trashcanApi.emptyTrashcan(); - } catch (error) { - console.error(`Main afterAll failed: ${error}`); - } + test.beforeEach(async ({ loginPage }) => { + await Utils.tryLoginUser(loginPage, username, username, 'beforeEach failed'); }); - test.beforeEach(async ({ loginPage }) => { - try { - await loginPage.loginUser({ username, password: username }, { withNavigation: true, waitForLoading: true }); - } catch (error) { - console.error(`Main beforeEach failed: ${error}`); - } + test.afterAll(async () => { + await Utils.deleteNodesSitesEmptyTrashcan(nodesApi, trashcanApi, 'afterAll failed'); }); test('[C299162] View properties - Default tabs', async ({ personalFiles }) => { diff --git a/e2e/playwright/info-drawer/src/tests/file-preview.spec.ts b/e2e/playwright/info-drawer/src/tests/file-preview.spec.ts index 533038634..c72e39c9a 100755 --- a/e2e/playwright/info-drawer/src/tests/file-preview.spec.ts +++ b/e2e/playwright/info-drawer/src/tests/file-preview.spec.ts @@ -23,7 +23,7 @@ */ import { expect, Page } from '@playwright/test'; -import { ApiClientFactory, test, TrashcanApi, NodesApi, FileActionsApi, TEST_FILES } from '@alfresco/playwright-shared'; +import { ApiClientFactory, test, TrashcanApi, NodesApi, FileActionsApi, TEST_FILES, Utils } from '@alfresco/playwright-shared'; test.describe('File preview', () => { const timestamp = new Date().getTime(); @@ -32,15 +32,6 @@ test.describe('File preview', () => { let trashcanApi: TrashcanApi; let fileActionsApi: FileActionsApi; - test.afterAll(async () => { - try { - await nodesApi.deleteCurrentUserNodes(); - await trashcanApi.emptyTrashcan(); - } catch (error) { - console.error(`Main afterAll failed: ${error}`); - } - }); - test.beforeAll(async () => { try { const apiClientFactory = new ApiClientFactory(); @@ -55,11 +46,11 @@ test.describe('File preview', () => { }); test.beforeEach(async ({ loginPage }) => { - try { - await loginPage.loginUser({ username, password: username }, { withNavigation: true, waitForLoading: true }); - } catch (error) { - console.error(`Main beforeEach failed: ${error}`); - } + await Utils.tryLoginUser(loginPage, username, username, 'beforeEach failed'); + }); + + test.afterAll(async () => { + await Utils.deleteNodesSitesEmptyTrashcan(nodesApi, trashcanApi, 'afterAll failed'); }); async function checkFileContent(page: Page, pageNumber: number, text: string): Promise { diff --git a/e2e/playwright/info-drawer/src/tests/general.spec.ts b/e2e/playwright/info-drawer/src/tests/general.spec.ts index 5e61d1cc4..2593785a4 100644 --- a/e2e/playwright/info-drawer/src/tests/general.spec.ts +++ b/e2e/playwright/info-drawer/src/tests/general.spec.ts @@ -32,14 +32,6 @@ test.describe('Info Drawer - General', () => { const username = `user1-${Utils.random()}`; - test.beforeEach(async ({ loginPage }) => { - try { - await loginPage.loginUser({ username, password: username }, { withNavigation: true, waitForLoading: true }); - } catch (error) { - console.error(`beforeEach failed: ${error}`); - } - }); - test.beforeAll(async () => { try { const apiClientFactory = new ApiClientFactory(); @@ -53,13 +45,12 @@ test.describe('Info Drawer - General', () => { } }); + test.beforeEach(async ({ loginPage }) => { + await Utils.tryLoginUser(loginPage, username, username, 'beforeEach failed'); + }); + test.afterAll(async () => { - try { - await trashcanApi.emptyTrashcan(); - await nodesApi.deleteCurrentUserNodes(); - } catch (error) { - console.error(`afterAll failed: ${error}`); - } + await Utils.deleteNodesSitesEmptyTrashcan(nodesApi, trashcanApi, 'afterAll failed'); }); test('[C268999] Info drawer closes on page refresh', async ({ personalFiles }) => { diff --git a/e2e/playwright/info-drawer/src/tests/library-properties.spec.ts b/e2e/playwright/info-drawer/src/tests/library-properties.spec.ts index 94f9f96ed..040a57ba8 100644 --- a/e2e/playwright/info-drawer/src/tests/library-properties.spec.ts +++ b/e2e/playwright/info-drawer/src/tests/library-properties.spec.ts @@ -43,15 +43,6 @@ test.describe('Library properties', () => { }; const siteDup = `site3-${Utils.random()}`; - test.beforeEach(async ({ myLibrariesPage, loginPage }) => { - try { - await loginPage.loginUser({ username, password: username }, { withNavigation: true, waitForLoading: true }); - await myLibrariesPage.navigate(); - } catch (error) { - console.error(` beforeEach failed: ${error}`); - } - }); - test.beforeAll(async () => { try { const apiClientFactory = new ApiClientFactory(); @@ -67,8 +58,13 @@ test.describe('Library properties', () => { } }); + test.beforeEach(async ({ loginPage, myLibrariesPage }) => { + await Utils.tryLoginUser(loginPage, username, username, 'beforeEach failed'); + await myLibrariesPage.navigate(); + }); + test.afterAll(async () => { - await sitesApi.deleteSites([site.id, siteForUpdate.id, siteDup]); + await Utils.deleteNodesSitesEmptyTrashcan(undefined, undefined, 'afterAll failed', sitesApi, [site.id, siteForUpdate.id, siteDup]); }); test('[C289336] Info drawer opens for a library', async ({ myLibrariesPage }) => { @@ -229,7 +225,7 @@ test.describe('Non manager', () => { }); test.afterAll(async () => { - await sitesApi.deleteSites([site.id]); + await Utils.deleteNodesSitesEmptyTrashcan(undefined, undefined, 'afterAll failed', sitesApi, [site.id]); }); test('[C289337] Info drawer button is not displayed when user is not the library manager', async ({ loginPage, myLibrariesPage }) => { diff --git a/e2e/playwright/search/exclude.tests.json b/e2e/playwright/search/exclude.tests.json index 0967ef424..28a318a83 100644 --- a/e2e/playwright/search/exclude.tests.json +++ b/e2e/playwright/search/exclude.tests.json @@ -1 +1,4 @@ -{} +{ + "C290019": "https://alfresco.atlassian.net/browse/ACS-6928", + "C290018": "https://alfresco.atlassian.net/browse/ACS-6928" +} \ No newline at end of file diff --git a/e2e/playwright/search/src/tests/search-input.spec.ts b/e2e/playwright/search/src/tests/search-input.spec.ts index 728c12ff6..e89e91916 100644 --- a/e2e/playwright/search/src/tests/search-input.spec.ts +++ b/e2e/playwright/search/src/tests/search-input.spec.ts @@ -39,11 +39,7 @@ test.describe('Search - Input', () => { }); test.beforeEach(async ({ loginPage }) => { - try { - await loginPage.loginUser({ username, password: username }, { withNavigation: true, waitForLoading: true }); - } catch (error) { - console.error(`beforeEach failed: ${error}`); - } + await Utils.tryLoginUser(loginPage, username, username, 'beforeEach failed'); }); test('[C289847] Search icon is displayed in toolbar and clicking on it displays search input container', async ({ searchPage }) => { diff --git a/e2e/playwright/search/src/tests/search-results-general.spec.ts b/e2e/playwright/search/src/tests/search-results-general.spec.ts index eadced196..1bcb8d779 100644 --- a/e2e/playwright/search/src/tests/search-results-general.spec.ts +++ b/e2e/playwright/search/src/tests/search-results-general.spec.ts @@ -37,14 +37,6 @@ test.describe('Search Results - General', () => { const folder = `test-folder-${random}`; const site = `test-site-${random}`; - test.beforeEach(async ({ loginPage }) => { - try { - await loginPage.loginUser({ username, password: username }, { withNavigation: true, waitForLoading: true }); - } catch (error) { - console.error(`beforeEach failed: ${error}`); - } - }); - test.beforeAll(async () => { try { const apiClientFactory = new ApiClientFactory(); @@ -61,13 +53,12 @@ test.describe('Search Results - General', () => { } }); + test.beforeEach(async ({ loginPage }) => { + await Utils.tryLoginUser(loginPage, username, username, 'beforeEach failed'); + }); + test.afterAll(async () => { - try { - await trashcanApi.emptyTrashcan(); - await nodesApi.deleteCurrentUserNodes(); - } catch (error) { - console.error(`afterAll failed: ${error}`); - } + await Utils.deleteNodesSitesEmptyTrashcan(nodesApi, trashcanApi, 'afterAll failed'); }); test('[C290005] Only files are returned when Files option is the only one checked', async ({ searchPage }) => { @@ -75,7 +66,7 @@ test.describe('Search Results - General', () => { await searchPage.searchInput.searchButton.click(); await searchPage.searchInput.checkOnlyFiles(); await searchPage.searchInput.searchFor(`*${random}`); - await searchPage.dataTable.body.waitFor(); + await searchPage.dataTable.waitForTable(); expect(await searchPage.dataTable.isItemPresent(file)).toBeTruthy(); expect(await searchPage.dataTable.isItemPresent(folder)).toBeFalsy(); @@ -87,7 +78,7 @@ test.describe('Search Results - General', () => { await searchPage.searchInput.searchButton.click(); await searchPage.searchInput.checkOnlyFolders(); await searchPage.searchInput.searchFor(`*${random}`); - await searchPage.dataTable.body.waitFor(); + await searchPage.dataTable.waitForTable(); expect(await searchPage.dataTable.isItemPresent(file)).toBeFalsy(); expect(await searchPage.dataTable.isItemPresent(folder)).toBeTruthy(); @@ -99,7 +90,7 @@ test.describe('Search Results - General', () => { await searchPage.searchInput.searchButton.click(); await searchPage.searchInput.checkFilesAndFolders(); await searchPage.searchInput.searchFor(`*${random}`); - await searchPage.dataTable.body.waitFor(); + await searchPage.dataTable.waitForTable(); expect(await searchPage.dataTable.isItemPresent(file)).toBeTruthy(); expect(await searchPage.dataTable.isItemPresent(folder)).toBeTruthy(); @@ -111,7 +102,7 @@ test.describe('Search Results - General', () => { await searchPage.searchInput.searchButton.click(); await searchPage.searchInput.checkLibraries(); await searchPage.searchInput.searchFor(`*${random}`); - await searchPage.dataTable.body.waitFor(); + await searchPage.dataTable.waitForTable(); expect(await searchPage.dataTable.isItemPresent(file)).toBeFalsy(); expect(await searchPage.dataTable.isItemPresent(folder)).toBeFalsy(); @@ -122,14 +113,14 @@ test.describe('Search Results - General', () => { await searchPage.acaHeader.searchButton.click(); await searchPage.searchInput.searchButton.click(); await searchPage.searchInput.searchFor(file); - await searchPage.dataTable.body.waitFor(); + await searchPage.dataTable.waitForTable(); expect(await searchPage.dataTable.isItemPresent(file)).toBeTruthy(); expect(await searchPage.dataTable.isItemPresent(folder)).toBeFalsy(); await searchPage.searchInput.searchButton.click(); await searchPage.searchInput.searchFor(folder); - await searchPage.dataTable.body.waitFor(); + await searchPage.dataTable.waitForTable(); expect(await searchPage.dataTable.isItemPresent(file)).toBeFalsy(); expect(await searchPage.dataTable.isItemPresent(folder)).toBeTruthy(); @@ -140,7 +131,7 @@ test.describe('Search Results - General', () => { await searchPage.searchInput.searchButton.click(); await searchPage.searchInput.checkLibraries(); await searchPage.searchInput.searchFor(site); - await searchPage.dataTable.body.waitFor(); + await searchPage.dataTable.waitForTable(); expect(await searchPage.dataTable.isItemPresent(site)).toBeTruthy(); @@ -148,7 +139,7 @@ test.describe('Search Results - General', () => { await personalFiles.navigate(); await personalFiles.page.goto(url); - await searchPage.dataTable.body.waitFor(); + await searchPage.dataTable.waitForTable(); expect(await searchPage.dataTable.isItemPresent(site)).toBeTruthy(); }); diff --git a/e2e/playwright/search/src/tests/search-results-libraries.spec.ts b/e2e/playwright/search/src/tests/search-results-libraries.spec.ts new file mode 100644 index 000000000..376a4480f --- /dev/null +++ b/e2e/playwright/search/src/tests/search-results-libraries.spec.ts @@ -0,0 +1,237 @@ +/*! + * Copyright © 2005-2023 Hyland Software, Inc. and its affiliates. All rights reserved. + * + * Alfresco Example Content Application + * + * 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 + * from Hyland Software. If not, see . + */ + +import { expect } from '@playwright/test'; +import { + ApiClientFactory, + Utils, + test, + TrashcanApi, + NodesApi, + SitesApi, + FileActionsApi, + SITE_VISIBILITY, + SITE_ROLES +} from '@alfresco/playwright-shared'; + +test.describe('Search Results - General', () => { + let trashcanApi: TrashcanApi; + let nodesApi: NodesApi; + let sitesApi: SitesApi; + let sitesAdminApi: SitesApi; + let fileActionsApi: FileActionsApi; + + const username = `user-${Utils.random()}`; + const random = Utils.random(); + const randomDescription = Utils.random() + '-' + Utils.random(); + + const site1 = { + name: `lib-${random}-1`, + id: `site-${random}-1` + }; + const site2 = { + name: `site-2-${random}`, + id: `site-${random}-2` + }; + const site3 = { + name: `lib-${random}-2`, + id: `site3-${random}` + }; + const site4 = { + name: `my-site-${random}`, + id: `site4-${random}`, + description: randomDescription + }; + + const userSitePrivate = `user-site-${random}-private`; + const userSiteModerated = `user-site-${random}-moderated`; + const userSitePublic = `user-site-${random}-public`; + + const adminSite1 = `admin-${random}-site1`; + const adminSite2 = `admin-${random}-site2`; + const adminSite3 = `admin-${random}-site3`; + const adminSite4 = `admin-${random}-site4`; + const adminPrivate = `admin-${random}-sitePrivate`; + + const siteRussian = { + /* cspell:disable-next-line */ + name: `любимый-сайт-${random}`, + id: `site-russian-id-${random}` + }; + + test.beforeEach(async ({ loginPage }) => { + await Utils.tryLoginUser(loginPage, username, username, 'beforeEach failed'); + }); + + test.afterAll(async () => { + await Utils.deleteNodesSitesEmptyTrashcan(nodesApi, trashcanApi, 'afterAll failed'); + }); + + test.beforeAll(async () => { + try { + const apiClientFactory = new ApiClientFactory(); + await apiClientFactory.setUpAcaBackend('admin'); + await apiClientFactory.createUser({ username }); + trashcanApi = await TrashcanApi.initialize(username, username); + sitesApi = await SitesApi.initialize(username, username); + fileActionsApi = await FileActionsApi.initialize(username, username); + nodesApi = await NodesApi.initialize(username, username); + sitesAdminApi = await SitesApi.initialize('admin'); + + await sitesApi.createSite(site1.name, null, null, site1.id); + await sitesApi.createSite(site2.name, null, null, site2.id); + await sitesApi.createSite(site3.name, null, null, site3.id); + await sitesApi.createSite(site4.name, null, site4.description, site4.id); + + await sitesApi.createSite(userSitePublic, SITE_VISIBILITY.PUBLIC); + await sitesApi.createSite(userSiteModerated, SITE_VISIBILITY.MODERATED); + await sitesApi.createSite(userSitePrivate, SITE_VISIBILITY.PRIVATE); + + await sitesAdminApi.createSite(adminSite1, SITE_VISIBILITY.PUBLIC); + await sitesAdminApi.createSite(adminSite2, SITE_VISIBILITY.PUBLIC); + await sitesAdminApi.createSite(adminSite3, SITE_VISIBILITY.PUBLIC); + await sitesAdminApi.createSite(adminSite4, SITE_VISIBILITY.PUBLIC); + await sitesAdminApi.addSiteMember(adminSite1, username, SITE_ROLES.SITE_CONSUMER.ROLE); + await sitesAdminApi.addSiteMember(adminSite2, username, SITE_ROLES.SITE_CONTRIBUTOR.ROLE); + await sitesAdminApi.addSiteMember(adminSite3, username, SITE_ROLES.SITE_COLLABORATOR.ROLE); + await sitesAdminApi.addSiteMember(adminSite4, username, SITE_ROLES.SITE_MANAGER.ROLE); + + await sitesAdminApi.createSite(adminPrivate, SITE_VISIBILITY.PRIVATE); + + await sitesApi.createSite(siteRussian.name, SITE_VISIBILITY.PUBLIC, '', siteRussian.id); + } catch (error) { + console.error(`beforeAll failed: ${error}`); + } + }); + + test('[C290012] Search library - full name match', async ({ searchPage }) => { + await searchPage.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.checkLibraries(); + await searchPage.searchInput.searchFor(site1.name); + await searchPage.dataTable.waitForTable(); + + expect(await searchPage.dataTable.isItemPresent(site1.name)).toBeTruthy(); + expect(await searchPage.dataTable.isItemPresent(site2.name)).toBeFalsy(); + expect(await searchPage.dataTable.isItemPresent(site3.name)).toBeFalsy(); + expect(await searchPage.dataTable.isItemPresent(site4.name)).toBeFalsy(); + }); + + test('[C290013] Search library - partial name match', async ({ searchPage }) => { + await fileActionsApi.waitForNodes(site3.id, { expect: 1 }); + await searchPage.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.checkLibraries(); + await searchPage.searchInput.searchFor(`lib-${random}`); + await searchPage.dataTable.waitForTable(); + + expect(await searchPage.dataTable.isItemPresent(site1.name)).toBeTruthy(); + expect(await searchPage.dataTable.isItemPresent(site2.name)).toBeFalsy(); + expect(await searchPage.dataTable.isItemPresent(site3.name)).toBeTruthy(); + expect(await searchPage.dataTable.isItemPresent(site4.name)).toBeFalsy(); + }); + + test('[C290014] Search library - description match', async ({ searchPage }) => { + await searchPage.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.checkLibraries(); + await searchPage.searchInput.searchFor(site4.description); + await searchPage.dataTable.waitForTable(); + + expect(await searchPage.dataTable.isItemPresent(site1.name)).toBeFalsy(); + expect(await searchPage.dataTable.isItemPresent(site2.name)).toBeFalsy(); + expect(await searchPage.dataTable.isItemPresent(site3.name)).toBeFalsy(); + expect(await searchPage.dataTable.isItemPresent(site4.name)).toBeTruthy(); + }); + + test('[C290016] Results page columns', async ({ searchPage }) => { + await searchPage.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.checkLibraries(); + await searchPage.searchInput.searchFor(site1.name); + await searchPage.dataTable.waitForTable(); + + const expectedColumns = ['Name', 'Description', 'My Role', 'Visibility']; + const actualColumns = await searchPage.dataTable.getColumnHeaders(); + + expect(actualColumns).toEqual(expectedColumns); + }); + + test('[C290017] Library visibility is correctly displayed', async ({ searchPage }) => { + await searchPage.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.checkLibraries(); + await searchPage.searchInput.searchFor(`user-site-${random}`); + await searchPage.dataTable.waitForTable(); + + const expectedSitesVisibility = { + [userSitePrivate]: SITE_VISIBILITY.PRIVATE, + [userSiteModerated]: SITE_VISIBILITY.MODERATED, + [userSitePublic]: SITE_VISIBILITY.PUBLIC + }; + + const actualSitesVisibility = await searchPage.dataTable.getSitesNameAndVisibility(); + + expect(expectedSitesVisibility).toEqual(actualSitesVisibility); + }); + + test('[C290018] User role is correctly displayed', async ({ searchPage }) => { + await searchPage.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.checkLibraries(); + await searchPage.searchInput.searchFor(`admin-${random}-site`); + await searchPage.dataTable.waitForTable(); + + const expectedSitesRoles = { + [adminSite1]: SITE_ROLES.SITE_CONSUMER.LABEL, + [adminSite2]: SITE_ROLES.SITE_CONTRIBUTOR.LABEL, + [adminSite3]: SITE_ROLES.SITE_COLLABORATOR.LABEL, + [adminSite4]: SITE_ROLES.SITE_MANAGER.LABEL + }; + + const actualSitesRole = await searchPage.dataTable.getSitesNameAndRole(); + + expect(expectedSitesRoles).toEqual(actualSitesRole); + }); + + test('[C290019] Private sites are not displayed when user is not a member', async ({ searchPage }) => { + await searchPage.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.checkLibraries(); + await searchPage.searchInput.searchFor(`admin-${random}-site`); + await searchPage.dataTable.waitForTable(); + + expect(await searchPage.dataTable.isItemPresent(adminPrivate)).toBeFalsy(); + }); + + test('[C290028] Search libraries with special characters', async ({ searchPage }) => { + await searchPage.acaHeader.searchButton.click(); + await searchPage.searchInput.searchButton.click(); + await searchPage.searchInput.checkLibraries(); + await searchPage.searchInput.searchFor(siteRussian.name); + await searchPage.dataTable.waitForTable(); + + expect(await searchPage.dataTable.isItemPresent(siteRussian.name)).toBeTruthy(); + }); +}); diff --git a/projects/aca-playwright-shared/src/page-objects/components/dataTable/data-table.component.ts b/projects/aca-playwright-shared/src/page-objects/components/dataTable/data-table.component.ts index 62addb8c2..fde03af7f 100644 --- a/projects/aca-playwright-shared/src/page-objects/components/dataTable/data-table.component.ts +++ b/projects/aca-playwright-shared/src/page-objects/components/dataTable/data-table.component.ts @@ -52,6 +52,9 @@ export class DataTableComponent extends BaseComponent { emptyListTest = this.getChild('adf-custom-empty-content-template'); paginationButton = this.page.locator('.adf-pagination__block button').nth(0); paginationOptions = this.page.locator('#cdk-overlay-0 button'); + sitesVisibility = this.page.locator('.adf-datatable-body [data-automation-id*="datatable-row"] [aria-label="Visibility"]'); + sitesName = this.page.locator('.adf-datatable-body [data-automation-id*="datatable-row"] [aria-label="Name"]'); + sitesRole = this.page.locator('.adf-datatable-body [data-automation-id*="datatable-row"] [aria-label="My Role"]'); /** Locator for row (or rows) */ getRowLocator = this.getChild(`adf-datatable-row`); @@ -327,4 +330,47 @@ export class DataTableComponent extends BaseComponent { await this.paginationButton.click(); await this.paginationOptions.getByText("50").click(); } + + /** + * Method used to create objects from names and visibility of sites from datatable + * + * @returns an object with sites' names and their corresponding visibility values + */ + async getSitesNameAndVisibility(): Promise<{ [siteName: string]: string }> { + const rowsCount = await this.sitesName.count(); + let sitesInfo: { [siteName: string]: string } = {}; + for (let i = 0; i < rowsCount; i++) { + let siteVisibilityText = await this.sitesVisibility.nth(i).textContent(); + let siteNameText = await this.sitesName.nth(i).textContent(); + siteVisibilityText = siteVisibilityText.trim().toUpperCase(); + siteNameText = siteNameText.trim(); + sitesInfo[siteNameText] = siteVisibilityText; + } + return sitesInfo; + } + + /** + * Method used to create objects from names and roles of sites from datatable + * + * @returns an object with sites' names and their corresponding role values + */ + async getSitesNameAndRole(): Promise<{ [siteName: string]: string }> { + const rowsCount = await this.sitesName.count(); + let sitesInfo: { [siteName: string]: string } = {}; + for (let i = 0; i < rowsCount; i++) { + let siteNameText = await this.sitesName.nth(i).textContent(); + let siteRoleText = await this.sitesRole.nth(i).textContent(); + siteNameText = siteNameText.trim(); + siteRoleText = siteRoleText.trim(); + sitesInfo[siteNameText] = siteRoleText; + } + return sitesInfo; + } + + /** + * Method used to wait for values to be loaded in the table + */ + async waitForTable(): Promise { + await this.getRowLocator.nth(0).waitFor({timeout:5000}); + } } diff --git a/projects/aca-playwright-shared/src/utils/utils.ts b/projects/aca-playwright-shared/src/utils/utils.ts index 3bc69e54e..9987fd577 100644 --- a/projects/aca-playwright-shared/src/utils/utils.ts +++ b/projects/aca-playwright-shared/src/utils/utils.ts @@ -23,6 +23,8 @@ */ const crypto = require('crypto'); +import { LoginPage } from '../'; +import { NodesApi, TrashcanApi, SitesApi } from '@alfresco/playwright-shared'; export class Utils { @@ -46,4 +48,43 @@ export class Utils { static formatDate(date: string): string { return new Date(date).toLocaleDateString('en-US'); } + + /** + * Method used to login user with navigation. Also waits for the page to load after login + * + * @param loginPage page context passed from the test + * @param username username string + * @param password password string + * @param errorMessage error message string if the login fails + * + */ + static async tryLoginUser(loginPage: LoginPage, username: string, password: string, errorMessage = 'Error '): Promise { + try { + await loginPage.loginUser({ username, password }, { withNavigation: true, waitForLoading: true }); + } catch (error) { + console.error(`${errorMessage}: ${error}`); + } + } + + /** + * Method used to delete nodes and sites from user's account + * + * @param nodesApi nodesApi initialized with user credentials passed from the test + * @param trashcanApi trashcanApi initialized with user credentials passed from the test + * @param errorMessage error message string if the deleting sites/nodes fails + * @param sitesApi sitesApi initialized with user credentials passed from the test + * @param sitesToDelete array of sites' ids + * + */ + static async deleteNodesSitesEmptyTrashcan(nodesApi?: NodesApi, trashcanApi?: TrashcanApi, errorMessage = 'Error ', sitesApi?: SitesApi, sitesToDelete?: string[]): Promise { + try { + await nodesApi?.deleteCurrentUserNodes(); + await trashcanApi?.emptyTrashcan(); + if (sitesToDelete?.length > 0) { + await sitesApi?.deleteSites(sitesToDelete); + } + } catch (error) { + console.error(`${errorMessage}: ${error}`); + } + } }