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

306 lines
12 KiB
TypeScript

import {expect} from '@playwright/test';
import datalensTest from '../../../utils/playwright/globalTestDefinition';
import {openTestPage, slct} from '../../../utils';
import {
DatasetFieldsTabQa,
DatasetEditorTableSettingsItems,
DatasetFieldContextMenuItemsQA,
DialogFieldEditorQA,
FieldEditorQa,
} from '../../../../src/shared';
import {DatasetsEntities} from '../../../constants/test-entities/datasets';
import DatasetPage from '../../../page-objects/dataset/DatasetPage';
import {GET_PREVIEW_URL} from '../../../page-objects/dataset/constants';
import {getValidatePromise} from '../../../page-objects/dataset/utils';
datalensTest.describe('Dataset basic ui', () => {
const url = `datasets${DatasetsEntities.Basic.url}`;
datalensTest('Invisible row should be hidden', async ({page}) => {
await openTestPage(page, url);
await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
const rowsCount = await page.locator(slct(DatasetFieldsTabQa.FieldNameColumnInput)).count();
const hiddenBtn = page.locator(slct(DatasetFieldsTabQa.FieldVisibleColumnIcon)).first();
await hiddenBtn.click();
const settingsBtn = page.locator(slct(DatasetFieldsTabQa.TableSettingsBtn));
await settingsBtn.click();
const showHiddenMenuItem = await page.waitForSelector(
slct(DatasetEditorTableSettingsItems.ShowHidden),
);
await showHiddenMenuItem.click();
const rowsCountAfterHide = await page
.locator(slct(DatasetFieldsTabQa.FieldNameColumnInput))
.count();
expect(rowsCount).toBeGreaterThan(rowsCountAfterHide);
});
datalensTest('Id should be visible if enabled in settings', async ({page}) => {
await openTestPage(page, url);
await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
const idColumnRowCount = await page
.locator(slct(DatasetFieldsTabQa.FieldIdColumnInput))
.count();
expect(idColumnRowCount).toBe(0);
const settingsBtn = page.locator(slct(DatasetFieldsTabQa.TableSettingsBtn));
await settingsBtn.click();
const showIdMenuItem = await page.waitForSelector(
slct(DatasetEditorTableSettingsItems.ShowId),
);
await showIdMenuItem.click();
const rowsCountAfterEnable = await page
.locator(slct(DatasetFieldsTabQa.FieldIdColumnInput))
.count();
expect(rowsCountAfterEnable).not.toBe(0);
});
datalensTest('Table rows are displayed', async ({page}) => {
await openTestPage(page, url);
await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
const rowsCount = await page.locator(slct(DatasetFieldsTabQa.FieldNameColumnInput)).count();
expect(rowsCount).toBeGreaterThan(0);
});
datalensTest('Field name can be renamed', async ({page}) => {
const datasetPage = new DatasetPage({page});
await openTestPage(page, url);
await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
const fieldInput = datasetPage.datasetFieldsTable.getFieldNameInput();
const {newValue} = await datasetPage.renameFirstField();
const updatedValue = await fieldInput.inputValue();
expect(updatedValue).toBe(newValue);
});
datalensTest('Field description can be edited', async ({page}) => {
const datasetPage = new DatasetPage({page});
await openTestPage(page, url);
await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
const descriptionInput = page
.locator(slct(DatasetFieldsTabQa.FieldDescriptionColumnInput))
.first()
.locator('input');
const newValue = 'test description';
await descriptionInput.fill(newValue);
const promise = datasetPage.waitForSuccessfulResponse(GET_PREVIEW_URL);
await page.keyboard.press('Enter');
await promise;
const updatedValue = await descriptionInput.inputValue();
expect(updatedValue).toBe(newValue);
});
datalensTest('Hidden field is restored when visibility toggled again', async ({page}) => {
const datasetPage = new DatasetPage({page});
await openTestPage(page, url);
await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
const rowsCountBefore = await page
.locator(slct(DatasetFieldsTabQa.FieldNameColumnInput))
.count();
const hiddenBtn = page.locator(slct(DatasetFieldsTabQa.FieldVisibleColumnIcon)).first();
// Hide the field
const hidePromise = datasetPage.waitForSuccessfulResponse(GET_PREVIEW_URL);
await hiddenBtn.click();
await hidePromise;
// Click again to unhide
const unhidePromise = datasetPage.waitForSuccessfulResponse(GET_PREVIEW_URL);
await hiddenBtn.click();
await unhidePromise;
// Enable "Show hidden" to make sure hidden fields would show
const settingsBtn = page.locator(slct(DatasetFieldsTabQa.TableSettingsBtn));
await settingsBtn.click();
const showHiddenMenuItem = await page.waitForSelector(
slct(DatasetEditorTableSettingsItems.ShowHidden),
);
await showHiddenMenuItem.click();
// All rows should still be visible since we toggled back
const rowsCountAfter = await page
.locator(slct(DatasetFieldsTabQa.FieldNameColumnInput))
.count();
expect(rowsCountAfter).toBe(rowsCountBefore);
});
datalensTest('Context menu opens for a field row', async ({page}) => {
await openTestPage(page, url);
const input = await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
await input.hover();
const contextMenuBtn = page.locator(slct(DatasetFieldsTabQa.FieldContextMenuBtn)).first();
await contextMenuBtn.click();
const popup = page.locator(slct(DatasetFieldsTabQa.FieldContextMenuPopup));
await expect(popup).toBeVisible();
const menuItems = popup.locator('li');
const menuItemsCount = await menuItems.count();
expect(menuItemsCount).toBeGreaterThan(0);
});
datalensTest('Field can be duplicated via context menu', async ({page}) => {
const datasetPage = new DatasetPage({page});
await openTestPage(page, url);
const input = await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
await input.hover();
const rowsCountBefore = await page
.locator(slct(DatasetFieldsTabQa.FieldNameColumnInput))
.count();
const contextMenuBtn = page.locator(slct(DatasetFieldsTabQa.FieldContextMenuBtn)).first();
await contextMenuBtn.click();
const popup = page.locator(slct(DatasetFieldsTabQa.FieldContextMenuPopup));
await expect(popup).toBeVisible();
const duplicateItem = popup.locator(slct(DatasetFieldContextMenuItemsQA.DUPLICATE));
const promise = datasetPage.waitForSuccessfulResponse(GET_PREVIEW_URL);
await duplicateItem.click();
await promise;
const rowsCountAfter = await page
.locator(slct(DatasetFieldsTabQa.FieldNameColumnInput))
.count();
expect(rowsCountAfter).toBe(rowsCountBefore + 1);
});
datalensTest('Field can be removed via context menu', async ({page}) => {
const datasetPage = new DatasetPage({page});
await openTestPage(page, url);
const input = await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
await input.hover();
const rowsCountBefore = await page
.locator(slct(DatasetFieldsTabQa.FieldNameColumnInput))
.count();
const contextMenuBtn = page.locator(slct(DatasetFieldsTabQa.FieldContextMenuBtn)).first();
await contextMenuBtn.click();
const popup = page.locator(slct(DatasetFieldsTabQa.FieldContextMenuPopup));
await expect(popup).toBeVisible();
const removeItem = popup.locator(slct(DatasetFieldContextMenuItemsQA.REMOVE));
const promise = datasetPage.waitForSuccessfulResponse(GET_PREVIEW_URL);
await removeItem.click();
await promise;
const rowsCountAfter = await page
.locator(slct(DatasetFieldsTabQa.FieldNameColumnInput))
.count();
expect(rowsCountAfter).toBe(rowsCountBefore - 1);
});
datalensTest('Source column button opens field editor', async ({page}) => {
await openTestPage(page, url);
await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
const sourceBtn = page.locator(slct(DatasetFieldsTabQa.FieldSourceColumnBtn)).first();
await sourceBtn.click();
const fieldEditorDialog = page.locator(slct(FieldEditorQa.Dialog));
await expect(fieldEditorDialog).toBeVisible();
const cancelBtn = page.locator(slct(DialogFieldEditorQA.CancelButton));
await cancelBtn.click();
await expect(fieldEditorDialog).not.toBeVisible();
});
datalensTest('Field name input shows error for invalid field', async ({page}) => {
await openTestPage(page, url);
await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
const fieldInputValue = await page
.locator(slct(DatasetFieldsTabQa.FieldNameColumnInput))
.first()
.locator('input')
.inputValue();
const secondField = page
.locator(slct(DatasetFieldsTabQa.FieldNameColumnInput))
.nth(1)
.locator('input');
await secondField.fill(fieldInputValue);
const validatePromise = getValidatePromise(page);
await page.keyboard.press('Enter');
await validatePromise;
const inputWrapper = page.locator(slct(DatasetFieldsTabQa.FieldNameColumnInput)).nth(1);
const hasError = await inputWrapper.locator('[aria-invalid=true]').count();
expect(hasError).toBeGreaterThan(0);
});
datalensTest('Row checkboxes can be selected', async ({page}) => {
await openTestPage(page, url);
const input = await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
await input.hover();
const checkbox = page.locator(slct(DatasetFieldsTabQa.FieldIndexColumnCheckbox)).first();
await checkbox.click();
const isChecked = await checkbox.locator('input[type="checkbox"]').isChecked();
expect(isChecked).toBe(true);
});
datalensTest('Select all checkbox selects all rows', async ({page}) => {
await openTestPage(page, url);
await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
const rowsCount = await page.locator(slct(DatasetFieldsTabQa.FieldNameColumnInput)).count();
// Click "select all" checkbox in the header
const selectAllCheckbox = page
.locator(slct(DatasetFieldsTabQa.FieldIndexHeaderColumnCheckbox))
.first();
await selectAllCheckbox.click();
const checkedCheckboxes = page
.locator(slct(DatasetFieldsTabQa.FieldIndexColumnCheckbox))
.locator('input[type="checkbox"]:checked');
const checkedCount = await checkedCheckboxes.count();
expect(checkedCount).toBe(rowsCount);
});
datalensTest('Batch action panel appears when rows are selected', async ({page}) => {
await openTestPage(page, url);
const input = await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
await input.hover();
// Select a row
const checkbox = page.locator(slct(DatasetFieldsTabQa.FieldIndexColumnCheckbox)).first();
await checkbox.click();
// Batch action panel should appear
const actionsPanel = page.locator(slct(DatasetFieldsTabQa.BatchActionsPanel));
await expect(actionsPanel).toBeVisible();
});
datalensTest('Batch action panel disappears when selection is cleared', async ({page}) => {
await openTestPage(page, url);
const input = await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
await input.hover();
// Select a row
const checkbox = page.locator(slct(DatasetFieldsTabQa.FieldIndexColumnCheckbox)).first();
await checkbox.click();
const actionsPanel = page.locator(slct(DatasetFieldsTabQa.BatchActionsPanel));
await expect(actionsPanel).toBeVisible();
// Deselect the row
await checkbox.click();
await expect(actionsPanel).not.toBeVisible();
});
});