From 09a034c573e25e197d2fa623e14d4caebc2ea137 Mon Sep 17 00:00:00 2001 From: Claude Code Date: Sat, 18 Jul 2026 14:56:16 -0700 Subject: [PATCH] test(plugins): cover the migrated calendar/chord/country-map registration Codecov flagged the calendar transformProps and the calendar/chord/ country-map plugin index modules as uncovered. Add plugin-registration tests (instantiate the plugin, assert v1 metadata and the buildQuery loader), a calendar transformProps test (v1 reshape plus display-option passthrough, and the non-array passthrough branch), and a calendar buildQuery case for an unrecognized subdomain granularity falling back to minutes. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../test/buildQuery.test.ts | 8 ++ .../plugin-chart-calendar/test/index.test.ts | 27 ++++++ .../test/transformProps.test.ts | 88 +++++++++++++++++++ .../plugin-chart-chord/test/index.test.ts | 27 ++++++ .../test/index.test.ts | 27 ++++++ 5 files changed, 177 insertions(+) create mode 100644 superset-frontend/plugins/plugin-chart-calendar/test/index.test.ts create mode 100644 superset-frontend/plugins/plugin-chart-calendar/test/transformProps.test.ts create mode 100644 superset-frontend/plugins/plugin-chart-chord/test/index.test.ts create mode 100644 superset-frontend/plugins/plugin-chart-country-map/test/index.test.ts diff --git a/superset-frontend/plugins/plugin-chart-calendar/test/buildQuery.test.ts b/superset-frontend/plugins/plugin-chart-calendar/test/buildQuery.test.ts index 54a95eb939c..120e1ab07e2 100644 --- a/superset-frontend/plugins/plugin-chart-calendar/test/buildQuery.test.ts +++ b/superset-frontend/plugins/plugin-chart-calendar/test/buildQuery.test.ts @@ -43,3 +43,11 @@ test('defaults the time grain to minutes like the legacy backend', () => { }).queries; expect(query.extras?.time_grain_sqla).toEqual('PT1M'); }); + +test('falls back to minutes for an unrecognized subdomain granularity', () => { + const [query] = buildQuery({ + ...formData, + subdomain_granularity: 'fortnight', + }).queries; + expect(query.extras?.time_grain_sqla).toEqual('PT1M'); +}); diff --git a/superset-frontend/plugins/plugin-chart-calendar/test/index.test.ts b/superset-frontend/plugins/plugin-chart-calendar/test/index.test.ts new file mode 100644 index 00000000000..8e1d45f1ac6 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-calendar/test/index.test.ts @@ -0,0 +1,27 @@ +/** + * 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 CalendarChartPlugin from '../src/index'; + +test('registers the plugin with its v1 metadata and buildQuery loader', () => { + const plugin = new CalendarChartPlugin(); + expect(plugin.metadata.name).toEqual('Calendar Heatmap'); + // Migrated off the legacy explore_json pipeline, so it must not opt back in. + expect(plugin.metadata.useLegacyApi).toBeFalsy(); + expect(plugin.loadBuildQuery).toBeDefined(); +}); diff --git a/superset-frontend/plugins/plugin-chart-calendar/test/transformProps.test.ts b/superset-frontend/plugins/plugin-chart-calendar/test/transformProps.test.ts new file mode 100644 index 00000000000..21283837e75 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-calendar/test/transformProps.test.ts @@ -0,0 +1,88 @@ +/** + * 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 { supersetTheme } from '@apache-superset/core/theme'; +import { ChartProps } from '@superset-ui/core'; +import transformProps from '../src/transformProps'; + +const baseChartProps = { + width: 800, + height: 600, + datasource: { verboseMap: { SUM__value: 'Sum value' } }, + theme: supersetTheme, + hooks: {}, +}; + +const formData = { + metrics: ['SUM__value'], + domainGranularity: 'month', + subdomainGranularity: 'day', + linearColorScheme: 'schemeRdYlBu', + cellSize: 10, + cellPadding: 2, + cellRadius: 0, + steps: 10, + yAxisFormat: '.2f', + xAxisTimeFormat: '%b %d', + showLegend: true, + showValues: false, + showMetricName: true, + sliceId: 1, +}; + +test('reshapes v1 records into calendar data and passes through display options', () => { + const chartProps = new ChartProps({ + ...baseChartProps, + formData, + queriesData: [ + { + data: [ + { __timestamp: Date.UTC(2020, 0, 1), SUM__value: 3 }, + { __timestamp: Date.UTC(2020, 0, 2), SUM__value: 7 }, + ], + from_dttm: Date.UTC(2020, 0, 1), + to_dttm: Date.UTC(2020, 0, 31), + }, + ], + }); + + const result = transformProps(chartProps) as Record; + + // The reshape produces a per-metric value map, and the display controls and + // formatters are forwarded to the chart. + expect(result.data).toBeDefined(); + expect(result.domainGranularity).toBe('month'); + expect(result.subdomainGranularity).toBe('day'); + expect(result.cellSize).toBe(10); + expect(result.showMetricName).toBe(true); + expect(typeof result.timeFormatter).toBe('function'); + expect(typeof result.valueFormatter).toBe('function'); + expect(result.verboseMap).toEqual({ SUM__value: 'Sum value' }); +}); + +test('passes through non-array data untouched (already-shaped payload)', () => { + const preShaped = { SUM__value: { 1577836800000: 3 } }; + const chartProps = new ChartProps({ + ...baseChartProps, + formData, + queriesData: [{ data: preShaped, from_dttm: null, to_dttm: null }], + }); + + const result = transformProps(chartProps) as Record; + expect(result.data).toBe(preShaped); +}); diff --git a/superset-frontend/plugins/plugin-chart-chord/test/index.test.ts b/superset-frontend/plugins/plugin-chart-chord/test/index.test.ts new file mode 100644 index 00000000000..4a01f0ed37a --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-chord/test/index.test.ts @@ -0,0 +1,27 @@ +/** + * 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 ChordChartPlugin from '../src/index'; + +test('registers the plugin with its v1 metadata and buildQuery loader', () => { + const plugin = new ChordChartPlugin(); + expect(plugin.metadata.name).toEqual('Chord Diagram'); + // Migrated off the legacy explore_json pipeline, so it must not opt back in. + expect(plugin.metadata.useLegacyApi).toBeFalsy(); + expect(plugin.loadBuildQuery).toBeDefined(); +}); diff --git a/superset-frontend/plugins/plugin-chart-country-map/test/index.test.ts b/superset-frontend/plugins/plugin-chart-country-map/test/index.test.ts new file mode 100644 index 00000000000..d9e107eceb8 --- /dev/null +++ b/superset-frontend/plugins/plugin-chart-country-map/test/index.test.ts @@ -0,0 +1,27 @@ +/** + * 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 CountryMapChartPlugin from '../src/index'; + +test('registers the plugin with its v1 metadata and buildQuery loader', () => { + const plugin = new CountryMapChartPlugin(); + expect(plugin.metadata.name).toEqual('Country Map'); + // Migrated off the legacy explore_json pipeline, so it must not opt back in. + expect(plugin.metadata.useLegacyApi).toBeFalsy(); + expect(plugin.loadBuildQuery).toBeDefined(); +});