mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Chore: Upgrade Jest to latest (#25591)
* Chore: Upgrade Jest to latest Signed-off-by: Arve Knudsen <arve.knudsen@gmail.com> * Chore: reduces strict null errors Co-authored-by: Hugo Häggmark <hugo.haggmark@grafana.com>
This commit is contained in:
parent
b1dee9392b
commit
91c24e1f56
12
package.json
12
package.json
@ -83,7 +83,7 @@
|
|||||||
"@types/file-saver": "2.0.1",
|
"@types/file-saver": "2.0.1",
|
||||||
"@types/hoist-non-react-statics": "3.3.0",
|
"@types/hoist-non-react-statics": "3.3.0",
|
||||||
"@types/is-hotkey": "0.1.1",
|
"@types/is-hotkey": "0.1.1",
|
||||||
"@types/jest": "24.0.13",
|
"@types/jest": "26.0.0",
|
||||||
"@types/jquery": "3.3.32",
|
"@types/jquery": "3.3.32",
|
||||||
"@types/lodash": "4.14.149",
|
"@types/lodash": "4.14.149",
|
||||||
"@types/lru-cache": "^5.1.0",
|
"@types/lru-cache": "^5.1.0",
|
||||||
@ -116,7 +116,7 @@
|
|||||||
"autoprefixer": "9.7.4",
|
"autoprefixer": "9.7.4",
|
||||||
"axios": "0.19.2",
|
"axios": "0.19.2",
|
||||||
"babel-core": "7.0.0-bridge.0",
|
"babel-core": "7.0.0-bridge.0",
|
||||||
"babel-jest": "24.8.0",
|
"babel-jest": "26.0.1",
|
||||||
"babel-loader": "8.0.6",
|
"babel-loader": "8.0.6",
|
||||||
"babel-plugin-angularjs-annotate": "0.10.0",
|
"babel-plugin-angularjs-annotate": "0.10.0",
|
||||||
"clean-webpack-plugin": "3.0.0",
|
"clean-webpack-plugin": "3.0.0",
|
||||||
@ -156,9 +156,9 @@
|
|||||||
"html-webpack-harddisk-plugin": "1.0.1",
|
"html-webpack-harddisk-plugin": "1.0.1",
|
||||||
"html-webpack-plugin": "3.2.0",
|
"html-webpack-plugin": "3.2.0",
|
||||||
"husky": "4.2.1",
|
"husky": "4.2.1",
|
||||||
"jest": "24.8.0",
|
"jest": "26.0.0",
|
||||||
"jest-canvas-mock": "2.1.2",
|
"jest-canvas-mock": "2.2.0",
|
||||||
"jest-date-mock": "1.0.7",
|
"jest-date-mock": "1.0.8",
|
||||||
"lerna": "^3.20.2",
|
"lerna": "^3.20.2",
|
||||||
"lint-staged": "10.0.7",
|
"lint-staged": "10.0.7",
|
||||||
"load-grunt-tasks": "5.1.0",
|
"load-grunt-tasks": "5.1.0",
|
||||||
@ -185,7 +185,7 @@
|
|||||||
"sinon": "8.1.1",
|
"sinon": "8.1.1",
|
||||||
"style-loader": "1.1.3",
|
"style-loader": "1.1.3",
|
||||||
"terser-webpack-plugin": "2.3.5",
|
"terser-webpack-plugin": "2.3.5",
|
||||||
"ts-jest": "24.1.0",
|
"ts-jest": "26.1.0",
|
||||||
"ts-node": "8.8.1",
|
"ts-node": "8.8.1",
|
||||||
"tslib": "1.10.0",
|
"tslib": "1.10.0",
|
||||||
"typescript": "3.7.5",
|
"typescript": "3.7.5",
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { QueryOperationRow } from './QueryOperationRow';
|
import { QueryOperationRow } from './QueryOperationRow';
|
||||||
import { shallow, mount } from 'enzyme';
|
import { mount, shallow } from 'enzyme';
|
||||||
import { act } from 'react-dom/test-utils';
|
import { act } from 'react-dom/test-utils';
|
||||||
|
|
||||||
describe('QueryOperationRow', () => {
|
describe('QueryOperationRow', () => {
|
||||||
@ -17,6 +17,7 @@ describe('QueryOperationRow', () => {
|
|||||||
describe('callbacks', () => {
|
describe('callbacks', () => {
|
||||||
it('should not call onOpen when component is shallowed', async () => {
|
it('should not call onOpen when component is shallowed', async () => {
|
||||||
const onOpenSpy = jest.fn();
|
const onOpenSpy = jest.fn();
|
||||||
|
// @ts-ignore strict null error, you shouldn't use promise like approach with act but I don't know what the intention is here
|
||||||
await act(async () => {
|
await act(async () => {
|
||||||
shallow(
|
shallow(
|
||||||
<QueryOperationRow onOpen={onOpenSpy}>
|
<QueryOperationRow onOpen={onOpenSpy}>
|
||||||
@ -38,10 +39,13 @@ describe('QueryOperationRow', () => {
|
|||||||
const titleEl = wrapper.find({ 'aria-label': 'Query operation row title' });
|
const titleEl = wrapper.find({ 'aria-label': 'Query operation row title' });
|
||||||
expect(titleEl).toHaveLength(1);
|
expect(titleEl).toHaveLength(1);
|
||||||
|
|
||||||
|
// @ts-ignore strict null error, you shouldn't use promise like approach with act but I don't know what the intention is here
|
||||||
await act(async () => {
|
await act(async () => {
|
||||||
// open
|
// open
|
||||||
titleEl.first().simulate('click');
|
titleEl.first().simulate('click');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// @ts-ignore strict null error, you shouldn't use promise like approach with act but I don't know what the intention is here
|
||||||
await act(async () => {
|
await act(async () => {
|
||||||
// close
|
// close
|
||||||
titleEl.first().simulate('click');
|
titleEl.first().simulate('click');
|
||||||
|
@ -2,6 +2,8 @@ import React from 'react';
|
|||||||
import { shallow } from 'enzyme';
|
import { shallow } from 'enzyme';
|
||||||
import { MetricSelect } from './MetricSelect';
|
import { MetricSelect } from './MetricSelect';
|
||||||
import { LegacyForms } from '@grafana/ui';
|
import { LegacyForms } from '@grafana/ui';
|
||||||
|
import { expect } from '../../../../test/lib/common';
|
||||||
|
|
||||||
const { Select } = LegacyForms;
|
const { Select } = LegacyForms;
|
||||||
|
|
||||||
describe('MetricSelect', () => {
|
describe('MetricSelect', () => {
|
||||||
@ -32,16 +34,15 @@ describe('MetricSelect', () => {
|
|||||||
variables: [],
|
variables: [],
|
||||||
};
|
};
|
||||||
const wrapper = shallow(<MetricSelect {...props} />);
|
const wrapper = shallow(<MetricSelect {...props} />);
|
||||||
wrapper
|
const select = wrapper.find(Select);
|
||||||
.find(Select)
|
|
||||||
.props()
|
select.props().onChange({ value: 'foo' });
|
||||||
.onChange({ value: 'foo' });
|
|
||||||
expect(
|
expect(select.props().noOptionsMessage).toBeDefined();
|
||||||
wrapper
|
|
||||||
.find(Select)
|
// @ts-ignore typescript doesn't understand that noOptionsMessage can't be undefined here
|
||||||
.props()
|
const noOptionsMessage = select.props().noOptionsMessage();
|
||||||
.noOptionsMessage()
|
expect(noOptionsMessage).toEqual('No options found');
|
||||||
).toEqual('No options found');
|
|
||||||
expect(spyOnChange).toHaveBeenCalledWith('foo');
|
expect(spyOnChange).toHaveBeenCalledWith('foo');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -14,7 +14,7 @@ describe('searchForTags', () => {
|
|||||||
title: 'some title',
|
title: 'some title',
|
||||||
tooltip: 'some tooltip',
|
tooltip: 'some tooltip',
|
||||||
type: 'dashboards',
|
type: 'dashboards',
|
||||||
url: undefined,
|
url: '/d/6ieouugGk/DashLinks',
|
||||||
};
|
};
|
||||||
const backendSrv: any = {
|
const backendSrv: any = {
|
||||||
search: jest.fn(args => []),
|
search: jest.fn(args => []),
|
||||||
@ -46,7 +46,7 @@ describe('resolveLinks', () => {
|
|||||||
title: 'some title',
|
title: 'some title',
|
||||||
tooltip: 'some tooltip',
|
tooltip: 'some tooltip',
|
||||||
type: 'dashboards',
|
type: 'dashboards',
|
||||||
url: undefined,
|
url: '/d/6ieouugGk/DashLinks',
|
||||||
};
|
};
|
||||||
const searchHits: DashboardSearchHit[] = [
|
const searchHits: DashboardSearchHit[] = [
|
||||||
{
|
{
|
||||||
|
@ -153,6 +153,8 @@ describe('DashboardPage', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('Should update model state normal state', () => {
|
it('Should update model state normal state', () => {
|
||||||
|
expect(ctx.dashboard).toBeDefined();
|
||||||
|
// @ts-ignore typescript doesn't understand that dashboard must be defined to reach the row below
|
||||||
expect(ctx.dashboard.panelInEdit).toBeUndefined();
|
expect(ctx.dashboard.panelInEdit).toBeUndefined();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -53,7 +53,11 @@ describe('filterPanelDataToQuery', () => {
|
|||||||
} as unknown) as PanelData;
|
} as unknown) as PanelData;
|
||||||
|
|
||||||
const panelData = filterPanelDataToQuery(withError, 'B');
|
const panelData = filterPanelDataToQuery(withError, 'B');
|
||||||
|
expect(panelData).toBeDefined();
|
||||||
|
|
||||||
|
// @ts-ignore typescript doesn't understand that panelData can't be undefined here
|
||||||
expect(panelData.state).toBe(LoadingState.Error);
|
expect(panelData.state).toBe(LoadingState.Error);
|
||||||
|
// @ts-ignore typescript doesn't understand that panelData can't be undefined here
|
||||||
expect(panelData.error).toBe(withError.error);
|
expect(panelData.error).toBe(withError.error);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -1,7 +1,14 @@
|
|||||||
import { PanelQueryRunner } from './PanelQueryRunner';
|
import { PanelQueryRunner } from './PanelQueryRunner';
|
||||||
// Importing this way to be able to spy on grafana/data
|
// Importing this way to be able to spy on grafana/data
|
||||||
import * as grafanaData from '@grafana/data';
|
import * as grafanaData from '@grafana/data';
|
||||||
import { DataConfigSource, DataQueryRequest, GrafanaTheme, PanelData, ScopedVars } from '@grafana/data';
|
import {
|
||||||
|
DataConfigSource,
|
||||||
|
DataQueryRequest,
|
||||||
|
DataTransformerConfig,
|
||||||
|
GrafanaTheme,
|
||||||
|
PanelData,
|
||||||
|
ScopedVars,
|
||||||
|
} from '@grafana/data';
|
||||||
import { DashboardModel } from './index';
|
import { DashboardModel } from './index';
|
||||||
import { setEchoSrv } from '@grafana/runtime';
|
import { setEchoSrv } from '@grafana/runtime';
|
||||||
import { Echo } from '../../../core/services/echo/Echo';
|
import { Echo } from '../../../core/services/echo/Echo';
|
||||||
@ -244,7 +251,7 @@ describe('PanelQueryRunner', () => {
|
|||||||
{
|
{
|
||||||
getFieldOverrideOptions: () => undefined,
|
getFieldOverrideOptions: () => undefined,
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
getTransformations: () => [{}],
|
getTransformations: () => [({} as unknown) as DataTransformerConfig],
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -288,7 +295,7 @@ describe('PanelQueryRunner', () => {
|
|||||||
theme: {} as GrafanaTheme,
|
theme: {} as GrafanaTheme,
|
||||||
}),
|
}),
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
getTransformations: () => [{}],
|
getTransformations: () => [({} as unknown) as DataTransformerConfig],
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
@ -2,7 +2,7 @@ import React from 'react';
|
|||||||
import { shallow } from 'enzyme';
|
import { shallow } from 'enzyme';
|
||||||
import { TraceView } from './TraceView';
|
import { TraceView } from './TraceView';
|
||||||
import { TracePageHeader, TraceTimelineViewer } from '@jaegertracing/jaeger-ui-components';
|
import { TracePageHeader, TraceTimelineViewer } from '@jaegertracing/jaeger-ui-components';
|
||||||
import { TraceData, SpanData } from '@grafana/data';
|
import { SpanData, TraceData } from '@grafana/data';
|
||||||
|
|
||||||
function renderTraceView() {
|
function renderTraceView() {
|
||||||
const wrapper = shallow(<TraceView trace={response} />);
|
const wrapper = shallow(<TraceView trace={response} />);
|
||||||
@ -98,7 +98,7 @@ describe('TraceView', () => {
|
|||||||
header.props().onSearchValueChange('HTTP POST - api_prom_push');
|
header.props().onSearchValueChange('HTTP POST - api_prom_push');
|
||||||
|
|
||||||
const timeline = wrapper.find(TraceTimelineViewer);
|
const timeline = wrapper.find(TraceTimelineViewer);
|
||||||
expect(timeline.props().findMatchesIDs.has('1ed38015486087ca')).toBeTruthy();
|
expect(timeline.props().findMatchesIDs?.has('1ed38015486087ca')).toBeTruthy();
|
||||||
});
|
});
|
||||||
|
|
||||||
it('change viewRange', () => {
|
it('change viewRange', () => {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { renderHook, act } from '@testing-library/react-hooks';
|
import { act, renderHook } from '@testing-library/react-hooks';
|
||||||
import { Log } from '@grafana/data';
|
import { Log } from '@grafana/data';
|
||||||
import { useDetailState } from './useDetailState';
|
import { useDetailState } from './useDetailState';
|
||||||
|
|
||||||
@ -19,38 +19,38 @@ describe('useDetailState', () => {
|
|||||||
const { result } = renderHook(() => useDetailState());
|
const { result } = renderHook(() => useDetailState());
|
||||||
act(() => result.current.toggleDetail('span1'));
|
act(() => result.current.toggleDetail('span1'));
|
||||||
act(() => result.current.detailLogsToggle('span1'));
|
act(() => result.current.detailLogsToggle('span1'));
|
||||||
expect(result.current.detailStates.get('span1').logs.isOpen).toBe(true);
|
expect(result.current.detailStates.get('span1')?.logs.isOpen).toBe(true);
|
||||||
|
|
||||||
const log = { timestamp: 1 } as Log;
|
const log = { timestamp: 1 } as Log;
|
||||||
act(() => result.current.detailLogItemToggle('span1', log));
|
act(() => result.current.detailLogItemToggle('span1', log));
|
||||||
expect(result.current.detailStates.get('span1').logs.openedItems.has(log)).toBe(true);
|
expect(result.current.detailStates.get('span1')?.logs.openedItems.has(log)).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('toggles warnings', async () => {
|
it('toggles warnings', async () => {
|
||||||
const { result } = renderHook(() => useDetailState());
|
const { result } = renderHook(() => useDetailState());
|
||||||
act(() => result.current.toggleDetail('span1'));
|
act(() => result.current.toggleDetail('span1'));
|
||||||
act(() => result.current.detailWarningsToggle('span1'));
|
act(() => result.current.detailWarningsToggle('span1'));
|
||||||
expect(result.current.detailStates.get('span1').isWarningsOpen).toBe(true);
|
expect(result.current.detailStates.get('span1')?.isWarningsOpen).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('toggles references', async () => {
|
it('toggles references', async () => {
|
||||||
const { result } = renderHook(() => useDetailState());
|
const { result } = renderHook(() => useDetailState());
|
||||||
act(() => result.current.toggleDetail('span1'));
|
act(() => result.current.toggleDetail('span1'));
|
||||||
act(() => result.current.detailReferencesToggle('span1'));
|
act(() => result.current.detailReferencesToggle('span1'));
|
||||||
expect(result.current.detailStates.get('span1').isReferencesOpen).toBe(true);
|
expect(result.current.detailStates.get('span1')?.isReferencesOpen).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('toggles processes', async () => {
|
it('toggles processes', async () => {
|
||||||
const { result } = renderHook(() => useDetailState());
|
const { result } = renderHook(() => useDetailState());
|
||||||
act(() => result.current.toggleDetail('span1'));
|
act(() => result.current.toggleDetail('span1'));
|
||||||
act(() => result.current.detailProcessToggle('span1'));
|
act(() => result.current.detailProcessToggle('span1'));
|
||||||
expect(result.current.detailStates.get('span1').isProcessOpen).toBe(true);
|
expect(result.current.detailStates.get('span1')?.isProcessOpen).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('toggles tags', async () => {
|
it('toggles tags', async () => {
|
||||||
const { result } = renderHook(() => useDetailState());
|
const { result } = renderHook(() => useDetailState());
|
||||||
act(() => result.current.toggleDetail('span1'));
|
act(() => result.current.toggleDetail('span1'));
|
||||||
act(() => result.current.detailTagsToggle('span1'));
|
act(() => result.current.detailTagsToggle('span1'));
|
||||||
expect(result.current.detailStates.get('span1').isTagsOpen).toBe(true);
|
expect(result.current.detailStates.get('span1')?.isTagsOpen).toBe(true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { renderHook, act } from '@testing-library/react-hooks';
|
import { act, renderHook } from '@testing-library/react-hooks';
|
||||||
import { useSearch } from './useSearch';
|
import { useSearch } from './useSearch';
|
||||||
import { Span } from '@grafana/data';
|
import { Span } from '@grafana/data';
|
||||||
|
|
||||||
@ -6,7 +6,7 @@ describe('useSearch', () => {
|
|||||||
it('returns matching span IDs', async () => {
|
it('returns matching span IDs', async () => {
|
||||||
const { result } = renderHook(() =>
|
const { result } = renderHook(() =>
|
||||||
useSearch([
|
useSearch([
|
||||||
{
|
({
|
||||||
spanID: 'span1',
|
spanID: 'span1',
|
||||||
operationName: 'operation1',
|
operationName: 'operation1',
|
||||||
process: {
|
process: {
|
||||||
@ -15,9 +15,9 @@ describe('useSearch', () => {
|
|||||||
},
|
},
|
||||||
tags: [],
|
tags: [],
|
||||||
logs: [],
|
logs: [],
|
||||||
} as Span,
|
} as unknown) as Span,
|
||||||
|
|
||||||
{
|
({
|
||||||
spanID: 'span2',
|
spanID: 'span2',
|
||||||
operationName: 'operation2',
|
operationName: 'operation2',
|
||||||
process: {
|
process: {
|
||||||
@ -26,13 +26,13 @@ describe('useSearch', () => {
|
|||||||
},
|
},
|
||||||
tags: [],
|
tags: [],
|
||||||
logs: [],
|
logs: [],
|
||||||
} as Span,
|
} as unknown) as Span,
|
||||||
])
|
])
|
||||||
);
|
);
|
||||||
|
|
||||||
act(() => result.current.setSearch('service1'));
|
act(() => result.current.setSearch('service1'));
|
||||||
expect(result.current.spanFindMatches.size).toBe(1);
|
expect(result.current.spanFindMatches?.size).toBe(1);
|
||||||
expect(result.current.spanFindMatches.has('span1')).toBe(true);
|
expect(result.current.spanFindMatches?.has('span1')).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('works without spans', async () => {
|
it('works without spans', async () => {
|
||||||
|
Loading…
Reference in New Issue
Block a user