Prometheus: Fix copy paste behaving as cut and paste (#28622)

This commit is contained in:
Andrej Ocenas
2020-10-30 10:03:05 +01:00
committed by GitHub
parent 05644e7042
commit 43a0167b01
3 changed files with 131 additions and 90 deletions

View File

@@ -3,7 +3,7 @@ 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';
import { DataSourceInstanceSettings } from '@grafana/data';
import { DataSourceInstanceSettings, dateTime } from '@grafana/data';
import { PromOptions } from '../types';
import { fireEvent, render, screen } from '@testing-library/react';
@@ -51,61 +51,89 @@ describe('PromQueryField', () => {
});
it('refreshes metrics when the data source changes', async () => {
const defaultProps = {
query: { expr: '', refId: '' },
onRunQuery: () => {},
onChange: () => {},
history: [],
};
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;
const queryField = render(
<PromQueryField
// @ts-ignore
datasource={{
languageProvider,
languageProvider: makeLanguageProvider({ metrics: [metrics] }),
}}
query={{ expr: '', refId: '' }}
onRunQuery={() => {}}
onChange={() => {}}
history={[]}
{...defaultProps}
/>
);
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);
}
checkMetricsInCascader(await screen.findByRole('button'), metrics);
const changedMetrics = ['baz', 'moo'];
queryField.rerender(
<PromQueryField
// @ts-ignore
datasource={{
//@ts-ignore
languageProvider: {
...languageProvider,
metrics: changedMetrics,
},
languageProvider: makeLanguageProvider({ metrics: [changedMetrics] }),
}}
query={{ expr: '', refId: '' }}
onRunQuery={() => {}}
onChange={() => {}}
history={[]}
{...defaultProps}
/>
);
cascader = await queryField.findByRole('button');
fireEvent.keyDown(cascader, { keyCode: 40 });
listNodes = screen.getAllByRole('menuitem');
for (const node of listNodes) {
expect(changedMetrics).toContain(node.innerHTML);
}
// If we check the cascader right away it should be in loading state
let cascader = screen.getByRole('button');
expect(cascader.textContent).toContain('Loading');
checkMetricsInCascader(await screen.findByRole('button'), changedMetrics);
});
it('refreshes metrics when time range changes but dont show loading state', async () => {
const defaultProps = {
query: { expr: '', refId: '' },
onRunQuery: () => {},
onChange: () => {},
history: [],
};
const metrics = ['foo', 'bar'];
const changedMetrics = ['baz', 'moo'];
const range = {
from: dateTime('2020-10-28T00:00:00Z'),
to: dateTime('2020-10-28T01:00:00Z'),
};
const languageProvider = makeLanguageProvider({ metrics: [metrics, changedMetrics] });
const queryField = render(
<PromQueryField
// @ts-ignore
datasource={{ languageProvider }}
range={{
...range,
raw: range,
}}
{...defaultProps}
/>
);
checkMetricsInCascader(await screen.findByRole('button'), metrics);
const newRange = {
from: dateTime('2020-10-28T01:00:00Z'),
to: dateTime('2020-10-28T02:00:00Z'),
};
queryField.rerender(
<PromQueryField
// @ts-ignore
datasource={{ languageProvider }}
range={{
...newRange,
raw: newRange,
}}
{...defaultProps}
/>
);
let cascader = screen.getByRole('button');
// Should not show loading
expect(cascader.textContent).toContain('Metrics');
checkMetricsInCascader(cascader, metrics);
});
});
@@ -162,3 +190,26 @@ describe('groupMetricsByPrefix()', () => {
]);
});
});
function makeLanguageProvider(options: { metrics: string[][] }) {
const metricsStack = [...options.metrics];
return ({
histogramMetrics: [] as any,
metrics: [],
metricsMetadata: {},
lookupsDisabled: false,
lookupMetricsThreshold: DEFAULT_LOOKUP_METRICS_THRESHOLD,
start() {
this.metrics = metricsStack.shift();
return Promise.resolve([]);
},
} as any) as PromQlLanguageProvider;
}
function checkMetricsInCascader(cascader: HTMLElement, metrics: string[]) {
fireEvent.keyDown(cascader, { keyCode: 40 });
let listNodes = screen.getAllByRole('menuitem');
for (const node of listNodes) {
expect(metrics).toContain(node.innerHTML);
}
}