182 lines
7.1 KiB
TypeScript
182 lines
7.1 KiB
TypeScript
import {Page, devices, test} from '@playwright/test';
|
|
|
|
import DashboardPage from '../../../page-objects/dashboard/DashboardPage';
|
|
import {openTestPage, slct, waitForCondition} from '../../../utils';
|
|
import {RobotChartsDashboardUrls} from '../../../utils/constants';
|
|
import datalensTest from '../../../utils/playwright/globalTestDefinition';
|
|
|
|
const SELECTORS = {
|
|
SELECTOR_KEY: 'chartkit-control-select',
|
|
SELECTOR_TITLE: 'chartkit-control-title',
|
|
SELECTOR_ITEMS: '.yc-select-items > .yc-select-item-wrap',
|
|
|
|
CHART_MOBILE_GRAPH: '.chartkit_mobile .chartkit-graph, .chartkit_mobile .gcharts-chart',
|
|
CHART_BASE_KEY: '.chartkit-theme_common',
|
|
CHART_OVERLAY_FOR_CLICK: '[data-qa=chart-widget-overlay]',
|
|
CHART_BAR_RECT: 'g.highcharts-column-series > rect, .gcharts-bar-x__segment',
|
|
|
|
DASH_FULLSCREEN: '[data-qa=chart-widget][data-qa-mod=fullscreen]',
|
|
DASH_NOT_FULLSCREEN: '[data-qa=chart-widget]:not([data-qa-mod=fullscreen])',
|
|
|
|
BACK_BUTTON: '[data-qa=chart-widget-back-icon]',
|
|
|
|
SHEET: '.g-sheet__sheet.g-sheet__sheet_with-transition',
|
|
};
|
|
const PARAMS = {
|
|
TAB_1_TITLE: 'Tab 1',
|
|
TAB_3_TITLE: 'Tab 3',
|
|
};
|
|
const SCREEN_80_PERCENT = 0.8;
|
|
const DEVICE_NAME = 'Galaxy S8';
|
|
|
|
const device = devices[DEVICE_NAME];
|
|
test.use(device);
|
|
|
|
datalensTest.describe(`Dashboards - mobile version on ${DEVICE_NAME}`, () => {
|
|
datalensTest(
|
|
'The mobile version of the dashboard should open correctly and display the selector with the chart',
|
|
async ({page}: {page: Page}) => {
|
|
const dashboardPage = new DashboardPage({page});
|
|
|
|
await openTestPage(page, RobotChartsDashboardUrls.DashboardWithTabsAndSelectors);
|
|
|
|
await dashboardPage.page.waitForSelector(slct(SELECTORS.SELECTOR_KEY));
|
|
|
|
await dashboardPage.page.waitForSelector(SELECTORS.CHART_MOBILE_GRAPH);
|
|
},
|
|
);
|
|
|
|
datalensTest(
|
|
'Tabs on the mobile version of the dashboard are switching successfully',
|
|
async ({page}: {page: Page}) => {
|
|
const dashboardPage = new DashboardPage({page});
|
|
|
|
await openTestPage(page, RobotChartsDashboardUrls.DashboardWithTabsAndSelectors);
|
|
|
|
// waiting for the first tab to load correctly
|
|
await dashboardPage.page.waitForSelector(slct(SELECTORS.SELECTOR_KEY));
|
|
await dashboardPage.page.waitForSelector(SELECTORS.CHART_MOBILE_GRAPH);
|
|
|
|
// switch to the third tab
|
|
await dashboardPage.changeTab({tabName: PARAMS.TAB_3_TITLE});
|
|
|
|
// waiting for the third tab to load correctly
|
|
await dashboardPage.page.waitForSelector(slct(SELECTORS.SELECTOR_TITLE, 'Step'));
|
|
|
|
// back to the first tab
|
|
await dashboardPage.changeTab({tabName: PARAMS.TAB_1_TITLE});
|
|
|
|
// waiting for the first tab to load correctly
|
|
await dashboardPage.page.waitForSelector(slct(SELECTORS.SELECTOR_KEY));
|
|
await dashboardPage.page.waitForSelector(SELECTORS.CHART_MOBILE_GRAPH);
|
|
},
|
|
);
|
|
|
|
datalensTest('The chart opens correctly in full-screen mode', async ({page}: {page: Page}) => {
|
|
const dashboardPage = new DashboardPage({page});
|
|
|
|
await openTestPage(page, RobotChartsDashboardUrls.DashboardWithTabsAndSelectors);
|
|
|
|
await dashboardPage.page.waitForSelector(slct(SELECTORS.SELECTOR_KEY));
|
|
|
|
await dashboardPage.page.waitForSelector(SELECTORS.CHART_MOBILE_GRAPH);
|
|
|
|
// checking the opening of the chart in full-screen mode
|
|
const chartBase = await page.waitForSelector(SELECTORS.CHART_BASE_KEY);
|
|
|
|
const chartOverlay = await page.waitForSelector(SELECTORS.CHART_OVERLAY_FOR_CLICK);
|
|
await chartOverlay.click();
|
|
|
|
await dashboardPage.page.waitForSelector(SELECTORS.DASH_FULLSCREEN);
|
|
const chartBoxFullscreen = await chartBase.boundingBox();
|
|
|
|
expect(chartBoxFullscreen).toBeTruthy();
|
|
|
|
// check that the chart has started to take up the entire width
|
|
expect(chartBoxFullscreen!.width).toStrictEqual(device.viewport.width);
|
|
// and not less than 80% in height
|
|
expect(chartBoxFullscreen!.height / device.viewport.height).toBeGreaterThanOrEqual(
|
|
SCREEN_80_PERCENT,
|
|
);
|
|
|
|
// exiting fullscreen mode
|
|
const backButton = await page.waitForSelector(SELECTORS.BACK_BUTTON);
|
|
|
|
await backButton.click();
|
|
await dashboardPage.page.waitForSelector(SELECTORS.DASH_NOT_FULLSCREEN);
|
|
|
|
// check that when exiting fullscreen mode, the chart size has decreased
|
|
const chartBoxPlain = await chartBase.boundingBox();
|
|
expect(chartBoxPlain?.width).toBeLessThan(chartBoxFullscreen!.width);
|
|
expect(chartBoxPlain?.height).toBeLessThan(chartBoxFullscreen!.height);
|
|
});
|
|
|
|
datalensTest(
|
|
'The selector is successfully opened by a pop-up component from below',
|
|
async ({page}: {page: Page}) => {
|
|
const dashboardPage = new DashboardPage({page});
|
|
|
|
await openTestPage(page, RobotChartsDashboardUrls.DashboardWithTabsAndSelectors);
|
|
|
|
const controlSelect = await dashboardPage.page.waitForSelector(
|
|
slct(SELECTORS.SELECTOR_KEY),
|
|
);
|
|
|
|
// check the number of rendered columns
|
|
let chartBarsCount = 0;
|
|
await waitForCondition(async () => {
|
|
const chartBars = await page.$$(SELECTORS.CHART_BAR_RECT);
|
|
chartBarsCount = chartBars.length;
|
|
|
|
return chartBarsCount > 0;
|
|
});
|
|
|
|
// checking the selector opening with a pop-up window
|
|
await controlSelect.click();
|
|
const controlModal = await page.waitForSelector(SELECTORS.SHEET);
|
|
|
|
// waiting for content load
|
|
await page.waitForSelector(SELECTORS.SELECTOR_ITEMS);
|
|
|
|
const controlBox = await controlModal.boundingBox();
|
|
|
|
// check that the selector has opened from below
|
|
expect(controlBox?.width).toEqual(device.viewport.width);
|
|
await waitForCondition(async () => {
|
|
const box = await controlModal.boundingBox();
|
|
|
|
if (!box) {
|
|
return false;
|
|
}
|
|
|
|
return box.y + box.height === device.viewport.height && box.height > 0 && box.y > 0;
|
|
});
|
|
|
|
const selectItems = await page.$$(SELECTORS.SELECTOR_ITEMS);
|
|
expect(selectItems.length).toBeGreaterThan(0);
|
|
|
|
// select only part of the list
|
|
let selectedItemsCount = 0;
|
|
for (let i = 0; i < selectItems.length; i++) {
|
|
const item = selectItems[i];
|
|
|
|
if (i % 2 === 0) {
|
|
await item.click();
|
|
selectedItemsCount += 1;
|
|
}
|
|
}
|
|
expect(selectedItemsCount).not.toEqual(chartBarsCount);
|
|
|
|
// closing the selector
|
|
await dashboardPage.closeMobileModal();
|
|
|
|
// we expect the number of columns after the filter to be equal to the number of selected elements in the filter
|
|
await waitForCondition(async () => {
|
|
const elements = await page.$$(SELECTORS.CHART_BAR_RECT);
|
|
|
|
return elements.length === selectedItemsCount;
|
|
});
|
|
},
|
|
);
|
|
});
|