2026-06-24 21:10:34 +05:00

177 lines
8.5 KiB
TypeScript

import {expect} from '@playwright/test';
import datalensTest from '../../../utils/playwright/globalTestDefinition';
import {openTestPage, slct} from '../../../utils';
import {FieldEditorQa, SectionDatasetQA, VisualizationItemQa} from '../../../../src/shared';
import WizardPage from '../../../page-objects/wizard/WizardPage';
import {DialogParameterDataTypes} from '../../../page-objects/common/DialogParameter';
import {PlaceholderName} from '../../../page-objects/wizard/SectionVisualization';
datalensTest.describe('Wizard', () => {
datalensTest.describe('Fields', () => {
datalensTest.beforeEach(async ({page, config}) => {
await openTestPage(page, config.wizard.urls.WizardBasicDataset);
});
datalensTest('Create formula field', async ({page}) => {
const wizardPage = new WizardPage({page});
const datasetFields = page.locator(slct(SectionDatasetQA.DatasetFields));
// 1. Write the formula in the text field
const newField1 = 'NewFormulaField1';
await expect(
datasetFields.locator(slct(SectionDatasetQA.ItemTitle), {hasText: newField1}),
).not.toBeVisible();
await wizardPage.createNewFieldWithFormula(newField1, '[City]');
const newField1Locator = datasetFields.locator(slct(newField1), {
hasText: newField1,
});
await expect(newField1Locator).toBeVisible();
await expect(newField1Locator).not.toHaveClass(/item-error/);
// 2. Selecting a field for a formula by click
const newField2 = 'NewFormulaField2';
await expect(
datasetFields.locator(slct(SectionDatasetQA.ItemTitle), {hasText: newField2}),
).not.toBeVisible();
await wizardPage.fieldEditor.open();
await wizardPage.fieldEditor.setName(newField2);
await wizardPage.fieldEditor.selectField('City');
await wizardPage.fieldEditor.clickToApplyButton();
const newField2Locator = datasetFields.locator(slct(newField2), {
hasText: newField2,
});
await expect(newField2Locator).toBeVisible();
await expect(newField2Locator).not.toHaveClass(/item-error/);
// 3. Create a field with an invalid formula
const invalidField = 'NewInvalidField';
await expect(
datasetFields.locator(slct(SectionDatasetQA.ItemTitle), {hasText: invalidField}),
).not.toBeVisible();
await wizardPage.fieldEditor.open();
await wizardPage.fieldEditor.setName(invalidField);
await wizardPage.fieldEditor.setFormula('invalid formula');
// An error icon should be displayed in the formula editor
await expect(page.locator('.dl-field-editor__formula-editor-glyph')).toBeVisible();
await wizardPage.fieldEditor.clickToApplyButton();
const invalidFieldLocator = datasetFields.locator(slct(invalidField), {
hasText: invalidField,
});
await expect(invalidFieldLocator).toBeVisible();
await expect(invalidFieldLocator).toHaveClass(/item-error/);
// 4. Create a formula field with a parameter
const parameter = 'p1';
const newField3 = 'NewFormulaFieldWithParameter';
await wizardPage.parameterEditor.openCreateParameter();
await wizardPage.parameterEditor.setName(parameter);
await wizardPage.parameterEditor.setDefaultValue('1');
await wizardPage.parameterEditor.apply();
await wizardPage.createNewFieldWithFormula(
newField3,
'case [City] when [p1] then "param" else [City] end',
);
const newField3Locator = datasetFields.locator(slct(newField3), {
hasText: newField3,
});
await expect(newField3Locator).toBeVisible();
await expect(newField3Locator).not.toHaveClass(/item-error/);
});
datalensTest('Create hierarchy field', async ({page}) => {
const wizardPage = new WizardPage({page});
const datasetFields = page.locator(slct(SectionDatasetQA.DatasetFields));
const newHierarchyField = 'City -> Country';
await wizardPage.openHierarchyEditor();
await wizardPage.hierarchyEditor.setName(newHierarchyField);
await wizardPage.hierarchyEditor.selectFields(['City', 'country']);
await wizardPage.hierarchyEditor.clickSave();
const hierarchyLocator = datasetFields.locator(slct(newHierarchyField), {
hasText: newHierarchyField,
});
await expect(hierarchyLocator).toBeVisible();
await expect(hierarchyLocator).not.toHaveClass(/item-error/);
// You cannot create two hierarchies with the same name
await wizardPage.openHierarchyEditor();
await wizardPage.hierarchyEditor.selectFields(['City', 'country']);
await expect(wizardPage.hierarchyEditor.getApplyButton()).not.toBeDisabled();
await wizardPage.hierarchyEditor.setName(newHierarchyField);
await expect(wizardPage.hierarchyEditor.getHierarchyNameError()).toBeVisible();
await expect(wizardPage.hierarchyEditor.getApplyButton()).toBeDisabled();
});
datalensTest('Hierarchy default name', async ({page}) => {
const wizardPage = new WizardPage({page});
const datasetFields = page.locator(slct(SectionDatasetQA.DatasetFields));
// Add first field with default name
let newHierarchyName = 'New hierarchy';
await wizardPage.openHierarchyEditor();
await wizardPage.hierarchyEditor.selectFields(['City', 'country']);
await wizardPage.hierarchyEditor.clickSave();
let hierarchyLocator = datasetFields.locator(slct(newHierarchyName), {
hasText: newHierarchyName,
});
await expect(hierarchyLocator).toBeVisible();
await expect(hierarchyLocator).not.toHaveClass(/item-error/);
// Add second field with default name
// The created hierarchies should be automatically named "New hierarchy (N)"
newHierarchyName = 'New hierarchy (1)';
await wizardPage.openHierarchyEditor();
await wizardPage.hierarchyEditor.selectFields(['City', 'country']);
await wizardPage.hierarchyEditor.clickSave();
hierarchyLocator = datasetFields.locator(slct(newHierarchyName), {
hasText: newHierarchyName,
});
await expect(hierarchyLocator).toBeVisible();
await expect(hierarchyLocator).not.toHaveClass(/item-error/);
});
datalensTest('Create parameter', async ({page}) => {
const wizardPage = new WizardPage({page});
const datasetFields = page.locator(slct(SectionDatasetQA.DatasetFields));
const parameter = 'p1';
await wizardPage.parameterEditor.openCreateParameter();
await wizardPage.parameterEditor.setName(parameter);
await wizardPage.parameterEditor.selectType(DialogParameterDataTypes.Int);
await wizardPage.parameterEditor.setDefaultValue('1');
await wizardPage.parameterEditor.apply();
const newFieldLocator = datasetFields.locator(slct(parameter), {
hasText: parameter,
});
await expect(newFieldLocator).toBeVisible();
});
datalensTest(
'Auto-generation of a formula when adding a dimension to a section with measures',
async ({page}) => {
const wizardPage = new WizardPage({page});
const fieldName = 'City';
await wizardPage.sectionVisualization.addFieldByClick(PlaceholderName.Y, fieldName);
const sectionField = page
.locator(slct(PlaceholderName.Y))
.locator(slct(fieldName), {
hasText: fieldName,
});
await expect(sectionField).toBeVisible();
await sectionField.hover();
await sectionField.locator(slct(VisualizationItemQa.FormulaIcon)).click();
const fieldEditor = page.locator(slct(FieldEditorQa.Dialog));
await expect(fieldEditor).toBeVisible();
await wizardPage.fieldEditor.checkFormula('countd(str([City]))');
},
);
});
});