| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- /**
- * 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 } from '@superset-ui/core';
- import { RadarSeriesOption } from 'echarts/charts';
- import transformProps from '../../src/Radar/transformProps';
- import {
- EchartsRadarChartProps,
- EchartsRadarFormData,
- } from '../../src/Radar/types';
- interface RadarIndicator {
- name: string;
- max: number;
- min: number;
- }
- type RadarShape = 'circle' | 'polygon';
- interface RadarChartConfig {
- shape: RadarShape;
- indicator: RadarIndicator[];
- }
- interface RadarSeriesData {
- value: number[];
- name: string;
- }
- const formData: Partial<EchartsRadarFormData> = {
- colorScheme: 'supersetColors',
- datasource: '3__table',
- granularity_sqla: 'ds',
- columnConfig: {
- 'MAX(na_sales)': {
- radarMetricMaxValue: null,
- radarMetricMinValue: 0,
- },
- 'SUM(eu_sales)': {
- radarMetricMaxValue: 5000,
- },
- },
- groupby: [],
- metrics: [
- 'MAX(na_sales)',
- 'SUM(jp_sales)',
- 'SUM(other_sales)',
- 'SUM(eu_sales)',
- ],
- viz_type: 'radar',
- numberFormat: 'SMART_NUMBER',
- dateFormat: 'smart_date',
- showLegend: true,
- showLabels: true,
- isCircle: false,
- };
- const queriesData = [
- {
- data: [
- {
- 'MAX(na_sales)': 41.49,
- 'SUM(jp_sales)': 1290.99,
- 'SUM(other_sales)': 797.73,
- 'SUM(eu_sales)': 2434.13,
- },
- ],
- },
- ];
- const chartProps = new ChartProps({
- formData,
- width: 800,
- height: 600,
- queriesData,
- theme: supersetTheme,
- });
- describe('Radar transformProps', () => {
- it('should transform chart props for normalized radar chart & normalize all metrics except the ones with custom min & max', () => {
- const transformedProps = transformProps(
- chartProps as EchartsRadarChartProps,
- );
- const series = transformedProps.echartOptions.series as RadarSeriesOption[];
- const radar = transformedProps.echartOptions.radar as RadarChartConfig;
- expect((series[0].data as RadarSeriesData[])[0].value).toEqual([
- 0.0170451044, 0.5303701939, 0.3277269497, 2434.13,
- ]);
- expect(radar.indicator).toEqual([
- {
- name: 'MAX(na_sales)',
- max: 1,
- min: 0,
- },
- {
- name: 'SUM(jp_sales)',
- max: 1,
- min: 0,
- },
- {
- name: 'SUM(other_sales)',
- max: 1,
- min: 0,
- },
- {
- name: 'SUM(eu_sales)',
- max: 5000,
- min: 0,
- },
- ]);
- });
- });
- describe('legend sorting', () => {
- const legendSortData = [
- {
- data: [
- {
- name: 'Sylvester sales',
- 'SUM(jp_sales)': 1290.99,
- 'SUM(other_sales)': 797.73,
- 'SUM(eu_sales)': 2434.13,
- },
- {
- name: 'Arnold sales',
- 'SUM(jp_sales)': 290.99,
- 'SUM(other_sales)': 627.73,
- 'SUM(eu_sales)': 434.13,
- },
- {
- name: 'Mark sales',
- 'SUM(jp_sales)': 2290.99,
- 'SUM(other_sales)': 1297.73,
- 'SUM(eu_sales)': 934.13,
- },
- ],
- },
- ];
- const createChartProps = (overrides = {}) =>
- new ChartProps({
- ...chartProps,
- formData: {
- ...formData,
- groupby: ['name'],
- metrics: ['SUM(jp_sales)', 'SUM(other_sales)', 'SUM(eu_sales)'],
- ...overrides,
- },
- queriesData: legendSortData,
- });
- it('preserves original data order when no sort specified', () => {
- const props = createChartProps({ legendSort: null });
- const result = transformProps(props as EchartsRadarChartProps);
- const legendData = (result.echartOptions.legend as any).data;
- expect(legendData).toEqual([
- 'Sylvester sales',
- 'Arnold sales',
- 'Mark sales',
- ]);
- });
- it('sorts alphabetically ascending when legendSort is "asc"', () => {
- const props = createChartProps({ legendSort: 'asc' });
- const result = transformProps(props as EchartsRadarChartProps);
- const legendData = (result.echartOptions.legend as any).data;
- expect(legendData).toEqual([
- 'Arnold sales',
- 'Mark sales',
- 'Sylvester sales',
- ]);
- });
- it('sorts alphabetically descending when legendSort is "desc"', () => {
- const props = createChartProps({ legendSort: 'desc' });
- const result = transformProps(props as EchartsRadarChartProps);
- const legendData = (result.echartOptions.legend as any).data;
- expect(legendData).toEqual([
- 'Sylvester sales',
- 'Mark sales',
- 'Arnold sales',
- ]);
- });
- });
|