mirror of https://github.com/grafana/grafana
Loki: Add e2e test for query builder (#51314)
* Loki: Add e2e test for query builder * Update * Update test * Update test * Update test * Update test * Add more checks in test * Update betterer * Update bettererpull/51434/head^2
parent
ed56755dd7
commit
60454192b7
@ -0,0 +1,81 @@ |
||||
import { e2e } from '@grafana/e2e'; |
||||
|
||||
const dataSourceName = 'LokiBuilder'; |
||||
const addDataSource = () => { |
||||
e2e.flows.addDataSource({ |
||||
type: 'Loki', |
||||
expectedAlertMessage: |
||||
'Unable to fetch labels from Loki (Failed to call resource), please check the server logs for more details', |
||||
name: dataSourceName, |
||||
form: () => { |
||||
e2e.components.DataSource.DataSourceHttpSettings.urlInput().type('http://loki-url:3100'); |
||||
}, |
||||
}); |
||||
}; |
||||
|
||||
describe('Loki query builder', () => { |
||||
beforeEach(() => { |
||||
e2e.flows.login('admin', 'admin'); |
||||
|
||||
e2e() |
||||
.request({ url: `${e2e.env('BASE_URL')}/api/datasources/name/${dataSourceName}`, failOnStatusCode: false }) |
||||
.then((response) => { |
||||
if (response.isOkStatusCode) { |
||||
return; |
||||
} |
||||
addDataSource(); |
||||
}); |
||||
}); |
||||
|
||||
it('should be able to use all modes', () => { |
||||
e2e().intercept(/labels?/, (req) => { |
||||
req.reply({ status: 'success', data: ['instance', 'job', 'source'] }); |
||||
}); |
||||
|
||||
e2e().intercept(/series?/, (req) => { |
||||
req.reply({ status: 'success', data: [{ instance: 'instance1' }] }); |
||||
}); |
||||
|
||||
const finalQuery = 'rate({instance=~"instance1|instance2"} | logfmt | __error__=`` [$__interval]'; |
||||
|
||||
// Go to Explore and choose Loki data source
|
||||
e2e.pages.Explore.visit(); |
||||
e2e.components.DataSourcePicker.container().should('be.visible').click(); |
||||
e2e().contains(dataSourceName).scrollIntoView().should('be.visible').click(); |
||||
|
||||
// Start in builder mode, click and choose query pattern
|
||||
e2e.components.QueryBuilder.queryPatterns().click().type('Log query with parsing{enter}'); |
||||
e2e().contains('No pipeline errors').should('be.visible'); |
||||
e2e().contains('Logfmt').should('be.visible'); |
||||
e2e().contains('{} | logfmt | __error__=``').should('be.visible'); |
||||
|
||||
// Add operation
|
||||
e2e().contains('Operations').should('be.visible').click(); |
||||
e2e().contains('Range functions').should('be.visible').click(); |
||||
e2e().contains('Rate').should('be.visible').click(); |
||||
e2e().contains('rate({} | logfmt | __error__=`` [$__interval]').should('be.visible'); |
||||
|
||||
// Check for expected error
|
||||
e2e().contains('You need to specify at least 1 label filter (stream selector)').should('be.visible'); |
||||
|
||||
// Add labels to remove error
|
||||
e2e.components.QueryBuilder.labelSelect().should('be.visible').click().type('instance{enter}'); |
||||
e2e.components.QueryBuilder.matchOperatorSelect().should('be.visible').click().type('=~{enter}'); |
||||
e2e.components.QueryBuilder.valueSelect() |
||||
.should('be.visible') |
||||
.click() |
||||
.type('instance1{enter}') |
||||
.type('instance2{enter}'); |
||||
e2e().contains('You need to specify at least 1 label filter (stream selector)').should('not.exist'); |
||||
e2e().contains(finalQuery).should('be.visible'); |
||||
|
||||
// Switch to code editor and check if query was parsed
|
||||
for (const word of finalQuery.split(' ')) { |
||||
e2e().contains(word).should('be.visible'); |
||||
} |
||||
|
||||
// Switch to explain mode and check if query is visible
|
||||
e2e().contains('label', 'Explain').click(); |
||||
e2e().contains(finalQuery).should('be.visible'); |
||||
}); |
||||
}); |
Loading…
Reference in new issue