From 0d5ddb36749aa9a5db727314c2b13719fd7e20d4 Mon Sep 17 00:00:00 2001 From: Joe Li Date: Thu, 12 Feb 2026 14:06:58 -0800 Subject: [PATCH] feat(themes): add enhanced validation and error handling with fallback mechanisms (#37378) Co-authored-by: Rafael Benitez Co-authored-by: Claude --- .../src/features/themes/ThemeModal.test.tsx | 170 ++++++++- .../src/features/themes/ThemeModal.tsx | 65 ++-- .../src/theme/ThemeController.ts | 147 +++++++- .../theme/hooks/useThemeValidation.test.ts | 133 +++++++ .../src/theme/hooks/useThemeValidation.ts | 155 ++++++++ .../src/theme/tests/ThemeController.test.ts | 196 ++++++++++ .../src/theme/utils/antdTokenNames.test.ts | 108 ++++++ .../src/theme/utils/antdTokenNames.ts | 115 ++++++ .../utils/themeStructureValidation.test.ts | 346 ++++++++++++++++++ .../theme/utils/themeStructureValidation.ts | 191 ++++++++++ 10 files changed, 1566 insertions(+), 60 deletions(-) create mode 100644 superset-frontend/src/theme/hooks/useThemeValidation.test.ts create mode 100644 superset-frontend/src/theme/hooks/useThemeValidation.ts create mode 100644 superset-frontend/src/theme/utils/antdTokenNames.test.ts create mode 100644 superset-frontend/src/theme/utils/antdTokenNames.ts create mode 100644 superset-frontend/src/theme/utils/themeStructureValidation.test.ts create mode 100644 superset-frontend/src/theme/utils/themeStructureValidation.ts diff --git a/superset-frontend/src/features/themes/ThemeModal.test.tsx b/superset-frontend/src/features/themes/ThemeModal.test.tsx index 2e5d1a51655..4994863b074 100644 --- a/superset-frontend/src/features/themes/ThemeModal.test.tsx +++ b/superset-frontend/src/features/themes/ThemeModal.test.tsx @@ -17,11 +17,12 @@ * under the License. */ -import { render, screen } from 'spec/helpers/testing-library'; +import { render, screen, waitFor } from 'spec/helpers/testing-library'; import userEvent from '@testing-library/user-event'; import fetchMock from 'fetch-mock'; import ThemeModal from './ThemeModal'; import { ThemeObject } from './types'; +import { validateTheme } from 'src/theme/utils/themeStructureValidation'; const mockThemeContext = { setTemporaryTheme: jest.fn(), @@ -37,6 +38,27 @@ jest.mock('src/dashboard/util/permissionUtils', () => ({ isUserAdmin: jest.fn(() => true), })); +// Mock JsonEditor to avoid direct DOM manipulation in tests +jest.mock('@superset-ui/core/components/AsyncAceEditor', () => ({ + ...jest.requireActual('@superset-ui/core/components/AsyncAceEditor'), + JsonEditor: ({ + onChange, + value, + readOnly, + }: { + onChange: (value: string) => void; + value: string; + readOnly?: boolean; + }) => ( +