100 lines
3.8 KiB
TypeScript
100 lines
3.8 KiB
TypeScript
import {expect} from '@playwright/test';
|
|
import {v4 as uuidv4} from 'uuid';
|
|
|
|
import datalensTest from '../../../utils/playwright/globalTestDefinition';
|
|
import {openTestPage, slct} from '../../../utils';
|
|
import {DatasetFieldsTabQa} from '../../../../src/shared';
|
|
import {DatasetsEntities} from '../../../constants/test-entities/datasets';
|
|
import DatasetPage from '../../../page-objects/dataset/DatasetPage';
|
|
|
|
datalensTest.describe('Dataset unsaved changes navigation prevention', () => {
|
|
const url = `datasets${DatasetsEntities.Basic.url}`;
|
|
let datasetPage: DatasetPage;
|
|
|
|
datalensTest.beforeEach(async ({page}) => {
|
|
datasetPage = new DatasetPage({page});
|
|
await openTestPage(page, url);
|
|
await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
|
|
});
|
|
|
|
datalensTest('No dialog appears on page reload when no changes were made', async ({page}) => {
|
|
let dialogAppeared = false;
|
|
page.on('dialog', async (dialog) => {
|
|
dialogAppeared = true;
|
|
await dialog.accept();
|
|
});
|
|
|
|
await page.reload();
|
|
await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
|
|
|
|
expect(dialogAppeared).toBe(false);
|
|
});
|
|
|
|
datalensTest(
|
|
'beforeunload dialog appears on page reload after making changes',
|
|
async ({page}) => {
|
|
await datasetPage.renameFirstField({value: uuidv4()});
|
|
|
|
const dialogPromise = page.waitForEvent('dialog');
|
|
// Do not await reload — dismiss will cancel it
|
|
page.reload().catch(() => {});
|
|
|
|
const dialog = await dialogPromise;
|
|
expect(dialog.type()).toBe('beforeunload');
|
|
await dialog.dismiss();
|
|
},
|
|
);
|
|
|
|
datalensTest('Dismissing beforeunload dialog keeps user on the page', async ({page}) => {
|
|
const fieldInput = datasetPage.datasetFieldsTable.getFieldNameInput();
|
|
const {newValue} = (await datasetPage.renameFirstField({value: uuidv4()})) ?? {};
|
|
|
|
const dialogPromise = page.waitForEvent('dialog');
|
|
page.reload().catch(() => {});
|
|
|
|
const dialog = await dialogPromise;
|
|
await dialog.dismiss();
|
|
|
|
// URL should still contain the dataset path
|
|
expect(page.url()).toContain(DatasetsEntities.Basic.url);
|
|
|
|
// The modified value should still be present (page was not reloaded)
|
|
const currentValue = await fieldInput.inputValue();
|
|
expect(currentValue).toBe(newValue);
|
|
});
|
|
|
|
datalensTest('Accepting beforeunload dialog allows the page to reload', async ({page}) => {
|
|
const fieldInput = datasetPage.datasetFieldsTable.getFieldNameInput();
|
|
const {originalValue} = (await datasetPage.renameFirstField({value: uuidv4()})) ?? {};
|
|
|
|
page.once('dialog', (dialog) => dialog.accept());
|
|
|
|
await page.reload();
|
|
await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
|
|
|
|
// After reload, unsaved changes are lost — field reverts to original value
|
|
const currentValue = await fieldInput.inputValue();
|
|
expect(currentValue).toBe(originalValue);
|
|
});
|
|
|
|
datalensTest('No dialog appears on page reload after saving changes', async ({page}) => {
|
|
const url = `datasets${DatasetsEntities.WithOtherConnection.url}`;
|
|
await openTestPage(page, url);
|
|
await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
|
|
|
|
await datasetPage.renameFirstField({value: uuidv4()});
|
|
await datasetPage.saveUpdatedDataset();
|
|
|
|
let dialogAppeared = false;
|
|
page.on('dialog', async (dialog) => {
|
|
dialogAppeared = true;
|
|
await dialog.accept();
|
|
});
|
|
|
|
await page.reload();
|
|
await page.waitForSelector(slct(DatasetFieldsTabQa.FieldNameColumnInput));
|
|
|
|
expect(dialogAppeared).toBe(false);
|
|
});
|
|
});
|