mirror of
https://github.com/grafana/grafana.git
synced 2025-02-16 18:34:52 -06:00
* Datasource test: fix describe nesting * Parsing: export handleQuotes function * Modify query: add functions to detect the presence of a label and remove it * Loki: add support to toggle filters if already present * Datasource test: fix describe nesting * Loki: add support to toggle filter out if present * Remove label: handle escaped values * Datasource: add test case for escaped label values * Loki: remove = filter when applying != * Remove selector: add support for Selector node being far from Matcher * Modify query: add unit tests * Elasticsearch: create modifyQuery for elastic * Elastic modify query: implement functions * Elasticsearch: implement modifyQuery functions in datasource * Elasticsearch: update datasource test * Loki modify query: check for streamSelectorPositions length * Elasticsearch query has filter: escape filter value in regex * Remove unused type * Modify query: add functions to detect the presence of a label and remove it * Remove label: handle escaped values * Logs: create props to check for label filters in the query * Log Details Row: use label state props to show visual feedback * Make isCallbacks async * Explore: add placeholder for checking for filter in query * Datasource: define new API method * Inspect query: add base implementation * Remove isFilterOutLabelActive as it will not be needed * Check for "isActive" on every render Otherwise the active state will be out of sync * Elasticsearch: implement inspectQuery in the datasource * Logs: update test * Log details: update test * Datasources: update tests * Inspect query: rename to analize query to prevent confusion * Datasource types: mark method as alpha * Explore: add comment to log-specific functions * Remove duplicated code from bad rebase * Remove label filter: check node type * getMatchersWithFilter: rename argument * Fix bad rebase * Create DataSourceWithQueryManipulationSupport interface * Implement type guard for DataSourceWithQueryManipulationSupport * DataSourceWithQueryManipulationSupport: move to logs module * hasQueryManipulationSupport: change implementation `modifyQuery` comes from the prototype. * DataSourceWithQueryManipulationSupport: expand code comments * AnalyzeQueryOptions: move to logs module * DataSourceWithQueryManipulationSupport: add support for more return types * Fix merge error * Update packages/grafana-data/src/types/logs.ts Co-authored-by: Sven Grossmann <sven.grossmann@grafana.com> * DatasourceAPI: deprecate modifyQuery * Explore: refactor isFilterLabelActive * DataSourceWithQueryModificationSupport: rename interface * Split interfaces into Analyze and Modify * Query analysis: better name for interface * Fix guard * Create feature flag for active state * Use new feature flag in Explore * DataSourceToggleableQueryFiltersSupport: create a specific interface for this feature * Rename feature flag * De-deprecate modifyQuery * DataSourceToggleableQueryFiltersSupport: Rethink types and methods * Explore: adjust modifyQuery and isFilterLabelActive to new methods * Loki: implement new interface and revert modifyQuery * DataSourceToggleableQueryFiltersSupport: better name for arguments * Elasticsearch: implement new interface and revert modifyQuery * Loki: better name for arguments * Explore: document current limitation on isFilterLabelActive * Explore: place toggleable filters under feature flag * Loki: add tests for the new methods * Loki: add legacy modifyQuery tests * Elasticsearch: add tests for the new methods * Elasticsearch: add legacy modifyQuery tests * Toggle filter action: improve type values * Logs types: update interface description * DataSourceWithToggleableQueryFiltersSupport: update interface name * Update feature flag description * Explore: add todo comment for isFilterLabelActive --------- Co-authored-by: Sven Grossmann <sven.grossmann@grafana.com>
109 lines
3.2 KiB
TypeScript
109 lines
3.2 KiB
TypeScript
import { screen, render, fireEvent } from '@testing-library/react';
|
|
import React, { ComponentProps } from 'react';
|
|
|
|
import { LogRowModel } from '@grafana/data';
|
|
|
|
import { LogDetailsRow } from './LogDetailsRow';
|
|
|
|
type Props = ComponentProps<typeof LogDetailsRow>;
|
|
|
|
const setup = (propOverrides?: Partial<Props>) => {
|
|
const props: Props = {
|
|
parsedValues: [''],
|
|
parsedKeys: [''],
|
|
isLabel: true,
|
|
wrapLogMessage: false,
|
|
getStats: () => null,
|
|
onClickFilterLabel: () => {},
|
|
onClickFilterOutLabel: () => {},
|
|
onClickShowField: () => {},
|
|
onClickHideField: () => {},
|
|
displayedFields: [],
|
|
row: {} as LogRowModel,
|
|
disableActions: false,
|
|
};
|
|
|
|
Object.assign(props, propOverrides);
|
|
|
|
return render(
|
|
<table>
|
|
<tbody>
|
|
<LogDetailsRow {...props} />
|
|
</tbody>
|
|
</table>
|
|
);
|
|
};
|
|
|
|
jest.mock('@grafana/runtime', () => ({
|
|
...jest.requireActual('@grafana/runtime'),
|
|
reportInteraction: jest.fn(),
|
|
}));
|
|
|
|
describe('LogDetailsRow', () => {
|
|
it('should render parsed key', () => {
|
|
setup({ parsedKeys: ['test key'] });
|
|
expect(screen.getByText('test key')).toBeInTheDocument();
|
|
});
|
|
it('should render parsed value', () => {
|
|
setup({ parsedValues: ['test value'] });
|
|
expect(screen.getByText('test value')).toBeInTheDocument();
|
|
});
|
|
|
|
it('should render metrics button', () => {
|
|
setup();
|
|
expect(screen.getAllByRole('button', { name: 'Ad-hoc statistics' })).toHaveLength(1);
|
|
});
|
|
|
|
describe('if props is a label', () => {
|
|
it('should render filter label button', () => {
|
|
setup();
|
|
expect(screen.getAllByRole('button', { name: 'Filter for value' })).toHaveLength(1);
|
|
expect(screen.queryByRole('button', { name: 'Remove filter' })).not.toBeInTheDocument();
|
|
});
|
|
it('should render filter out label button', () => {
|
|
setup();
|
|
expect(screen.getAllByRole('button', { name: 'Filter out value' })).toHaveLength(1);
|
|
});
|
|
it('should render remove filter button', async () => {
|
|
setup({
|
|
isFilterLabelActive: jest.fn().mockResolvedValue(true),
|
|
});
|
|
expect(await screen.findByRole('button', { name: 'Remove filter' })).toBeInTheDocument();
|
|
});
|
|
});
|
|
|
|
describe('if props is not a label', () => {
|
|
it('should render a show toggleFieldButton button', () => {
|
|
setup({ isLabel: false });
|
|
expect(screen.getAllByRole('button', { name: 'Show this field instead of the message' })).toHaveLength(1);
|
|
});
|
|
});
|
|
|
|
it('should render stats when stats icon is clicked', () => {
|
|
setup({
|
|
parsedKeys: ['key'],
|
|
parsedValues: ['value'],
|
|
getStats: () => {
|
|
return [
|
|
{
|
|
count: 1,
|
|
proportion: 1 / 2,
|
|
value: 'value',
|
|
},
|
|
{
|
|
count: 1,
|
|
proportion: 1 / 2,
|
|
value: 'another value',
|
|
},
|
|
];
|
|
},
|
|
});
|
|
|
|
expect(screen.queryByTestId('logLabelStats')).not.toBeInTheDocument();
|
|
const adHocStatsButton = screen.getByRole('button', { name: 'Ad-hoc statistics' });
|
|
fireEvent.click(adHocStatsButton);
|
|
expect(screen.getByTestId('logLabelStats')).toBeInTheDocument();
|
|
expect(screen.getByTestId('logLabelStats')).toHaveTextContent('another value');
|
|
});
|
|
});
|