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