superset-frontend/src/explore/actions/exploreActions.test.js
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { defaultState } from 'src/explore/store';
import exploreReducer from 'src/explore/reducers/exploreReducer';
import * as actions from 'src/explore/actions/exploreActions';
const METRICS = [
{
expressionType: 'SIMPLE',
column: {
advanced_data_type: null,
certification_details: null,
certified_by: null,
column_name: 'a',
description: null,
expression: null,
filterable: true,
groupby: true,
id: 1,
is_certified: false,
is_dttm: false,
python_date_format: null,
type: 'DOUBLE PRECISION',
type_generic: 0,
verbose_name: null,
warning_markdown: null,
},
aggregate: 'SUM',
sqlExpression: null,
datasourceWarning: false,
hasCustomLabel: false,
label: 'SUM(a)',
optionName: 'metric_1a2b3c4d5f_1a2b3c4d5f',
},
{
expressionType: 'SIMPLE',
column: {
advanced_data_type: null,
certification_details: null,
certified_by: null,
column_name: 'b',
description: null,
expression: null,
filterable: true,
groupby: true,
id: 2,
is_certified: false,
is_dttm: false,
python_date_format: null,
type: 'BIGINT',
type_generic: 0,
verbose_name: null,
warning_markdown: null,
},
aggregate: 'AVG',
sqlExpression: null,
datasourceWarning: false,
hasCustomLabel: false,
label: 'AVG(b)',
optionName: 'metric_6g7h8i9j0k_6g7h8i9j0k',
},
];
describe('reducers', () => {
it('Does not set a control value if control does not exist', () => {
const newState = exploreReducer(
defaultState,
actions.setControlValue('NEW_FIELD', 'x', []),
);
expect(newState.controls.NEW_FIELD).toBeUndefined();
});
it('setControlValue works as expected with a Select control', () => {
const newState = exploreReducer(
defaultState,
actions.setControlValue('y_axis_format', '$,.2f', []),
);
expect(newState.controls.y_axis_format.value).toBe('$,.2f');
expect(newState.form_data.y_axis_format).toBe('$,.2f');
});
it('Keeps the column config when metric column positions are swapped', () => {
const mockedState = {
...defaultState,
controls: {
...defaultState.controls,
metrics: {
...defaultState.controls.metrics,
value: METRICS,
},
column_config: {
...defaultState.controls.column_config,
value: {
'AVG(b)': {
currencyFormat: {
symbolPosition: 'prefix',
symbol: 'USD',
},
},
},
},
},
form_data: {
...defaultState.form_data,
metrics: METRICS,
column_config: {
'AVG(b)': {
currencyFormat: {
symbolPosition: 'prefix',
symbol: 'USD',
},
},
},
},
};
const swappedMetrics = [METRICS[1], METRICS[0]];
const newState = exploreReducer(
mockedState,
actions.setControlValue('metrics', swappedMetrics, []),
);
const expectedColumnConfig = {
'AVG(b)': {
currencyFormat: {
symbolPosition: 'prefix',
symbol: 'USD',
},
},
};
expect(newState.controls.metrics.value).toStrictEqual(swappedMetrics);
expect(newState.form_data.metrics).toStrictEqual(swappedMetrics);
expect(newState.controls.column_config.value).toStrictEqual(
expectedColumnConfig,
);
expect(newState.form_data.column_config).toStrictEqual(
expectedColumnConfig,
);
});
it('Keeps the column config when metric column name is updated', () => {
const mockedState = {
...defaultState,
controls: {
...defaultState.controls,
metrics: {
...defaultState.controls.metrics,
value: METRICS,
},
column_config: {
...defaultState.controls.column_config,
value: {
'AVG(b)': {
currencyFormat: {
symbolPosition: 'prefix',
symbol: 'USD',
},
},
},
},
},
form_data: {
...defaultState.form_data,
metrics: METRICS,
column_config: {
'AVG(b)': {
currencyFormat: {
symbolPosition: 'prefix',
symbol: 'USD',
},
},
},
},
};
const updatedMetrics = [
METRICS[0],
{
...METRICS[1],
hasCustomLabel: true,
label: 'AVG of b',
},
];
const newState = exploreReducer(
mockedState,
actions.setControlValue('metrics', updatedMetrics, []),
);
const expectedColumnConfig = {
'AVG of b': {
currencyFormat: {
symbolPosition: 'prefix',
symbol: 'USD',
},
},
};
expect(newState.controls.metrics.value).toStrictEqual(updatedMetrics);
expect(newState.form_data.metrics).toStrictEqual(updatedMetrics);
expect(newState.form_data.column_config).toStrictEqual(
expectedColumnConfig,
);
});
test('setStashFormData works as expected with fieldNames', () => {
const newState = exploreReducer(
defaultState,
actions.setStashFormData(true, ['y_axis_format']),
);
expect(newState.hiddenFormData).toEqual({
y_axis_format: defaultState.form_data.y_axis_format,
});
expect(newState.form_data.y_axis_format).toBeFalsy();
const updatedState = exploreReducer(
newState,
actions.setStashFormData(false, ['y_axis_format']),
);
expect(updatedState.hiddenFormData.y_axis_format).toBeFalsy();
expect(updatedState.form_data.y_axis_format).toEqual(
defaultState.form_data.y_axis_format,
);
});
});