1
0
mirror of https://gitlab.com/bramw/baserow.git synced 2024-11-23 16:17:35 +00:00
bramw_baserow/e2e-tests/pages/database/tablePage.ts
2024-11-14 12:30:42 +00:00

193 lines
6.4 KiB
TypeScript

import { expect, Locator, Page } from "@playwright/test";
import { BaserowPage } from "../baserowPage";
import { Table } from "../../fixtures/database/table";
const TEST_IMAGE_FILE_PATH = "assets/testuploadimage.png";
export class TablePage extends BaserowPage {
private readonly projectsTextLocator: Locator;
private readonly addColumnLocator: Locator;
private readonly createButtonLocator: Locator;
private readonly firstFileCellLocator: Locator;
private readonly addFileLocator: Locator;
private readonly fileZoneLocator: Locator;
private readonly uploadButtonLocator: Locator;
private readonly fileCellImageLocator: Locator;
private readonly searchButtonIcon: Locator;
private readonly firstNonPrimaryCell: Locator;
private readonly nonPrimaryRows: Locator;
readonly firstNonPrimaryCellWrappingColumnDiv: Locator;
private readonly searchMatchCells: Locator;
private readonly hideNotMatchingRowsSearchToggle;
private readonly fieldHeader: Locator;
private readonly loadingOverlay: Locator;
private readonly searchInput: Locator;
readonly rowIdDivsMatchingSearch: Locator;
readonly firstRowIdDiv: Locator;
constructor(page: Page) {
super(page);
this.projectsTextLocator = this.page.locator("text=Projects");
this.addColumnLocator = this.page.locator(".grid-view__add-column");
this.searchButtonIcon = this.page.locator(".header__search-icon");
this.hideNotMatchingRowsSearchToggle = this.page.getByText(
"hide not matching rows"
);
this.createButtonLocator = this.page.getByRole("button", {
name: /create/i,
});
this.firstFileCellLocator = this.page
.locator(".grid-field-file__cell")
.first();
this.addFileLocator = this.page.locator(".grid-field-file__item-add");
this.fileZoneLocator = this.page.locator(".upload-files__dropzone");
this.uploadButtonLocator = this.page
.locator("button span")
.filter({ hasText: "Upload" });
this.fileCellImageLocator = this.page.locator(".grid-field-file__image");
this.firstNonPrimaryCell = this.page
.locator(".grid-view__right .grid-view__cell")
.first();
this.nonPrimaryRows = this.page.locator(
".grid-view__right .grid-view__rows .grid-view__row"
);
this.firstNonPrimaryCellWrappingColumnDiv = this.page
.locator(".grid-view__right .grid-view__rows .grid-view__column")
.first();
this.searchMatchCells = this.page.locator(
".grid-view__column--matches-search"
);
this.fieldHeader = this.page.locator(".grid-view__description");
this.loadingOverlay = this.page.locator(".content .loading-overlay");
this.searchInput = this.page.getByPlaceholder("Search in all rows");
this.rowIdDivsMatchingSearch = this.page.locator(
".grid-view__row-info.grid-view__row-info--matches-search"
);
this.firstRowIdDiv = this.page.locator(".grid-view__row-info").first();
}
async addNewFieldOfType(type: string) {
await this.addColumnLocator.click();
await this.page.locator(`.select__item-name-text[title="${type}"]`).click();
await this.createButtonLocator.click();
}
async uploadImageToFirstFileFieldCellAndGetWidth() {
await this.selectFirstFileCell();
await this.clickAddFile();
await this.uploadFile(TEST_IMAGE_FILE_PATH);
return await this.getWidthOfFirstFileFieldCellImage();
}
async selectFirstFileCell() {
await this.firstFileCellLocator.click();
}
async clickAddFile() {
await this.addFileLocator.click();
}
async clickFileZone() {
const clickFileZonePromise = this.fileZoneLocator.click();
const fileChooserPromise = this.page.waitForEvent("filechooser");
const [fileChooser] = await Promise.all([
fileChooserPromise,
clickFileZonePromise,
]);
return fileChooser;
}
async uploadFile(filePath) {
const fileChooser = await this.clickFileZone();
await fileChooser.setFiles(filePath);
await this.uploadButtonLocator.click();
}
async waitForFileFieldCellImage() {
await this.fileCellImageLocator.waitFor();
}
async getWidthOfFirstFileFieldCellImage() {
await this.waitForFileFieldCellImage();
return await this.page.evaluate(() => {
const element = document.querySelector(".grid-field-file__image");
return element.clientWidth;
});
}
async goToTable(table: Table) {
this.pageUrl = `database/${table.database.id}/table/${table.id}`;
await this.goto();
}
async clearSearchInput() {
await this.searchInput.click();
await this.page.keyboard.press("Control+A");
await this.page.keyboard.press("Backspace");
await this.waitForLoadingOverlayToDisappear();
}
async openSearchContextAndSearchFor(searchTerm) {
await this.searchButtonIcon.click();
await this.searchInput.click();
await this.page.keyboard.press("Control+A");
await this.page.keyboard.press("Backspace");
await this.page.keyboard.type(searchTerm.toString());
await this.page.keyboard.press("Enter");
await this.waitForLoadingOverlayToDisappear();
await this.searchButtonIcon.click();
}
async openAndClickSearchToggle(clearInput = false) {
await this.searchButtonIcon.click();
if (clearInput) {
await this.clearSearchInput();
}
await this.hideNotMatchingRowsSearchToggle.click();
await this.waitForLoadingOverlayToDisappear();
await this.searchButtonIcon.click();
}
async inFirstNonPrimaryCellInput(cellValue: string) {
await this.firstNonPrimaryCell.click();
await this.page.keyboard.type(cellValue);
await this.page.keyboard.press("Enter");
}
async expectIsSearchHighlighted(locator) {
await expect(locator).toHaveClass(/.*matches-search.*/);
}
async expectIsNotSearchHighlighted(locator) {
await expect(locator).not.toHaveClass(/.*matches-search.*/);
}
rows() {
return this.nonPrimaryRows;
}
searchMatchingCells() {
return this.searchMatchCells;
}
fields() {
return this.fieldHeader;
}
async waitForLoadingOverlayToDisappear() {
await expect(this.loadingOverlay).toHaveCount(0);
}
async waitForFirstCellNotBeBlank() {
await this.page.evaluate(() => {
return new Promise((resolve) => {
setTimeout(resolve, 1000); // Sleep for 1000 milliseconds (1 second)
});
});
await expect(this.firstNonPrimaryCell.locator("*")).not.toHaveCount(0);
}
async waitForFirstCellToBeBlank() {
await expect(this.firstNonPrimaryCell.locator("div *")).toHaveCount(0);
}
}