diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.test.jsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.test.jsx
index 2724dcce25..4fb5d60cdd 100644
--- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.test.jsx
+++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.test.jsx
@@ -26,6 +26,7 @@ import {
cleanup,
act,
} from 'spec/helpers/testing-library';
+import * as hooks from 'src/views/CRUD/hooks';
import DatabaseModal from './index';
const dbProps = {
@@ -1269,4 +1270,94 @@ describe('DatabaseModal', () => {
expect(schemasForFileUploadText).not.toBeInTheDocument();
});
});
+
+ describe('DatabaseModal w errors as objects', () => {
+ jest.mock('src/views/CRUD/hooks', () => ({
+ ...jest.requireActual('src/views/CRUD/hooks'),
+ useSingleViewResource: jest.fn(),
+ }));
+ const useSingleViewResourceMock = jest.spyOn(
+ hooks,
+ 'useSingleViewResource',
+ );
+
+ useSingleViewResourceMock.mockReturnValue({
+ state: {
+ loading: false,
+ resource: null,
+ error: { _schema: 'Test Error With Object' },
+ },
+ fetchResource: jest.fn(),
+ createResource: jest.fn(),
+ updateResource: jest.fn(),
+ clearError: jest.fn(),
+ });
+
+ const renderAndWait = async () => {
+ const mounted = act(async () => {
+ render(, {
+ useRedux: true,
+ });
+ });
+
+ return mounted;
+ };
+
+ beforeEach(async () => {
+ await renderAndWait();
+ });
+
+ test('Error displays when it is an object', async () => {
+ const step2of3text = screen.getByText(/step 2 of 3/i);
+ const errorSection = screen.getByText(/Database Creation Error/i);
+ expect(step2of3text).toBeVisible();
+ expect(errorSection).toBeVisible();
+ });
+ });
+
+ describe('DatabaseModal w errors as strings', () => {
+ jest.mock('src/views/CRUD/hooks', () => ({
+ ...jest.requireActual('src/views/CRUD/hooks'),
+ useSingleViewResource: jest.fn(),
+ }));
+ const useSingleViewResourceMock = jest.spyOn(
+ hooks,
+ 'useSingleViewResource',
+ );
+
+ useSingleViewResourceMock.mockReturnValue({
+ state: {
+ loading: false,
+ resource: null,
+ error: 'Test Error With String',
+ },
+ fetchResource: jest.fn(),
+ createResource: jest.fn(),
+ updateResource: jest.fn(),
+ clearError: jest.fn(),
+ });
+
+ const renderAndWait = async () => {
+ const mounted = act(async () => {
+ render(, {
+ useRedux: true,
+ });
+ });
+
+ return mounted;
+ };
+
+ beforeEach(async () => {
+ await renderAndWait();
+ });
+
+ test('Error displays when it is a string', async () => {
+ const step2of3text = screen.getByText(/step 2 of 3/i);
+ const errorTitleMessage = screen.getByText(/Database Creation Error/i);
+ const errorMessage = screen.getByText(/Test Error With String/i);
+ expect(step2of3text).toBeVisible();
+ expect(errorTitleMessage).toBeVisible();
+ expect(errorMessage).toBeVisible();
+ });
+ });
});
diff --git a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx
index 9fb55246ce..de5d750ebd 100644
--- a/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx
+++ b/superset-frontend/src/views/CRUD/data/database/DatabaseModal/index.tsx
@@ -1144,7 +1144,12 @@ const DatabaseModal: FunctionComponent = ({
const errorAlert = () => {
let alertErrors: string[] = [];
if (!isEmpty(dbErrors)) {
- alertErrors = typeof dbErrors === 'object' ? Object.values(dbErrors) : [];
+ alertErrors =
+ typeof dbErrors === 'object'
+ ? Object.values(dbErrors)
+ : typeof dbErrors === 'string'
+ ? [dbErrors]
+ : [];
} else if (!isEmpty(validationErrors)) {
alertErrors =
validationErrors?.error_type === 'GENERIC_DB_ENGINE_ERROR'