diff --git a/public/app/features/explore/state/query.test.ts b/public/app/features/explore/state/query.test.ts index 24d5601b5cd..436ecf94fe2 100644 --- a/public/app/features/explore/state/query.test.ts +++ b/public/app/features/explore/state/query.test.ts @@ -4,6 +4,7 @@ import { thunkTester } from 'test/core/thunk/thunkTester'; import { assertIsDefined } from 'test/helpers/asserts'; import { + DataQueryRequest, DataQueryResponse, DataSourceApi, DataSourceJsonData, @@ -52,6 +53,7 @@ import { makeExplorePaneState } from './utils'; const { testRange, defaultInitialState } = createDefaultInitialState(); const exploreId = 'left'; +const cleanUpMock = jest.fn(); const datasources: DataSourceApi[] = [ { name: 'testDs', @@ -769,6 +771,39 @@ describe('reducer', () => { }); }); + describe('when data source does not support log volume supplementary query', () => { + it('cleans up query subscription correctly (regression #70049)', async () => { + const store: { dispatch: ThunkDispatch; getState: () => StoreState } = configureStore({ + ...defaultInitialState, + explore: { + panes: { + left: { + ...defaultInitialState.explore.panes.left, + datasourceInstance: { + getRef: jest.fn(), + meta: { + id: 'something', + }, + query( + request: DataQueryRequest + ): Promise | Observable { + return new Observable(() => cleanUpMock); + }, + }, + }, + }, + }, + } as unknown as Partial); + + const dispatch = store.dispatch; + + cleanUpMock.mockClear(); + await dispatch(runQueries({ exploreId: 'left' })); + await dispatch(cancelQueries('left')); + expect(cleanUpMock).toBeCalledTimes(1); + }); + }); + describe('supplementary queries', () => { let dispatch: ThunkDispatch, getState: () => StoreState, diff --git a/public/app/features/explore/utils/supplementaryQueries.ts b/public/app/features/explore/utils/supplementaryQueries.ts index aeba3e21dca..1b2300e4d3c 100644 --- a/public/app/features/explore/utils/supplementaryQueries.ts +++ b/public/app/features/explore/utils/supplementaryQueries.ts @@ -58,7 +58,7 @@ const createFallbackLogVolumeProvider = ( datasourceName: string ): Observable => { return new Observable((observer) => { - explorePanelData.subscribe((exploreData) => { + return explorePanelData.subscribe((exploreData) => { if ( exploreData.logsResult && exploreData.logsResult.rows &&