Files
grafana/public/app/features/explore/Graph/useStructureRev.test.ts
Giordano Ricci 6b6b733229 Explore: Fix graph not updating when changing config (#62473)
* Explore: Fix graph not updating when changing config

* move useStructureRev to a seprate hook and add specific tests
2023-02-01 16:23:02 +00:00

118 lines
3.6 KiB
TypeScript

import { renderHook } from '@testing-library/react-hooks';
import { DataFrame, FieldType, toDataFrame } from '@grafana/data';
import { useStructureRev } from './useStructureRev';
let lastResult: number = Number.MIN_SAFE_INTEGER;
const resetCounters = () => {
lastResult = Number.MIN_SAFE_INTEGER;
};
const startCounters = (start: number | Error) => {
// The if is only to make TypeScript happy
if (start instanceof Error) {
expect(start).not.toBeInstanceOf(Error);
return;
}
lastResult = start;
};
beforeAll(() => {
expect.extend({
toHaveIncremented(received: number[]) {
if (received.length < 2) {
return {
message: () => `expected at least 2 elements, got ${received.length}`,
pass: false,
};
}
const pass = received[received.length - 1] > lastResult;
const r = lastResult;
const message = () =>
this.isNot
? `expected ${received[received.length - 1]} to be equal or lesser than ${r}`
: `expected ${received[received.length - 1]} to be greater than ${r}`;
lastResult = received[received.length - 1];
return {
message,
pass,
};
},
});
});
describe('useStructureRev', () => {
afterEach(() => resetCounters());
it('should increment only when relevant fields in frame change', () => {
let frames: DataFrame[] = [toDataFrame({ fields: [{ name: 'time', type: FieldType.time, values: [1, 2, 3] }] })];
const { result, rerender } = renderHook((frames) => useStructureRev(frames), { initialProps: frames });
startCounters(result.current);
// When changing number of frames, the structureRev should increment
frames = [...frames, toDataFrame({ fields: [{ name: 'time', type: FieldType.time, values: [1, 2, 3] }] })];
rerender(frames);
expect(result.all).toHaveIncremented();
// Changing RefId should not increment the structure revision
frames[0] = toDataFrame({
refId: 'A',
fields: [{ name: 'time', type: FieldType.time, values: [1, 2, 3] }],
});
rerender([...frames]);
expect(result.all).not.toHaveIncremented();
// Changing frame name should increment the structure revision
frames[0] = toDataFrame({
refId: 'A',
name: 'Some Name',
fields: [{ name: 'time', type: FieldType.time, values: [1, 2, 3] }],
});
rerender([...frames]);
expect(result.all).toHaveIncremented();
// Changing frame's fields number should increment the structure revision
frames[0] = toDataFrame({
refId: 'A',
name: 'Some Name',
fields: [
{ name: 'time', type: FieldType.time, values: [1, 2, 3] },
{ name: 'value', type: FieldType.number, values: [1, 2, 3] },
],
});
rerender([...frames]);
expect(result.all).toHaveIncremented();
// Changing a frame's field's config should increment the structure revision
frames[0] = toDataFrame({
refId: 'A',
name: 'Some Name',
fields: [
{ name: 'time', type: FieldType.time, values: [1, 2, 3] },
{ name: 'value', type: FieldType.number, values: [1, 2, 3], config: { unit: 'ms' } },
],
});
rerender([...frames]);
expect(result.all).toHaveIncremented();
// Changing a frame's field's name should increment the structure revision
frames[0] = toDataFrame({
refId: 'A',
name: 'Some Name',
fields: [
{ name: 'time', type: FieldType.time, values: [1, 2, 3] },
{ name: 'value, but with a different name', type: FieldType.number, values: [1, 2, 3], config: { unit: 'ms' } },
],
});
rerender([...frames]);
expect(result.all).toHaveIncremented();
});
});