This is an automated email from the ASF dual-hosted git repository.

rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/master by this push:
     new b0ac9ef61f6 test(explore): cover color scheme selection, BigNumber 
subheader/trendline, and WorldMap bubbles (#44846)
b0ac9ef61f6 is described below

commit b0ac9ef61f6127bb39766275213c7f71e9d9f6e9
Author: Joe Li <[email protected]>
AuthorDate: Fri Oct 2 10:24:47 2026 -0700

    test(explore): cover color scheme selection, BigNumber subheader/trendline, 
and WorldMap bubbles (#44846)
    
    Co-authored-by: Claude Opus 5.5 <[email protected]>
---
 .../src/BigNumber/BigNumberViz.test.tsx            | 57 ++++++++++++++++
 .../BigNumberWithTrendline/transformProps.test.ts  | 72 ++++++++++++++++++++
 .../plugin-chart-world-map/test/WorldMap.test.ts   | 14 ++++
 .../ColorSchemeControl/ColorSchemeControl.test.tsx | 76 ++++++++++++++++++++++
 4 files changed, 219 insertions(+)

diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.test.tsx
 
b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.test.tsx
index db8d4e50f9d..659c6b24c66 100644
--- 
a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.test.tsx
+++ 
b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberViz.test.tsx
@@ -17,6 +17,7 @@
  * under the License.
  */
 
+import { ComponentProps } from 'react';
 import {
   DTTM_ALIAS,
   getNumberFormatter,
@@ -246,3 +247,59 @@ describe('BigNumberViz trendline context menu', () => {
     expect(onContextMenu).not.toHaveBeenCalled();
   });
 });
+
+describe('BigNumberViz trendline and subheader rendering', () => {
+  beforeEach(() => {
+    mockedEchart.mockClear();
+  });
+
+  const renderViz = (
+    props: Partial<ComponentProps<typeof BigNumberVis>> = {},
+  ) =>
+    render(
+      <BigNumberVis
+        width={200}
+        height={100}
+        bigNumber={42}
+        headerFormatter={getNumberFormatter()}
+        headerFontSize={0.3}
+        subheaderFontSize={0.125}
+        subtitleFontSize={0.125}
+        subtitle=""
+        refs={{}}
+        trendLineData={[
+          [1577836800000, 10],
+          [1577923200000, 20],
+        ]}
+        echartOptions={{ series: [] }}
+        {...props}
+      />,
+    );
+
+  test('renders the trendline chart when showTrendLine is true', () => {
+    renderViz({ showTrendLine: true });
+
+    expect(mockedEchart).toHaveBeenCalled();
+  });
+
+  test('does not render the trendline chart when showTrendLine is false', () 
=> {
+    const { container } = renderViz({ showTrendLine: false });
+
+    expect(mockedEchart).not.toHaveBeenCalled();
+    expect(container.querySelector('.no-trendline')).toBeInTheDocument();
+  });
+
+  test('renders the subheader when one is provided', () => {
+    const { container } = renderViz({ subheader: '10.0% WoW' });
+
+    expect(container.querySelector('.subheader-line')).toHaveTextContent(
+      '10.0% WoW',
+    );
+  });
+
+  test('does not render a subheader when none is provided', () => {
+    const { container } = renderViz({ subheader: '' });
+
+    expect(container.querySelector('.subheader-line')).not.toBeInTheDocument();
+  });
+});
diff --git 
a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/transformProps.test.ts
 
b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/transformProps.test.ts
index 6a9752d57b9..225f9eef833 100644
--- 
a/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/transformProps.test.ts
+++ 
b/superset-frontend/plugins/plugin-chart-echarts/src/BigNumber/BigNumberWithTrendline/transformProps.test.ts
@@ -305,4 +305,76 @@ describe('BigNumberWithTrendline transformProps', () => {
     );
     expect(result.mainColor).toBeUndefined();
   });
+
+  const twoPointQueriesData = [
+    {
+      data: [
+        { __timestamp: 2, value: 110 },
+        { __timestamp: 1, value: 100 },
+      ] as unknown as BigNumberDatum[],
+      colnames: ['__timestamp', 'value'],
+      coltypes: ['TEMPORAL', 'NUMERIC'],
+    },
+  ];
+
+  const buildChartProps = (formData: Record<string, unknown>) =>
+    ({
+      width: 500,
+      height: 400,
+      queriesData: twoPointQueriesData,
+      formData,
+      rawFormData: baseRawFormData,
+      hooks: baseHooks,
+      datasource: baseDatasource,
+      theme: { colors: { grayscale: { light5: '#eee' } } },
+    }) as unknown as BigNumberWithTrendlineChartProps;
+
+  test('should not produce a percent-change subheader when compareLag is 
absent', () => {
+    const result = transformProps(
+      buildChartProps({ ...baseFormData, compareLag: undefined }),
+    );
+
+    expect(result.subheader).toBe('');
+  });
+
+  test('should not produce a percent-change subheader when compareLag is 
null', () => {
+    const result = transformProps(
+      buildChartProps({ ...baseFormData, compareLag: null }),
+    );
+
+    expect(result.subheader).toBe('');
+  });
+
+  test('should keep the configured subheader when compareLag is absent', () => 
{
+    const result = transformProps(
+      buildChartProps({
+        ...baseFormData,
+        compareLag: undefined,
+        subheader: 'custom subheader',
+      }),
+    );
+
+    expect(result.subheader).toBe('custom subheader');
+  });
+
+  test('should not produce trendline data or echart options when showTrendLine 
is false', () => {
+    const result = transformProps(
+      buildChartProps({ ...baseFormData, showTrendLine: false }),
+    );
+
+    expect(result.trendLineData).toBeUndefined();
+    expect(result.echartOptions).toEqual({});
+  });
+
+  test('should produce chronologically ordered trendline data and echart 
options when showTrendLine is true', () => {
+    const result = transformProps(
+      buildChartProps({ ...baseFormData, showTrendLine: true }),
+    );
+
+    expect(result.trendLineData).toEqual([
+      [1, 100],
+      [2, 110],
+    ]);
+    expect(result.echartOptions).toHaveProperty('series');
+  });
 });
