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

143 lines
4.5 KiB
TypeScript

import {Page} from '@playwright/test';
import {slct, waitForCondition} from './index';
import {COMMON_CHARTKIT_SELECTORS} from '../page-objects/constants/chartkit';
import {CollectionActionsQa, EntryScope} from '../../src/shared';
export const getStylesFromString = (string = '') => {
return string
.split(';')
.filter(Boolean)
.reduce(
(acc, pair) => {
const [key, value] = pair.split(':').map((val) => val.trim());
acc[key.trim()] = value;
return acc;
},
{} as Record<string, string>,
);
};
export const mapColorsAndShapes = (colors: string[], shapes: string[]) => {
return colors.map((color, index) => ({
color,
shape: shapes[index],
}));
};
export const getXAxisValues = async (page: Page): Promise<(string | null)[]> => {
return await page.evaluate(() => {
let xAxisLabelNodes = [];
const xAxisValues = document.querySelector('.highcharts-xaxis-labels');
if (xAxisValues) {
xAxisLabelNodes = Array.from(xAxisValues.children);
} else {
xAxisLabelNodes = Array.from(document.getElementsByClassName('gcharts-x-axis__label'));
}
return xAxisLabelNodes
.sort((a, b) => {
const firstElAttributes = a.attributes;
const secondElAttributes = b.attributes;
const firstElValue = firstElAttributes.getNamedItem('x')?.value || '';
const secondElValue = secondElAttributes.getNamedItem('x')?.value || '';
const parsedFirstValue = parseFloat(firstElValue);
const parsedSecondValue = parseFloat(secondElValue);
return parsedFirstValue - parsedSecondValue;
})
.map((el) => el.textContent);
});
};
type WaitForValidSearchParamsArgs = {
page: Page;
error: string;
shouldIncludeParam: boolean;
param: string;
};
export async function waitForValidSearchParams({
page,
error,
param,
shouldIncludeParam,
}: WaitForValidSearchParamsArgs) {
await waitForCondition(async () => {
const search = (await page.evaluate('document.location.search')) as string;
const searchParams = new URLSearchParams(search);
if (shouldIncludeParam) {
return searchParams.get(param);
} else {
return !searchParams.get(param);
}
}).catch(() => {
throw new Error(error);
});
}
export const hoverTooltip = async (page: Page, chartId: string) => {
const plot = page
.locator(slct(`chartkit-body-entry-${chartId}`))
.locator(COMMON_CHARTKIT_SELECTORS.chart);
await plot.waitFor({state: 'visible'});
const plotBox = await plot.boundingBox();
if (!plotBox) {
throw Error('Chart boundingBox is null');
}
const [x, y] = [plotBox.width / 2, plotBox.height / 2];
await plot.hover({position: {x, y}});
await plot.hover({position: {x: x + 1, y: y + 1}});
};
export async function isEnabledFeature(page: Page, featureName: string) {
// problems with fair DL imports, that's why using evaluate window
const isDynamicFeature = await page.evaluate(`window.DL.dynamicFeatures?.${featureName}`);
const isFeature = await page.evaluate(`window.DL.features?.${featureName}`);
return Boolean(typeof isDynamicFeature === 'undefined' ? isFeature : isDynamicFeature);
}
export function expectArraysEqualUnordered(actual: unknown[], expected: unknown[]) {
expect(actual).toHaveLength(expected.length);
expected.forEach((expectedItem) => {
expect(actual).toContainEqual(expectedItem);
});
actual.forEach((actualItem) => {
expect(expected).toContainEqual(actualItem);
});
}
export const createSharedEntry = async ({
page,
scope,
}: {
page: Page;
scope: EntryScope.Dataset | EntryScope.Connection;
}) => {
const sharedObjectsMenuItem = page.locator(slct(CollectionActionsQa.SharedObjectsMenuItem));
await sharedObjectsMenuItem.hover();
switch (scope) {
case EntryScope.Connection: {
const sharedConnectionCreateBtn = page.locator(
slct(CollectionActionsQa.SharedConnectionCreateBtn),
);
await sharedConnectionCreateBtn.click();
break;
}
case EntryScope.Dataset: {
const sharedDatasetCreateBtn = page.locator(
slct(CollectionActionsQa.SharedDatasetCreateBtn),
);
await sharedDatasetCreateBtn.click();
break;
}
}
};