mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
E2E: remove duplicate loki e2e tests (#95644)
* remove duplicate loki e2e tests to avoid flakiness * unskip test * adjust panel ids
This commit is contained in:
parent
ada6249280
commit
9f5258717e
@ -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');
|
||||
});
|
||||
});
|
@ -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');
|
||||
});
|
||||
});
|
@ -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');
|
||||
});
|
||||
});
|
@ -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');
|
||||
});
|
||||
});
|
||||
|
Loading…
Reference in New Issue
Block a user