From c4e3110034efa22200e837f2844d875f74d0ff06 Mon Sep 17 00:00:00 2001 From: Shavonn Brown Date: Mon, 3 Feb 2020 09:07:50 -0500 Subject: [PATCH] deps so can mock in tests (#21827) --- .../datasources/state/actions.test.ts | 43 +++++++++++++------ .../app/features/datasources/state/actions.ts | 18 ++++++-- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/public/app/features/datasources/state/actions.test.ts b/public/app/features/datasources/state/actions.test.ts index a4604939c7a..0d2b3439ac7 100644 --- a/public/app/features/datasources/state/actions.test.ts +++ b/public/app/features/datasources/state/actions.test.ts @@ -1,4 +1,10 @@ -import { findNewName, nameExits, InitDataSourceSettingDependencies, testDataSource } from './actions'; +import { + findNewName, + nameExits, + InitDataSourceSettingDependencies, + testDataSource, + TestDataSourceDependencies, +} from './actions'; import { getMockPlugin, getMockPlugins } from '../../plugins/__mocks__/pluginMocks'; import { thunkTester } from 'test/core/thunk/thunkTester'; import { @@ -11,10 +17,17 @@ import { import { initDataSourceSettings } from '../state/actions'; import { ThunkResult, ThunkDispatch } from 'app/types'; import { GenericDataSourcePlugin } from '../settings/PluginSettings'; -import * as DatasourceSrv from 'app/features/plugins/datasource_srv'; -jest.mock('app/features/plugins/datasource_srv'); -const getDatasourceSrvMock = (DatasourceSrv.getDatasourceSrv as any) as jest.Mock; +const getBackendSrvMock = () => + ({ + get: jest.fn().mockReturnValue({ + testDatasource: jest.fn().mockReturnValue({ + status: '', + message: '', + }), + }), + withNoBackendCache: jest.fn().mockImplementationOnce(cb => cb()), + } as any); describe('Name exists', () => { const plugins = getMockPlugins(5); @@ -131,8 +144,8 @@ describe('initDataSourceSettings', () => { describe('testDataSource', () => { describe('when a datasource is tested', () => { it('then testDataSourceStarting and testDataSourceSucceeded should be dispatched', async () => { - getDatasourceSrvMock.mockImplementation( - () => + const dependencies: TestDataSourceDependencies = { + getDatasourceSrv: () => ({ get: jest.fn().mockReturnValue({ testDatasource: jest.fn().mockReturnValue({ @@ -140,8 +153,9 @@ describe('testDataSource', () => { message: '', }), }), - } as any) - ); + } as any), + getBackendSrv: getBackendSrvMock, + }; const state = { testingStatus: { status: '', @@ -150,22 +164,23 @@ describe('testDataSource', () => { }; const dispatchedActions = await thunkTester(state) .givenThunk(testDataSource) - .whenThunkIsDispatched('Azure Monitor'); + .whenThunkIsDispatched('Azure Monitor', dependencies); expect(dispatchedActions).toEqual([testDataSourceStarting(), testDataSourceSucceeded(state.testingStatus)]); }); it('then testDataSourceFailed should be dispatched', async () => { - getDatasourceSrvMock.mockImplementation( - () => + const dependencies: TestDataSourceDependencies = { + getDatasourceSrv: () => ({ get: jest.fn().mockReturnValue({ testDatasource: jest.fn().mockImplementation(() => { throw new Error('Error testing datasource'); }), }), - } as any) - ); + } as any), + getBackendSrv: getBackendSrvMock, + }; const result = { message: 'Error testing datasource', }; @@ -177,7 +192,7 @@ describe('testDataSource', () => { }; const dispatchedActions = await thunkTester(state) .givenThunk(testDataSource) - .whenThunkIsDispatched('Azure Monitor'); + .whenThunkIsDispatched('Azure Monitor', dependencies); expect(dispatchedActions).toEqual([testDataSourceStarting(), testDataSourceFailed(result)]); }); diff --git a/public/app/features/datasources/state/actions.ts b/public/app/features/datasources/state/actions.ts index 1eca6a63047..4554d4bd7a1 100644 --- a/public/app/features/datasources/state/actions.ts +++ b/public/app/features/datasources/state/actions.ts @@ -21,6 +21,7 @@ import { } from './reducers'; import { buildCategories } from './buildCategories'; import { getDataSource, getDataSourceMeta } from './selectors'; +import { getDataSourceSrv } from '@grafana/runtime'; export interface DataSourceTypesLoadedPayload { plugins: DataSourcePluginMeta[]; @@ -34,6 +35,11 @@ export interface InitDataSourceSettingDependencies { importDataSourcePlugin: typeof importDataSourcePlugin; } +export interface TestDataSourceDependencies { + getDatasourceSrv: typeof getDataSourceSrv; + getBackendSrv: typeof getBackendSrv; +} + export const initDataSourceSettings = ( pageId: number, dependencies: InitDataSourceSettingDependencies = { @@ -67,9 +73,15 @@ export const initDataSourceSettings = ( }; }; -export const testDataSource = (dataSourceName: string): ThunkResult => { +export const testDataSource = ( + dataSourceName: string, + dependencies: TestDataSourceDependencies = { + getDatasourceSrv, + getBackendSrv, + } +): ThunkResult => { return async (dispatch: ThunkDispatch, getState) => { - const dsApi = await getDatasourceSrv().get(dataSourceName); + const dsApi = await dependencies.getDatasourceSrv().get(dataSourceName); if (!dsApi.testDatasource) { return; @@ -77,7 +89,7 @@ export const testDataSource = (dataSourceName: string): ThunkResult => { dispatch(testDataSourceStarting()); - getBackendSrv().withNoBackendCache(async () => { + dependencies.getBackendSrv().withNoBackendCache(async () => { try { const result = await dsApi.testDatasource();