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

280 lines
9.0 KiB
TypeScript

import {slct, waitForCondition, fillDatePicker} from '../../utils';
import {BasePageProps} from '../BasePage';
import {ChartPage, ChartType} from '../ChartPage';
import ChartKit from '../wizard/ChartKit';
import ChartSettings from '../wizard/ChartSettings';
import NavigationMinimal, {Ownership} from '../wizard/NavigationMinimal';
import VisualizationItemDialog from '../wizard/VisualizationItemDialog';
import {CommonSelectors} from '../constants/common-selectors';
import PreviewTable from './PreviewTable';
import {
ViewSetupQA,
TabQueryQA,
TabParamsQA,
DialogQLParameterQA,
ScreenEditorQA,
NavigationMinimalPlaceSelectQa,
DlNavigationQA,
WorkbookNavigationMinimalQa,
} from '../../../src/shared';
import SectionVisualization from '../wizard/SectionVisualization';
import {ColumnSettings} from '../wizard/ColumnSettings';
import PlaceholderDialog from '../wizard/PlaceholderDialog';
import {NavigationMinimalPopup} from '../workbook/NavigationMinimalPopup';
interface QLPageProps extends BasePageProps {}
class QLPage extends ChartPage {
previewTable: PreviewTable;
chartkit: ChartKit;
chartSettings: ChartSettings;
visualizationItemDialog: VisualizationItemDialog;
placeholderDialog: PlaceholderDialog;
sectionVisualization: SectionVisualization;
columnSettings: ColumnSettings;
private selectConnectionButtonSelector = slct(TabQueryQA.SelectConnection);
private navigationMinimal: NavigationMinimal;
private navigationMinimalPopup: NavigationMinimalPopup;
constructor({page}: QLPageProps) {
super({page});
this.navigationMinimal = new NavigationMinimal(page);
this.navigationMinimalPopup = new NavigationMinimalPopup(page);
this.chartkit = new ChartKit(page);
this.chartSettings = new ChartSettings(page);
this.previewTable = new PreviewTable(page);
this.visualizationItemDialog = new VisualizationItemDialog(page);
this.placeholderDialog = new PlaceholderDialog(page);
this.sectionVisualization = new SectionVisualization(page);
this.columnSettings = new ColumnSettings(page);
}
async clickCreate() {
await this.page.click(slct(ViewSetupQA.ViewSetupCreate));
}
async selectConnection(connectionName: string, isWorkbook = false) {
await this.page.click(this.selectConnectionButtonSelector);
const list = this.page
.locator(
`${slct(isWorkbook ? WorkbookNavigationMinimalQa.Popup : 'navigation-minimal')} ${slct(isWorkbook ? WorkbookNavigationMinimalQa.List : DlNavigationQA.List)}`,
)
.first();
await list.waitFor({state: 'visible'});
if (isWorkbook) {
await this.navigationMinimalPopup.selectListItem({innerText: connectionName});
} else {
await this.page
.locator(slct('navigation-minimal'))
.locator(slct('navigation-minimal-place-select'))
.click();
await this.page.locator(slct(NavigationMinimalPlaceSelectQa.Connections)).click();
await this.navigationMinimal.typeToSearch(connectionName);
await this.navigationMinimal.selectOwnership(Ownership.All);
await this.navigationMinimal.clickToItem(connectionName);
}
}
async waitForConnectionName(expectedName: string) {
let actualName = '';
await waitForCondition(async () => {
actualName = await this.page.innerText(this.selectConnectionButtonSelector);
return expectedName === actualName;
}).catch((error) => {
console.error(error);
throw new Error(`expectedName: ${expectedName} !== actualName: ${actualName}`);
});
}
async selectChartType(chartType: string) {
await this.page.click(`.ql-view-setup__chart-type-select >> text=${chartType}`, {
force: true,
});
}
async setScript(sqlScript: string) {
await this.page.click('.react-monaco-editor-container');
await this.page.keyboard.insertText(sqlScript);
}
async clearScript() {
await waitForCondition(async () => {
await this.page.click('.react-monaco-editor-container');
// for Windows/Linux select all text
await this.page.keyboard.press('Control+A');
await this.page.keyboard.press('Backspace');
const script: string | null = await this.getScript();
const isEditorEmpty = this.compareScripts('', script);
if (isEditorEmpty) {
return true;
} else {
// for mac os select all text
await this.page.keyboard.press('Meta+A');
await this.page.keyboard.press('Backspace');
const scriptAfterRetry = await this.getScript();
return this.compareScripts('', scriptAfterRetry);
}
}).catch(() => {
throw new Error('Could not clear the editor');
});
}
async runScript() {
await this.page.click(slct('run-ql-script'));
}
async saveQlEntry(entryName: string) {
await this.saveEntry({entryName, chartType: ChartType.QL});
}
async saveExistentQlEntry() {
await this.saveExistentEntry();
}
async switchToQlInitialRevision(initialState: string): Promise<void> {
const waitForConditionPromise = waitForCondition(async () => {
const currentState = await this.getScript();
if (currentState) {
return this.compareScripts(initialState, currentState);
}
return false;
}).catch(() => {
throw new Error('There should be another script in the editor');
});
await this.switchToSecondRevision({waitForConditionPromise});
}
async getScript(): Promise<string | null> {
const editor = await this.page.$('.ql-screen-sql__query-editor .lines-content');
if (!editor) {
return null;
}
return editor.textContent();
}
async saveQlChartAsNew(entryName: string) {
await this.saveAsNewChart(entryName);
}
async openParamsTab() {
await this.page.click(slct(ScreenEditorQA.ParamsTab));
}
async addParam() {
await this.page.click(slct(TabParamsQA.AddParamBtn));
}
async selectParamType(type: string) {
await this.page.click(slct(TabParamsQA.ParamType));
await this.page.click(`${CommonSelectors.SelectItem} >> text=${type}`);
}
async setParamName(name: string) {
const inputLocator = this.page.locator(
`${slct(TabParamsQA.ParamName)} ${CommonSelectors.TextInput}`,
);
await inputLocator.fill(name);
}
async openParamDialog() {
await this.page.click(slct(TabParamsQA.OpenParamDialogBtn));
}
async applyParamDialog() {
await this.page.click('.g-dialog-footer__button_action_apply');
}
async selectDate(dateValue: string) {
await fillDatePicker({
page: this.page,
selector: `${slct(DialogQLParameterQA.Dialog)} .g-text-input__control`,
value: dateValue,
});
}
async selectRangeDate(dateValue: [string | null, string]) {
const startDate = dateValue[0];
const endDate = dateValue[1];
if (startDate) {
await fillDatePicker({
page: this.page,
selector: `${slct(DialogQLParameterQA.Dialog)} ${slct(
DialogQLParameterQA.DatepickerStart,
)} .g-text-input__control`,
value: startDate,
});
}
await fillDatePicker({
page: this.page,
selector: `${slct(DialogQLParameterQA.Dialog)} ${slct(
DialogQLParameterQA.DatepickerEnd,
)} .g-text-input__control`,
value: endDate,
});
}
waitForSomeSuccessfulRender() {
const gchart = this.page.locator('.chartkit .gcharts-chart');
const hcChart = this.page.locator('.chartkit .chartkit-graph');
const metricLocators = [
'.chartkit .chartkit-markup',
'.chartkit .chartkit-indicator',
].join();
const metric = this.page.locator(metricLocators);
const table = this.chartkit.getTableLocator();
return gchart.or(hcChart).or(metric).or(table).waitFor();
}
compareScripts(s1: string | null, s2: string | null) {
if (s1 === null || s2 === null) {
return false;
}
const s1WithoutFormatting = s1
.split('')
.filter((s) => s.trim())
.join('');
const s2WithoutFormatting = s2
.split('')
.filter((s) => s.trim())
.join('');
return s1WithoutFormatting === s2WithoutFormatting;
}
async addEmptyPromQlQuery() {
await this.page.click(slct(TabQueryQA.AddPromQLQueryBtn));
}
async clickConnectionButton() {
await this.page.click(this.selectConnectionButtonSelector);
}
}
export default QLPage;