fix stored procedure summary panel exception (#22189)

This commit is contained in:
Karan Hotchandani 2025-07-07 21:06:51 +05:30 committed by GitHub
parent 02a5a5fcc2
commit 16b94538df
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 197 additions and 1 deletions

View File

@ -11,9 +11,14 @@
* limitations under the License.
*/
import { render, screen } from '@testing-library/react';
import { isEmpty } from 'lodash';
import { BrowserRouter } from 'react-router-dom';
import { EntityType } from '../enums/entity.enum';
import { SummaryEntityType } from '../enums/EntitySummary.enum';
import { Column } from '../generated/entity/data/table';
import {
getEntityChildDetails,
getFormattedEntityData,
getHighlightOfListItem,
getMapOfListHighlights,
@ -35,6 +40,9 @@ import {
mockLinkBasedSummaryTitleDashboardResponse,
mockLinkBasedSummaryTitleResponse,
mockListItemNameHighlight,
mockStoredProcedureWithCode,
mockStoredProcedureWithEmptyCode,
mockStoredProcedureWithoutCode,
mockTagFQNsForHighlight,
mockTagsSortAndHighlightResponse,
mockTextBasedSummaryTitleResponse,
@ -49,6 +57,16 @@ jest.mock('../constants/EntitySummaryPanelUtils.constant', () => ({
],
}));
jest.mock('../components/Database/SchemaEditor/SchemaEditor', () => {
return jest
.fn()
.mockImplementation(({ value }) => (
<div data-testid="schema-editor">
{isEmpty(value) ? 'No code available' : value}
</div>
));
});
describe('EntitySummaryPanelUtils tests', () => {
describe('getFormattedEntityData', () => {
it('getFormattedEntityData should return formatted data properly for table columns data with nesting, and also sort the data based on highlights', () => {
@ -188,4 +206,94 @@ describe('EntitySummaryPanelUtils tests', () => {
expect(result).toEqual(mockGetHighlightOfListItemResponse);
});
});
describe('getEntityChildDetails', () => {
const renderWithRouter = (component: JSX.Element) => {
return render(<BrowserRouter>{component}</BrowserRouter>);
};
describe('STORED_PROCEDURE cases', () => {
it('should render stored procedure with code correctly', () => {
const result = getEntityChildDetails(
EntityType.STORED_PROCEDURE,
mockStoredProcedureWithCode
);
renderWithRouter(result as JSX.Element);
expect(screen.getByText('label.code')).toBeInTheDocument();
expect(screen.getByTestId('schema-editor')).toBeInTheDocument();
expect(screen.getByTestId('schema-editor')).toHaveTextContent(
'CREATE PROCEDURE test_stored_procedure() BEGIN SELECT * FROM users; END'
);
});
it('should render stored procedure without code correctly (null storedProcedureCode)', () => {
const result = getEntityChildDetails(
EntityType.STORED_PROCEDURE,
mockStoredProcedureWithoutCode
);
renderWithRouter(result as JSX.Element);
expect(screen.getByText('label.code')).toBeInTheDocument();
expect(screen.getByTestId('schema-editor')).toBeInTheDocument();
expect(screen.getByTestId('schema-editor')).toHaveTextContent(
'No code available'
);
});
it('should render stored procedure with empty code correctly', () => {
const result = getEntityChildDetails(
EntityType.STORED_PROCEDURE,
mockStoredProcedureWithEmptyCode
);
renderWithRouter(result as JSX.Element);
expect(screen.getByText('label.code')).toBeInTheDocument();
expect(screen.getByTestId('schema-editor')).toBeInTheDocument();
expect(screen.getByTestId('schema-editor')).toHaveTextContent(
'No code available'
);
});
it('should render stored procedure with undefined code field correctly', () => {
const mockStoredProcedureWithUndefinedCode = {
...mockStoredProcedureWithCode,
storedProcedureCode: {
language: 'SQL',
code: undefined,
},
};
const result = getEntityChildDetails(
EntityType.STORED_PROCEDURE,
mockStoredProcedureWithUndefinedCode
);
renderWithRouter(result as JSX.Element);
expect(screen.getByText('label.code')).toBeInTheDocument();
expect(screen.getByTestId('schema-editor')).toBeInTheDocument();
expect(screen.getByTestId('schema-editor')).toHaveTextContent(
'No code available'
);
});
it('should render stored procedure heading and testId correctly', () => {
const result = getEntityChildDetails(
EntityType.STORED_PROCEDURE,
mockStoredProcedureWithCode
);
renderWithRouter(result as JSX.Element);
expect(screen.getByTestId('code-header')).toBeInTheDocument();
expect(screen.getByTestId('code-header')).toHaveTextContent(
'label.code'
);
});
});
});
});

View File

@ -544,7 +544,7 @@ export const getEntityChildDetails = (
(
(entityInfo as StoredProcedure)
.storedProcedureCode as StoredProcedureCodeObject
).code ?? ''
)?.code ?? ''
}
/>
);

View File

@ -17,6 +17,10 @@ import { Link } from 'react-router-dom';
import { BasicEntityInfo } from '../../components/Explore/EntitySummaryPanel/SummaryList/SummaryList.interface';
import { ICON_DIMENSION } from '../../constants/constants';
import { Task } from '../../generated/entity/data/pipeline';
import {
StoredProcedure,
StoredProcedureCodeObject,
} from '../../generated/entity/data/storedProcedure';
import {
Column,
DataType,
@ -396,3 +400,87 @@ export const mockInvalidDataResponse = [
type: undefined,
},
];
export const mockStoredProcedureWithCode: StoredProcedure = {
id: '123e4567-e89b-12d3-a456-426614174000',
name: 'test_stored_procedure',
fullyQualifiedName: 'sample_database.test_stored_procedure',
description: 'A test stored procedure',
storedProcedureCode: {
language: 'SQL',
code: 'CREATE PROCEDURE test_stored_procedure()\nBEGIN\n SELECT * FROM users;\nEND',
} as StoredProcedureCodeObject,
databaseSchema: {
id: '456e7890-e12b-34c5-d678-901234567890',
name: 'test_schema',
fullyQualifiedName: 'sample_database.test_schema',
type: 'databaseSchema',
},
database: {
id: '789e0123-e45f-67g8-h901-234567890123',
name: 'sample_database',
fullyQualifiedName: 'sample_database',
type: 'database',
},
service: {
id: '012e3456-e78h-90i1-j234-567890123456',
name: 'mysql_service',
fullyQualifiedName: 'mysql_service',
type: 'databaseService',
},
};
export const mockStoredProcedureWithoutCode: StoredProcedure = {
id: '123e4567-e89b-12d3-a456-426614174001',
name: 'test_stored_procedure_no_code',
fullyQualifiedName: 'sample_database.test_stored_procedure_no_code',
description: 'A test stored procedure without code',
storedProcedureCode: null,
databaseSchema: {
id: '456e7890-e12b-34c5-d678-901234567890',
name: 'test_schema',
fullyQualifiedName: 'sample_database.test_schema',
type: 'databaseSchema',
},
database: {
id: '789e0123-e45f-67g8-h901-234567890123',
name: 'sample_database',
fullyQualifiedName: 'sample_database',
type: 'database',
},
service: {
id: '012e3456-e78h-90i1-j234-567890123456',
name: 'mysql_service',
fullyQualifiedName: 'mysql_service',
type: 'databaseService',
},
};
export const mockStoredProcedureWithEmptyCode: StoredProcedure = {
id: '123e4567-e89b-12d3-a456-426614174002',
name: 'test_stored_procedure_empty_code',
fullyQualifiedName: 'sample_database.test_stored_procedure_empty_code',
description: 'A test stored procedure with empty code',
storedProcedureCode: {
language: 'SQL',
code: '',
} as StoredProcedureCodeObject,
databaseSchema: {
id: '456e7890-e12b-34c5-d678-901234567890',
name: 'test_schema',
fullyQualifiedName: 'sample_database.test_schema',
type: 'databaseSchema',
},
database: {
id: '789e0123-e45f-67g8-h901-234567890123',
name: 'sample_database',
fullyQualifiedName: 'sample_database',
type: 'database',
},
service: {
id: '012e3456-e78h-90i1-j234-567890123456',
name: 'mysql_service',
fullyQualifiedName: 'mysql_service',
type: 'databaseService',
},
};