blob: a403a464e75bb002d1cf425f148abc7ab73c028f [file] [log] [blame]
/**
* 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 { ChartProps, supersetTheme, VizType } from '@superset-ui/core';
import {
LegendOrientation,
LegendType,
EchartsTimeseriesSeriesType,
} from '../../src';
import transformProps from '../../src/MixedTimeseries/transformProps';
import {
EchartsMixedTimeseriesFormData,
EchartsMixedTimeseriesProps,
} from '../../src/MixedTimeseries/types';
const formData: EchartsMixedTimeseriesFormData = {
annotationLayers: [],
area: false,
areaB: false,
legendMargin: null,
logAxis: false,
logAxisSecondary: false,
markerEnabled: false,
markerEnabledB: false,
markerSize: 0,
markerSizeB: 0,
minorSplitLine: false,
minorTicks: false,
opacity: 0,
opacityB: 0,
orderDesc: false,
orderDescB: false,
richTooltip: false,
rowLimit: 0,
rowLimitB: 0,
legendOrientation: LegendOrientation.Top,
legendType: LegendType.Scroll,
showLegend: false,
showValue: false,
showValueB: false,
stack: true,
stackB: true,
truncateYAxis: false,
truncateYAxisSecondary: false,
xAxisLabelRotation: 0,
xAxisTitle: '',
xAxisTitleMargin: 0,
yAxisBounds: [undefined, undefined],
yAxisBoundsSecondary: [undefined, undefined],
yAxisTitle: '',
yAxisTitleMargin: 0,
yAxisTitlePosition: '',
yAxisTitleSecondary: '',
zoomable: false,
colorScheme: 'bnbColors',
datasource: '3__table',
x_axis: 'ds',
metrics: ['sum__num'],
metricsB: ['sum__num'],
groupby: ['gender'],
groupbyB: ['gender'],
seriesType: EchartsTimeseriesSeriesType.Line,
seriesTypeB: EchartsTimeseriesSeriesType.Bar,
viz_type: VizType.MixedTimeseries,
forecastEnabled: false,
forecastPeriods: [],
forecastInterval: 0,
forecastSeasonalityDaily: 0,
legendSort: null,
};
const queriesData = [
{
data: [
{ boy: 1, girl: 2, ds: 599616000000 },
{ boy: 3, girl: 4, ds: 599916000000 },
],
label_map: {
ds: ['ds'],
boy: ['boy'],
girl: ['girl'],
},
},
{
data: [
{ boy: 1, girl: 2, ds: 599616000000 },
{ boy: 3, girl: 4, ds: 599916000000 },
],
label_map: {
ds: ['ds'],
boy: ['boy'],
girl: ['girl'],
},
},
];
const chartPropsConfig = {
formData,
width: 800,
height: 600,
queriesData,
theme: supersetTheme,
};
it('should transform chart props for viz with showQueryIdentifiers=false', () => {
const chartPropsConfigWithoutIdentifiers = {
...chartPropsConfig,
formData: {
...formData,
showQueryIdentifiers: false,
},
};
const chartProps = new ChartProps(chartPropsConfigWithoutIdentifiers);
const transformed = transformProps(chartProps as EchartsMixedTimeseriesProps);
// Check that series IDs don't include query identifiers
const seriesIds = (transformed.echartOptions.series as any[]).map(
(s: any) => s.id,
);
expect(seriesIds).toContain('sum__num, girl');
expect(seriesIds).toContain('sum__num, boy');
expect(seriesIds).not.toContain('sum__num (Query A), girl');
expect(seriesIds).not.toContain('sum__num (Query A), boy');
expect(seriesIds).not.toContain('sum__num (Query B), girl');
expect(seriesIds).not.toContain('sum__num (Query B), boy');
// Check that series name include query identifiers
const seriesName = (transformed.echartOptions.series as any[]).map(
(s: any) => s.name,
);
expect(seriesName).toContain('sum__num, girl');
expect(seriesName).toContain('sum__num, boy');
expect(seriesName).not.toContain('sum__num (Query A), girl');
expect(seriesName).not.toContain('sum__num (Query A), boy');
expect(seriesName).not.toContain('sum__num (Query B), girl');
expect(seriesName).not.toContain('sum__num (Query B), boy');
expect((transformed.echartOptions.legend as any).data).toEqual([
'sum__num, girl',
'sum__num, boy',
'sum__num, girl',
'sum__num, boy',
]);
});
it('should transform chart props for viz with showQueryIdentifiers=true', () => {
const chartPropsConfigWithIdentifiers = {
...chartPropsConfig,
formData: {
...formData,
showQueryIdentifiers: true,
},
};
const chartProps = new ChartProps(chartPropsConfigWithIdentifiers);
const transformed = transformProps(chartProps as EchartsMixedTimeseriesProps);
// Check that series IDs include query identifiers
const seriesIds = (transformed.echartOptions.series as any[]).map(
(s: any) => s.id,
);
expect(seriesIds).toContain('sum__num (Query A), girl');
expect(seriesIds).toContain('sum__num (Query A), boy');
expect(seriesIds).toContain('sum__num (Query B), girl');
expect(seriesIds).toContain('sum__num (Query B), boy');
expect(seriesIds).not.toContain('sum__num, girl');
expect(seriesIds).not.toContain('sum__num, boy');
// Check that series name include query identifiers
const seriesName = (transformed.echartOptions.series as any[]).map(
(s: any) => s.name,
);
expect(seriesName).toContain('sum__num (Query A), girl');
expect(seriesName).toContain('sum__num (Query A), boy');
expect(seriesName).toContain('sum__num (Query B), girl');
expect(seriesName).toContain('sum__num (Query B), boy');
expect(seriesName).not.toContain('sum__num, girl');
expect(seriesName).not.toContain('sum__num, boy');
expect((transformed.echartOptions.legend as any).data).toEqual([
'sum__num (Query A), girl',
'sum__num (Query A), boy',
'sum__num (Query B), girl',
'sum__num (Query B), boy',
]);
});
describe('legend sorting', () => {
const getChartProps = (overrides = {}) =>
new ChartProps({
...chartPropsConfig,
formData: {
...formData,
...overrides,
showQueryIdentifiers: true,
},
});
it('sort legend by data', () => {
const chartProps = getChartProps({
legendSort: null,
});
const transformed = transformProps(
chartProps as EchartsMixedTimeseriesProps,
);
expect((transformed.echartOptions.legend as any).data).toEqual([
'sum__num (Query A), girl',
'sum__num (Query A), boy',
'sum__num (Query B), girl',
'sum__num (Query B), boy',
]);
});
it('sort legend by label ascending', () => {
const chartProps = getChartProps({
legendSort: 'asc',
});
const transformed = transformProps(
chartProps as EchartsMixedTimeseriesProps,
);
expect((transformed.echartOptions.legend as any).data).toEqual([
'sum__num (Query A), boy',
'sum__num (Query A), girl',
'sum__num (Query B), boy',
'sum__num (Query B), girl',
]);
});
it('sort legend by label descending', () => {
const chartProps = getChartProps({
legendSort: 'desc',
});
const transformed = transformProps(
chartProps as EchartsMixedTimeseriesProps,
);
expect((transformed.echartOptions.legend as any).data).toEqual([
'sum__num (Query B), girl',
'sum__num (Query B), boy',
'sum__num (Query A), girl',
'sum__num (Query A), boy',
]);
});
});
it('legend margin: top orientation sets grid.top correctly', () => {
const chartPropsConfigWithoutIdentifiers = {
...chartPropsConfig,
formData: {
...formData,
legendMargin: 250,
showLegend: true,
},
};
const chartProps = new ChartProps(chartPropsConfigWithoutIdentifiers);
const transformed = transformProps(chartProps as EchartsMixedTimeseriesProps);
expect((transformed.echartOptions.grid as any).top).toEqual(270);
});
it('legend margin: bottom orientation sets grid.bottom correctly', () => {
const chartPropsConfigWithoutIdentifiers = {
...chartPropsConfig,
formData: {
...formData,
legendMargin: 250,
showLegend: true,
legendOrientation: LegendOrientation.Bottom,
},
};
const chartProps = new ChartProps(chartPropsConfigWithoutIdentifiers);
const transformed = transformProps(chartProps as EchartsMixedTimeseriesProps);
expect((transformed.echartOptions.grid as any).bottom).toEqual(270);
});
it('legend margin: left orientation sets grid.left correctly', () => {
const chartPropsConfigWithoutIdentifiers = {
...chartPropsConfig,
formData: {
...formData,
legendMargin: 250,
showLegend: true,
legendOrientation: LegendOrientation.Left,
},
};
const chartProps = new ChartProps(chartPropsConfigWithoutIdentifiers);
const transformed = transformProps(chartProps as EchartsMixedTimeseriesProps);
expect((transformed.echartOptions.grid as any).left).toEqual(270);
});
it('legend margin: right orientation sets grid.right correctly', () => {
const chartPropsConfigWithoutIdentifiers = {
...chartPropsConfig,
formData: {
...formData,
legendMargin: 270,
showLegend: true,
legendOrientation: LegendOrientation.Right,
},
};
const chartProps = new ChartProps(chartPropsConfigWithoutIdentifiers);
const transformed = transformProps(chartProps as EchartsMixedTimeseriesProps);
expect((transformed.echartOptions.grid as any).right).toEqual(270);
});