grafana/public/app/features/transformers/prepareTimeSeries/prepareTimeSeries.test.ts
Josh Hunt 3c6e0e8ef8
Chore: ESlint import order (#44959)
* Add and configure eslint-plugin-import

* Fix the lint:ts npm command

* Autofix + prettier all the files

* Manually fix remaining files

* Move jquery code in jest-setup to external file to safely reorder imports

* Resolve issue caused by circular dependencies within Prometheus

* Update .betterer.results

* Fix missing // @ts-ignore

* ignore iconBundle.ts

* Fix missing // @ts-ignore
2022-04-22 14:33:13 +01:00

343 lines
9.3 KiB
TypeScript

import {
toDataFrame,
ArrayVector,
DataFrame,
FieldType,
toDataFrameDTO,
DataFrameDTO,
DataFrameType,
getFrameDisplayName,
} from '@grafana/data';
import { prepareTimeSeriesTransformer, PrepareTimeSeriesOptions, timeSeriesFormat } from './prepareTimeSeries';
describe('Prepare time series transformer', () => {
it('should transform wide to many', () => {
const source = [
toDataFrame({
name: 'wide',
refId: 'A',
fields: [
{ name: 'time', type: FieldType.time, values: [1, 2, 3, 4, 5, 6] },
{ name: 'count', type: FieldType.number, values: [10, 20, 30, 40, 50, 60] },
{ name: 'more', type: FieldType.number, values: [2, 3, 4, 5, 6, 7] },
],
}),
];
const config: PrepareTimeSeriesOptions = {
format: timeSeriesFormat.TimeSeriesMany,
};
expect(prepareTimeSeriesTransformer.transformer(config)(source)).toEqual([
toEquableDataFrame({
name: 'wide',
refId: 'A',
fields: [
{ name: 'time', type: FieldType.time, values: [1, 2, 3, 4, 5, 6] },
{ name: 'count', type: FieldType.number, values: [10, 20, 30, 40, 50, 60] },
],
meta: {
type: DataFrameType.TimeSeriesMany,
},
length: 6,
}),
toEquableDataFrame({
name: 'wide',
refId: 'A',
fields: [
{ name: 'time', type: FieldType.time, values: [1, 2, 3, 4, 5, 6] },
{ name: 'more', type: FieldType.number, values: [2, 3, 4, 5, 6, 7] },
],
meta: {
type: DataFrameType.TimeSeriesMany,
},
length: 6,
}),
]);
});
it('should treat string fields as labels', () => {
const source = [
toDataFrame({
name: 'wide',
refId: 'A',
fields: [
{ name: 'time', type: FieldType.time, values: [1, 1, 2, 2] },
{ name: 'region', type: FieldType.string, values: ['a', 'b', 'a', 'b'] },
{ name: 'count', type: FieldType.number, values: [10, 20, 30, 40] },
{ name: 'more', type: FieldType.number, values: [2, 3, 4, 5] },
],
}),
];
const config: PrepareTimeSeriesOptions = {
format: timeSeriesFormat.TimeSeriesMany,
};
const frames = prepareTimeSeriesTransformer.transformer(config)(source);
expect(frames.length).toEqual(4);
expect(
frames.map((f) => ({
name: getFrameDisplayName(f),
labels: f.fields[1].labels,
time: f.fields[0].values.toArray(),
values: f.fields[1].values.toArray(),
}))
).toMatchInlineSnapshot(`
Array [
Object {
"labels": Object {
"region": "a",
},
"name": "wide",
"time": Array [
1,
2,
],
"values": Array [
10,
30,
],
},
Object {
"labels": Object {
"region": "b",
},
"name": "wide",
"time": Array [
1,
2,
],
"values": Array [
20,
40,
],
},
Object {
"labels": Object {
"region": "a",
},
"name": "wide",
"time": Array [
1,
2,
],
"values": Array [
2,
4,
],
},
Object {
"labels": Object {
"region": "b",
},
"name": "wide",
"time": Array [
1,
2,
],
"values": Array [
3,
5,
],
},
]
`);
});
it('should transform all wide to many when mixed', () => {
const source = [
toDataFrame({
name: 'wide',
refId: 'A',
fields: [
{ name: 'time', type: FieldType.time, values: [0, 1, 2, 3, 4, 5] },
{ name: 'count', type: FieldType.number, values: [10, 20, 30, 40, 50, 60] },
{ name: 'another', type: FieldType.number, values: [2, 3, 4, 5, 6, 7] },
],
}),
toDataFrame({
name: 'long',
refId: 'B',
fields: [
{ name: 'time', type: FieldType.time, values: [4, 5, 6, 7, 8, 9] },
{ name: 'value', type: FieldType.number, values: [2, 3, 4, 5, 6, 7] },
],
}),
];
const config: PrepareTimeSeriesOptions = {
format: timeSeriesFormat.TimeSeriesMany,
};
expect(prepareTimeSeriesTransformer.transformer(config)(source)).toEqual([
toEquableDataFrame({
name: 'wide',
refId: 'A',
fields: [
{ name: 'time', type: FieldType.time, values: [0, 1, 2, 3, 4, 5] },
{ name: 'another', type: FieldType.number, values: [2, 3, 4, 5, 6, 7] },
],
length: 6,
meta: {
type: DataFrameType.TimeSeriesMany,
},
}),
toEquableDataFrame({
name: 'wide',
refId: 'A',
fields: [
{ name: 'time', type: FieldType.time, values: [0, 1, 2, 3, 4, 5] },
{ name: 'count', type: FieldType.number, values: [10, 20, 30, 40, 50, 60] },
],
length: 6,
meta: {
type: DataFrameType.TimeSeriesMany,
},
}),
toEquableDataFrame({
name: 'long',
refId: 'B',
fields: [
{ name: 'time', type: FieldType.time, values: [4, 5, 6, 7, 8, 9] },
{ name: 'value', type: FieldType.number, values: [2, 3, 4, 5, 6, 7] },
],
length: 6,
meta: {
type: DataFrameType.TimeSeriesMany,
},
}),
]);
});
it('should transform none when source only has long frames', () => {
const source = [
toDataFrame({
name: 'long',
refId: 'A',
fields: [
{ name: 'time', type: FieldType.time, values: [1, 2, 3, 4, 5, 6] },
{ name: 'count', type: FieldType.number, values: [10, 20, 30, 40, 50, 60] },
],
}),
toDataFrame({
name: 'long',
refId: 'B',
fields: [
{ name: 'time', type: FieldType.time, values: [1, 2, 3, 4, 5, 6] },
{ name: 'count', type: FieldType.number, values: [10, 20, 30, 40, 50, 60] },
],
}),
];
const config: PrepareTimeSeriesOptions = {
format: timeSeriesFormat.TimeSeriesMany,
};
expect(toEquableDataFrames(prepareTimeSeriesTransformer.transformer(config)(source))).toEqual(
toEquableDataFrames(
source.map((frame) => ({
...frame,
meta: {
type: DataFrameType.TimeSeriesMany,
},
}))
)
);
});
it('should return empty array when no timeseries exist', () => {
const source = [
toDataFrame({
name: 'wide',
refId: 'A',
fields: [
{ name: 'text', type: FieldType.string, values: ['a', 'z', 'b', 'x', 'c', 'b'] },
{ name: 'text', type: FieldType.string, values: ['a', 'z', 'b', 'x', 'c', 'b'] },
{ name: 'text', type: FieldType.string, values: ['a', 'z', 'b', 'x', 'c', 'b'] },
],
}),
toDataFrame({
name: 'wide',
refId: 'B',
fields: [
{ name: 'text', type: FieldType.string, values: ['a', 'z', 'b', 'x', 'c', 'b'] },
{ name: 'text', type: FieldType.string, values: ['a', 'z', 'b', 'x', 'c', 'b'] },
{ name: 'text', type: FieldType.string, values: ['a', 'z', 'b', 'x', 'c', 'b'] },
],
}),
];
const config: PrepareTimeSeriesOptions = {
format: timeSeriesFormat.TimeSeriesMany,
};
expect(prepareTimeSeriesTransformer.transformer(config)(source)).toEqual([]);
});
it('should convert long to many', () => {
const source = [
toDataFrame({
name: 'long',
refId: 'X',
fields: [
{ name: 'time', type: FieldType.time, values: [1, 1, 2, 2, 3, 3] },
{ name: 'value', type: FieldType.number, values: [10, 20, 30, 40, 50, 60] },
{ name: 'region', type: FieldType.string, values: ['a', 'b', 'a', 'b', 'a', 'b'] },
],
}),
];
const config: PrepareTimeSeriesOptions = {
format: timeSeriesFormat.TimeSeriesMany,
};
const frames = prepareTimeSeriesTransformer.transformer(config)(source);
expect(frames).toEqual([
toEquableDataFrame({
name: 'long',
refId: 'X',
fields: [
{ name: 'time', type: FieldType.time, values: [1, 2, 3] },
{ name: 'value', labels: { region: 'a' }, type: FieldType.number, values: [10, 30, 50] },
],
length: 3,
meta: {
type: DataFrameType.TimeSeriesMany,
},
}),
toEquableDataFrame({
name: 'long',
refId: 'X',
fields: [
{ name: 'time', type: FieldType.time, values: [1, 2, 3] },
{ name: 'value', labels: { region: 'b' }, type: FieldType.number, values: [20, 40, 60] },
],
length: 3,
meta: {
type: DataFrameType.TimeSeriesMany,
},
}),
]);
});
});
function toEquableDataFrame(source: any): DataFrame {
return toDataFrame({
meta: undefined,
...source,
fields: source.fields.map((field: any) => {
return {
...field,
values: new ArrayVector(field.values),
config: {},
};
}),
});
}
function toEquableDataFrames(data: DataFrame[]): DataFrameDTO[] {
return data.map((frame) => toDataFrameDTO(frame));
}