From fb1f2c4f188397470bdbfd562243cb876c95b529 Mon Sep 17 00:00:00 2001 From: Joe Li Date: Tue, 2 Jul 2024 16:58:55 -0700 Subject: [PATCH] fix: re-add missing code from PR #28132 (#29446) --- .../FormattingPopoverContent.test.tsx | 121 ++++++++++++++++++ .../FormattingPopoverContent.tsx | 10 +- 2 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.test.tsx diff --git a/superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.test.tsx b/superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.test.tsx new file mode 100644 index 0000000000000..e99796c135a2f --- /dev/null +++ b/superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.test.tsx @@ -0,0 +1,121 @@ +/** + * 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 { + render, + screen, + fireEvent, + waitFor, +} from 'spec/helpers/testing-library'; +import { Comparator } from '@superset-ui/chart-controls'; +import { ColorSchemeEnum } from '@superset-ui/plugin-chart-table'; +import { FormattingPopoverContent } from './FormattingPopoverContent'; + +const mockOnChange = jest.fn(); + +const columns = [ + { label: 'Column 1', value: 'column1' }, + { label: 'Column 2', value: 'column2' }, +]; + +const extraColorChoices = [ + { + value: ColorSchemeEnum.Green, + label: 'Green for increase, red for decrease', + }, + { + value: ColorSchemeEnum.Red, + label: 'Red for increase, green for decrease', + }, +]; + +test('renders FormattingPopoverContent component', () => { + render( + , + ); + + // Assert that the component renders correctly + expect(screen.getByLabelText('Column')).toBeInTheDocument(); + expect(screen.getAllByLabelText('Color scheme')).toHaveLength(2); + expect(screen.getAllByLabelText('Operator')).toHaveLength(2); + expect(screen.queryByLabelText('Left value')).not.toBeInTheDocument(); + expect(screen.queryByLabelText('Right value')).not.toBeInTheDocument(); + expect(screen.getByText('Apply')).toBeInTheDocument(); +}); + +test('calls onChange when Apply button is clicked', async () => { + render( + , + ); + + // Simulate user interaction by clicking the Apply button + fireEvent.click(screen.getByText('Apply')); + + // Assert that the onChange function is called with the correct config + await waitFor(() => { + expect(mockOnChange).toHaveBeenCalled(); + }); +}); + +test('renders the correct input fields based on the selected operator', async () => { + render( + , + ); + + // Select the 'Between' operator + fireEvent.change(screen.getAllByLabelText('Operator')[0], { + target: { value: Comparator.Between }, + }); + fireEvent.click(await screen.findByTitle('< x <')); + + // Assert that the left and right value inputs are rendered + expect(await screen.findByLabelText('Left value')).toBeInTheDocument(); + expect(await screen.findByLabelText('Right value')).toBeInTheDocument(); +}); + +test('renders None for operator when Green for increase is selected', async () => { + render( + , + ); + + // Select the 'Green for increase' color scheme + fireEvent.change(screen.getAllByLabelText(/color scheme/i)[0], { + target: { value: ColorSchemeEnum.Green }, + }); + + fireEvent.click(await screen.findByTitle(/green for increase/i)); + + // Assert that the operator is set to 'None' + expect(screen.getByText(/none/i)).toBeInTheDocument(); +}); diff --git a/superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx b/superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx index b49fdbb0238ed..79b0829dad986 100644 --- a/superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx +++ b/superset-frontend/src/explore/components/controls/ConditionalFormattingControl/FormattingPopoverContent.tsx @@ -124,7 +124,7 @@ const shouldFormItemUpdate = ( isOperatorMultiValue(prevValues.operator) !== isOperatorMultiValue(currentValues.operator); -const operatorField = (showOnlyNone?: boolean) => ( +const renderOperator = ({ showOnlyNone }: { showOnlyNone?: boolean } = {}) => ( ( const renderOperatorFields = ({ getFieldValue }: GetFieldValue) => isOperatorNone(getFieldValue('operator')) ? ( - {operatorField()} + {renderOperator()} ) : isOperatorMultiValue(getFieldValue('operator')) ? ( @@ -157,7 +157,7 @@ const renderOperatorFields = ({ getFieldValue }: GetFieldValue) => - {operatorField} + {renderOperator()} ) : ( - {operatorField} + {renderOperator()} - {operatorField(true)} + {renderOperator({ showOnlyNone: true })} )}