2020-05-04 10:17:57 +02:00
|
|
|
// @ts-ignore
|
|
|
|
|
import RCCascader from 'rc-cascader';
|
|
|
|
|
import React from 'react';
|
|
|
|
|
import PromQlLanguageProvider, { DEFAULT_LOOKUP_METRICS_THRESHOLD } from '../language_provider';
|
|
|
|
|
import PromQueryField, { groupMetricsByPrefix, RECORDING_RULES_GROUP } from './PromQueryField';
|
2020-05-05 18:02:55 +02:00
|
|
|
import { DataSourceInstanceSettings } from '@grafana/data';
|
|
|
|
|
import { PromOptions } from '../types';
|
2020-09-25 15:48:41 +01:00
|
|
|
import { fireEvent, render, screen } from '@testing-library/react';
|
2020-05-04 10:17:57 +02:00
|
|
|
|
|
|
|
|
describe('PromQueryField', () => {
|
|
|
|
|
beforeAll(() => {
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
window.getSelection = () => {};
|
|
|
|
|
});
|
|
|
|
|
|
2020-05-05 18:02:55 +02:00
|
|
|
it('renders metrics chooser regularly if lookups are not disabled in the datasource settings', () => {
|
|
|
|
|
const datasource = ({
|
|
|
|
|
languageProvider: {
|
|
|
|
|
start: () => Promise.resolve([]),
|
|
|
|
|
},
|
|
|
|
|
} as unknown) as DataSourceInstanceSettings<PromOptions>;
|
|
|
|
|
|
2020-09-25 15:48:41 +01:00
|
|
|
const queryField = render(
|
2020-05-05 18:02:55 +02:00
|
|
|
<PromQueryField
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
datasource={datasource}
|
|
|
|
|
query={{ expr: '', refId: '' }}
|
|
|
|
|
onRunQuery={() => {}}
|
|
|
|
|
onChange={() => {}}
|
|
|
|
|
history={[]}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
|
2020-09-25 15:48:41 +01:00
|
|
|
expect(queryField.getAllByRole('button')).toHaveLength(1);
|
2020-05-05 18:02:55 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('renders a disabled metrics chooser if lookups are disabled in datasource settings', () => {
|
2020-09-25 15:48:41 +01:00
|
|
|
const queryField = render(
|
2020-05-05 18:02:55 +02:00
|
|
|
<PromQueryField
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
datasource={{ lookupsDisabled: true }}
|
|
|
|
|
query={{ expr: '', refId: '' }}
|
|
|
|
|
onRunQuery={() => {}}
|
|
|
|
|
onChange={() => {}}
|
|
|
|
|
history={[]}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
|
2020-09-25 15:48:41 +01:00
|
|
|
const bcButton = queryField.getByRole('button');
|
|
|
|
|
expect(bcButton).toBeDisabled();
|
2020-05-05 18:02:55 +02:00
|
|
|
});
|
|
|
|
|
|
2020-05-04 10:17:57 +02:00
|
|
|
it('refreshes metrics when the data source changes', async () => {
|
|
|
|
|
const metrics = ['foo', 'bar'];
|
|
|
|
|
const languageProvider = ({
|
|
|
|
|
histogramMetrics: [] as any,
|
|
|
|
|
metrics,
|
|
|
|
|
metricsMetadata: {},
|
|
|
|
|
lookupsDisabled: false,
|
|
|
|
|
lookupMetricsThreshold: DEFAULT_LOOKUP_METRICS_THRESHOLD,
|
|
|
|
|
start: () => {
|
|
|
|
|
return Promise.resolve([]);
|
|
|
|
|
},
|
|
|
|
|
} as unknown) as PromQlLanguageProvider;
|
|
|
|
|
|
2020-09-25 15:48:41 +01:00
|
|
|
const queryField = render(
|
2020-05-04 10:17:57 +02:00
|
|
|
<PromQueryField
|
|
|
|
|
// @ts-ignore
|
|
|
|
|
datasource={{
|
|
|
|
|
languageProvider,
|
|
|
|
|
}}
|
|
|
|
|
query={{ expr: '', refId: '' }}
|
|
|
|
|
onRunQuery={() => {}}
|
|
|
|
|
onChange={() => {}}
|
|
|
|
|
history={[]}
|
|
|
|
|
/>
|
|
|
|
|
);
|
|
|
|
|
|
2020-09-25 15:48:41 +01:00
|
|
|
let cascader = await queryField.findByRole('button');
|
|
|
|
|
fireEvent.keyDown(cascader, { keyCode: 40 });
|
|
|
|
|
let listNodes = screen.getAllByRole('menuitem');
|
|
|
|
|
for (const node of listNodes) {
|
|
|
|
|
expect(metrics).toContain(node.innerHTML);
|
2020-05-04 10:17:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const changedMetrics = ['baz', 'moo'];
|
2020-09-25 15:48:41 +01:00
|
|
|
queryField.rerender(
|
|
|
|
|
<PromQueryField
|
|
|
|
|
datasource={{
|
|
|
|
|
//@ts-ignore
|
|
|
|
|
languageProvider: {
|
|
|
|
|
...languageProvider,
|
|
|
|
|
metrics: changedMetrics,
|
|
|
|
|
},
|
|
|
|
|
}}
|
|
|
|
|
query={{ expr: '', refId: '' }}
|
|
|
|
|
onRunQuery={() => {}}
|
|
|
|
|
onChange={() => {}}
|
|
|
|
|
history={[]}
|
|
|
|
|
/>
|
|
|
|
|
);
|
2020-05-04 10:17:57 +02:00
|
|
|
|
2020-09-25 15:48:41 +01:00
|
|
|
cascader = await queryField.findByRole('button');
|
|
|
|
|
fireEvent.keyDown(cascader, { keyCode: 40 });
|
|
|
|
|
listNodes = screen.getAllByRole('menuitem');
|
|
|
|
|
for (const node of listNodes) {
|
|
|
|
|
expect(changedMetrics).toContain(node.innerHTML);
|
2020-05-04 10:17:57 +02:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
2018-08-08 16:56:21 +02:00
|
|
|
|
|
|
|
|
describe('groupMetricsByPrefix()', () => {
|
|
|
|
|
it('returns an empty group for no metrics', () => {
|
|
|
|
|
expect(groupMetricsByPrefix([])).toEqual([]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('returns options grouped by prefix', () => {
|
|
|
|
|
expect(groupMetricsByPrefix(['foo_metric'])).toMatchObject([
|
|
|
|
|
{
|
|
|
|
|
value: 'foo',
|
2020-01-17 18:07:40 +01:00
|
|
|
children: [
|
2018-08-08 16:56:21 +02:00
|
|
|
{
|
|
|
|
|
value: 'foo_metric',
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
]);
|
|
|
|
|
});
|
|
|
|
|
|
2019-12-17 11:06:43 +01:00
|
|
|
it('returns options grouped by prefix with metadata', () => {
|
|
|
|
|
expect(groupMetricsByPrefix(['foo_metric'], { foo_metric: [{ type: 'TYPE', help: 'my help' }] })).toMatchObject([
|
|
|
|
|
{
|
|
|
|
|
value: 'foo',
|
2020-01-17 18:07:40 +01:00
|
|
|
children: [
|
2019-12-17 11:06:43 +01:00
|
|
|
{
|
|
|
|
|
value: 'foo_metric',
|
|
|
|
|
title: 'foo_metric\nTYPE\nmy help',
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
]);
|
|
|
|
|
});
|
|
|
|
|
|
2018-08-08 16:56:21 +02:00
|
|
|
it('returns options without prefix as toplevel option', () => {
|
|
|
|
|
expect(groupMetricsByPrefix(['metric'])).toMatchObject([
|
|
|
|
|
{
|
|
|
|
|
value: 'metric',
|
|
|
|
|
},
|
|
|
|
|
]);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
it('returns recording rules grouped separately', () => {
|
|
|
|
|
expect(groupMetricsByPrefix([':foo_metric:'])).toMatchObject([
|
|
|
|
|
{
|
|
|
|
|
value: RECORDING_RULES_GROUP,
|
2020-01-17 18:07:40 +01:00
|
|
|
children: [
|
2018-08-08 16:56:21 +02:00
|
|
|
{
|
|
|
|
|
value: ':foo_metric:',
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
},
|
|
|
|
|
]);
|
|
|
|
|
});
|
|
|
|
|
});
|