frontend/apps/quantgrid/playwright/pages/ProjectSelection.ts (187 lines of code) (raw):

import { expect, Locator, Page } from '@playwright/test'; import { DeleteProjectForm } from '../components/DeleteProjectForm'; import { FolderCreationForm } from '../components/FolderCreationForm'; import { ProjectCreationForm } from '../components/ProjectCreationForm'; export class ProjectSelection { private addNewElement = 'New'; private addNewProjectElement = 'New project'; private addNewFolderElement = 'New folder'; private showAllProjects = 'a#home'; private welcomeMessage = 'Recent'; private projectInList = 'span.text-textPrimary'; private cleanMask = '[data-file-name]'; private dropdownPart = 'span.ant-dropdown-trigger'; private dropdownMenuButton = `div[data-file-name] ${this.dropdownPart}`; private deleteMenuItem = "li[data-menu-id*='delete']"; private innerPage: Page; constructor(page: Page) { this.innerPage = page; } private itemLocator(projectName: string) { return `span[title="${projectName}"]`; } private getFolderLocator(folderName: string) { return `[data-file-name='${folderName}']`; } private cleanMaskWithException(exceptionItem: string) { return `[data-file-name]:not([data-file-name='${exceptionItem}'])`; } private currentFolderMatchLocator(folderName: string) { return `span.text-textPrimary>[title='${folderName}']`; } private treeStructureElementLocator(itemName: string) { return `div.items-center>span>span[title='${itemName}']`; } private getFolderMenuLocator(folderName: string) { return `${this.getFolderLocator(folderName)} ${this.dropdownPart}`; } public async createFolder(folderName: string) { await this.innerPage.getByText(this.addNewElement).first().click(); await this.innerPage .getByText(this.addNewFolderElement, { exact: true }) .click(); const folderCreationForm = new FolderCreationForm(this.innerPage); await folderCreationForm.fillForm(folderName); await expect( this.innerPage.locator(this.getFolderLocator(folderName)) ).toBeVisible(); } public async isFolderPresent(folderName: string) { return this.innerPage .locator(this.getFolderLocator(folderName)) .isVisible(); } public async openFolder(folderName: string) { await this.getProjectInList(folderName).click(); await expect( this.innerPage.locator(this.currentFolderMatchLocator(folderName)).nth(1) ).toBeVisible(); } public async openFolders(folders: string[]) { for (const nameIt of folders) { if ( nameIt !== '' && (await this.innerPage .locator(this.treeStructureElementLocator(nameIt)) .count()) === 0 ) { await this.openFolder(nameIt); } } } public async addNewProject(projectName: string, folderName = ['']) { await this.switchToAllProjects(); await this.openFolders(folderName); if (!(await this.getProjectInList(projectName).isVisible())) { await this.innerPage.getByText(this.addNewElement).first().click(); await this.innerPage.getByText(this.addNewProjectElement).click(); const projectCreationForm = new ProjectCreationForm(this.innerPage); await projectCreationForm.fillForm(projectName); await expect(this.getProjectInList(projectName)).toBeVisible(); return true; } return false; } public async deleteAllAutotestsProjects(folderName = '') { if (folderName !== '') { await this.getProjectInList(folderName).click(); } const deleteProjectLocator = this.innerPage.locator(this.cleanMask).first(); await expect(deleteProjectLocator).toBeVisible(); while ( (await deleteProjectLocator.isVisible()) && (folderName === '' || (await this.innerPage.locator(this.itemLocator(folderName)).count()) > 0) ) { const deletingItem = await deleteProjectLocator.getAttribute( 'data-file-name' ); if (deletingItem) { await this.deleteProject(deleteProjectLocator); await expect( this.innerPage.locator(this.getFolderLocator(deletingItem)) ).toBeHidden(); } } } public async cleanEverythingExceptCurrent(currentFolder: string) { await expect( this.innerPage .locator(this.cleanMask) .first() .or(this.innerPage.getByText('No items found')) ).toBeVisible(); const deleteProjectLocator = this.innerPage .locator(this.cleanMaskWithException(currentFolder)) .first(); while (await deleteProjectLocator.isVisible()) { const deletingItem = await deleteProjectLocator.getAttribute( 'data-file-name' ); if (deletingItem) { await this.deleteProject(deleteProjectLocator); await expect( this.innerPage.locator(this.getFolderLocator(deletingItem)) ).toBeHidden(); } } } public async deleteProject(projectElement: Locator) { await projectElement.first().hover(); await projectElement.locator(this.dropdownPart).first().click(); await this.innerPage.locator(this.deleteMenuItem).click(); const deleteForm = new DeleteProjectForm(this.innerPage); await deleteForm.confirmDelete(); } public async deleteFolder(folderNames: string[]) { for (let i = 0; i < folderNames.length - 1; i++) { if ( folderNames[i] !== '' && (await this.innerPage .locator(this.treeStructureElementLocator(folderNames[i])) .count()) === 0 ) { await this.getProjectInList(folderNames[i]).click(); } } const folderName = folderNames[folderNames.length - 1]; await this.innerPage.locator(this.getFolderLocator(folderName)).hover(); await this.innerPage.locator(this.getFolderMenuLocator(folderName)).click(); await this.innerPage.locator(this.deleteMenuItem).click(); const deleteForm = new DeleteProjectForm(this.innerPage); await deleteForm.confirmDelete(); await expect( this.innerPage.locator(this.getFolderLocator(folderName)) ).toBeHidden(); } public getWelcomeElement() { return this.innerPage.getByText(this.welcomeMessage); } public getProjectInList(projectName: string) { return this.innerPage.locator(this.itemLocator(projectName)); /* return this.innerPage .locator(this.projectInList) .and(this.innerPage.getByText(projectName, { exact: true }));*/ } public async switchToAllProjects() { if ( !( await this.innerPage.locator(this.showAllProjects).getAttribute('class') )?.includes('border-b-2') ) { await this.innerPage.locator(this.showAllProjects).click(); } } public async openProject(projectName: string, folderName = ['']) { await this.switchToAllProjects(); for (const name of folderName) { if ( name !== '' && (await this.innerPage .locator(this.treeStructureElementLocator(name)) .count()) === 0 ) { await this.getProjectInList(name).click(); } } await this.getProjectInList(projectName).first().click(); } }