mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* WIP: initial commit * Fix: Fixed $timeout call when testing snapshots * Chore: reverts changes to metrics_panel_ctrl.ts * Chore: reverts changes to annotations_srv * Refactor: adds DashboardQueryRunner.run to initdashboard * Refactor: adds run to dashboard model start refresh * Refactor: move to own folder and split up into smaller files * Tests: adds tests for LegacyAnnotationQueryRunner * Tests: adds tests for AnnotationsQueryRunner * Tests: adds tests for SnapshotWorker * Refactor: renames from canRun|run to canWork|work * Tests: adds tests for AlertStatesWorker * Tests: adds tests for AnnotationsWorker * Refactor: renames operators * Refactor: renames operators * Tests: adds tests for DashboardQueryRunner * Refactor: adds mergePanelAndDashboardData function * Tests: fixes broken tests * Chore: Fixes errors after merge with master * Chore: Removes usage of AnnotationSrv from event_editor and initDashboard * WIP: getting annotations and alerts working in graph (snapshot not working) * Refactor: fixes snapshot data for React panels * Refactor: Fixes so snapshots work for Graph * Refactor: moves alert types to grafana-data * Refactor: changes to some for readability * Tests: skipping tests for now, needs rewrite * Refactor: refactors out common static functions to utils * Refactor: fixes resolving annotations from dataframes * Refactor: removes getRunners/Workers functions * Docs: fixes docs errors * Docs: trying to fix doc error * Refactor: changes after PR comments * Refactor: hides everything behind a factory instead * Refactor: adds cancellation between runs and explicitly
198 lines
6.7 KiB
TypeScript
198 lines
6.7 KiB
TypeScript
import { throwError } from 'rxjs';
|
|
import { setDataSourceSrv } from '@grafana/runtime';
|
|
|
|
import { AnnotationsWorker } from './AnnotationsWorker';
|
|
import * as annotationsSrv from '../../../annotations/annotations_srv';
|
|
import { getDefaultOptions, LEGACY_DS_NAME, NEXT_GEN_DS_NAME, toAsyncOfResult } from './testHelpers';
|
|
import { silenceConsoleOutput } from '../../../../../test/core/utils/silenceConsoleOutput';
|
|
|
|
function getTestContext() {
|
|
jest.clearAllMocks();
|
|
const executeAnnotationQueryMock = jest
|
|
.spyOn(annotationsSrv, 'executeAnnotationQuery')
|
|
.mockReturnValue(toAsyncOfResult({ events: [{ id: 'NextGen' }] }));
|
|
const annotationQueryMock = jest.fn().mockResolvedValue([{ id: 'Legacy' }]);
|
|
const dataSourceSrvMock: any = {
|
|
get: async (name: string) => {
|
|
if (name === LEGACY_DS_NAME) {
|
|
return {
|
|
annotationQuery: annotationQueryMock,
|
|
};
|
|
}
|
|
|
|
if (name === NEXT_GEN_DS_NAME) {
|
|
return {
|
|
annotations: {},
|
|
};
|
|
}
|
|
|
|
return {};
|
|
},
|
|
};
|
|
setDataSourceSrv(dataSourceSrvMock);
|
|
const options = getDefaultOptions();
|
|
|
|
return { options, annotationQueryMock, executeAnnotationQueryMock };
|
|
}
|
|
|
|
describe('AnnotationsWorker', () => {
|
|
const worker = new AnnotationsWorker();
|
|
|
|
describe('when canWork is called with correct props', () => {
|
|
it('then it should return true', () => {
|
|
const options = getDefaultOptions();
|
|
|
|
expect(worker.canWork(options)).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('when canWork is called with incorrect props', () => {
|
|
it('then it should return false', () => {
|
|
const dashboard: any = { annotations: { list: [] } };
|
|
const options = { ...getDefaultOptions(), dashboard };
|
|
|
|
expect(worker.canWork(options)).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('when run is called with incorrect props', () => {
|
|
it('then it should return the correct results', async () => {
|
|
const dashboard: any = { annotations: { list: [] } };
|
|
const options = { ...getDefaultOptions(), dashboard };
|
|
|
|
await expect(worker.work(options)).toEmitValues([{ alertStates: [], annotations: [] }]);
|
|
});
|
|
});
|
|
|
|
describe('when run is called with correct props and all workers are successful', () => {
|
|
it('then it should return the correct results', async () => {
|
|
const { options, executeAnnotationQueryMock, annotationQueryMock } = getTestContext();
|
|
|
|
await expect(worker.work(options)).toEmitValuesWith((received) => {
|
|
expect(received).toHaveLength(1);
|
|
const result = received[0];
|
|
expect(result).toEqual({
|
|
alertStates: [],
|
|
annotations: [
|
|
{
|
|
id: 'Legacy',
|
|
source: {
|
|
enable: true,
|
|
hide: false,
|
|
name: 'Test',
|
|
iconColor: 'pink',
|
|
snapshotData: undefined,
|
|
datasource: 'Legacy',
|
|
},
|
|
color: 'pink',
|
|
type: 'Test',
|
|
isRegion: false,
|
|
},
|
|
{
|
|
id: 'NextGen',
|
|
source: {
|
|
enable: true,
|
|
hide: false,
|
|
name: 'Test',
|
|
iconColor: 'pink',
|
|
snapshotData: undefined,
|
|
datasource: 'NextGen',
|
|
},
|
|
color: 'pink',
|
|
type: 'Test',
|
|
isRegion: false,
|
|
},
|
|
],
|
|
});
|
|
expect(executeAnnotationQueryMock).toHaveBeenCalledTimes(1);
|
|
expect(annotationQueryMock).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('when run is called with correct props and legacy worker fails', () => {
|
|
silenceConsoleOutput();
|
|
it('then it should return the correct results', async () => {
|
|
const { options, executeAnnotationQueryMock, annotationQueryMock } = getTestContext();
|
|
annotationQueryMock.mockRejectedValue({ message: 'Some error' });
|
|
|
|
await expect(worker.work(options)).toEmitValuesWith((received) => {
|
|
expect(received).toHaveLength(1);
|
|
const result = received[0];
|
|
expect(result).toEqual({
|
|
alertStates: [],
|
|
annotations: [
|
|
{
|
|
id: 'NextGen',
|
|
source: {
|
|
enable: true,
|
|
hide: false,
|
|
name: 'Test',
|
|
iconColor: 'pink',
|
|
snapshotData: undefined,
|
|
datasource: 'NextGen',
|
|
},
|
|
color: 'pink',
|
|
type: 'Test',
|
|
isRegion: false,
|
|
},
|
|
],
|
|
});
|
|
expect(executeAnnotationQueryMock).toHaveBeenCalledTimes(1);
|
|
expect(annotationQueryMock).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|
|
|
|
describe('when run is called with correct props and nextgen worker fails', () => {
|
|
silenceConsoleOutput();
|
|
it('then it should return the correct results', async () => {
|
|
const { options, executeAnnotationQueryMock, annotationQueryMock } = getTestContext();
|
|
executeAnnotationQueryMock.mockReturnValue(throwError({ message: 'An error' }));
|
|
|
|
await expect(worker.work(options)).toEmitValuesWith((received) => {
|
|
expect(received).toHaveLength(1);
|
|
const result = received[0];
|
|
expect(result).toEqual({
|
|
alertStates: [],
|
|
annotations: [
|
|
{
|
|
id: 'Legacy',
|
|
source: {
|
|
enable: true,
|
|
hide: false,
|
|
name: 'Test',
|
|
iconColor: 'pink',
|
|
snapshotData: undefined,
|
|
datasource: 'Legacy',
|
|
},
|
|
color: 'pink',
|
|
type: 'Test',
|
|
isRegion: false,
|
|
},
|
|
],
|
|
});
|
|
expect(executeAnnotationQueryMock).toHaveBeenCalledTimes(1);
|
|
expect(annotationQueryMock).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('when run is called with correct props and both workers fail', () => {
|
|
silenceConsoleOutput();
|
|
it('then it should return the correct results', async () => {
|
|
const { options, executeAnnotationQueryMock, annotationQueryMock } = getTestContext();
|
|
annotationQueryMock.mockRejectedValue({ message: 'Some error' });
|
|
executeAnnotationQueryMock.mockReturnValue(throwError({ message: 'An error' }));
|
|
|
|
await expect(worker.work(options)).toEmitValuesWith((received) => {
|
|
expect(received).toHaveLength(1);
|
|
const result = received[0];
|
|
expect(result).toEqual({ alertStates: [], annotations: [] });
|
|
expect(executeAnnotationQueryMock).toHaveBeenCalledTimes(1);
|
|
expect(annotationQueryMock).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
});
|