grafana/public/app/plugins/panel/timeseries/utils.test.ts
2023-05-01 19:41:40 -07:00

146 lines
4.1 KiB
TypeScript

import { createTheme, FieldType, createDataFrame, toDataFrame } from '@grafana/data';
import { prepareGraphableFields } from './utils';
describe('prepare timeseries graph', () => {
it('errors with no time fields', () => {
const input = [
toDataFrame({
fields: [
{ name: 'a', values: [1, 2, 3] },
{ name: 'b', values: ['a', 'b', 'c'] },
],
}),
];
const frames = prepareGraphableFields(input, createTheme());
expect(frames).toBeNull();
});
it('requires a number or boolean value', () => {
const input = [
toDataFrame({
fields: [
{ name: 'a', type: FieldType.time, values: [1, 2, 3] },
{ name: 'b', values: ['a', 'b', 'c'] },
],
}),
];
const frames = prepareGraphableFields(input, createTheme());
expect(frames).toBeNull();
});
it('sets classic palette index on graphable fields', () => {
const input = [
toDataFrame({
fields: [
{ name: 'a', type: FieldType.time, values: [1, 2, 3] },
{ name: 'b', type: FieldType.string, values: ['a', 'b', 'c'] },
{ name: 'c', type: FieldType.number, values: [1, 2, 3] },
{ name: 'd', type: FieldType.string, values: ['d', 'e', 'f'] },
{ name: 'e', type: FieldType.boolean, values: [true, false, true] },
],
}),
];
const frames = prepareGraphableFields(input, createTheme());
expect(frames![0].fields.map((f) => f.state?.seriesIndex)).toEqual([undefined, undefined, 0, undefined, 1]);
});
it('will graph numbers and boolean values', () => {
const input = [
toDataFrame({
fields: [
{ name: 'a', type: FieldType.time, values: [1, 2, 3] },
{ name: 'b', values: ['a', 'b', 'c'] },
{ name: 'c', values: [true, false, true] },
{ name: 'd', values: [100, 200, 300] },
],
}),
];
const frames = prepareGraphableFields(input, createTheme());
const out = frames![0];
expect(out.fields.map((f) => f.name)).toEqual(['a', 'b', 'c', 'd']);
const field = out.fields.find((f) => f.name === 'c');
expect(field?.display).toBeDefined();
expect(field!.display!(1)).toMatchInlineSnapshot(`
{
"color": "#808080",
"numeric": 1,
"percent": 1,
"prefix": undefined,
"suffix": undefined,
"text": "True",
}
`);
});
it('will convert NaN and Infinty to nulls', () => {
const df = createDataFrame({
fields: [
{ name: 'time', type: FieldType.time, values: [995, 9996, 9997, 9998, 9999] },
{ name: 'a', values: [-10, NaN, 10, -Infinity, +Infinity] },
],
});
const frames = prepareGraphableFields([df], createTheme());
const field = frames![0].fields.find((f) => f.name === 'a');
expect(field!.values).toMatchInlineSnapshot(`
[
-10,
null,
10,
null,
null,
]
`);
});
it('will insert nulls given an interval value', () => {
const df = createDataFrame({
fields: [
{ name: 'time', type: FieldType.time, config: { interval: 1 }, values: [1, 3, 6] },
{ name: 'a', values: [1, 2, 3] },
],
});
const frames = prepareGraphableFields([df], createTheme());
const field = frames![0].fields.find((f) => f.name === 'a');
expect(field!.values).toMatchInlineSnapshot(`
[
1,
null,
2,
null,
null,
3,
]
`);
expect(frames![0].length).toEqual(6);
});
it('will insert and convert nulls to a configure "no value" value', () => {
const df = createDataFrame({
fields: [
{ name: 'time', type: FieldType.time, config: { interval: 1 }, values: [1, 3, 6] },
{ name: 'a', config: { noValue: '20' }, values: [1, 2, 3] },
],
});
const frames = prepareGraphableFields([df], createTheme());
const field = frames![0].fields.find((f) => f.name === 'a');
expect(field!.values).toMatchInlineSnapshot(`
[
1,
20,
2,
20,
20,
3,
]
`);
expect(frames![0].length).toEqual(6);
});
});