mirror of https://github.com/grafana/grafana
Variables: Fixes loading with a custom all value in url (#28958)
parent
b2dcf06b60
commit
8f4e50f439
@ -0,0 +1,154 @@ |
||||
import { variableAdapters } from '../adapters'; |
||||
import { createCustomVariableAdapter } from '../custom/adapter'; |
||||
import { customBuilder } from '../shared/testing/builders'; |
||||
import { reduxTester } from '../../../../test/core/redux/reduxTester'; |
||||
import { TemplatingState } from './reducers'; |
||||
import { getTemplatingRootReducer } from './helpers'; |
||||
import { addVariable, setCurrentVariableValue } from './sharedReducer'; |
||||
import { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE, toVariableIdentifier, toVariablePayload } from './types'; |
||||
import { setOptionFromUrl } from './actions'; |
||||
|
||||
variableAdapters.setInit(() => [createCustomVariableAdapter()]); |
||||
|
||||
describe('when setOptionFromUrl is dispatched with a custom variable (no refresh property)', () => { |
||||
it.each` |
||||
urlValue | isMulti | expected |
||||
${'B'} | ${false} | ${'B'} |
||||
${['B']} | ${false} | ${'B'} |
||||
${'X'} | ${false} | ${'X'} |
||||
${''} | ${false} | ${''} |
||||
${null} | ${false} | ${null} |
||||
${undefined} | ${false} | ${undefined} |
||||
${'B'} | ${true} | ${['B']} |
||||
${['B']} | ${true} | ${['B']} |
||||
${'X'} | ${true} | ${['X']} |
||||
${''} | ${true} | ${['']} |
||||
${['A', 'B']} | ${true} | ${['A', 'B']} |
||||
${null} | ${true} | ${[null]} |
||||
${undefined} | ${true} | ${[undefined]} |
||||
`('and urlValue is $urlValue then correct actions are dispatched', async ({ urlValue, expected, isMulti }) => {
|
||||
const custom = customBuilder() |
||||
.withId('0') |
||||
.withMulti(isMulti) |
||||
.withOptions('A', 'B', 'C') |
||||
.withCurrent('A') |
||||
.build(); |
||||
|
||||
const tester = await reduxTester<{ templating: TemplatingState }>() |
||||
.givenRootReducer(getTemplatingRootReducer()) |
||||
.whenActionIsDispatched(addVariable(toVariablePayload(custom, { global: false, index: 0, model: custom }))) |
||||
.whenAsyncActionIsDispatched(setOptionFromUrl(toVariableIdentifier(custom), urlValue), true); |
||||
|
||||
await tester.thenDispatchedActionsShouldEqual( |
||||
setCurrentVariableValue( |
||||
toVariablePayload({ type: 'custom', id: '0' }, { option: { text: expected, value: expected, selected: false } }) |
||||
) |
||||
); |
||||
}); |
||||
}); |
||||
|
||||
describe('when setOptionFromUrl is dispatched for a variable with a custom all value', () => { |
||||
it('and urlValue contains same all value then correct actions are dispatched', async () => { |
||||
const allValue = '.*'; |
||||
const urlValue = allValue; |
||||
const custom = customBuilder() |
||||
.withId('0') |
||||
.withMulti(false) |
||||
.withIncludeAll() |
||||
.withAllValue(allValue) |
||||
.withOptions('A', 'B', 'C') |
||||
.withCurrent('A') |
||||
.build(); |
||||
|
||||
const tester = await reduxTester<{ templating: TemplatingState }>() |
||||
.givenRootReducer(getTemplatingRootReducer()) |
||||
.whenActionIsDispatched(addVariable(toVariablePayload(custom, { global: false, index: 0, model: custom }))) |
||||
.whenAsyncActionIsDispatched(setOptionFromUrl(toVariableIdentifier(custom), urlValue), true); |
||||
|
||||
await tester.thenDispatchedActionsShouldEqual( |
||||
setCurrentVariableValue( |
||||
toVariablePayload( |
||||
{ type: 'custom', id: '0' }, |
||||
{ option: { text: ALL_VARIABLE_TEXT, value: ALL_VARIABLE_VALUE, selected: false } } |
||||
) |
||||
) |
||||
); |
||||
}); |
||||
|
||||
it('and urlValue differs from all value then correct actions are dispatched', async () => { |
||||
const allValue = '.*'; |
||||
const urlValue = 'X'; |
||||
const custom = customBuilder() |
||||
.withId('0') |
||||
.withMulti(false) |
||||
.withIncludeAll() |
||||
.withAllValue(allValue) |
||||
.withOptions('A', 'B', 'C') |
||||
.withCurrent('A') |
||||
.build(); |
||||
|
||||
const tester = await reduxTester<{ templating: TemplatingState }>() |
||||
.givenRootReducer(getTemplatingRootReducer()) |
||||
.whenActionIsDispatched(addVariable(toVariablePayload(custom, { global: false, index: 0, model: custom }))) |
||||
.whenAsyncActionIsDispatched(setOptionFromUrl(toVariableIdentifier(custom), urlValue), true); |
||||
|
||||
await tester.thenDispatchedActionsShouldEqual( |
||||
setCurrentVariableValue( |
||||
toVariablePayload({ type: 'custom', id: '0' }, { option: { text: 'X', value: 'X', selected: false } }) |
||||
) |
||||
); |
||||
}); |
||||
|
||||
it('and urlValue differs but matches an option then correct actions are dispatched', async () => { |
||||
const allValue = '.*'; |
||||
const urlValue = 'B'; |
||||
const custom = customBuilder() |
||||
.withId('0') |
||||
.withMulti(false) |
||||
.withIncludeAll() |
||||
.withAllValue(allValue) |
||||
.withOptions('A', 'B', 'C') |
||||
.withCurrent('A') |
||||
.build(); |
||||
|
||||
const tester = await reduxTester<{ templating: TemplatingState }>() |
||||
.givenRootReducer(getTemplatingRootReducer()) |
||||
.whenActionIsDispatched(addVariable(toVariablePayload(custom, { global: false, index: 0, model: custom }))) |
||||
.whenAsyncActionIsDispatched(setOptionFromUrl(toVariableIdentifier(custom), urlValue), true); |
||||
|
||||
await tester.thenDispatchedActionsShouldEqual( |
||||
setCurrentVariableValue( |
||||
toVariablePayload({ type: 'custom', id: '0' }, { option: { text: 'B', value: 'B', selected: false } }) |
||||
) |
||||
); |
||||
}); |
||||
|
||||
it('and custom all value matches an option', async () => { |
||||
const allValue = '.*'; |
||||
const urlValue = allValue; |
||||
const custom = customBuilder() |
||||
.withId('0') |
||||
.withMulti(false) |
||||
.withIncludeAll() |
||||
.withAllValue(allValue) |
||||
.withOptions('A', 'B', '.*') |
||||
.withCurrent('A') |
||||
.build(); |
||||
|
||||
custom.options[2].value = 'special value for .*'; |
||||
|
||||
const tester = await reduxTester<{ templating: TemplatingState }>() |
||||
.givenRootReducer(getTemplatingRootReducer()) |
||||
.whenActionIsDispatched(addVariable(toVariablePayload(custom, { global: false, index: 0, model: custom }))) |
||||
.whenAsyncActionIsDispatched(setOptionFromUrl(toVariableIdentifier(custom), urlValue), true); |
||||
|
||||
await tester.thenDispatchedActionsShouldEqual( |
||||
setCurrentVariableValue( |
||||
toVariablePayload( |
||||
{ type: 'custom', id: '0' }, |
||||
{ option: { text: '.*', value: 'special value for .*', selected: false } } |
||||
) |
||||
) |
||||
); |
||||
}); |
||||
}); |
||||
Loading…
Reference in new issue