import { browser , protractor , ElementFinder , ExpectedConditions as EC , by , logging , until , WebElement } from 'protractor' ; import { BrowserVisibility , Logger } from '@alfresco/adf-testing' ; import { BROWSER_WAIT_TIMEOUT } from '../configs' ; import * as path from 'path' ; import * as fs from 'fs' ; const StreamZip = require ( 'node-stream-zip' ) ; export async function typeText ( element , text ) { await element . clear ( ) ; await element . sendKeys ( text ) ; } export async function clearTextWithBackspace ( element ) { await element . clear ( ) ; await element . sendKeys ( ' ' , protractor . Key . CONTROL , 'a' , protractor . Key . NULL , protractor . Key . BACK_SPACE ) ; } export async function waitElement ( css , errorMessage ? ) { return browser . wait ( until . elementLocated ( by . css ( css ) ) , BROWSER_WAIT_TIMEOUT , errorMessage || `Timeout waiting for element: ${ css }` ) ; } export async function waitForPresence ( element , errorMessage ? ) { await browser . wait ( EC . presenceOf ( element ) , BROWSER_WAIT_TIMEOUT , errorMessage || `Timeout waiting for element presence: ${ element . locator ( ) }` ) ; } export async function waitForStaleness ( element , errorMessage ? ) { await browser . wait ( EC . stalenessOf ( element ) , BROWSER_WAIT_TIMEOUT , errorMessage || `Timeout waiting element staleness: ${ element . locator ( ) }` ) ; } export const isPresentAndEnabled = async ( element ) : Promise < boolean > => { try { await BrowserVisibility . waitUntilElementIsPresent ( element ) ; return element . isEnabled ( ) ; } catch ( error ) { return false ; } } ; export const isPresentAndDisplayed = async ( element ) : Promise < boolean > => { try { await BrowserVisibility . waitUntilElementIsVisible ( element ) ; return true ; } catch ( error ) { return false ; } } ; export class Utils { static string257 = 'assembly doctor offender limit clearance inspiration baker fraud active apples trait brainstorm concept breaks down presidential \
    reluctance summary communication patience books opponent banana economist head develop project swear unanimous read conservation' ; static string513 = 'great indirect brain tune other expectation fun silver drain tumble rhythm harmful wander picture distribute opera complication copyright \
    explosion snack ride pool machinery pair frog joint wrestle video referee drive window cage falsify happen tablet horror thank conception \
    extension decay dismiss platform respect ceremony applaud absorption presentation dominate race courtship soprano body \
    lighter track cinema tread tick climate lend summit singer radical flower visual negotiation promises cooperative live' ; static random ( ) { return Math . random ( ) . toString ( 36 ) . substring ( 5 , 10 ) . toLowerCase ( ) ; } static async clearLocalStorage ( ) { await browser . executeScript ( 'window.localStorage.clear();' ) ; } static async setSessionStorageFromConfig ( configFileName ) { const configFile = `${ browser . params . e2eRootPath }/resources/extensibility-configs/${ configFileName }` ; const fileContent = JSON . stringify ( fs . readFileSync ( configFile , { encoding : 'utf8' } ) ) ; await browser . executeScript ( `window.sessionStorage.setItem('app.extension.config', ${ fileContent });` ) ; } static retryCall ( fn , retry = 30 , delay = 1500 ) { const pause = ( duration ) => new Promise ( ( res ) => setTimeout ( res , duration ) ) ; const run = ( retries ) : Promise < any > => { return fn ( ) . catch ( ( err ) => ( retries > 1 ? pause ( delay ) . then ( ( ) => run ( retries - 1 ) ) : Promise . reject ( err ) ) ) ; } ; return run ( retry ) ; } static async fileExistsOnOS ( fileName , folderName = '' , subFolderName = '' ) { const config = await browser . getProcessedConfig ( ) ; const filePath = path . join ( config . params . downloadFolder , folderName , subFolderName , fileName ) ; let tries = 15 ; return new Promise ( function ( resolve ) { const checkExist = setInterval ( ( ) => { fs . access ( filePath , function ( error ) { tries -- ; if ( error && tries === 0 ) { clearInterval ( checkExist ) ; resolve ( false ) ; } if ( ! error ) { clearInterval ( checkExist ) ; resolve ( true ) ; } } ) ; } , 500 ) ; } ) ; } static async renameFile ( oldName , newName ) { const config = await browser . getProcessedConfig ( ) ; const oldFilePath = path . join ( config . params . downloadFolder , oldName ) ; const newFilePath = path . join ( config . params . downloadFolder , newName ) ; const fileExists = await this . fileExistsOnOS ( oldName ) ; if ( fileExists ) { fs . rename ( oldFilePath , newFilePath , function ( err ) { if ( err ) { Logger . error ( `==== rename err : failed to rename file from ${ oldName } to ${ newName } : ` , err ) ; } } ) ; } } static async unzip ( filename , unzippedName = '' ) { const config = await browser . getProcessedConfig ( ) ; const filePath = path . join ( config . params . downloadFolder , filename ) ; const output = path . join ( config . params . downloadFolder , unzippedName ? unzippedName : '' ) ; const zip = new StreamZip ( { file : filePath , storeEntries : true } ) ; await zip . on ( 'error' , ( err ) => { Logger . error ( `=== unzip err : failed to unzip ${ filename } - ${ unzippedName } :` , err ) ; } ) ; await zip . on ( 'ready' , async ( ) => { if ( unzippedName ) { await fs . mkdirSync ( output ) ; } await zip . extract ( null , output , async ( ) => { await zip . close ( ) ; } ) ; } ) ; } static async pressEscape ( ) { await browser . actions ( ) . sendKeys ( protractor . Key . ESCAPE ) . perform ( ) ; } static async pressTab ( ) { await browser . actions ( ) . sendKeys ( protractor . Key . TAB ) . perform ( ) ; } static async pressCmd ( ) { await browser . actions ( ) . sendKeys ( protractor . Key . COMMAND ) . perform ( ) ; } static async releaseKeyPressed ( ) { await browser . actions ( ) . sendKeys ( protractor . Key . NULL ) . perform ( ) ; } static async getBrowserLog ( ) { return browser . manage ( ) . logs ( ) . get ( 'browser' ) ; } static formatDate ( date ) { return new Date ( date ) . toLocaleDateString ( 'en-US' ) ; } static async uploadFileNewVersion ( fileFromOS ) { const el = browser . element ( by . id ( 'app-upload-file-version' ) ) ; await el . sendKeys ( `${ browser . params . e2eRootPath }/resources/test-files/${ fileFromOS }` ) ; } }