import { test } from '@playwright/test'; import { DashboardPage } from '../pages/Dashboard'; import setup from '../setup'; test.describe('Shared view', () => { let dashboard: DashboardPage; let context: any; let mainPageLink: string; let sharedLink: string; test.beforeEach(async ({ page }) => { context = await setup({ page }); dashboard = new DashboardPage(page, context.project); }); test('Grid share ', async ({ page }) => { /** * 1. Create Shared view * - hide column * - add sort * - add filter * - enable download * - disable password * - generate shared view link * - copy link **/ // close 'Team & Auth' tab await dashboard.closeTab({ title: 'Team & Auth' }); await dashboard.treeView.openTable({ title: 'Address' }); // hide column await dashboard.grid.toolbar.fields.toggle({ title: 'Address2' }); // sort await dashboard.grid.toolbar.sort.addSort({ columnTitle: 'District', isAscending: false, isLocallySaved: false, }); // filter await dashboard.grid.toolbar.filter.addNew({ columnTitle: 'Address', value: 'Ab', opType: 'is like', isLocallySaved: false, }); mainPageLink = page.url(); // share with password disabled, download enabled await dashboard.grid.toolbar.clickShareView(); sharedLink = await dashboard.grid.toolbar.shareView.getShareLink(); /** * 2. Access shared view: verify * - access without password * - column order * - data order (sort & filter) * - virtual columns (hm, bt) **/ await page.goto(sharedLink); const sharedPage = new DashboardPage(page, context.project); const expectedColumns = [ { title: 'Address', isVisible: true }, { title: 'Address2', isVisible: false }, { title: 'District', isVisible: true }, { title: 'City', isVisible: true }, { title: 'PostalCode', isVisible: true }, { title: 'Phone', isVisible: true }, { title: 'LastUpdate', isVisible: true }, { title: 'Customer List', isVisible: true }, { title: 'Staff List', isVisible: true }, { title: 'City', isVisible: true }, ]; for (const column of expectedColumns) { await sharedPage.grid.column.verify(column); } const expectedRecords = [ { index: 0, columnHeader: 'Address', value: '1013 Tabuk Boulevard' }, { index: 1, columnHeader: 'Address', value: '1892 Nabereznyje Telny Lane', }, { index: 2, columnHeader: 'Address', value: '1993 Tabuk Lane' }, { index: 0, columnHeader: 'District', value: 'West Bengali' }, { index: 1, columnHeader: 'District', value: 'Tutuila' }, { index: 2, columnHeader: 'District', value: 'Tamil Nadu' }, { index: 0, columnHeader: 'PostalCode', value: '96203' }, { index: 1, columnHeader: 'PostalCode', value: '28396' }, { index: 2, columnHeader: 'PostalCode', value: '64221' }, { index: 0, columnHeader: 'Phone', value: '158399646978' }, { index: 1, columnHeader: 'Phone', value: '478229987054' }, { index: 2, columnHeader: 'Phone', value: '648482415405' }, ]; // verify order of records (original sort & filter) for (const record of expectedRecords) { await sharedPage.grid.cell.verify(record); } const expectedVirtualRecords = [ { index: 0, columnHeader: 'Customer List', count: 1, value: ['2'] }, { index: 1, columnHeader: 'Customer List', count: 1, value: ['2'] }, { index: 0, columnHeader: 'City', count: 1, value: ['Kanchrapara'] }, { index: 1, columnHeader: 'City', count: 1, value: ['Tafuna'] }, ]; // verify virtual records for (const record of expectedVirtualRecords) { await sharedPage.grid.cell.verifyVirtualCell(record); } /** * 3. Shared view: verify * - new sort * - new filter * - new column hidden **/ // create new sort & filter criteria in shared view await sharedPage.grid.toolbar.sort.addSort({ columnTitle: 'Address', isAscending: true, isLocallySaved: true, }); await sharedPage.grid.toolbar.filter.addNew({ columnTitle: 'District', value: 'Ta', opType: 'is like', isLocallySaved: true, }); await sharedPage.grid.toolbar.fields.toggle({ title: 'LastUpdate', isLocallySaved: true }); expectedColumns[6].isVisible = false; // verify new sort & filter criteria for (const column of expectedColumns) { await sharedPage.grid.column.verify(column); } const expectedRecords2 = [ { index: 0, columnHeader: 'Address', value: '1661 Abha Drive' }, { index: 1, columnHeader: 'Address', value: '1993 Tabuk Lane' }, { index: 2, columnHeader: 'Address', value: '381 Kabul Way' }, { index: 0, columnHeader: 'District', value: 'Tamil Nadu' }, { index: 1, columnHeader: 'District', value: 'Tamil Nadu' }, { index: 2, columnHeader: 'District', value: 'Taipei' }, { index: 0, columnHeader: 'PostalCode', value: '14400' }, { index: 1, columnHeader: 'PostalCode', value: '64221' }, { index: 2, columnHeader: 'PostalCode', value: '87272' }, { index: 0, columnHeader: 'Phone', value: '270456873752' }, { index: 1, columnHeader: 'Phone', value: '648482415405' }, { index: 2, columnHeader: 'Phone', value: '55477302294' }, ]; // verify order of records (original sort & filter) for (const record of expectedRecords2) { await sharedPage.grid.cell.verify(record); } /** * 4. Download * - Verify download data (order, filter, sort) **/ // verify download await sharedPage.grid.toolbar.clickDownload('Download as CSV', './expectedData.txt'); }); test('Shared view: password', async ({ page }) => { /** * 5. Enable shared view password, disable download: verify * - Incorrect password * - Correct password * - Download disabled * - Add new record & column after shared view creation; verify **/ await dashboard.closeTab({ title: 'Team & Auth' }); await dashboard.treeView.openTable({ title: 'Country' }); // enable password & verify share link await dashboard.grid.toolbar.clickShareView(); await dashboard.grid.toolbar.shareView.enablePassword('p@ssword'); // disable download await dashboard.grid.toolbar.shareView.toggleDownload(); sharedLink = await dashboard.grid.toolbar.shareView.getShareLink(); await dashboard.grid.toolbar.shareView.close(); // add new column, record after share view creation await dashboard.grid.column.create({ title: 'New Column', }); await dashboard.grid.addNewRow({ index: 25, columnHeader: 'Country', value: 'New Country', }); await page.goto(sharedLink); // todo: Create shared view page // verify if password request modal exists const sharedPage2 = new DashboardPage(page, context.project); await sharedPage2.rootPage.locator('input[placeholder="Enter password"]').fill('incorrect p@ssword'); await sharedPage2.rootPage.click('button:has-text("Unlock")'); await sharedPage2.verifyToast({ message: 'INVALID_SHARED_VIEW_PASSWORD' }); // correct password await sharedPage2.rootPage.locator('input[placeholder="Enter password"]').fill('p@ssword'); await sharedPage2.rootPage.click('button:has-text("Unlock")'); // verify if download button is disabled await sharedPage2.grid.toolbar.verifyDownloadDisabled(); // verify new column & record await sharedPage2.grid.column.verify({ title: 'New Column', isVisible: true, }); await sharedPage2.grid.toolbar.filter.addNew({ columnTitle: 'Country', value: 'New Country', opType: 'is like', isLocallySaved: true, }); await sharedPage2.grid.cell.verify({ index: 0, columnHeader: 'Country', value: 'New Country', }); }); });