/*!
* Copyright © 2005-2024 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 .
*/
const crypto = require('crypto');
import * as path from 'path';
import { LoginPage, MyLibrariesPage, PersonalFilesPage, FavoritesLibrariesPage, SearchPage, SharedPage, TrashPage } from '../';
import { NodesApi, TrashcanApi, SitesApi } from '@alfresco/playwright-shared';
export class Utils {
static string257Long = 'x'.repeat(257);
static string513Long = 'x'.repeat(513);
static random(): string {
return crypto.getRandomValues(new Uint32Array(1))[0].toString(36).substring(0, 5).toLowerCase();
}
static retryCall(fn: () => Promise, retry: number = 30, delay: number = 1500): Promise {
const pause = (duration: number) => new Promise((res) => setTimeout(res, duration));
const run = (retries: number): Promise => {
return fn().catch((err) => (retries > 1 ? pause(delay).then(() => run(retries - 1)) : Promise.reject(err)));
};
return run(retry);
}
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}`);
}
}
static async uploadFileNewVersion(personalFilesPage: PersonalFilesPage, fileFromOS: string): Promise {
const fileInput = await personalFilesPage.page.$('#app-upload-file-version');
await fileInput.setInputFiles(path.join(__dirname, `../resources/test-files/${fileFromOS}.docx`));
}
static async reloadPageIfRowNotVisible(
pageContext: PersonalFilesPage | MyLibrariesPage | FavoritesLibrariesPage | SearchPage | SharedPage,
nodeName: string,
errorMessage = 'reloadPageIfRowNotVisible Error '
): Promise {
try {
if (!await pageContext.dataTable.getRowByName(nodeName).isVisible()) {
await pageContext.page.reload({ waitUntil: 'load' });
};
} catch (error) {
console.error(`${errorMessage}: ${error}`);
}
}
static async reloadPageIfDatatableEmpty(
pageContext: PersonalFilesPage | MyLibrariesPage | FavoritesLibrariesPage | SearchPage | SharedPage | TrashPage,
errorMessage = 'reloadPageIfDatatableEmpty Error '
): Promise {
try {
if (await pageContext.dataTable.getEmptyFolderLocator.isVisible() || await pageContext.dataTable.emptyListTitle.isVisible()) {
await pageContext.page.reload({ waitUntil: 'load' });
}
} catch (error) {
console.error(`${errorMessage}: ${error}`);
}
}
}