diff --git 
a/superset-frontend/plugins/plugin-chart-world-map/test/WorldMap.test.ts 
b/superset-frontend/plugins/plugin-chart-world-map/test/WorldMap.test.ts
index 96c30a1a4a9..d53740827f8 100644
--- a/superset-frontend/plugins/plugin-chart-world-map/test/WorldMap.test.ts
+++ b/superset-frontend/plugins/plugin-chart-world-map/test/WorldMap.test.ts
@@ -420,3 +420,17 @@ test('popupTemplate handles null/undefined country data 
gracefully', () => {
 
   expect(tooltipHtml).toBeFalsy();
 });
+
+test('draws bubbles for the processed data when showBubbles is true', () => {
+  WorldMap(container, { ...baseProps, showBubbles: true });
+
+  expect(mockBubbles).toHaveBeenCalledTimes(1);
+  const bubbleData = mockBubbles.mock.calls[0][0] as { name: string }[];
+  expect(bubbleData.map(d => d.name)).toEqual(['United States', 'Canada']);
+});
+
+test('does not draw bubbles when showBubbles is false', () => {
+  WorldMap(container, { ...baseProps, showBubbles: false });
+
+  expect(mockBubbles).not.toHaveBeenCalled();
+});
diff --git 
a/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeControl.test.tsx
 
b/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeControl.test.tsx
index e9d4e482904..bd419d03191 100644
--- 
a/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeControl.test.tsx
+++ 
b/superset-frontend/src/explore/components/controls/ColorSchemeControl/ColorSchemeControl.test.tsx
@@ -21,6 +21,7 @@ import {
   CategoricalModernSunset,
   CategoricalScheme,
   ColorSchemeGroup,
+  SequentialScheme,
   getCategoricalSchemeRegistry,
 } from '@superset-ui/core';
 import {
@@ -28,6 +29,7 @@ import {
   screen,
   userEvent,
   waitFor,
+  within,
 } from 'spec/helpers/testing-library';
 import ColorSchemeControl, { ColorSchemes } from '.';
 
@@ -337,3 +339,77 @@ test('should NOT show tooltip for search results (original 
Cypress contract)', a
     expect(tooltipContent).toBeFalsy();
   });
 });
+
+test('searching for a color scheme and selecting it calls onChange with the 
scheme id', async () => {
+  getCategoricalSchemeRegistry().registerValue(lyftColors.id, lyftColors);
+  const onChange = jest.fn();
+  setup({ onChange });
+
+  const selectInput = screen.getByLabelText('Select color scheme', {
+    selector: 'input',
+  });
+  await userEvent.click(selectInput);
+  await userEvent.type(selectInput, 'lyftColors');
+  await userEvent.click(await screen.findByTestId('lyftColors'));
+
+  await waitFor(() => expect(onChange).toHaveBeenCalledTimes(1));
+  expect(onChange).toHaveBeenCalledWith('lyftColors');
+});
+
+test('searching by label matches a scheme and filters out non-matching 
schemes', async () => {
+  [...CategoricalD3, lyftColors].forEach(scheme =>
+    getCategoricalSchemeRegistry().registerValue(scheme.id, scheme),
+  );
+  setup();
+
+  const selectInput = screen.getByLabelText('Select color scheme', {
+    selector: 'input',
+  });
+  await userEvent.click(selectInput);
+  await userEvent.type(selectInput, 'Lyft');
+
+  expect(await screen.findByTestId('lyftColors')).toBeInTheDocument();
+  await waitFor(() =>
+    expect(screen.queryByText('D3 Category 10')).not.toBeInTheDocument(),
+  );
+});
+
+test('isLinear: searching a sequential scheme and selecting it calls onChange 
with the scheme id', async () => {
+  const sequentialSchemes = [
+    new SequentialScheme({
+      id: 'testBlues',
+      label: 'Test Blues',
+      colors: ['#eff3ff', '#6baed6', '#08519c'],
+    }),
+    new SequentialScheme({
+      id: 'testGreens',
+      label: 'Test Greens',
+      colors: ['#edf8e9', '#74c476', '#006d2c'],
+    }),
+  ];
+  const onChange = jest.fn();
+  setup({
+    isLinear: true,
+    value: 'testBlues',
+    choices: sequentialSchemes.map(s => [s.id, s.label]),
+    schemes: Object.fromEntries(
+      sequentialSchemes.map(s => [s.id, s]),
+    ) as ColorSchemes,
+    onChange,
+  });
+
+  const selectInput = screen.getByLabelText('Select color scheme', {
+    selector: 'input',
+  });
+  await userEvent.click(selectInput);
+  await userEvent.type(selectInput, 'Greens');
+
+  const option = await screen.findByTestId('testGreens');
+  // Sequential schemes are interpolated to 10 swatches, not their 3 raw colors
+  expect(within(option).getAllByTestId('color')).toHaveLength(10);
+
+  await userEvent.click(option);
+
+  await waitFor(() => expect(onChange).toHaveBeenCalledTimes(1));
+  expect(onChange).toHaveBeenCalledWith('testGreens');
+});

Reply via email to