grafana/public/app/features/dashboard/state/DashboardModel.refresh.test.ts

142 lines
5.5 KiB
TypeScript

import { appEvents } from '../../../core/core';
import { VariablesChanged } from '../../variables/types';
import { getTimeSrv, setTimeSrv } from '../services/TimeSrv';
import { DashboardModel } from './DashboardModel';
import { PanelModel } from './PanelModel';
function getTestContext({
usePanelInEdit,
usePanelInView,
refreshAll = false,
}: { usePanelInEdit?: boolean; usePanelInView?: boolean; refreshAll?: 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, refreshAll }));
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({ panelIds: [1, 2, 3], refreshAll: false });
});
});
describe('when there is no panel in full view or panel in panel edit during variable change but refreshAll is true', () => {
it('then all affected panels should be refreshed', () => {
const { startRefreshMock } = getTestContext({ refreshAll: true });
expect(startRefreshMock).toHaveBeenCalledTimes(1);
expect(startRefreshMock).toHaveBeenLastCalledWith({ panelIds: [], refreshAll: true });
});
});
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({ panelIds: [], refreshAll: true });
});
});
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({ panelIds: [1, 2, 3], refreshAll: false });
});
});
describe('when the dashboard has been refreshed within the threshold but refreshAll is true', () => {
it('then all affected panels should be refreshed', () => {
isRefreshOutsideThreshold = false;
const { startRefreshMock } = getTestContext({ refreshAll: true });
expect(startRefreshMock).toHaveBeenCalledTimes(1);
expect(startRefreshMock).toHaveBeenLastCalledWith({ panelIds: [], refreshAll: true });
});
});
});
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({ panelIds: [1, 2, 3, panelInView.id], refreshAll: false });
});
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({ panelIds: [1, 2, 3], refreshAll: false });
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({ panelIds: [1, 2, 3, panelInEdit.id], refreshAll: false });
});
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({ panelIds: [1, 2, 3], refreshAll: false });
expect(dashboard['panelsAffectedByVariableChange']).toBeNull();
});
});
});
});