From 664188b7e0fea3b27e2bdf28ff221ae432628f37 Mon Sep 17 00:00:00 2001 From: Ashley Harrison Date: Wed, 30 Jul 2025 09:15:01 +0100 Subject: [PATCH] Chore: Remove `panels-suite` from cypress tests (#108709) remove panels-suite from cypress tests --- .github/CODEOWNERS | 12 ++ .github/workflows/pr-e2e-tests.yml | 2 - .../panels-suite/datagrid-data-change.spec.ts | 56 ++++++ .../datagrid-editing-features.spec.ts | 183 ++++++++++++++++++ e2e/panels-suite/dashlist.spec.ts | 41 ---- e2e/panels-suite/datagrid-data-change.spec.ts | 36 ---- .../datagrid-editing-features.spec.ts | 159 --------------- .../frontend-sandbox-panel.spec.ts | 135 ------------- e2e/panels-suite/geomap-layer-types.spec.ts | 99 ---------- e2e/panels-suite/geomap-map-controls.spec.ts | 70 ------- ...eomap-spatial-operations-transform.spec.ts | 98 ---------- e2e/panels-suite/panelEdit_base.spec.ts | 109 ----------- e2e/panels-suite/panelEdit_queries.spec.ts | 99 ---------- e2e/panels-suite/panelEdit_transforms.spec.ts | 28 --- 14 files changed, 251 insertions(+), 876 deletions(-) create mode 100644 e2e-playwright/panels-suite/datagrid-data-change.spec.ts create mode 100644 e2e-playwright/panels-suite/datagrid-editing-features.spec.ts delete mode 100644 e2e/panels-suite/dashlist.spec.ts delete mode 100644 e2e/panels-suite/datagrid-data-change.spec.ts delete mode 100644 e2e/panels-suite/datagrid-editing-features.spec.ts delete mode 100644 e2e/panels-suite/frontend-sandbox-panel.spec.ts delete mode 100644 e2e/panels-suite/geomap-layer-types.spec.ts delete mode 100644 e2e/panels-suite/geomap-map-controls.spec.ts delete mode 100644 e2e/panels-suite/geomap-spatial-operations-transform.spec.ts delete mode 100644 e2e/panels-suite/panelEdit_base.spec.ts delete mode 100644 e2e/panels-suite/panelEdit_queries.spec.ts delete mode 100644 e2e/panels-suite/panelEdit_transforms.spec.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 4cf7c2c931f..e4c805b9850 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -408,6 +408,18 @@ /e2e/cloud-plugins-suite/ @grafana/partner-datasources /e2e-playwright/ @grafana/grafana-frontend-platform /e2e-playwright/dashboard-new-layouts @grafana/dashboards-squad +/e2e-playwright/panels-suite/dashlist.spec.ts @grafana/grafana-search-navigate-organise +/e2e-playwright/panels-suite/datagrid-data-change.spec.ts @grafana/dataviz-squad +/e2e-playwright/panels-suite/datagrid-editing-features.spec.ts @grafana/dataviz-squad +/e2e-playwright/panels-suite/frontend-sandbox-panel.spec.ts @grafana/plugins-platform-frontend +/e2e-playwright/panels-suite/geomap-layer-types.spec.ts @grafana/dataviz-squad +/e2e-playwright/panels-suite/geomap-map-controls.spec.ts @grafana/dataviz-squad +/e2e-playwright/panels-suite/geomap-spatial-operations-transform.spec.ts @grafana/dataviz-squad +/e2e-playwright/panels-suite/panelEdit_base.spec.ts @grafana/dashboards-squad +/e2e-playwright/panels-suite/panelEdit_queries.spec.ts @grafana/dashboards-squad +/e2e-playwright/panels-suite/panelEdit_transforms.spec.ts @grafana/datapro +/e2e-playwright/panels-suite/table-kitchenSink.spec.ts @grafana/dataviz-squad +/e2e-playwright/panels-suite/table-sparkline.spec.ts @grafana/dataviz-squad /e2e-playwright/plugin-e2e/ @grafana/oss-big-tent @grafana/partner-datasources /e2e-playwright/plugin-e2e/plugin-e2e-api-tests/ @grafana/plugins-platform-frontend /e2e-playwright/test-plugins/grafana-extensionstest-app/ @grafana/plugins-platform-frontend diff --git a/.github/workflows/pr-e2e-tests.yml b/.github/workflows/pr-e2e-tests.yml index ce7703d2b76..bbae7d86c65 100644 --- a/.github/workflows/pr-e2e-tests.yml +++ b/.github/workflows/pr-e2e-tests.yml @@ -143,8 +143,6 @@ jobs: path: e2e/various-suite - suite: dashboards-suite path: e2e/dashboards-suite - - suite: panels-suite - path: e2e/panels-suite - suite: various-suite (old arch) path: e2e/old-arch/various-suite flags: --flags="--env dashboardScene=false" diff --git a/e2e-playwright/panels-suite/datagrid-data-change.spec.ts b/e2e-playwright/panels-suite/datagrid-data-change.spec.ts new file mode 100644 index 00000000000..0b996d82381 --- /dev/null +++ b/e2e-playwright/panels-suite/datagrid-data-change.spec.ts @@ -0,0 +1,56 @@ +import { test, expect } from '@grafana/plugin-e2e'; + +const DASHBOARD_ID = 'c01bf42b-b783-4447-a304-8554cee1843b'; +const DATAGRID_SELECT_SERIES = 'Datagrid Select series'; + +test.use({ + featureToggles: { + enableDatagridEditing: true, + }, +}); + +// TODO enable this test when panel goes live +test.describe.skip( + 'Datagrid data changes', + { + tag: ['@panels'], + }, + () => { + test('Tests changing data in the grid', async ({ gotoDashboardPage, selectors, page }) => { + const dashboardPage = await gotoDashboardPage({ + uid: DASHBOARD_ID, + queryParams: new URLSearchParams({ editPanel: '1' }), + }); + + // Check that the data is series A + await expect( + dashboardPage.getByGrafanaSelector( + selectors.components.PanelEditor.OptionsPane.fieldLabel(DATAGRID_SELECT_SERIES) + ) + ).toBeVisible(); + await expect(page.getByTestId('glide-cell-2-0')).toHaveText('1'); + await expect(page.getByTestId('glide-cell-2-1')).toHaveText('20'); + await expect(page.getByTestId('glide-cell-2-2')).toHaveText('90'); + + // Change the series to B + const seriesInput = dashboardPage + .getByGrafanaSelector(selectors.components.PanelEditor.OptionsPane.fieldLabel(DATAGRID_SELECT_SERIES)) + .locator('input'); + await seriesInput.fill('B'); + await seriesInput.press('Enter'); + await expect(page.getByTestId('glide-cell-2-3')).toHaveText('30'); + await expect(page.getByTestId('glide-cell-2-4')).toHaveText('40'); + await expect(page.getByTestId('glide-cell-2-5')).toHaveText('50'); + + // Edit datagrid which triggers a snapshot query + await page.locator('.dvn-scroller').click({ position: { x: 200, y: 100 } }); + await expect(page.getByTestId('glide-cell-2-1')).toHaveAttribute('aria-selected', 'true'); + await page.keyboard.type('12'); + await page.keyboard.press('Enter'); + + await page.getByTestId('data-testid Confirm Modal Danger Button').click(); + + await expect(page.getByTestId('query-editor-row')).toContainText('Snapshot'); + }); + } +); diff --git a/e2e-playwright/panels-suite/datagrid-editing-features.spec.ts b/e2e-playwright/panels-suite/datagrid-editing-features.spec.ts new file mode 100644 index 00000000000..8fb7a9eab81 --- /dev/null +++ b/e2e-playwright/panels-suite/datagrid-editing-features.spec.ts @@ -0,0 +1,183 @@ +import { test, expect } from '@grafana/plugin-e2e'; + +const DASHBOARD_ID = 'c01bf42b-b783-4447-a304-8554cee1843b'; +const DATAGRID_CANVAS = 'data-grid-canvas'; + +test.use({ + featureToggles: { + enableDatagridEditing: true, + }, +}); + +// TODO enable this test when panel goes live +test.describe.skip( + 'Datagrid data changes', + { + tag: ['@panels'], + }, + () => { + test('Tests changing data in the grid', async ({ gotoDashboardPage, selectors, page }) => { + await gotoDashboardPage({ + uid: DASHBOARD_ID, + queryParams: new URLSearchParams({ editPanel: '1' }), + }); + + // Edit datagrid which triggers a snapshot query + await page.locator('.dvn-scroller').click({ position: { x: 200, y: 100 } }); + await expect(page.getByTestId('glide-cell-2-1')).toHaveAttribute('aria-selected', 'true'); + await page.keyboard.type('123'); + await page.keyboard.press('Enter'); + + await page.getByTestId('data-testid Confirm Modal Danger Button').click(); + + // Delete a cell + await page.locator('.dvn-scroller').click({ position: { x: 200, y: 200 } }); + await page.keyboard.press('Delete'); + await expect(page.getByTestId('glide-cell-2-4')).toHaveText('0'); + + // Delete a selection + await page.locator('.dvn-scroller').click({ position: { x: 50, y: 100 }, modifiers: ['Shift'] }); + await page.keyboard.press('Delete'); + await expect(page.getByTestId('glide-cell-2-3')).toHaveText('0'); + await expect(page.getByTestId('glide-cell-2-2')).toHaveText('0'); + await expect(page.getByTestId('glide-cell-2-1')).toHaveText('0'); + await expect(page.getByTestId('glide-cell-2-0')).toHaveText('1'); + await expect(page.getByTestId('glide-cell-1-3')).toHaveText(''); + await expect(page.getByTestId('glide-cell-1-2')).toHaveText(''); + await expect(page.getByTestId('glide-cell-1-1')).toHaveText(''); + await expect(page.getByTestId('glide-cell-1-0')).not.toHaveText(''); + + // Clear column through context menu + await page.locator('.dvn-scroller').click({ button: 'right', position: { x: 200, y: 100 } }); + await page.locator('[aria-label="Context menu"]').click({ position: { x: 100, y: 120 } }); // click clear column + await expect(page.getByTestId('glide-cell-2-0')).toHaveText('0'); + await expect(page.getByTestId('glide-cell-2-4')).toHaveText('0'); + + // Clear row through context menu + await page.locator('.dvn-scroller').click({ position: { x: 200, y: 220 } }); + await page.keyboard.type('1123'); + await page.keyboard.press('Enter'); + await page.locator('.dvn-scroller').click({ button: 'right', position: { x: 200, y: 220 } }); + await page.locator('[aria-label="Context menu"]').click({ position: { x: 100, y: 100 } }); // click clear row + await expect(page.getByTestId('glide-cell-1-4')).toHaveText(''); + await expect(page.getByTestId('glide-cell-2-4')).toHaveText('0'); + + // get the data back + await page.reload(); + + // Clear row through row selector + await page.locator('.dvn-scroller').click({ position: { x: 20, y: 190 } }); + await page.locator('.dvn-scroller').click({ position: { x: 20, y: 90 }, modifiers: ['Shift'] }); // with shift to select all rows between clicks + await page.keyboard.press('Delete'); + await page.getByTestId('data-testid Confirm Modal Danger Button').click(); + await expect(page.getByTestId('glide-cell-1-4')).toHaveText(''); + await expect(page.getByTestId('glide-cell-1-3')).toHaveText(''); + await expect(page.getByTestId('glide-cell-1-2')).toHaveText(''); + await expect(page.getByTestId('glide-cell-1-1')).toHaveText(''); + await expect(page.getByTestId('glide-cell-2-4')).toHaveText('0'); + await expect(page.getByTestId('glide-cell-2-3')).toHaveText('0'); + await expect(page.getByTestId('glide-cell-2-2')).toHaveText('0'); + await expect(page.getByTestId('glide-cell-2-1')).toHaveText('0'); + await page.reload(); + await page.locator('.dvn-scroller').click({ position: { x: 20, y: 190 } }); + await page.locator('.dvn-scroller').click({ position: { x: 20, y: 90 }, modifiers: ['Meta'] }); // with cmd to select only clicked rows + await page.keyboard.press('Delete'); + + await page.getByTestId('data-testid Confirm Modal Danger Button').click(); + + await expect(page.getByTestId('glide-cell-1-1')).toHaveText(''); + await expect(page.getByTestId('glide-cell-2-1')).toHaveText('0'); + await expect(page.getByTestId('glide-cell-2-4')).toHaveText('0'); + await expect(page.getByTestId('glide-cell-1-4')).toHaveText(''); + + // Remove all data + await page.locator('.dvn-scroller').click({ button: 'right', position: { x: 100, y: 100 } }); + await page.locator('body').click({ position: { x: 150, y: 420 } }); + await expect(page.getByTestId(DATAGRID_CANVAS).locator('th')).toHaveCount(0); + + await page.reload(); + + // Delete column through header dropdown menu + await page.locator('.dvn-scroller').click({ position: { x: 250, y: 15 } }); // click header dropdown + await page.locator('body').click({ position: { x: 450, y: 420 } }); // click delete column + await page.getByTestId('data-testid Confirm Modal Danger Button').click(); + await expect(page.getByTestId(DATAGRID_CANVAS).locator('th')).toHaveCount(1); + + // Delete row through context menu + await page.locator('.dvn-scroller').click({ button: 'right', position: { x: 100, y: 100 } }); + await page.locator('[aria-label="Context menu"]').click({ position: { x: 10, y: 10 } }); + await expect(page.getByTestId(DATAGRID_CANVAS).locator('tbody tr')).toHaveCount(6); // there are 5 data rows + 1 for the add new row btns + + // Delete rows through row selector + await page.locator('.dvn-scroller').click({ position: { x: 20, y: 190 } }); + await page.locator('.dvn-scroller').click({ position: { x: 20, y: 90 }, modifiers: ['Shift'] }); // with shift to select all rows between clicks + await page.locator('.dvn-scroller').click({ button: 'right', position: { x: 100, y: 100 } }); + await page.locator('[aria-label="Context menu"]').click({ position: { x: 10, y: 10 } }); + await expect(page.getByTestId(DATAGRID_CANVAS).locator('tbody tr')).toHaveCount(2); // there are 1 data rows + 1 for the add new row btns + await page.reload(); + await page.locator('.dvn-scroller').click({ position: { x: 20, y: 190 } }); + await page.locator('.dvn-scroller').click({ position: { x: 20, y: 90 }, modifiers: ['Meta'] }); // with cmd to select only clicked rows + await page.locator('.dvn-scroller').click({ button: 'right', position: { x: 40, y: 90 } }); + await page.locator('[aria-label="Context menu"]').click({ position: { x: 10, y: 10 } }); + await page.getByTestId('data-testid Confirm Modal Danger Button').click(); + await expect(page.getByTestId(DATAGRID_CANVAS).locator('tbody tr')).toHaveCount(5); // there are 5 data rows + 1 for the add new row btns + + // Delete column through context menu + await page.locator('.dvn-scroller').click({ button: 'right', position: { x: 100, y: 100 } }); + await page.locator('[aria-label="Context menu"]').click({ position: { x: 10, y: 50 } }); + await expect(page.getByTestId(DATAGRID_CANVAS).locator('th')).toHaveCount(1); + + await page.reload(); + + // Add a new column + await page.locator('body').click({ position: { x: 350, y: 200 } }); + await page.keyboard.type('New Column'); + await page.keyboard.press('Enter'); + await page.getByTestId('data-testid Confirm Modal Danger Button').click(); + await page.locator('body').click({ position: { x: 350, y: 230 } }); + await page.keyboard.type('Value 1'); + await page.keyboard.press('Enter'); + await page.keyboard.type('Value 2'); + await page.keyboard.press('Enter'); + await page.keyboard.type('Value 3'); + await page.keyboard.press('Enter'); + await page.keyboard.type('Value 4'); + await page.keyboard.press('Enter'); + await page.keyboard.type('Value 5'); + await page.keyboard.press('Enter'); + await page.keyboard.type('Value 6'); + await page.keyboard.press('Enter'); + await expect(page.getByTestId(DATAGRID_CANVAS).locator('th')).toHaveCount(3); + + // Rename a column + await page.locator('.dvn-scroller').click({ position: { x: 250, y: 15 } }); // click header dropdown + await page.locator('body').click({ position: { x: 450, y: 380 } }); + await page.keyboard.press('Control+a'); // select all + await page.keyboard.press('Backspace'); + await page.keyboard.type('Renamed column'); + await page.keyboard.press('Enter'); + await expect(page.getByTestId(DATAGRID_CANVAS).locator('th')).toContainText('Renamed column'); + + // Change column field type + await page.locator('.dvn-scroller').click({ position: { x: 310, y: 15 } }); + await page.locator('[aria-label="Context menu"]').click({ position: { x: 50, y: 50 } }); + await page.locator('.dvn-scroller').click({ position: { x: 200, y: 100 } }); + await page.keyboard.type('Str Value'); + await page.keyboard.press('Enter'); + await expect(page.getByTestId(DATAGRID_CANVAS).locator('tr')).toContainText('Str Value'); + + // Select all rows through row selection + await page.locator('.dvn-scroller').click({ position: { x: 10, y: 10 } }); + await expect(page.getByTestId(DATAGRID_CANVAS).locator('[aria-selected="true"]')).toHaveCount(6); + + // Add a new row + await page.locator('.dvn-scroller').click({ position: { x: 200, y: 250 } }); + await page.keyboard.type('123'); + await page.locator('.dvn-scroller').click({ position: { x: 50, y: 250 } }); + await page.keyboard.type('Val'); + await page.keyboard.press('Enter'); + await expect(page.getByTestId(DATAGRID_CANVAS).locator('tbody tr')).toContainText('Val'); + await expect(page.getByTestId(DATAGRID_CANVAS).locator('tbody tr')).toHaveCount(8); + }); + } +); diff --git a/e2e/panels-suite/dashlist.spec.ts b/e2e/panels-suite/dashlist.spec.ts deleted file mode 100644 index 002cf235e82..00000000000 --- a/e2e/panels-suite/dashlist.spec.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { e2e } from '../utils'; -const PAGE_UNDER_TEST = 'a6801696-cc53-4196-b1f9-2403e3909185/panel-tests-dashlist-variables'; - -describe('DashList panel', () => { - beforeEach(() => { - e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); - }); - - // this is to prevent the fix for https://github.com/grafana/grafana/issues/76800 from regressing - it('should pass current variable values correctly when `Include current template variable values` is set', () => { - e2e.flows.openDashboard({ uid: PAGE_UNDER_TEST }); - - // check the initial value of the urls contain the variable value correctly - e2e.components.Panels.Panel.title('Include time range and variables enabled') - .should('be.visible') - .within(() => { - cy.get('a').each(($el) => { - cy.wrap($el).should('have.attr', 'href').and('contain', 'var-server=A'); - }); - }); - - // update variable to b - e2e.pages.Dashboard.SubMenu.submenuItemLabels('server') - .parent() - .within(() => { - cy.get('input').click(); - }); - e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('B').click(); - // blur the dropdown - cy.get('body').click(); - - // check the urls are updated with the new variable value - e2e.components.Panels.Panel.title('Include time range and variables enabled') - .should('be.visible') - .within(() => { - cy.get('a').each(($el) => { - cy.wrap($el).should('have.attr', 'href').and('contain', 'var-server=B'); - }); - }); - }); -}); diff --git a/e2e/panels-suite/datagrid-data-change.spec.ts b/e2e/panels-suite/datagrid-data-change.spec.ts deleted file mode 100644 index 583f30e267f..00000000000 --- a/e2e/panels-suite/datagrid-data-change.spec.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { e2e } from '../utils'; - -const DASHBOARD_ID = 'c01bf42b-b783-4447-a304-8554cee1843b'; -const DATAGRID_SELECT_SERIES = 'Datagrid Select series'; - -//TODO enable this test when panel goes live -describe.skip('Datagrid data changes', () => { - beforeEach(() => { - e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); - }); - - it('Tests changing data in the grid', () => { - e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { editPanel: 1 } }); - - // Check that the data is series A - e2e.components.PanelEditor.OptionsPane.fieldLabel(DATAGRID_SELECT_SERIES).should('be.visible'); - cy.get('[data-testid="glide-cell-2-0"]').should('have.text', '1'); - cy.get('[data-testid="glide-cell-2-1"]').should('have.text', '20'); - cy.get('[data-testid="glide-cell-2-2"]').should('have.text', '90'); - - // Change the series to B - e2e.components.PanelEditor.OptionsPane.fieldLabel(DATAGRID_SELECT_SERIES).find('input').type('B {enter}'); - cy.get('[data-testid="glide-cell-2-3"]').should('have.text', '30'); - cy.get('[data-testid="glide-cell-2-4"]').should('have.text', '40'); - cy.get('[data-testid="glide-cell-2-5"]').should('have.text', '50'); - - // Edit datagrid which triggers a snapshot query - cy.get('.dvn-scroller').click(200, 100); - cy.get('[data-testid="glide-cell-2-1"]').should('have.attr', 'aria-selected', 'true'); - cy.get('body').type('12{enter}', { delay: 500 }); - - cy.get('[data-testid="data-testid Confirm Modal Danger Button"]').click(); - - cy.get('[data-testid="query-editor-row"]').contains('Snapshot'); - }); -}); diff --git a/e2e/panels-suite/datagrid-editing-features.spec.ts b/e2e/panels-suite/datagrid-editing-features.spec.ts deleted file mode 100644 index e3592f60388..00000000000 --- a/e2e/panels-suite/datagrid-editing-features.spec.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { e2e } from '../utils'; - -const DASHBOARD_ID = 'c01bf42b-b783-4447-a304-8554cee1843b'; -const DATAGRID_CANVAS = 'data-grid-canvas'; - -//TODO enable this test when panel goes live -describe.skip('Datagrid data changes', () => { - beforeEach(() => { - e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); - }); - - it('Tests changing data in the grid', () => { - e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { editPanel: 1 } }); - - // Edit datagrid which triggers a snapshot query - cy.get('.dvn-scroller').click(200, 100); - cy.get('[data-testid="glide-cell-2-1"]').should('have.attr', 'aria-selected', 'true'); - cy.get('body').type('123{enter}', { delay: 500 }); - - cy.get('[data-testid="data-testid Confirm Modal Danger Button"]').click(); - - // Delete a cell - cy.get('.dvn-scroller').click(200, 200); - cy.get('body').type('{del}'); - cy.get('[data-testid="glide-cell-2-4"]').should('have.text', 0); - - // Delete a selection - cy.get('.dvn-scroller').click(50, 100, { shiftKey: true }); - cy.get('body').type('{del}'); - cy.get('[data-testid="glide-cell-2-3"]').should('have.text', 0); - cy.get('[data-testid="glide-cell-2-2"]').should('have.text', 0); - cy.get('[data-testid="glide-cell-2-1"]').should('have.text', 0); - cy.get('[data-testid="glide-cell-2-0"]').should('have.text', 1); - cy.get('[data-testid="glide-cell-1-3"]').should('have.text', ''); - cy.get('[data-testid="glide-cell-1-2"]').should('have.text', ''); - cy.get('[data-testid="glide-cell-1-1"]').should('have.text', ''); - cy.get('[data-testid="glide-cell-1-0"]').should('not.have.text', ''); - - // Clear column through context menu - cy.get('.dvn-scroller').rightclick(200, 100); - cy.get('[aria-label="Context menu"]').click(100, 120); // click clear column - cy.get('[data-testid="glide-cell-2-0"]').should('have.text', 0); - cy.get('[data-testid="glide-cell-2-4"]').should('have.text', 0); - - // Clear row through context menu - cy.get('.dvn-scroller').click(200, 220); - cy.get('body').type('1123{enter}', { delay: 500 }); - cy.get('.dvn-scroller').rightclick(200, 220); - cy.get('[aria-label="Context menu"]').click(100, 100); // click clear row - cy.get('[data-testid="glide-cell-1-4"]').should('have.text', ''); - cy.get('[data-testid="glide-cell-2-4"]').should('have.text', 0); - - // get the data back - cy.reload(); - - // Clear row through row selector - cy.get('.dvn-scroller').click(20, 190, { waitForAnimations: true }); - cy.get('.dvn-scroller').click(20, 90, { shiftKey: true, waitForAnimations: true }); // with shift to select all rows between clicks - cy.get('body').type('{del}'); - cy.get('[data-testid="data-testid Confirm Modal Danger Button"]').click(); - cy.get('[data-testid="glide-cell-1-4"]').should('have.text', ''); - cy.get('[data-testid="glide-cell-1-3"]').should('have.text', ''); - cy.get('[data-testid="glide-cell-1-2"]').should('have.text', ''); - cy.get('[data-testid="glide-cell-1-1"]').should('have.text', ''); - cy.get('[data-testid="glide-cell-2-4"]').should('have.text', 0); - cy.get('[data-testid="glide-cell-2-3"]').should('have.text', 0); - cy.get('[data-testid="glide-cell-2-2"]').should('have.text', 0); - cy.get('[data-testid="glide-cell-2-1"]').should('have.text', 0); - cy.wait(1000); - cy.reload(); - cy.get('.dvn-scroller').click(20, 190, { waitForAnimations: true }); - cy.get('.dvn-scroller').click(20, 90, { commandKey: true, waitForAnimations: true }); // with cmd to select only clicked rows - cy.get('body').type('{del}'); - - cy.get('[data-testid="data-testid Confirm Modal Danger Button"]').click(); - - cy.get('[data-testid="glide-cell-1-1"]').should('have.text', ''); - cy.get('[data-testid="glide-cell-2-1"]').should('have.text', 0); - cy.get('[data-testid="glide-cell-2-4"]').should('have.text', 0); - cy.get('[data-testid="glide-cell-1-4"]').should('have.text', ''); - - // Remove all data - cy.get('.dvn-scroller').rightclick(100, 100); - cy.get('body').click(150, 420); - cy.get(`[data-testid="${DATAGRID_CANVAS}"] th`).should('have.length', 0); - - cy.reload(); - - // Delete column through header dropdown menu - cy.get('.dvn-scroller').click(250, 15); // click header dropdown - cy.get('body').click(450, 420); // click delete column - cy.get('[data-testid="data-testid Confirm Modal Danger Button"]').click(); - cy.get(`[data-testid="${DATAGRID_CANVAS}"] th`).should('have.length', 1); - - // Delete row through context menu - cy.get('.dvn-scroller').rightclick(100, 100); - cy.get('[aria-label="Context menu"]').click(10, 10); - cy.get(`[data-testid="${DATAGRID_CANVAS}"] tbody tr`).should('have.length', 6); // there are 5 data rows + 1 for the add new row btns - - // Delete rows through row selector - cy.get('.dvn-scroller').click(20, 190, { waitForAnimations: true }); - cy.get('.dvn-scroller').click(20, 90, { shiftKey: true, waitForAnimations: true }); // with shift to select all rows between clicks - cy.get('.dvn-scroller').rightclick(100, 100); - cy.get('[aria-label="Context menu"]').click(10, 10); - cy.get(`[data-testid="${DATAGRID_CANVAS}"] tbody tr`).should('have.length', 2); // there are 1 data rows + 1 for the add new row btns - cy.reload(); - cy.get('.dvn-scroller').click(20, 190, { waitForAnimations: true }); - cy.get('.dvn-scroller').click(20, 90, { commandKey: true, waitForAnimations: true }); // with shift to select all rows between clicks - cy.get('.dvn-scroller').rightclick(40, 90); - cy.get('[aria-label="Context menu"]').click(10, 10); - cy.get('[data-testid="data-testid Confirm Modal Danger Button"]').click(); - cy.get(`[data-testid="${DATAGRID_CANVAS}"] tbody tr`).should('have.length', 5); // there are 5 data rows + 1 for the add new row btns - - // Delete column through context menu - cy.get('.dvn-scroller').rightclick(100, 100); - cy.get('[aria-label="Context menu"]').click(10, 50); - cy.get(`[data-testid="${DATAGRID_CANVAS}"] th`).should('have.length', 1); - - cy.reload(); - cy.wait(3000); - - // Add a new column - cy.get('body').click(350, 200).type('New Column{enter}'); - cy.get('[data-testid="data-testid Confirm Modal Danger Button"]').click(); - cy.get('body') - .click(350, 230) - .type('Value 1{enter}') - .type('Value 2{enter}') - .type('Value 3{enter}') - .type('Value 4{enter}') - .type('Value 5{enter}') - .type('Value 6{enter}'); - cy.get(`[data-testid="${DATAGRID_CANVAS}"] th`).should('have.length', 3); - - // Rename a column - cy.get('.dvn-scroller').click(250, 15); // click header dropdown - cy.get('body').click(450, 380).type('{selectall}{backspace}Renamed column{enter}'); - cy.get(`[data-testid="${DATAGRID_CANVAS}"] th`).contains('Renamed column'); - - // Change column field type - cy.get('.dvn-scroller').click(310, 15); - cy.get('[aria-label="Context menu"]').click(50, 50); - cy.get('.dvn-scroller').click(200, 100); - cy.get('body').type('Str Value{enter}'); - cy.get(`[data-testid="${DATAGRID_CANVAS}"] tr`).contains('Str Value'); - - // Select all rows through row selection - cy.get('.dvn-scroller').click(10, 10, { waitForAnimations: true }); - cy.get(`[data-testid="${DATAGRID_CANVAS}"] [aria-selected="true"]`).should('have.length', 6); - - // Add a new row - cy.get('.dvn-scroller').click(200, 250); - cy.get('body').type('123'); - cy.get('.dvn-scroller').click(50, 250); - cy.get('body').type('Val{enter}'); - cy.get(`[data-testid="${DATAGRID_CANVAS}"] tbody tr`).contains('Val'); - cy.get(`[data-testid="${DATAGRID_CANVAS}"] tbody tr`).should('have.length', 8); - }); -}); diff --git a/e2e/panels-suite/frontend-sandbox-panel.spec.ts b/e2e/panels-suite/frontend-sandbox-panel.spec.ts deleted file mode 100644 index 4f2f0e3a192..00000000000 --- a/e2e/panels-suite/frontend-sandbox-panel.spec.ts +++ /dev/null @@ -1,135 +0,0 @@ -import panelSandboxDashboard from '../dashboards/PanelSandboxDashboard.json'; -import { e2e } from '../utils'; - -const DASHBOARD_ID = 'c46b2460-16b7-42a5-82d1-b07fbf431950'; -// Skipping due to race conditions with same old arch test e2e/panels-suite/frontend-sandbox-panel.spec.ts -describe('Panel sandbox', () => { - beforeEach(() => { - e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD'), true); - return e2e.flows.importDashboard(panelSandboxDashboard, 1000, true); - }); - - describe('Sandbox disabled', () => { - beforeEach(() => { - cy.window().then((win) => { - win.localStorage.setItem('grafana.featureToggles', 'pluginsFrontendSandbox=0'); - }); - cy.reload(); - }); - - it('Add iframes to body', () => { - // this button adds iframes to the body - cy.get('[data-testid="button-create-iframes"]').click(); - - const iframeIds = [ - 'createElementIframe', - 'innerHTMLIframe', - 'appendIframe', - 'prependIframe', - 'afterIframe', - 'beforeIframe', - 'outerHTMLIframe', - 'parseFromStringIframe', - 'insertBeforeIframe', - 'replaceChildIframe', - ]; - iframeIds.forEach((id) => { - cy.get(`#${id}`).should('exist'); - }); - }); - - it('Reaches out of panel div', () => { - // this button reaches out of the panel div and modifies the element dataset - cy.get('[data-testid="button-reach-out"]').click(); - - cy.get('[data-sandbox-test="true"]').should('exist'); - }); - - it('Reaches out of the panel editor', () => { - e2e.flows.openDashboard({ - uid: DASHBOARD_ID, - queryParams: { - editPanel: 1, - }, - }); - - cy.get('[data-testid="panel-editor-custom-editor-input"]').should('not.be.disabled'); - cy.get('[data-testid="panel-editor-custom-editor-input"]').should('have.value', ''); - // wait because sometimes cypress is faster than react and the value doesn't change - cy.wait(1000); - cy.get('[data-testid="panel-editor-custom-editor-input"]').type('x', { force: true, delay: 500 }); - cy.wait(100); // small delay to prevent false positives from too fast tests - cy.get('[data-testid="panel-editor-custom-editor-input"]').should('have.value', 'x'); - cy.get('[data-sandbox-test="panel-editor"]').should('exist'); - }); - }); - - describe('Sandbox enabled', () => { - beforeEach(() => { - cy.window().then((win) => { - win.localStorage.setItem('grafana.featureToggles', 'pluginsFrontendSandbox=1'); - }); - cy.reload(); - }); - - it('Does not add iframes to body', () => { - // this button adds 3 iframes to the body - cy.get('[data-testid="button-create-iframes"]').click(); - cy.wait(100); // small delay to prevent false positives from too fast tests - - const iframeIds = [ - 'createElementIframe', - 'innerHTMLIframe', - 'appendIframe', - 'prependIframe', - 'afterIframe', - 'beforeIframe', - 'outerHTMLIframe', - 'parseFromStringIframe', - 'insertBeforeIframe', - 'replaceChildIframe', - ]; - iframeIds.forEach((id) => { - cy.get(`#${id}`).should('not.exist'); - }); - }); - - it('Does not reaches out of panel div', () => { - // this button reaches out of the panel div and modifies the element dataset - cy.get('[data-testid="button-reach-out"]').click(); - cy.wait(100); // small delay to prevent false positives from too fast tests - cy.get('[data-sandbox-test="true"]').should('not.exist'); - }); - - it('Does not Reaches out of the panel editor', () => { - e2e.flows.openDashboard({ - uid: DASHBOARD_ID, - queryParams: { - editPanel: 1, - }, - }); - - cy.get('[data-testid="panel-editor-custom-editor-input"]').should('not.be.disabled'); - // wait because sometimes cypress is faster than react and the value doesn't change - cy.wait(1000); - cy.get('[data-testid="panel-editor-custom-editor-input"]').type('x', { force: true }); - cy.wait(100); // small delay to prevent false positives from too fast tests - cy.get('[data-sandbox-test="panel-editor"]').should('not.exist'); - }); - - it('Can access specific window global variables', () => { - cy.get('[data-testid="button-test-globals"]').click(); - cy.get('[data-sandbox-global="Prism"]').should('be.visible'); - cy.get('[data-sandbox-global="jQuery"]').should('be.visible'); - cy.get('[data-sandbox-global="location"]').should('be.visible'); - }); - }); - - afterEach(() => { - e2e.flows.revertAllChanges(); - }); - - after(() => { - return cy.clearCookies(); - }); -}); diff --git a/e2e/panels-suite/geomap-layer-types.spec.ts b/e2e/panels-suite/geomap-layer-types.spec.ts deleted file mode 100644 index 70af145c784..00000000000 --- a/e2e/panels-suite/geomap-layer-types.spec.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { e2e } from '../utils'; - -const DASHBOARD_ID = 'P2jR04WVk'; - -const MAP_LAYERS_TYPE = 'Map layers Layer type'; -const MAP_LAYERS_DATA = 'Map layers Data'; -const MAP_LAYERS_GEOJSON = 'Map layers GeoJSON URL'; - -describe('Geomap layer types', () => { - beforeEach(() => { - e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); - }); - - it('Tests changing the layer type', () => { - e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { editPanel: 1 } }); - cy.get('[data-testid="layer-drag-drop-list"]').should('be.visible'); - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_TYPE).should('be.visible'); - cy.get('[data-testid="layer-drag-drop-list"]').contains('markers'); - - // Heatmap - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_TYPE).type('Heatmap{enter}'); - cy.get('[data-testid="layer-drag-drop-list"]').contains('heatmap'); - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_DATA).should('be.visible'); - // e2e.components.PanelEditor.General.content().should('be.visible'); - - // GeoJSON - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_TYPE).type('GeoJSON{enter}'); - cy.get('[data-testid="layer-drag-drop-list"]').contains('geojson'); - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_DATA).should('not.exist'); - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_GEOJSON).should('be.visible'); - // e2e.components.PanelEditor.General.content().should('be.visible'); - - // Open Street Map - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_TYPE).type('Open Street Map{enter}'); - cy.get('[data-testid="layer-drag-drop-list"]').contains('osm-standard'); - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_DATA).should('not.exist'); - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_GEOJSON).should('not.exist'); - // e2e.components.PanelEditor.General.content().should('be.visible'); - - // CARTO basemap - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_TYPE).type('CARTO basemap{enter}'); - cy.get('[data-testid="layer-drag-drop-list"]').contains('carto'); - e2e.components.PanelEditor.OptionsPane.fieldLabel('Map layers Show labels').should('be.visible'); - e2e.components.PanelEditor.OptionsPane.fieldLabel('Map layers Theme').should('be.visible'); - // e2e.components.PanelEditor.General.content().should('be.visible'); - - // ArcGIS MapServer - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_TYPE).type('ArcGIS MapServer{enter}'); - cy.get('[data-testid="layer-drag-drop-list"]').contains('esri-xyz'); - e2e.components.PanelEditor.OptionsPane.fieldLabel('Map layers Server instance').should('be.visible'); - // e2e.components.PanelEditor.General.content().should('be.visible'); - - // XYZ Tile layer - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_TYPE).type('XYZ Tile layer{enter}'); - cy.get('[data-testid="layer-drag-drop-list"]').contains('xyz'); - e2e.components.PanelEditor.OptionsPane.fieldLabel('Map layers URL template').should('be.visible'); - e2e.components.PanelEditor.OptionsPane.fieldLabel('Map layers Attribution').should('be.visible'); - // e2e.components.PanelEditor.General.content().should('be.visible'); - }); - - it.skip('Tests changing the layer type (alpha)', () => { - e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { editPanel: 1 } }); - cy.get('[data-testid="layer-drag-drop-list"]').should('be.visible'); - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_TYPE).should('be.visible'); - cy.get('[data-testid="layer-drag-drop-list"]').contains('markers'); - - // Icon at last point (Alpha) - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_TYPE).type('Icon at last point{enter}'); - cy.get('[data-testid="layer-drag-drop-list"]').contains('last-point-tracker'); - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_DATA).should('be.visible'); - e2e.components.PanelEditor.General.content().should('be.visible'); - - // Dynamic GeoJSON (Alpha) - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_TYPE).type('Dynamic GeoJSON{enter}'); - cy.get('[data-testid="layer-drag-drop-list"]').contains('dynamic-geojson'); - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_DATA).should('be.visible'); - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_GEOJSON).should('be.visible'); - e2e.components.PanelEditor.OptionsPane.fieldLabel('Map layers ID Field').should('be.visible'); - e2e.components.PanelEditor.General.content().should('be.visible'); - - // Night / Day (Alpha) - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_TYPE).type('Night / Day{enter}'); - cy.get('[data-testid="layer-drag-drop-list"]').contains('dayNight'); - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_DATA).should('be.visible'); - e2e.components.PanelEditor.OptionsPane.fieldLabel('Map layers Show').should('be.visible'); - e2e.components.PanelEditor.OptionsPane.fieldLabel('Map layers Night region color').should('be.visible'); - e2e.components.PanelEditor.OptionsPane.fieldLabel('Map layers Display sun').should('be.visible'); - e2e.components.PanelEditor.General.content().should('be.visible'); - - // Route (Alpha) - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_TYPE).type('Route{enter}'); - cy.get('[data-testid="layer-drag-drop-list"]').contains('route'); - e2e.components.PanelEditor.OptionsPane.fieldLabel(MAP_LAYERS_DATA).should('be.visible'); - e2e.components.PanelEditor.OptionsPane.fieldLabel('Map layers Location').should('be.visible'); - e2e.components.PanelEditor.OptionsPane.fieldLabel('Map layers Style').should('be.visible'); - e2e.components.PanelEditor.OptionsPane.fieldLabel('Map layers Line width').should('be.visible'); - e2e.components.PanelEditor.General.content().should('be.visible'); - }); -}); diff --git a/e2e/panels-suite/geomap-map-controls.spec.ts b/e2e/panels-suite/geomap-map-controls.spec.ts deleted file mode 100644 index b344dae5abe..00000000000 --- a/e2e/panels-suite/geomap-map-controls.spec.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { e2e } from '../utils'; -const DASHBOARD_ID = 'P2jR04WVk'; -const TIMEOUT = 45000; - -describe('Geomap layer controls options', () => { - beforeEach(() => { - e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); - }); - - it('Tests map controls options', () => { - e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { editPanel: 1 } }); - // Wait until the query editor has been loaded by ensuring that the QueryEditor select contains the text 'flight_info_by_state.csv' - e2e.components.Select.singleValue().contains('flight_info_by_state.csv').should('be.visible'); - e2e.components.OptionsGroup.group('Map controls').scrollIntoView().should('be.visible'); - - // Show zoom field - e2e.components.PanelEditor.showZoomField() - .should('be.visible') - .within(() => { - cy.get('input[type="checkbox"]').check({ force: true }).should('be.checked'); - }); - - // Show attribution - e2e.components.PanelEditor.showAttributionField() - .should('be.visible') - .within(() => { - cy.get('input[type="checkbox"]').check({ force: true }).should('be.checked'); - }); - - // Show scale - e2e.components.PanelEditor.showScaleField() - .should('be.visible') - .within(() => { - cy.get('input[type="checkbox"]').check({ force: true }).should('be.checked'); - }); - - // Show measure tool - e2e.components.PanelEditor.showMeasureField() - .should('be.visible') - .within(() => { - cy.get('input[type="checkbox"]').check({ force: true }).should('be.checked'); - }); - - // Show debug - e2e.components.PanelEditor.showDebugField() - .should('be.visible') - .within(() => { - cy.get('input[type="checkbox"]').check({ force: true }).should('be.checked'); - }); - - e2e.components.Panels.Panel.content({ timeout: TIMEOUT }) - .should('be.visible') - .within(() => { - // Verify zoom - cy.get('.ol-zoom', { timeout: TIMEOUT }).should('be.visible'); - - // Verify attribution - cy.get('.ol-attribution', { timeout: TIMEOUT }).should('be.visible'); - - // Verify scale - cy.get('.ol-scale-line', { timeout: TIMEOUT }).should('be.visible'); - - // Verify measure tool - e2e.components.PanelEditor.measureButton({ timeout: TIMEOUT }).should('be.visible'); - - // Verify debug tool - e2e.components.DebugOverlay.wrapper({ timeout: TIMEOUT }).should('be.visible'); - }); - }); -}); diff --git a/e2e/panels-suite/geomap-spatial-operations-transform.spec.ts b/e2e/panels-suite/geomap-spatial-operations-transform.spec.ts deleted file mode 100644 index 4eb24162791..00000000000 --- a/e2e/panels-suite/geomap-spatial-operations-transform.spec.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { e2e } from '../utils'; - -const DASHBOARD_ID = 'P2jR04WVk'; - -describe.skip('Geomap spatial operations', () => { - beforeEach(() => { - e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); - }); - - it('Tests location auto option', () => { - e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { '__feature.tableNextGen': false, editPanel: 1 } }); - e2e.components.Tab.title('Transformations').should('be.visible').click(); - e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click(); - - e2e.components.TransformTab.newTransform('Spatial operations').scrollIntoView().should('be.visible').click(); - e2e.components.Transforms.SpatialOperations.actionLabel().type('Prepare spatial field{enter}'); - e2e.components.Transforms.SpatialOperations.locationLabel().should('be.visible'); - e2e.components.Transforms.SpatialOperations.locationLabel().type('Auto{enter}'); - - e2e.components.PanelEditor.toggleTableView().click({ force: true }); - e2e.components.Panels.Visualization.Table.header() - .should('be.visible') - .within(() => { - cy.contains('Point').should('be.visible'); - }); - }); - - it('Tests location coords option', () => { - e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { '__feature.tableNextGen': false, editPanel: 1 } }); - e2e.components.Tab.title('Transformations').should('be.visible').click(); - e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click(); - - e2e.components.TransformTab.newTransform('Spatial operations').scrollIntoView().should('be.visible').click(); - e2e.components.Transforms.SpatialOperations.actionLabel().type('Prepare spatial field{enter}'); - e2e.components.Transforms.SpatialOperations.locationLabel().should('be.visible'); - e2e.components.Transforms.SpatialOperations.locationLabel().type('Coords{enter}'); - - e2e.components.Transforms.SpatialOperations.location.coords.latitudeFieldLabel().should('be.visible'); - e2e.components.Transforms.SpatialOperations.location.coords.latitudeFieldLabel().type('Lat{enter}'); - - e2e.components.Transforms.SpatialOperations.location.coords.longitudeFieldLabel().should('be.visible'); - e2e.components.Transforms.SpatialOperations.location.coords.longitudeFieldLabel().type('Lng{enter}'); - - e2e.components.PanelEditor.toggleTableView().click({ force: true }); - e2e.components.Panels.Visualization.Table.header() - .should('be.visible') - .within(() => { - cy.contains('Point').should('be.visible'); - }); - }); - - it('Tests geoshash field column appears in table view', () => { - e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { '__feature.tableNextGen': false, editPanel: 1 } }); - e2e.components.Tab.title('Transformations').should('be.visible').click(); - e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click(); - - e2e.components.TransformTab.newTransform('Spatial operations').scrollIntoView().should('be.visible').click(); - e2e.components.Transforms.SpatialOperations.actionLabel().type('Prepare spatial field{enter}'); - e2e.components.Transforms.SpatialOperations.locationLabel().should('be.visible'); - e2e.components.Transforms.SpatialOperations.locationLabel().type('Geohash{enter}'); - - e2e.components.Transforms.SpatialOperations.location.geohash - .geohashFieldLabel() - .should('be.visible') - .type('State{enter}'); - - e2e.components.PanelEditor.toggleTableView().click({ force: true }); - e2e.components.Panels.Visualization.Table.header() - .should('be.visible') - .within(() => { - cy.contains('State 1').should('be.visible'); - }); - }); - - it('Tests location lookup option', () => { - e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { '__feature.tableNextGen': false, editPanel: 1 } }); - e2e.components.Tab.title('Transformations').should('be.visible').click(); - e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click(); - - e2e.components.TransformTab.newTransform('Spatial operations').scrollIntoView().should('be.visible').click(); - e2e.components.Transforms.SpatialOperations.actionLabel().type('Prepare spatial field{enter}'); - e2e.components.Transforms.SpatialOperations.locationLabel().should('be.visible'); - e2e.components.Transforms.SpatialOperations.locationLabel().type('Lookup{enter}'); - - e2e.components.Transforms.SpatialOperations.location.lookup.lookupFieldLabel().should('be.visible'); - e2e.components.Transforms.SpatialOperations.location.lookup.lookupFieldLabel().type('State{enter}'); - - e2e.components.Transforms.SpatialOperations.location.lookup.gazetteerFieldLabel().should('be.visible'); - e2e.components.Transforms.SpatialOperations.location.lookup.gazetteerFieldLabel().type('USA States{enter}'); - - e2e.components.PanelEditor.toggleTableView().click({ force: true }); - e2e.components.Panels.Visualization.Table.header() - .should('be.visible') - .within(() => { - cy.contains('Geometry').should('be.visible'); - }); - }); -}); diff --git a/e2e/panels-suite/panelEdit_base.spec.ts b/e2e/panels-suite/panelEdit_base.spec.ts deleted file mode 100644 index d48879e5a8d..00000000000 --- a/e2e/panels-suite/panelEdit_base.spec.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { selectors } from '@grafana/e2e-selectors'; - -import { e2e } from '../utils'; - -const PANEL_UNDER_TEST = 'Lines 500 data points'; - -describe('Panel edit tests', () => { - beforeEach(() => { - e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); - }); - - it('Tests various Panel edit scenarios', () => { - cy.intercept({ - pathname: '/api/ds/query', - }).as('query'); - e2e.flows.openDashboard({ uid: 'TkZXxlNG3', queryParams: { '__feature.tableNextGen': false } }); - cy.wait('@query'); - - e2e.components.Panels.Panel.title('Lines 500 data points') - .should('be.visible') - .within(() => { - e2e.components.Panels.Panel.loadingBar().should('not.exist'); - cy.get('[data-testid="uplot-main-div"]').first().should('be.visible'); - }); - - e2e.flows.openPanelMenuItem(e2e.flows.PanelMenuItems.Edit, PANEL_UNDER_TEST); - - // New panel editor opens when navigating from Panel menu - e2e.components.PanelEditor.General.content().should('be.visible'); - - // Queries tab is rendered and open by default - e2e.components.PanelEditor.DataPane.content() - .scrollIntoView() - .should('be.visible') - .within(() => { - e2e.components.Tab.title('Queries').should('be.visible'); - // data should be the active tab - e2e.components.Tab.active().within((li: JQuery) => { - expect(li.text()).equals('Queries1'); // there's already a query so therefore Query + 1 - }); - cy.get(`[data-testid="${selectors.components.QueryTab.content}"]`).should('be.visible'); - e2e.components.TransformTab.content().should('not.exist'); - e2e.components.AlertTab.content().should('not.exist'); - e2e.components.PanelAlertTabContent.content().should('not.exist'); - - // Bottom pane tabs - // Can change to Transform tab - e2e.components.Tab.title('Transformations').should('be.visible').click(); - e2e.components.Tab.active().within((li: JQuery) => { - expect(li.text()).equals('Transformations0'); // there's no transform so therefore Transform + 0 - }); - e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible'); - cy.get(`[data-testid="${selectors.components.QueryTab.content}"]`).should('not.exist'); - e2e.components.AlertTab.content().should('not.exist'); - e2e.components.PanelAlertTabContent.content().should('not.exist'); - - // Can change to Alerts tab (graph panel is the default vis so the alerts tab should be rendered) - e2e.components.Tab.title('Alert').scrollIntoView().should('be.visible').click(); - e2e.components.Tab.active().should('have.text', 'Alert0'); // there's no alert so therefore Alert + 0 - - // Needs to be disabled until Grafana EE turns unified alerting on by default - // e2e.components.AlertTab.content().should('not.exist'); - - cy.get(`[data-testid="${selectors.components.QueryTab.content}"]`).should('not.exist'); - e2e.components.TransformTab.content().should('not.exist'); - - // Needs to be disabled until Grafana EE turns unified alerting on by default - // e2e.components.PanelAlertTabContent.content().should('exist'); - // e2e.components.PanelAlertTabContent.content().should('be.visible'); - - e2e.components.Tab.title('Queries').should('be.visible').click(); - }); - - // Check that Time series is chosen - e2e.components.PanelEditor.toggleVizPicker().click(); - e2e.components.PluginVisualization.item('Time series').should('be.visible'); - e2e.components.PluginVisualization.current().should((e) => expect(e).to.contain('Time series')); - - // Check that table view works - e2e.components.Panels.Panel.loadingBar().should('not.exist'); - e2e.components.PanelEditor.toggleTableView().click({ force: true }); - e2e.components.Panels.Visualization.Table.header() - .should('be.visible') - .within(() => { - cy.contains('A-series').should('be.visible'); - }); - - // Change to Text panel - e2e.components.PluginVisualization.item('Text').scrollIntoView().should('be.visible').click(); - e2e.components.PanelEditor.toggleVizPicker().should((e) => expect(e).to.contain('Text')); - - // Data pane should not be rendered - e2e.components.PanelEditor.DataPane.content().should('not.exist'); - - // Change to Table panel - e2e.components.PanelEditor.toggleVizPicker().click(); - e2e.components.PluginVisualization.item('Table').scrollIntoView().should('be.visible').click(); - e2e.components.PanelEditor.toggleVizPicker().should((e) => expect(e).to.contain('Table')); - - // Data pane should be rendered - e2e.components.PanelEditor.DataPane.content().should('be.visible'); - - // Field & Overrides tabs (need to switch to React based vis, i.e. Table) - e2e.components.PanelEditor.toggleTableView().click({ force: true }).click({ force: true }); - - e2e.components.PanelEditor.OptionsPane.fieldLabel('Table Show table header').should('be.visible'); - e2e.components.PanelEditor.OptionsPane.fieldLabel('Table Column width').should('be.visible'); - }); -}); diff --git a/e2e/panels-suite/panelEdit_queries.spec.ts b/e2e/panels-suite/panelEdit_queries.spec.ts deleted file mode 100644 index 1700a00ea9f..00000000000 --- a/e2e/panels-suite/panelEdit_queries.spec.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { e2e } from '../utils'; - -const flakyTimeout = 10000; - -describe('Panel edit tests - queries', () => { - beforeEach(() => { - e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); - }); - - it('Tests various Panel edit queries scenarios', () => { - e2e.flows.openDashboard({ uid: '5SdHCadmz', queryParams: { editPanel: 3 } }); - - // New panel editor opens when navigating from Panel menu - e2e.components.PanelEditor.General.content().should('be.visible'); - - // Queries tab is rendered and open by default - e2e.components.PanelEditor.DataPane.content().should('be.visible'); - - // We expect row with refId A to exist and be visible - e2e.components.QueryEditorRows.rows().within((rows) => { - expect(rows.length).equals(1); - }); - - // Add query button should be visible and clicking on it should create a new row - e2e.components.QueryTab.addQuery().scrollIntoView().should('be.visible').click(); - - // We expect row with refId A and B to exist and be visible - e2e.components.QueryEditorRows.rows({ timeout: flakyTimeout }).should('have.length', 2); - - // Remove refId A - e2e.components.QueryEditorRow.actionButton('Remove query').eq(0).scrollIntoView(); - e2e.components.QueryEditorRow.actionButton('Remove query').eq(0).should('be.visible').click(); - - // We expect row with refId B to exist and be visible - e2e.components.QueryEditorRows.rows({ timeout: flakyTimeout }).should('have.length', 1); - - // Duplicate refId B - e2e.components.QueryEditorRow.actionButton('Duplicate query').eq(0).should('be.visible').click(); - - // We expect row with refId Band and A to exist and be visible - e2e.components.QueryEditorRows.rows().should('have.length', 2); - - // Change to CSV Metric Values scenario for A - e2e.components.DataSource.TestData.QueryTab.scenarioSelectContainer() - .first() - .should('be.visible') - .within(() => { - cy.get('input[id*="test-data-scenario-select-"]').eq(0).should('be.visible').click(); - }); - - cy.contains('CSV Metric Values').scrollIntoView().should('be.visible').eq(0).click(); - - // Disable / enable row - expectInspectorResultAndClose((keys) => { - const length = keys.length; - const resultIds = new Set([ - keys[length - 2].innerText, // last 2 - keys[length - 1].innerText, // last 2 - ]); - - expect(resultIds.has('A:')).equals(true); - expect(resultIds.has('B:')).equals(true); - }); - - // Hide response for row with refId A - e2e.components.QueryEditorRow.actionButton('Hide response').eq(1).should('be.visible').click(); - - expectInspectorResultAndClose((keys) => { - const length = keys.length; - expect(keys[length - 1].innerText).equals('B:'); - }); - - // Show response for row with refId A - e2e.components.QueryEditorRow.actionButton('Hide response').eq(1).should('be.visible').click(); - - expectInspectorResultAndClose((keys) => { - const length = keys.length; - const resultIds = new Set([ - keys[length - 2].innerText, // last 2 - keys[length - 1].innerText, // last 2 - ]); - - expect(resultIds.has('A:')).equals(true); - expect(resultIds.has('B:')).equals(true); - }); - }); -}); - -const expectInspectorResultAndClose = (expectCallBack: (keys: JQuery) => void) => { - e2e.components.QueryTab.queryInspectorButton().should('be.visible').click(); - - e2e.components.PanelInspector.Query.refreshButton().should('be.visible').click(); - - e2e.components.PanelInspector.Query.jsonObjectKeys({ timeout: flakyTimeout }) - .should('be.visible') - .should((keys) => expectCallBack(keys)); - - e2e.components.Drawer.General.close().should('be.visible').click(); -}; diff --git a/e2e/panels-suite/panelEdit_transforms.spec.ts b/e2e/panels-suite/panelEdit_transforms.spec.ts deleted file mode 100644 index 963991a22e7..00000000000 --- a/e2e/panels-suite/panelEdit_transforms.spec.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { e2e } from '../utils'; - -describe('Panel edit tests - transformations', () => { - beforeEach(() => { - e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); - }); - - it('Tests transformations editor', () => { - e2e.flows.openDashboard({ uid: 'TkZXxlNG3', queryParams: { editPanel: 47 } }); - - e2e.components.Tab.title('Transformations').should('be.visible').click(); - e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click(); - e2e.components.TransformTab.newTransform('Reduce').scrollIntoView().should('be.visible').click(); - e2e.components.Transforms.Reduce.calculationsLabel().scrollIntoView().should('be.visible'); - e2e.components.Transforms.Reduce.modeLabel().should('be.visible'); - }); - - it('Tests case where transformations can be disabled and not clear out panel data', () => { - e2e.flows.openDashboard({ uid: 'TkZXxlNG3', queryParams: { editPanel: 47 } }); - - e2e.components.Tab.title('Transformations').should('be.visible').click(); - e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click(); - e2e.components.TransformTab.newTransform('Reduce').scrollIntoView().should('be.visible').click(); - e2e.components.Transforms.disableTransformationButton().should('be.visible').click(); - - e2e.components.Panels.Panel.PanelDataErrorMessage().should('not.exist'); - }); -});