mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
89 lines
2.4 KiB
TypeScript
89 lines
2.4 KiB
TypeScript
|
import { renderHook } from '@testing-library/react-hooks';
|
||
|
import { useLayout } from './layout';
|
||
|
import { EdgeDatum, NodeDatum } from './types';
|
||
|
|
||
|
let onmessage: jest.MockedFunction<any>;
|
||
|
let postMessage: jest.MockedFunction<any>;
|
||
|
let terminate: jest.MockedFunction<any>;
|
||
|
|
||
|
jest.mock('./createLayoutWorker', () => {
|
||
|
return {
|
||
|
__esModule: true,
|
||
|
createWorker: () => {
|
||
|
onmessage = jest.fn();
|
||
|
postMessage = jest.fn();
|
||
|
terminate = jest.fn();
|
||
|
return {
|
||
|
onmessage: onmessage,
|
||
|
postMessage: postMessage,
|
||
|
terminate: terminate,
|
||
|
};
|
||
|
},
|
||
|
};
|
||
|
});
|
||
|
|
||
|
describe('layout', () => {
|
||
|
it('doesnt fail without any data', async () => {
|
||
|
const nodes: NodeDatum[] = [];
|
||
|
const edges: EdgeDatum[] = [];
|
||
|
|
||
|
const { result } = renderHook(() => {
|
||
|
return useLayout(nodes, edges, undefined, 100, 1000);
|
||
|
});
|
||
|
expect(result.current.nodes).toEqual([]);
|
||
|
expect(result.current.edges).toEqual([]);
|
||
|
expect(postMessage).toBeUndefined();
|
||
|
});
|
||
|
|
||
|
it('cancels worker', async () => {
|
||
|
const { result, rerender } = renderHook(
|
||
|
({ nodes, edges }) => {
|
||
|
return useLayout(nodes, edges, undefined, 100, 1000);
|
||
|
},
|
||
|
{
|
||
|
initialProps: {
|
||
|
nodes: [makeNode(0, 0), makeNode(1, 1)],
|
||
|
edges: [makeEdge(0, 1)],
|
||
|
},
|
||
|
}
|
||
|
);
|
||
|
expect(postMessage).toBeCalledTimes(1);
|
||
|
// Bit convoluted but we cannot easily access the worker instance as we only export constructor so the default
|
||
|
// export is class and we only store latest instance of the methods as jest.fn here as module local variables.
|
||
|
// So we capture the terminate function from current worker so that when we call rerender and new worker is created
|
||
|
// we can still access and check the method from the old one that we assume should be canceled.
|
||
|
const localTerminate = terminate;
|
||
|
|
||
|
rerender({
|
||
|
nodes: [],
|
||
|
edges: [],
|
||
|
});
|
||
|
|
||
|
expect(result.current.nodes).toEqual([]);
|
||
|
expect(result.current.edges).toEqual([]);
|
||
|
expect(localTerminate).toBeCalledTimes(1);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
function makeNode(index: number, incoming: number): NodeDatum {
|
||
|
return {
|
||
|
id: `n${index}`,
|
||
|
title: `n${index}`,
|
||
|
subTitle: '',
|
||
|
dataFrameRowIndex: 0,
|
||
|
incoming,
|
||
|
arcSections: [],
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function makeEdge(source: number, target: number): EdgeDatum {
|
||
|
return {
|
||
|
id: `${source}-${target}`,
|
||
|
source: 'n' + source,
|
||
|
target: 'n' + target,
|
||
|
mainStat: '',
|
||
|
secondaryStat: '',
|
||
|
dataFrameRowIndex: 0,
|
||
|
};
|
||
|
}
|