2026-06-24 20:31:05 +05:00

207 lines
6.5 KiB
TypeScript

import {Page} from '@playwright/test';
import {clickDropDownOption, cssSlct, slct, waitForCondition} from '../../utils';
import {COMMON_SELECTORS} from '../../utils/constants';
import {ActionPanelEntryContextMenuQa} from '../../../src/shared/constants/qa/action-panel';
import {
DashRevisions,
DialogConfirmQA,
RevisionsListQa,
RevisionsPanelQa,
} from '../../../src/shared';
const REVISIONS_LOAD_TIMEOUT = 2000;
export default class Revisions {
static getUrlRevIdParam(page: Page): string | null {
const pageURL = new URL(page.url());
// so far, it is not possible to use a common constant from the 'ui' before updating playwright
// switch to a constant after CHARTS-5226
return pageURL.searchParams.get('revId');
}
page: Page;
private showRevisionsActionPanelButtonQa = 'action-open-revisions';
constructor(page: Page) {
this.page = page;
}
async openList() {
const revisionList = await this.page.$(slct(RevisionsListQa.ExpandablePanel));
if (revisionList) {
return;
}
// click on the ellipsis in the upper panel
await this.page.click(slct(COMMON_SELECTORS.ENTRY_PANEL_MORE_BTN));
await this.page.waitForSelector(cssSlct(COMMON_SELECTORS.ENTRY_CONTEXT_MENU_KEY));
// select the item Change History
await clickDropDownOption(this.page, ActionPanelEntryContextMenuQa.Revisions);
await this.page.waitForSelector(slct(DashRevisions.EXPANDABLE_PANEL));
// waiting for the revision list to be uploaded
await this.page.waitForSelector(slct(RevisionsListQa.List));
await this.page.waitForSelector(slct(RevisionsListQa.RevisionsListRow));
}
async openActualVersion() {
try {
await this.page.waitForSelector(slct(RevisionsListQa.RevisionsListRow), {
timeout: REVISIONS_LOAD_TIMEOUT,
});
} catch {
// the revision list is hidden, you need to open
await this.openList();
}
await this.page.click(slct(RevisionsListQa.RevisionsListRowActual));
}
async openDraft() {
try {
await this.page.waitForSelector(slct(RevisionsListQa.RevisionsListRow), {
timeout: REVISIONS_LOAD_TIMEOUT,
});
} catch {
// the revision list is hidden, you need to open
await this.openList();
}
await this.page.click(slct(RevisionsListQa.RevisionsListRowDraft));
}
async openFirstNotActualVersion() {
try {
await this.page.waitForSelector(slct(RevisionsListQa.RevisionsListRow), {
timeout: REVISIONS_LOAD_TIMEOUT,
});
} catch {
// the revision list is hidden, you need to open
await this.openList();
}
const firstNotActualRevision = await this.page
.locator(slct(RevisionsListQa.RevisionsListRowNotActual))
.first();
await firstNotActualRevision.click();
}
async getRevisions() {
return this.page.$$(slct(RevisionsListQa.RevisionsListRow));
}
async makeRevisionActual() {
await this.page.click(slct(RevisionsPanelQa.ButtonMakeActual));
await this.page.waitForSelector(slct(DialogConfirmQA.Dialog));
await this.page.click(
`${slct(DialogConfirmQA.Dialog)} ${slct(DialogConfirmQA.ApplyButton)}`,
);
}
async validateRevisions(expectedNumber: number) {
let revisions = [];
await waitForCondition(async () => {
await this.openList();
revisions = await this.getRevisions();
return revisions.length === expectedNumber;
}).catch(() => {
throw new Error(
`Expected ${expectedNumber} of revisions in the list, but in fact ${revisions.length}`,
);
});
}
async checkRevisionsStatusCount({
all,
actual,
draft,
notActual,
}: {
all: number;
actual?: number;
draft?: number;
notActual?: number;
}) {
await this.openList();
const allRevisions = await this.getRevisions();
const revisionsList = this.page.locator(slct(RevisionsListQa.List));
await expect(allRevisions.length).toBe(all);
if (actual) {
const actualRevisionsCount = await revisionsList
.locator(slct(RevisionsListQa.RevisionsListRowActual))
.count();
await expect(actualRevisionsCount).toBe(actual);
}
if (draft) {
const draftRevisionsCount = await revisionsList
.locator(slct(RevisionsListQa.RevisionsListRowDraft))
.count();
await expect(draftRevisionsCount).toBe(draft);
}
if (notActual) {
const notActualRevisionsCount = await revisionsList
.locator(slct(RevisionsListQa.RevisionsListRowNotActual))
.count();
await expect(notActualRevisionsCount).toBe(notActual);
}
}
async getRevisionIdFromUrl() {
return this.page.evaluate(() => {
const searchParams = new URLSearchParams(window.location.search);
return searchParams.get('revId');
});
}
async waitUntilRevisionPanelDisappear() {
return await waitForCondition(async () => {
return !(await this.page.$(slct(RevisionsPanelQa.RevisionsPanel)));
});
}
async openActualRevision() {
await this.page.click(slct(RevisionsPanelQa.ButtonOpenActual));
}
async openRevisionsListByRevisionsPanelControl() {
await this.page.click(slct(this.showRevisionsActionPanelButtonQa));
}
getRevisionByIdx(idx: number) {
return this.page.locator(slct(RevisionsListQa.RevisionsListRow)).nth(idx);
}
async getRevisionIdByIdx(idx: number) {
return await this.getRevisionByIdx(idx).getAttribute('data-qa-revid');
}
/**
* Close revisions list panel
* @returns Promise that resolves when panel is closed
*/
async closeList(): Promise<void> {
await this.page.locator(slct(RevisionsListQa.ExpandablePanelButtonClose)).click();
}
/**
* Open revision by index and wait for it to load
* @param idx - Index of the revision to open
* @returns Promise that resolves when revision is opened
*/
async openRevisionByIdx(idx: number): Promise<void> {
await this.getRevisionByIdx(idx).click();
}
}