You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

123 lines
5.0 KiB

import { variableAdapters } from '../adapters';
import { customBuilder } from '../shared/testing/builders';
import { DashboardState, StoreState } from '../../../types';
import { initialState } from '../../dashboard/state/reducers';
import { TemplatingState } from './reducers';
import { ExtendedUrlQueryMap } from '../utils';
import { templateVarsChangedInUrl } from './actions';
import { createCustomVariableAdapter } from '../custom/adapter';
import { VariablesState } from './types';
import { DashboardModel } from '../../dashboard/state';
const dashboardModel = new DashboardModel({});
variableAdapters.setInit(() => [createCustomVariableAdapter()]);
async function getTestContext(urlQueryMap: ExtendedUrlQueryMap = {}) {
jest.clearAllMocks();
const custom = customBuilder().withId('custom').withCurrent(['A', 'C']).withOptions('A', 'B', 'C').build();
const setValueFromUrlMock = jest.fn();
variableAdapters.get('custom').setValueFromUrl = setValueFromUrlMock;
const templateVariableValueUpdatedMock = jest.fn();
const startRefreshMock = jest.fn();
const dashboard: DashboardState = {
...initialState,
getModel: () => {
dashboardModel.templateVariableValueUpdated = templateVariableValueUpdatedMock;
dashboardModel.startRefresh = startRefreshMock;
dashboardModel.templating = { list: [custom] };
return dashboardModel;
},
};
const variables: VariablesState = { custom };
const templating = ({ variables } as unknown) as TemplatingState;
const state: Partial<StoreState> = {
dashboard,
templating,
};
const getState = () => (state as unknown) as StoreState;
const dispatch = jest.fn();
const thunk = templateVarsChangedInUrl(urlQueryMap);
await thunk(dispatch, getState, undefined);
return { setValueFromUrlMock, templateVariableValueUpdatedMock, startRefreshMock, custom };
}
describe('templateVarsChangedInUrl', () => {
describe('when called with no variables in url query map', () => {
it('then no value should change and dashboard should not be refreshed', async () => {
const { setValueFromUrlMock, templateVariableValueUpdatedMock, startRefreshMock } = await getTestContext();
expect(setValueFromUrlMock).not.toHaveBeenCalled();
expect(templateVariableValueUpdatedMock).not.toHaveBeenCalled();
expect(startRefreshMock).not.toHaveBeenCalled();
});
});
describe('when called with no variables in url query map matching variables in state', () => {
it('then no value should change and dashboard should not be refreshed', async () => {
const { setValueFromUrlMock, templateVariableValueUpdatedMock, startRefreshMock } = await getTestContext({
'var-query': { value: 'A' },
});
expect(setValueFromUrlMock).not.toHaveBeenCalled();
expect(templateVariableValueUpdatedMock).not.toHaveBeenCalled();
expect(startRefreshMock).not.toHaveBeenCalled();
});
});
describe('when called with variables in url query map matching variables in state', () => {
describe('and the values in url query map are the same as current in state', () => {
it('then no value should change and dashboard should not be refreshed', async () => {
const { setValueFromUrlMock, templateVariableValueUpdatedMock, startRefreshMock } = await getTestContext({
'var-custom': { value: ['A', 'C'] },
});
expect(setValueFromUrlMock).not.toHaveBeenCalled();
expect(templateVariableValueUpdatedMock).not.toHaveBeenCalled();
expect(startRefreshMock).not.toHaveBeenCalled();
});
});
describe('and the values in url query map are the not the same as current in state', () => {
it('then the value should change to the value in url query map and dashboard should be refreshed', async () => {
const {
setValueFromUrlMock,
templateVariableValueUpdatedMock,
startRefreshMock,
custom,
} = await getTestContext({
'var-custom': { value: 'B' },
});
expect(setValueFromUrlMock).toHaveBeenCalledTimes(1);
expect(setValueFromUrlMock).toHaveBeenCalledWith(custom, 'B');
expect(templateVariableValueUpdatedMock).toHaveBeenCalledTimes(1);
expect(startRefreshMock).toHaveBeenCalledTimes(1);
});
describe('but the values in url query map were removed', () => {
it('then the value should change to the value in dashboard json and dashboard should be refreshed', async () => {
const {
setValueFromUrlMock,
templateVariableValueUpdatedMock,
startRefreshMock,
custom,
} = await getTestContext({
'var-custom': { value: '', removed: true },
});
expect(setValueFromUrlMock).toHaveBeenCalledTimes(1);
expect(setValueFromUrlMock).toHaveBeenCalledWith(custom, ['A', 'C']);
expect(templateVariableValueUpdatedMock).toHaveBeenCalledTimes(1);
expect(startRefreshMock).toHaveBeenCalledTimes(1);
});
});
});
});
});