mirror of
https://github.com/grafana/grafana.git
synced 2025-02-11 08:05:43 -06:00
216 lines
5.6 KiB
TypeScript
216 lines
5.6 KiB
TypeScript
import { render, screen } from '@testing-library/react';
|
|
import React from 'react';
|
|
import { AutoSizerProps } from 'react-virtualized-auto-sizer';
|
|
import { TestProvider } from 'test/helpers/TestProvider';
|
|
|
|
import { CoreApp, createTheme, DataSourceApi, EventBusSrv, LoadingState, PluginExtensionTypes } from '@grafana/data';
|
|
import { selectors } from '@grafana/e2e-selectors';
|
|
import { getPluginLinkExtensions } from '@grafana/runtime';
|
|
import { configureStore } from 'app/store/configureStore';
|
|
|
|
import { Explore, Props } from './Explore';
|
|
import { initialExploreState } from './state/main';
|
|
import { scanStopAction } from './state/query';
|
|
import { createEmptyQueryResponse, makeExplorePaneState } from './state/utils';
|
|
|
|
const resizeWindow = (x: number, y: number) => {
|
|
global.innerWidth = x;
|
|
global.innerHeight = y;
|
|
global.dispatchEvent(new Event('resize'));
|
|
};
|
|
|
|
const makeEmptyQueryResponse = (loadingState: LoadingState) => {
|
|
const baseEmptyResponse = createEmptyQueryResponse();
|
|
|
|
baseEmptyResponse.request = {
|
|
requestId: '1',
|
|
intervalMs: 0,
|
|
interval: '1s',
|
|
panelId: 1,
|
|
range: baseEmptyResponse.timeRange,
|
|
scopedVars: {
|
|
apps: {
|
|
value: 'value',
|
|
text: 'text',
|
|
},
|
|
},
|
|
targets: [
|
|
{
|
|
refId: 'A',
|
|
},
|
|
],
|
|
timezone: 'UTC',
|
|
app: CoreApp.Explore,
|
|
startTime: 0,
|
|
};
|
|
|
|
baseEmptyResponse.state = loadingState;
|
|
|
|
return baseEmptyResponse;
|
|
};
|
|
|
|
const dummyProps: Props = {
|
|
logsResult: undefined,
|
|
changeSize: jest.fn(),
|
|
datasourceInstance: {
|
|
meta: {
|
|
metrics: true,
|
|
logs: true,
|
|
},
|
|
components: {
|
|
QueryEditorHelp: {},
|
|
},
|
|
} as DataSourceApi,
|
|
exploreId: 'left',
|
|
loading: false,
|
|
modifyQueries: jest.fn(),
|
|
scanStart: jest.fn(),
|
|
scanStopAction: scanStopAction,
|
|
setQueries: jest.fn(),
|
|
queryKeys: [],
|
|
queries: [],
|
|
isLive: false,
|
|
syncedTimes: false,
|
|
updateTimeRange: jest.fn(),
|
|
graphResult: [],
|
|
absoluteRange: {
|
|
from: 0,
|
|
to: 0,
|
|
},
|
|
timeZone: 'UTC',
|
|
queryResponse: makeEmptyQueryResponse(LoadingState.NotStarted),
|
|
addQueryRow: jest.fn(),
|
|
theme: createTheme(),
|
|
showMetrics: true,
|
|
showLogs: true,
|
|
showTable: true,
|
|
showTrace: true,
|
|
showCustom: true,
|
|
showNodeGraph: true,
|
|
showFlameGraph: true,
|
|
splitOpen: jest.fn(),
|
|
splitted: false,
|
|
eventBus: new EventBusSrv(),
|
|
showRawPrometheus: false,
|
|
showLogsSample: false,
|
|
logsSample: { enabled: false },
|
|
setSupplementaryQueryEnabled: jest.fn(),
|
|
};
|
|
|
|
jest.mock('@grafana/runtime/src/services/dataSourceSrv', () => {
|
|
return {
|
|
getDataSourceSrv: () => ({
|
|
get: () => Promise.resolve({}),
|
|
getList: () => [],
|
|
getInstanceSettings: () => {},
|
|
}),
|
|
};
|
|
});
|
|
|
|
jest.mock('app/core/core', () => ({
|
|
contextSrv: {
|
|
hasAccess: () => true,
|
|
getValidIntervals: (defaultIntervals: string[]) => defaultIntervals,
|
|
},
|
|
}));
|
|
|
|
jest.mock('@grafana/runtime', () => ({
|
|
...jest.requireActual('@grafana/runtime'),
|
|
getPluginLinkExtensions: jest.fn(() => ({ extensions: [] })),
|
|
}));
|
|
|
|
// for the AutoSizer component to have a width
|
|
jest.mock('react-virtualized-auto-sizer', () => {
|
|
return ({ children }: AutoSizerProps) => children({ height: 1, width: 1 });
|
|
});
|
|
|
|
const getPluginLinkExtensionsMock = jest.mocked(getPluginLinkExtensions);
|
|
|
|
const setup = (overrideProps?: Partial<Props>) => {
|
|
const store = configureStore({
|
|
explore: {
|
|
...initialExploreState,
|
|
panes: {
|
|
left: makeExplorePaneState(),
|
|
},
|
|
},
|
|
});
|
|
const exploreProps = { ...dummyProps, ...overrideProps };
|
|
|
|
return render(
|
|
<TestProvider store={store}>
|
|
<Explore {...exploreProps} />
|
|
</TestProvider>
|
|
);
|
|
};
|
|
|
|
describe('Explore', () => {
|
|
it('should not render no data with not started loading state', async () => {
|
|
setup();
|
|
|
|
// Wait for the Explore component to render
|
|
await screen.findByTestId(selectors.components.DataSourcePicker.container);
|
|
|
|
expect(screen.queryByTestId('explore-no-data')).not.toBeInTheDocument();
|
|
});
|
|
|
|
it('should render no data with done loading state', async () => {
|
|
setup({ queryResponse: makeEmptyQueryResponse(LoadingState.Done) });
|
|
|
|
// Wait for the Explore component to render
|
|
await screen.findByTestId(selectors.components.DataSourcePicker.container);
|
|
|
|
expect(screen.getByTestId('explore-no-data')).toBeInTheDocument();
|
|
});
|
|
|
|
it('should render toolbar extension point if extensions is available', async () => {
|
|
getPluginLinkExtensionsMock.mockReturnValueOnce({
|
|
extensions: [
|
|
{
|
|
id: '1',
|
|
pluginId: 'grafana',
|
|
title: 'Test 1',
|
|
description: '',
|
|
type: PluginExtensionTypes.link,
|
|
onClick: () => {},
|
|
},
|
|
{
|
|
id: '2',
|
|
pluginId: 'grafana',
|
|
title: 'Test 2',
|
|
description: '',
|
|
type: PluginExtensionTypes.link,
|
|
onClick: () => {},
|
|
},
|
|
],
|
|
});
|
|
|
|
setup({ queryResponse: makeEmptyQueryResponse(LoadingState.Done) });
|
|
// Wait for the Explore component to render
|
|
await screen.findByTestId(selectors.components.DataSourcePicker.container);
|
|
|
|
expect(screen.getByRole('button', { name: 'Add' })).toBeVisible();
|
|
});
|
|
|
|
describe('On small screens', () => {
|
|
const windowWidth = global.innerWidth,
|
|
windowHeight = global.innerHeight;
|
|
|
|
beforeAll(() => {
|
|
resizeWindow(500, 500);
|
|
});
|
|
|
|
afterAll(() => {
|
|
resizeWindow(windowWidth, windowHeight);
|
|
});
|
|
|
|
it('should render data source picker', async () => {
|
|
setup();
|
|
|
|
const dataSourcePicker = await screen.findByTestId(selectors.components.DataSourcePicker.container);
|
|
|
|
expect(dataSourcePicker).toBeInTheDocument();
|
|
});
|
|
});
|
|
});
|