mirror of
https://github.com/apache/superset.git
synced 2026-04-20 16:44:46 +00:00
feat(plugin): add plugin-chart-cartodiagram (#25869)
Co-authored-by: Jakob Miksch <jakob@meggsimum.de>
This commit is contained in:
@@ -0,0 +1,249 @@
|
||||
/**
|
||||
* 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 {
|
||||
groupByLocation,
|
||||
getChartConfigs,
|
||||
parseSelectedChart,
|
||||
getGeojsonColumns,
|
||||
createColumnName,
|
||||
groupByLocationGenericX,
|
||||
stripGeomFromColnamesAndTypes,
|
||||
stripGeomColumnFromLabelMap,
|
||||
} from '../../src/util/transformPropsUtil';
|
||||
import {
|
||||
nonTimeSeriesChartData,
|
||||
groupedTimeseriesChartData,
|
||||
geom1,
|
||||
geom2,
|
||||
groupedTimeseriesLabelMap,
|
||||
} from '../testData';
|
||||
|
||||
describe('transformPropsUtil', () => {
|
||||
const groupedTimeseriesParams = {
|
||||
x_axis: 'mydate',
|
||||
};
|
||||
|
||||
const groupedTimeseriesQueryData = {
|
||||
label_map: groupedTimeseriesLabelMap,
|
||||
};
|
||||
|
||||
describe('getGeojsonColumns', () => {
|
||||
it('gets the GeoJSON columns', () => {
|
||||
const columns = ['foo', 'bar', geom1];
|
||||
const result = getGeojsonColumns(columns);
|
||||
expect(result).toHaveLength(1);
|
||||
expect(result[0]).toEqual(2);
|
||||
});
|
||||
|
||||
it('gets multiple GeoJSON columns', () => {
|
||||
const columns = ['foo', geom2, 'bar', geom1];
|
||||
const result = getGeojsonColumns(columns);
|
||||
expect(result).toHaveLength(2);
|
||||
expect(result[0]).toEqual(1);
|
||||
expect(result[1]).toEqual(3);
|
||||
});
|
||||
|
||||
it('returns empty array when no GeoJSON is included', () => {
|
||||
const columns = ['foo', 'bar'];
|
||||
const result = getGeojsonColumns(columns);
|
||||
expect(result).toHaveLength(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe('createColumnName', () => {
|
||||
it('creates a columns name', () => {
|
||||
const columns = ['foo', 'bar'];
|
||||
const result = createColumnName(columns, []);
|
||||
expect(result).toEqual('foo, bar');
|
||||
});
|
||||
|
||||
it('ignores items provided by ignoreIdx', () => {
|
||||
const columns = ['foo', 'bar', 'baz'];
|
||||
const ignoreIdx = [1];
|
||||
const result = createColumnName(columns, ignoreIdx);
|
||||
expect(result).toEqual('foo, baz');
|
||||
});
|
||||
});
|
||||
|
||||
describe('groupByLocationGenericX', () => {
|
||||
it('groups in the correct count of geometries', () => {
|
||||
const result = groupByLocationGenericX(
|
||||
groupedTimeseriesChartData,
|
||||
groupedTimeseriesParams,
|
||||
groupedTimeseriesQueryData,
|
||||
);
|
||||
const countOfGeometries = Object.keys(result).length;
|
||||
expect(countOfGeometries).toEqual(2);
|
||||
});
|
||||
|
||||
it('groups items by same geometry', () => {
|
||||
const result = groupByLocationGenericX(
|
||||
groupedTimeseriesChartData,
|
||||
groupedTimeseriesParams,
|
||||
groupedTimeseriesQueryData,
|
||||
);
|
||||
const allGeom1 = result[geom1].length === 2;
|
||||
const allGeom2 = result[geom2].length === 2;
|
||||
expect(allGeom1 && allGeom2).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('groupByLocation', () => {
|
||||
it('groups in the correct count of geometries', () => {
|
||||
const geometryColumn = 'geom';
|
||||
const result = groupByLocation(nonTimeSeriesChartData, geometryColumn);
|
||||
const countOfGeometries = Object.keys(result).length;
|
||||
expect(countOfGeometries).toEqual(2);
|
||||
});
|
||||
|
||||
it('groups items by same geometry', () => {
|
||||
const geometryColumn = 'geom';
|
||||
const result = groupByLocation(nonTimeSeriesChartData, geometryColumn);
|
||||
const allGeom1 = result[geom1].length === 6;
|
||||
const allGeom2 = result[geom2].length === 4;
|
||||
expect(allGeom1 && allGeom2).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe('stripGeomFromColnamesAndTypes', () => {
|
||||
it('strips the geom from colnames with geom column', () => {
|
||||
const queryData = {
|
||||
colnames: ['foo', 'geom'],
|
||||
coltypes: [0, 0],
|
||||
};
|
||||
const result = stripGeomFromColnamesAndTypes(queryData, 'geom');
|
||||
expect(result).toEqual({
|
||||
colnames: ['foo'],
|
||||
coltypes: [0],
|
||||
});
|
||||
});
|
||||
|
||||
it('strips the geom from colnames with grouped columns', () => {
|
||||
const queryData = {
|
||||
colnames: ['foo', `bar, ${geom1}`],
|
||||
coltypes: [0, 0],
|
||||
};
|
||||
const result = stripGeomFromColnamesAndTypes(queryData, 'geom');
|
||||
expect(result).toEqual({
|
||||
colnames: ['foo', 'bar'],
|
||||
coltypes: [0, 0],
|
||||
});
|
||||
});
|
||||
|
||||
it('strips the geom from colnames with grouped columns without geom', () => {
|
||||
const queryData = {
|
||||
colnames: ['foo', `bar, baz`],
|
||||
coltypes: [0, 0],
|
||||
};
|
||||
const result = stripGeomFromColnamesAndTypes(queryData, 'geom');
|
||||
expect(result).toEqual({
|
||||
colnames: ['foo', 'bar, baz'],
|
||||
coltypes: [0, 0],
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('stripGeomColumnFromLabelMap', () => {
|
||||
it('strips the geom column from label_map', () => {
|
||||
const labelMap = {
|
||||
[`apple, ${geom1}`]: ['apple', geom1],
|
||||
[`${geom2}, lemon`]: [geom2, 'lemon'],
|
||||
geom: ['geom'],
|
||||
};
|
||||
const result = stripGeomColumnFromLabelMap(labelMap, 'geom');
|
||||
expect(result).toEqual({
|
||||
apple: ['apple'],
|
||||
lemon: ['lemon'],
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('getChartConfigs', () => {
|
||||
let chartTransformer: jest.MockedFunction<any>;
|
||||
const geomColumn = 'geom';
|
||||
const pieChartConfig = {
|
||||
params: {},
|
||||
viz_type: 'pie',
|
||||
};
|
||||
const chartProps: any = {
|
||||
queriesData: [
|
||||
{
|
||||
data: nonTimeSeriesChartData,
|
||||
},
|
||||
],
|
||||
};
|
||||
beforeEach(() => {
|
||||
chartTransformer = jest.fn();
|
||||
});
|
||||
|
||||
it('calls the transformProps function for every location', () => {
|
||||
getChartConfigs(pieChartConfig, geomColumn, chartProps, chartTransformer);
|
||||
|
||||
expect(chartTransformer).toHaveBeenCalledTimes(2);
|
||||
});
|
||||
it('returns a geojson', () => {
|
||||
const result = getChartConfigs(
|
||||
pieChartConfig,
|
||||
geomColumn,
|
||||
chartProps,
|
||||
chartTransformer,
|
||||
);
|
||||
|
||||
expect(result).toEqual(
|
||||
expect.objectContaining({
|
||||
type: 'FeatureCollection',
|
||||
features: expect.arrayContaining([
|
||||
expect.objectContaining({
|
||||
type: 'Feature',
|
||||
}),
|
||||
]),
|
||||
}),
|
||||
);
|
||||
});
|
||||
it('returns a feature for each location', () => {
|
||||
const result = getChartConfigs(
|
||||
pieChartConfig,
|
||||
geomColumn,
|
||||
chartProps,
|
||||
chartTransformer,
|
||||
);
|
||||
expect(result.features).toHaveLength(2);
|
||||
expect(result.features[0].geometry).toEqual(JSON.parse(geom1));
|
||||
expect(result.features[1].geometry).toEqual(JSON.parse(geom2));
|
||||
});
|
||||
});
|
||||
|
||||
describe('parseSelectedChart', () => {
|
||||
it('parses the inline stringified JSON', () => {
|
||||
const selectedChartObject = {
|
||||
id: 278,
|
||||
params:
|
||||
'{"adhoc_filters":[],"applied_time_extras":{},"datasource":"24__table","viz_type":"pie","time_range":"No filter","groupby":["nuclide"],"metric":{"expressionType":"SIMPLE","column":{"advanced_data_type":null,"certification_details":null,"certified_by":null,"column_name":"nuclide","description":null,"expression":null,"filterable":true,"groupby":true,"id":772,"is_certified":false,"is_dttm":false,"python_date_format":null,"type":"TEXT","type_generic":1,"verbose_name":null,"warning_markdown":null},"aggregate":"COUNT","sqlExpression":null,"isNew":false,"datasourceWarning":false,"hasCustomLabel":false,"label":"COUNT(nuclide)","optionName":"metric_k6d9mt9zujc_7v9szd1i0pl"},"dashboards":[]}',
|
||||
slice_name: 'pie',
|
||||
viz_type: 'pie',
|
||||
};
|
||||
|
||||
const selectedChartString = JSON.stringify(selectedChartObject);
|
||||
const result = parseSelectedChart(selectedChartString);
|
||||
const expectedParams = JSON.parse(selectedChartObject.params);
|
||||
|
||||
expect(result.params).toEqual(expectedParams);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user