[ACS-6798] protractor to playwright e2e test suites search results libraries ()

* [ACS-6798] seach results libraries migrated

* [ACS-6798] added infoDrawer and search to PW tests in PRs

* [ACS-6798] excluded tests + sonar fix

* [ACS-6798] sonar fix 2

* [ACS-6798] sonar fix 3

* [ACS-6798] sonar fix 3

* [ACS-6798] login and delete methods added to Utils for sonar cloud duplication code

* [ACS-6798] review fixes

* Revert "[ci:force][auto-commit] Update dependencies ADF:6.8.0-8186121470  JS:7.7.0-8186121470 ()"

This reverts commit 29b1bf99d4ff8734342b94907d6bb2676a407e2e.

* Revert "Release 4.4.1 ()"

This reverts commit 6dd3ad66d0d96054beb4f70fee5b2b550cc23efc.

* [ACS-6798] review fixes pt2

* [ACS-6798] review fixes pt 3

* [ACS-6798] review fixes pt4

* [ACS-6798] review fixes pt4.1
This commit is contained in:
Adam Świderski 2024-03-08 10:58:19 +01:00 committed by GitHub
parent 00feb07d7d
commit 93cf1b9198
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 370 additions and 92 deletions

@ -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

@ -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 }) => {

@ -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 }) => {

@ -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<void> {

@ -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 }) => {

@ -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 }) => {

@ -1 +1,4 @@
{}
{
"C290019": "https://alfresco.atlassian.net/browse/ACS-6928",
"C290018": "https://alfresco.atlassian.net/browse/ACS-6928"
}

@ -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 }) => {

@ -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();
});

@ -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 <http://www.gnu.org/licenses/>.
*/
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();
});
});

@ -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<void> {
await this.getRowLocator.nth(0).waitFor({timeout:5000});
}
}

@ -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<void> {
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<void> {
try {
await nodesApi?.deleteCurrentUserNodes();
await trashcanApi?.emptyTrashcan();
if (sitesToDelete?.length > 0) {
await sitesApi?.deleteSites(sitesToDelete);
}
} catch (error) {
console.error(`${errorMessage}: ${error}`);
}
}
}