306 lines
12 KiB
TypeScript
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();
|
|
});
|
|
});
|