import { DbClient } from '@contour/db-client/lib/dbClient'; import { Button, Input, Label, Web } from '@contour/fet/lib/elements'; import { ContourBasePage } from '../../base/basePage'; import { ContourAlert } from '../../elements/contourAlert'; import { ContourSelect } from '../../elements/contourSelect'; import ContourSpinner from '../../elements/contourSpinner'; import envConfig from '../../env/env-config'; import { getDefaultNodeBaseUrl, getNodeProfile } from '../../env/nodeProfile'; import scenarioContext from '../../util/scenarioContext'; import { generateRadomEmail, getUserNameFromEmail } from '../../util/stringUtil'; import locator from './users.locator'; export class UsersPage extends ContourBasePage { constructor(url?: string) { super(locator, url); } async createUser(email: string, role: string): Promise { const userEmail = email ?? generateRadomEmail(); await new Input(this.locators.emailInput).setInputField(userEmail); await new ContourSelect(this.locators.userRoleSelect).selectOptionByVisibleText(role); await new Button(this.locators.createUserButton).clickElement(); await new ContourAlert().clickButtonByLabelTxt('Confirm'); await new ContourSpinner().waitForLoadingToComplete(); scenarioContext().userDtl.email = userEmail; scenarioContext().userDtl.userName = getUserNameFromEmail(userEmail); } async searchUser(tabName: string, txtToSearch: string): Promise { await new Button(this.locators.tab.replace('#tabName#', tabName)).clickElement(); await new Input(this.locators.searchUserInput).setInputField(txtToSearch); await new Button(this.locators.searchUserBtn).clickElement(); } async verifyUser(userAction: string, userName: string): Promise { const user = userName ?? scenarioContext().userDtl.userName; await this.searchUser('Pending', user); await new Label(this.locators.userNameInTable.replace('#userName#', user)).clickElement(); await new Button(this.locators.approveBtn).clickElement(); await new ContourAlert().clickButtonByLabelTxt(userAction === 'Approve' ? 'Confirm' : 'Cancel'); } async checkUserStatus(tabName: string, userName: string, columnName: string, valueToAssert: string): Promise { const user = userName ?? scenarioContext().userDtl.userName; await this.searchUser(tabName, user); await new Button(this.locators.tab.replace('#tabName#', tabName)).clickElement(); await new Label( this.locators.userRow.replace('#userName#', user).replace('#colIdx#', String(this.getColumnIndexOf[columnName])) ).checkEqualsText(valueToAssert); } async setupUser(fullName?: string, password?: string): Promise { const fullNameTxt = fullName || 'Automation User'; const passwordTxt = password || envConfig.constants.defaultPassword; scenarioContext().userDtl.password = passwordTxt; await new Input(this.locators.fullNameTxt).setInputField(fullNameTxt); await new Input(this.locators.passwordTxt).setInputField(passwordTxt); await new Input(this.locators.confirmPasswordTxt).setInputField(passwordTxt); await new Button(this.locators.createBtn).clickElement(); } async loadSetupUserPage(userEmail: string) { const email = userEmail ?? scenarioContext().userDtl.email; await Web.url(await this.getUserAccountSetupURL(email)); } async getUserAccountSetupURL(userEmail: string) { const baseURL = scenarioContext().currentLoggedInCompany ? getNodeProfile(scenarioContext().currentLoggedInCompany).baseUrl : getDefaultNodeBaseUrl(); return ( baseURL + envConfig.pages.setupUser .replace('#token#', await this.getOnboardingTokenFromDB(userEmail)) .replace('#email#', userEmail) ); } async getOnboardingTokenFromDB(userEmail: string): Promise { const query = `select onboarding_token from users where email='${userEmail}';`; const dbConfig = getNodeProfile(scenarioContext().currentLoggedInCompany).dbConfig; const dbClient = new DbClient(dbConfig); const response = await dbClient.runQuery(query); return response[0]['onboarding_token']; } getColumnIndexOf = { StaffID: 1, Privileges: 2, Status: 4, UserType: 5 }; }