diff --git a/e2e/old-arch/various-suite/loki-editor.spec.ts b/e2e/old-arch/various-suite/loki-editor.spec.ts deleted file mode 100644 index 42bf063c137..00000000000 --- a/e2e/old-arch/various-suite/loki-editor.spec.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { e2e } from '../utils'; -import { waitForMonacoToLoad } from '../utils/support/monaco'; - -const dataSourceName = 'LokiEditor'; -const addDataSource = () => { - e2e.flows.addDataSource({ - type: 'Loki', - expectedAlertMessage: 'Unable to connect with Loki. Please check the server logs for more details.', - name: dataSourceName, - form: () => { - cy.get('#connection-url').type('http://loki-url:3100'); - }, - }); -}; - -describe('Loki Query Editor', () => { - beforeEach(() => { - e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); - }); - - afterEach(() => { - e2e.flows.revertAllChanges(); - }); - - it('Autocomplete features should work as expected.', () => { - addDataSource(); - - cy.intercept(/labels?/, (req) => { - req.reply({ status: 'success', data: ['instance', 'job', 'source'] }); - }); - - cy.intercept(/series?/, (req) => { - req.reply({ status: 'success', data: [{ instance: 'instance1' }] }); - }); - - // Go to Explore and choose Loki data source - e2e.pages.Explore.visit(); - e2e.components.DataSourcePicker.container().should('be.visible').click(); - cy.contains(dataSourceName).scrollIntoView().should('be.visible').click(); - - e2e.components.RadioButton.container().filter(':contains("Code")').click(); - - waitForMonacoToLoad(); - - // adds closing braces around empty value - e2e.components.QueryField.container().type('time('); - cy.get('.monaco-editor textarea:first').should(($el) => { - expect($el.val()).to.eq('time()'); - }); - - // removes closing brace when opening brace is removed - e2e.components.QueryField.container().type('{selectall}{backspace}avg_over_time({backspace}'); - cy.get('.monaco-editor textarea:first').should(($el) => { - expect($el.val()).to.eq('avg_over_time'); - }); - - // keeps closing brace when opening brace is removed and inner values exist - e2e.components.QueryField.container().type( - '{selectall}{backspace}time(test{leftArrow}{leftArrow}{leftArrow}{leftArrow}{backspace}' - ); - cy.get('.monaco-editor textarea:first').should(($el) => { - expect($el.val()).to.eq('timetest)'); - }); - - // overrides an automatically inserted brace - e2e.components.QueryField.container().type('{selectall}{backspace}time()'); - cy.get('.monaco-editor textarea:first').should(($el) => { - expect($el.val()).to.eq('time()'); - }); - - // does not override manually inserted braces - e2e.components.QueryField.container().type('{selectall}{backspace}))'); - cy.get('.monaco-editor textarea:first').should(($el) => { - expect($el.val()).to.eq('))'); - }); - - /** Runner plugin */ - - // Should execute the query when enter with shift is pressed - e2e.components.QueryField.container().type('{selectall}{backspace}{shift+enter}'); - cy.get('[data-testid="explore-no-data"]').should('be.visible'); - - /** Suggestions plugin */ - e2e.components.QueryField.container().type('{selectall}av'); - cy.contains('avg').should('be.visible'); - cy.contains('avg_over_time').should('be.visible'); - }); -}); diff --git a/e2e/old-arch/various-suite/loki-query-builder.spec.ts b/e2e/old-arch/various-suite/loki-query-builder.spec.ts deleted file mode 100644 index 45b527fca5b..00000000000 --- a/e2e/old-arch/various-suite/loki-query-builder.spec.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { e2e } from '../utils'; - -const MISSING_LABEL_FILTER_ERROR_MESSAGE = 'Select at least 1 label filter (label and value)'; -const dataSourceName = 'LokiBuilder'; -const addDataSource = () => { - e2e.flows.addDataSource({ - type: 'Loki', - expectedAlertMessage: 'Unable to connect with Loki. Please check the server logs for more details.', - name: dataSourceName, - form: () => { - cy.get('#connection-url').type('http://loki-url:3100'); - }, - }); -}; - -const finalQuery = 'rate({instance=~"instance1|instance2"} | logfmt | __error__=`` [$__auto]'; - -describe('Loki query builder', () => { - beforeEach(() => { - e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); - - cy.request({ - url: `${Cypress.env('BASE_URL')}/api/datasources/name/${dataSourceName}`, - failOnStatusCode: false, - }).then((response) => { - if (response.isOkStatusCode) { - return; - } - addDataSource(); - }); - }); - - it('should be able to use all modes', () => { - cy.intercept(/labels\?/, (req) => { - req.reply({ status: 'success', data: ['instance', 'job', 'source'] }); - }).as('labelsRequest'); - - cy.intercept(/series?/, (req) => { - req.reply({ status: 'success', data: [{ instance: 'instance1' }] }); - }); - - cy.intercept(/values/, (req) => { - req.reply({ status: 'success', data: ['instance1', 'instance2'] }); - }).as('valuesRequest'); - - cy.intercept(/index\/stats/, (req) => { - req.reply({ streams: 2, chunks: 2660, bytes: 2721792, entries: 14408 }); - }); - - // Go to Explore and choose Loki data source - e2e.pages.Explore.visit(); - e2e.components.DataSourcePicker.container().should('be.visible').click(); - cy.contains(dataSourceName).scrollIntoView().should('be.visible').click(); - - // Start in builder mode, click and choose query pattern - e2e.components.QueryBuilder.queryPatterns().click(); - cy.contains('Log query starters').click(); - cy.contains('Use this query').click(); - cy.contains('No pipeline errors').should('be.visible'); - cy.contains('Logfmt').should('be.visible'); - cy.contains('{} | logfmt | __error__=``').should('be.visible'); - - // Add operation - cy.contains('Operations').should('be.visible').click(); - cy.contains('Range functions').should('be.visible').click(); - cy.contains('Rate').should('be.visible').click(); - cy.contains('rate({} | logfmt | __error__=`` [$__auto]').should('be.visible'); - - // Check for expected error - cy.contains(MISSING_LABEL_FILTER_ERROR_MESSAGE).should('be.visible'); - - // Add labels to remove error - e2e.components.QueryBuilder.labelSelect().should('be.visible').click(); - // wait until labels are loaded and set on the component before starting to type - e2e.components.QueryBuilder.inputSelect().type('i'); - cy.wait('@labelsRequest'); - e2e.components.QueryBuilder.inputSelect().type('nstance{enter}'); - e2e.components.QueryBuilder.matchOperatorSelect() - .should('be.visible') - .click({ force: true }) - .children('div') - .children('input') - .type('=~{enter}', { force: true }); - e2e.components.QueryBuilder.valueSelect().should('be.visible').click(); - e2e.components.QueryBuilder.valueSelect().children('div').children('input').type('instance1{enter}'); - cy.wait('@valuesRequest'); - e2e.components.QueryBuilder.valueSelect().children('div').children('input').type('instance2{enter}'); - - cy.contains(MISSING_LABEL_FILTER_ERROR_MESSAGE).should('not.exist'); - cy.contains(finalQuery).should('be.visible'); - - // Change to code editor - e2e.components.RadioButton.container().filter(':contains("Code")').click(); - - // We need to test this manually because the final query is split into separate DOM elements using cy.contains(finalQuery).should('be.visible'); does not detect the query. - cy.contains('rate').should('be.visible'); - cy.contains('instance1|instance2').should('be.visible'); - cy.contains('logfmt').should('be.visible'); - cy.contains('__error__').should('be.visible'); - cy.contains('$__auto').should('be.visible'); - - // Checks the explain mode toggle - cy.contains('label', 'Explain').click(); - cy.contains('Fetch all log lines matching label filters.').should('be.visible'); - }); -}); diff --git a/e2e/old-arch/various-suite/loki-table-explore-to-dash.spec.ts b/e2e/old-arch/various-suite/loki-table-explore-to-dash.spec.ts deleted file mode 100644 index c3834e7e7b9..00000000000 --- a/e2e/old-arch/various-suite/loki-table-explore-to-dash.spec.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { e2e } from '../utils'; - -const dataSourceName = 'LokiEditor' + Date.now(); -const addDataSource = () => { - e2e.flows.addDataSource({ - type: 'Loki', - expectedAlertMessage: 'Unable to connect with Loki. Please check the server logs for more details.', - name: dataSourceName, - form: () => { - cy.get('#connection-url').type('http://loki-url:3100'); - }, - }); -}; - -const lokiQueryResult = { - status: 'success', - results: { - A: { - status: 200, - frames: [ - { - schema: { - refId: 'A', - meta: { - typeVersion: [0, 0], - custom: { - frameType: 'LabeledTimeValues', - }, - stats: [ - { - displayName: 'Summary: bytes processed per second', - unit: 'Bps', - value: 223921, - }, - { - displayName: 'Summary: total bytes processed', - unit: 'decbytes', - value: 4156, - }, - { - displayName: 'Summary: exec time', - unit: 's', - value: 0.01856, - }, - ], - executedQueryString: 'Expr: {targetLabelName="targetLabelValue"}', - }, - fields: [ - { - name: 'labels', - type: 'other', - typeInfo: { - frame: 'json.RawMessage', - }, - }, - { - name: 'Time', - type: 'time', - typeInfo: { - frame: 'time.Time', - }, - }, - { - name: 'Line', - type: 'string', - typeInfo: { - frame: 'string', - }, - }, - { - name: 'tsNs', - type: 'string', - typeInfo: { - frame: 'string', - }, - }, - { - name: 'id', - type: 'string', - typeInfo: { - frame: 'string', - }, - }, - ], - }, - data: { - values: [ - [ - { - targetLabelName: 'targetLabelValue', - instance: 'server\\1', - job: '"grafana/data"', - nonIndexed: 'value', - place: 'moon', - re: 'one.two$three^four', - source: 'data', - }, - ], - [1700077283237], - [ - '{"_entry":"log text with ANSI \\u001b[31mpart of the text\\u001b[0m [149702545]","counter":"22292","float":"NaN","wave":-0.5877852522916832,"label":"val3","level":"info"}', - ], - ['1700077283237000000'], - ['1700077283237000000_9b025d35'], - ], - }, - }, - ], - }, - }, -}; - -describe('Loki Query Editor', () => { - beforeEach(() => { - e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); - }); - - afterEach(() => { - e2e.flows.revertAllChanges(); - }); - - beforeEach(() => { - cy.window().then((win) => { - cy.setLocalStorage('grafana.featureToggles', 'logsExploreTableVisualisation=1'); - cy.setLocalStorage('grafana.featureToggles', 'dashboardScene=false'); - }); - }); - it('Should be able to add explore table to dashboard', () => { - addDataSource(); - - cy.intercept(/labels?/, (req) => { - req.reply({ status: 'success', data: ['instance', 'job', 'source'] }); - }); - - cy.intercept(/series?/, (req) => { - req.reply({ status: 'success', data: [{ instance: 'instance1' }] }); - }); - - cy.intercept(/\/api\/ds\/query\?ds_type=loki?/, (req) => { - req.reply(lokiQueryResult); - }); - - // Go to Explore and choose Loki data source - e2e.pages.Explore.visit(); - e2e.components.DataSourcePicker.container().should('be.visible').click(); - cy.contains(dataSourceName).scrollIntoView().should('be.visible').click(); - - cy.contains('Code').click({ force: true }); - - // Wait for lazy loading - // const monacoLoadingText = 'Loading...'; - - // e2e.components.QueryField.container().should('be.visible').should('have.text', monacoLoadingText); - e2e.components.QueryField.container() - .find('.view-overlays[role="presentation"]') - .get('.cdr') - .then(($el) => { - const win = $el[0].ownerDocument.defaultView; - const after = win.getComputedStyle($el[0], '::after'); - const content = after.getPropertyValue('content'); - expect(content).to.eq('"Enter a Loki query (run with Shift+Enter)"'); - }); - - // Write a simple query - e2e.components.QueryField.container().type('query').type('{instance="instance1"'); - cy.get('.monaco-editor textarea:first').should(($el) => { - expect($el.val()).to.eq('query{instance="instance1"}'); - }); - - // Submit the query - e2e.components.QueryField.container().type('{shift+enter}'); - // Assert the no-data message is not visible - cy.get('[data-testid="explore-no-data"]').should('not.exist'); - - // Click on the table toggle - cy.contains('Table').click({ force: true }); - - // One row with two cells - cy.get('[role="cell"]').should('have.length', 2); - - cy.contains('label', 'targetLabelName').should('be.visible'); - cy.contains('label', 'targetLabelName').click(); - cy.contains('label', 'targetLabelName').within(() => { - cy.get('input[type="checkbox"]').check({ force: true }); - }); - - cy.contains('label', 'targetLabelName').within(() => { - cy.get('input[type="checkbox"]').should('be.checked'); - }); - - const exploreCells = cy.get('[role="cell"]'); - - // Now we should have a row with 3 columns - exploreCells.should('have.length', 3); - // And a value of "targetLabelValue" - exploreCells.should('contain', 'targetLabelValue'); - - const addToButton = cy.get('[aria-label="Add"]'); - addToButton.should('be.visible'); - addToButton.click(); - - const addToDashboardButton = cy.get('[aria-label="Add to dashboard"]'); - - // Now let's add this to a dashboard - addToDashboardButton.should('be.visible'); - addToDashboardButton.click(); - - const addPanelToDashboardButton = cy.contains('Add panel to dashboard'); - addPanelToDashboardButton.should('be.visible'); - - const openDashboardButton = cy.contains('Open dashboard'); - openDashboardButton.should('be.visible'); - openDashboardButton.click(); - - const panel = cy.get('[data-panelid="1"]'); - panel.should('be.visible'); - - const cells = panel.find('[role="table"] [role="cell"]'); - // Should have 3 columns - cells.should('have.length', 3); - // Cells contain strings found in log line - cells.contains('"wave":-0.5877852522916832'); - - // column has correct value of "targetLabelValue", need to requery the DOM because of the .contains call above - cy.get('[data-panelid="1"]').find('[role="table"] [role="cell"]').contains('targetLabelValue'); - }); -}); diff --git a/e2e/various-suite/loki-table-explore-to-dash.spec.ts b/e2e/various-suite/loki-table-explore-to-dash.spec.ts index 088745c7fca..1477f6f0165 100644 --- a/e2e/various-suite/loki-table-explore-to-dash.spec.ts +++ b/e2e/various-suite/loki-table-explore-to-dash.spec.ts @@ -110,8 +110,7 @@ const lokiQueryResult = { }, }; -// Skipping due to race conditions with same old arch test e2e/various-suite/loki-table-explore-to-dash.spec.ts -describe.skip('Loki Query Editor', () => { +describe('Loki Query Editor', () => { beforeEach(() => { e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); }); @@ -121,9 +120,7 @@ describe.skip('Loki Query Editor', () => { }); beforeEach(() => { - cy.window().then((win) => { - win.localStorage.setItem('grafana.featureToggles', 'logsExploreTableVisualisation=1'); - }); + cy.setLocalStorage('grafana.featureToggles', 'logsExploreTableVisualisation=1'); }); it('Should be able to add explore table to dashboard', () => { addDataSource(); @@ -212,7 +209,7 @@ describe.skip('Loki Query Editor', () => { openDashboardButton.should('be.visible'); openDashboardButton.click(); - const panel = cy.get('[data-panelid="1"]'); + const panel = cy.get('[data-viz-panel-key="panel-1"]'); panel.should('be.visible'); const cells = panel.find('[role="table"] [role="cell"]'); @@ -222,6 +219,6 @@ describe.skip('Loki Query Editor', () => { cells.contains('"wave":-0.5877852522916832'); // column has correct value of "targetLabelValue", need to requery the DOM because of the .contains call above - cy.get('[data-panelid="1"]').find('[role="table"] [role="cell"]').contains('targetLabelValue'); + cy.get('[data-viz-panel-key="panel-1"]').find('[role="table"] [role="cell"]').contains('targetLabelValue'); }); });