From c5241aa6108551b70dd40e7e34d5da82643e621b Mon Sep 17 00:00:00 2001 From: Dessen Xu <41524013+dessen-xu@users.noreply.github.com> Date: Wed, 5 May 2021 18:50:31 +0800 Subject: [PATCH] Add default support (#32625) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * support default * fix * fix * fix better * Refactor: simplifies the logic a bit and changes test description Co-authored-by: Hugo Häggmark --- .../variables/datasource/reducer.test.ts | 53 +++++++++++++++++++ .../features/variables/datasource/reducer.ts | 16 ++++-- 2 files changed, 64 insertions(+), 5 deletions(-) diff --git a/public/app/features/variables/datasource/reducer.test.ts b/public/app/features/variables/datasource/reducer.test.ts index 15d292cf4be..316e354ac18 100644 --- a/public/app/features/variables/datasource/reducer.test.ts +++ b/public/app/features/variables/datasource/reducer.test.ts @@ -73,4 +73,57 @@ describe('dataSourceVariableReducer', () => { }); }); }); + + describe('when createDataSourceOptions is dispatched with default in the regex and item is default data source', () => { + it('then the state should include an extra default option', () => { + const plugins = getMockPlugins(3); + const sources: DataSourceInstanceSettings[] = plugins.map((p) => getDataSourceInstanceSetting(p.name, p)); + sources[1].isDefault = true; + + const { initialState } = getVariableTestContext(adapter, { + query: sources[1].meta.id, + includeAll: false, + }); + const payload = toVariablePayload({ id: '0', type: 'datasource' }, { sources, regex: /default/ }); + + reducerTester() + .givenReducer(dataSourceVariableReducer, cloneDeep(initialState)) + .whenActionIsDispatched(createDataSourceOptions(payload)) + .thenStateShouldEqual({ + ...initialState, + ['0']: ({ + ...initialState['0'], + options: [{ text: 'default', value: 'default', selected: false }], + } as unknown) as DataSourceVariableModel, + }); + }); + }); + + describe('when createDataSourceOptions is dispatched without default in the regex and item is default data source', () => { + it('then the state should include an extra default option', () => { + const plugins = getMockPlugins(3); + const sources: DataSourceInstanceSettings[] = plugins.map((p) => getDataSourceInstanceSetting(p.name, p)); + sources[1].isDefault = true; + + const { initialState } = getVariableTestContext(adapter, { + query: sources[1].meta.id, + includeAll: false, + }); + const payload = toVariablePayload({ id: '0', type: 'datasource' }, { sources, regex: /pretty/ }); + + reducerTester() + .givenReducer(dataSourceVariableReducer, cloneDeep(initialState)) + .whenActionIsDispatched(createDataSourceOptions(payload)) + .thenStateShouldEqual({ + ...initialState, + ['0']: ({ + ...initialState['0'], + options: [ + { text: 'pretty cool plugin-1', value: 'pretty cool plugin-1', selected: false }, + { text: 'default', value: 'default', selected: false }, + ], + } as unknown) as DataSourceVariableModel, + }); + }); + }); }); diff --git a/public/app/features/variables/datasource/reducer.ts b/public/app/features/variables/datasource/reducer.ts index ea5aae741a1..fe26d29ffbf 100644 --- a/public/app/features/variables/datasource/reducer.ts +++ b/public/app/features/variables/datasource/reducer.ts @@ -6,8 +6,8 @@ import { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE, getInstanceState, - VariablePayload, initialVariablesState, + VariablePayload, VariablesState, } from '../state/types'; @@ -45,12 +45,10 @@ export const dataSourceVariableSlice = createSlice({ continue; } - if (regex && !regex.exec(source.name)) { - continue; + if (isValid(source, regex)) { + options.push({ text: source.name, value: source.name, selected: false }); } - options.push({ text: source.name, value: source.name, selected: false }); - if (source.isDefault) { options.push({ text: 'default', value: 'default', selected: false }); } @@ -69,5 +67,13 @@ export const dataSourceVariableSlice = createSlice({ }, }); +function isValid(source: DataSourceInstanceSettings, regex?: RegExp) { + if (!regex) { + return true; + } + + return regex && regex.exec(source.name); +} + export const dataSourceVariableReducer = dataSourceVariableSlice.reducer; export const { createDataSourceOptions } = dataSourceVariableSlice.actions;