The open and composable observability and data visualization platform. Visualize metrics, logs, and traces from multiple sources like Prometheus, Loki, Elasticsearch, InfluxDB, Postgres and many more.
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.
 
 
 
 
 
 
grafana/public/app/features/variables/state/templateVarsChangedInUrl.te...

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);
});
});
});
});
});