From f8393fb3393e9d02189a052abf765c4f9198adcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 6 May 2019 19:35:10 +0200 Subject: [PATCH] PanelModel: Clear queryRunner on destroy (#16906) * PanelModel: Clear queryRunner on destroy * fix test asumptions --- .../dashboard/state/PanelModel.test.ts | 20 ++++++++++++------- .../features/dashboard/state/PanelModel.ts | 1 + .../dashboard/state/PanelQueryState.ts | 2 +- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/public/app/features/dashboard/state/PanelModel.test.ts b/public/app/features/dashboard/state/PanelModel.test.ts index ceda847adf6..18a3086fe57 100644 --- a/public/app/features/dashboard/state/PanelModel.test.ts +++ b/public/app/features/dashboard/state/PanelModel.test.ts @@ -87,10 +87,7 @@ describe('PanelModel', () => { }); describe('when changing panel type', () => { - let panelQueryRunner: any; - beforeEach(() => { - panelQueryRunner = model.getQueryRunner(); model.changePlugin(getPanelPlugin({ id: 'graph' })); model.alert = { id: 2 }; }); @@ -109,9 +106,9 @@ describe('PanelModel', () => { expect(model.alert).toBe(undefined); }); - it('getQueryRunner() should return same instance after plugin change', () => { - const sameQueryRunner = model.getQueryRunner(); - expect(panelQueryRunner).toBe(sameQueryRunner); + it('panelQueryRunner should be cleared', () => { + const panelQueryRunner = (model as any).queryRunner; + expect(panelQueryRunner).toBeFalsy(); }); }); @@ -131,12 +128,15 @@ describe('PanelModel', () => { }); }); - describe('when changing to react panel', () => { + describe('when changing to react panel from angular panel', () => { + let panelQueryRunner: any; + const onPanelTypeChanged = jest.fn(); const reactPlugin = getPanelPlugin({ id: 'react' }).setPanelChangeHandler(onPanelTypeChanged as any); beforeEach(() => { model.changePlugin(reactPlugin); + panelQueryRunner = model.getQueryRunner(); }); it('should call react onPanelTypeChanged', () => { @@ -144,6 +144,12 @@ describe('PanelModel', () => { expect(onPanelTypeChanged.mock.calls[0][1]).toBe('table'); expect(onPanelTypeChanged.mock.calls[0][2].thresholds).toBeDefined(); }); + + it('getQueryRunner() should return same instance after changing to another react panel', () => { + model.changePlugin(getPanelPlugin({ id: 'react2' })); + const sameQueryRunner = model.getQueryRunner(); + expect(panelQueryRunner).toBe(sameQueryRunner); + }); }); describe('get panel options', () => { diff --git a/public/app/features/dashboard/state/PanelModel.ts b/public/app/features/dashboard/state/PanelModel.ts index d84e39d16c8..65a5a595d18 100644 --- a/public/app/features/dashboard/state/PanelModel.ts +++ b/public/app/features/dashboard/state/PanelModel.ts @@ -336,6 +336,7 @@ export class PanelModel { if (this.queryRunner) { this.queryRunner.destroy(); + this.queryRunner = null; } } } diff --git a/public/app/features/dashboard/state/PanelQueryState.ts b/public/app/features/dashboard/state/PanelQueryState.ts index 8f355bcd16e..889390f50b1 100644 --- a/public/app/features/dashboard/state/PanelQueryState.ts +++ b/public/app/features/dashboard/state/PanelQueryState.ts @@ -41,7 +41,7 @@ export class PanelQueryState { sendLegacy = false; // A promise for the running query - private executor?: Promise; + private executor?: Promise = null; private rejector = (reason?: any) => {}; private datasource: DataSourceApi = {} as any;