mirror of https://github.com/grafana/grafana
Variables: Only update panels that are impacted by variable change (#39420)
* Refactor: adds affectedPanelIds and fixes some bugs * Refactor: Fixes all dependencies and affected panel ids * Refactor: glue it together with events * Chore: remove debug code * Chore: remove unused events * Chore: removes unused function * Chore: reverts processRepeats * Chore: update to use redux state * Refactor: adds feature toggle in variables settings * Refactor: adds appEvents to jest-setup * Tests: adds tests for strict panel refresh logic * Refactor: small refactor * Refactor: moved to more events * Tests: fixes test * Refactor: makes sure we store strictPanelRefreshMode in dashboard model * Refactor: reporting and adds tests * Tests: fix broken tests * Tests: fix broken initDashboard test * Tests: fix broken Wrapper test * Refactor: adds solution for $__all_variables * Chore: updates to radio button * Refactor: removes toggle and calculates threshold instead * Chore: fix up tests * Refactor: moving functions around * Tests: fixes broken test * Update public/app/features/dashboard/services/TimeSrv.ts Co-authored-by: kay delaney <45561153+kaydelaney@users.noreply.github.com> * Chore: fix after PR comments * Chore: fix import and add comment * Chore: update after PR comments Co-authored-by: kay delaney <45561153+kaydelaney@users.noreply.github.com>pull/41466/head
parent
077b1e847a
commit
b4f00d6312
@ -0,0 +1,121 @@ |
|||||||
|
import { DashboardModel } from './DashboardModel'; |
||||||
|
import { appEvents } from '../../../core/core'; |
||||||
|
import { VariablesChanged } from '../../variables/types'; |
||||||
|
import { PanelModel } from './PanelModel'; |
||||||
|
import { getTimeSrv, setTimeSrv } from '../services/TimeSrv'; |
||||||
|
import { afterEach, beforeEach } from '../../../../test/lib/common'; |
||||||
|
|
||||||
|
function getTestContext({ |
||||||
|
usePanelInEdit, |
||||||
|
usePanelInView, |
||||||
|
}: { usePanelInEdit?: boolean; usePanelInView?: boolean } = {}) { |
||||||
|
jest.clearAllMocks(); |
||||||
|
|
||||||
|
const dashboard = new DashboardModel({}); |
||||||
|
const startRefreshMock = jest.fn(); |
||||||
|
dashboard.startRefresh = startRefreshMock; |
||||||
|
const panelInView = new PanelModel({ id: 99 }); |
||||||
|
const panelInEdit = new PanelModel({ id: 100 }); |
||||||
|
const panelIds = [1, 2, 3]; |
||||||
|
if (usePanelInEdit) { |
||||||
|
dashboard.panelInEdit = panelInEdit; |
||||||
|
panelIds.push(panelInEdit.id); |
||||||
|
} |
||||||
|
if (usePanelInView) { |
||||||
|
dashboard.panelInView = panelInView; |
||||||
|
panelIds.push(panelInView.id); |
||||||
|
} |
||||||
|
|
||||||
|
appEvents.publish(new VariablesChanged({ panelIds })); |
||||||
|
|
||||||
|
return { dashboard, startRefreshMock, panelInEdit, panelInView }; |
||||||
|
} |
||||||
|
|
||||||
|
describe('Strict panel refresh', () => { |
||||||
|
describe('when there is no panel in full view or panel in panel edit during variable change', () => { |
||||||
|
it('then all affected panels should be refreshed', () => { |
||||||
|
const { startRefreshMock } = getTestContext(); |
||||||
|
|
||||||
|
expect(startRefreshMock).toHaveBeenCalledTimes(1); |
||||||
|
expect(startRefreshMock).toHaveBeenLastCalledWith([1, 2, 3]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('testing refresh threshold', () => { |
||||||
|
const originalTimeSrv = getTimeSrv(); |
||||||
|
let isRefreshOutsideThreshold = false; |
||||||
|
|
||||||
|
beforeEach(() => { |
||||||
|
setTimeSrv({ |
||||||
|
isRefreshOutsideThreshold: () => isRefreshOutsideThreshold, |
||||||
|
} as any); |
||||||
|
}); |
||||||
|
|
||||||
|
afterEach(() => { |
||||||
|
setTimeSrv(originalTimeSrv); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('when the dashboard has not been refreshed within the threshold', () => { |
||||||
|
it(' then all panels should be refreshed', () => { |
||||||
|
isRefreshOutsideThreshold = true; |
||||||
|
const { startRefreshMock } = getTestContext(); |
||||||
|
|
||||||
|
expect(startRefreshMock).toHaveBeenCalledTimes(1); |
||||||
|
expect(startRefreshMock).toHaveBeenLastCalledWith(undefined); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('when the dashboard has been refreshed within the threshold', () => { |
||||||
|
it('then all affected panels should be refreshed', () => { |
||||||
|
isRefreshOutsideThreshold = false; |
||||||
|
const { startRefreshMock } = getTestContext(); |
||||||
|
|
||||||
|
expect(startRefreshMock).toHaveBeenCalledTimes(1); |
||||||
|
expect(startRefreshMock).toHaveBeenLastCalledWith([1, 2, 3]); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('when there is a panel in full view during variable change', () => { |
||||||
|
it('then all affected panels should be refreshed', () => { |
||||||
|
const { panelInView, startRefreshMock } = getTestContext({ usePanelInView: true }); |
||||||
|
|
||||||
|
expect(startRefreshMock).toHaveBeenCalledTimes(1); |
||||||
|
expect(startRefreshMock).toHaveBeenLastCalledWith([1, 2, 3, panelInView.id]); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('and when exitViewPanel is called', () => { |
||||||
|
it('then all affected panels except the panel in full view should be refreshed', () => { |
||||||
|
const { dashboard, panelInView, startRefreshMock } = getTestContext({ usePanelInView: true }); |
||||||
|
startRefreshMock.mockClear(); |
||||||
|
|
||||||
|
dashboard.exitViewPanel(panelInView); |
||||||
|
|
||||||
|
expect(startRefreshMock).toHaveBeenCalledTimes(1); |
||||||
|
expect(startRefreshMock).toHaveBeenLastCalledWith([1, 2, 3]); |
||||||
|
expect(dashboard['panelsAffectedByVariableChange']).toBeNull(); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('when there is a panel in panel edit during variable change', () => { |
||||||
|
it('then all affected panels should be refreshed', () => { |
||||||
|
const { panelInEdit, startRefreshMock } = getTestContext({ usePanelInEdit: true }); |
||||||
|
expect(startRefreshMock).toHaveBeenCalledTimes(1); |
||||||
|
expect(startRefreshMock).toHaveBeenLastCalledWith([1, 2, 3, panelInEdit.id]); |
||||||
|
}); |
||||||
|
|
||||||
|
describe('and when exitViewPanel is called', () => { |
||||||
|
it('then all affected panels except the panel in panel edit should be refreshed', () => { |
||||||
|
const { dashboard, startRefreshMock } = getTestContext({ usePanelInEdit: true }); |
||||||
|
startRefreshMock.mockClear(); |
||||||
|
|
||||||
|
dashboard.exitPanelEditor(); |
||||||
|
|
||||||
|
expect(startRefreshMock).toHaveBeenCalledTimes(1); |
||||||
|
expect(startRefreshMock).toHaveBeenLastCalledWith([1, 2, 3]); |
||||||
|
expect(dashboard['panelsAffectedByVariableChange']).toBeNull(); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
||||||
|
}); |
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue