Fix: Additional permissions call happening in summary components (#20943)

* fix double permissions call happening in summary components

* fix failing unit test case

* removed unnecessary entity details fn call

* address unit test failure
This commit is contained in:
Shrushti Polekar 2025-04-25 14:35:51 +05:30 committed by GitHub
parent e181c50e50
commit 9ef9ae97a5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 55 additions and 38 deletions

View File

@ -144,7 +144,6 @@ export const DataAssetSummaryPanel = ({
dataAsset.id dataAsset.id
); );
setEntityPermissions(permissions); setEntityPermissions(permissions);
fetchEntityBasedDetails();
} else { } else {
setEntityPermissions(null); setEntityPermissions(null);
} }
@ -220,7 +219,10 @@ export const DataAssetSummaryPanel = ({
</Row> </Row>
{entityType === EntityType.TABLE && ( {entityType === EntityType.TABLE && (
<TableSummary entityDetails={dataAsset as Table} /> <TableSummary
entityDetails={dataAsset as Table}
permissions={entityPermissions}
/>
)} )}
<SummaryTagsDescription <SummaryTagsDescription

View File

@ -25,11 +25,7 @@ import { useTranslation } from 'react-i18next';
import { useHistory } from 'react-router-dom'; import { useHistory } from 'react-router-dom';
import { ROUTES } from '../../../../constants/constants'; import { ROUTES } from '../../../../constants/constants';
import { mockTablePermission } from '../../../../constants/mockTourData.constants'; import { mockTablePermission } from '../../../../constants/mockTourData.constants';
import { usePermissionProvider } from '../../../../context/PermissionProvider/PermissionProvider'; import { OperationPermission } from '../../../../context/PermissionProvider/PermissionProvider.interface';
import {
OperationPermission,
ResourceEntity,
} from '../../../../context/PermissionProvider/PermissionProvider.interface';
import { EntityTabs, EntityType } from '../../../../enums/entity.enum'; import { EntityTabs, EntityType } from '../../../../enums/entity.enum';
import { TestSummary } from '../../../../generated/tests/testCase'; import { TestSummary } from '../../../../generated/tests/testCase';
import useCustomLocation from '../../../../hooks/useCustomLocation/useCustomLocation'; import useCustomLocation from '../../../../hooks/useCustomLocation/useCustomLocation';
@ -40,21 +36,25 @@ import { TableProfilerTab } from '../../../Database/Profiler/ProfilerDashboard/p
import './table-summary.less'; import './table-summary.less';
import { TableSummaryProps } from './TableSummary.interface'; import { TableSummaryProps } from './TableSummary.interface';
function TableSummary({ entityDetails: tableDetails }: TableSummaryProps) { function TableSummary({
entityDetails: tableDetails,
permissions,
}: Readonly<TableSummaryProps>) {
const { t } = useTranslation(); const { t } = useTranslation();
const location = useCustomLocation(); const location = useCustomLocation();
const history = useHistory(); const history = useHistory();
const isTourPage = location.pathname.includes(ROUTES.TOUR); const isTourPage = location.pathname.includes(ROUTES.TOUR);
const { getEntityPermission } = usePermissionProvider();
const [testSuiteSummary, setTestSuiteSummary] = useState<TestSummary>(); const [testSuiteSummary, setTestSuiteSummary] = useState<TestSummary>();
const [tablePermissions, setTablePermissions] = useState<OperationPermission>( const [tablePermissions, setTablePermissions] = useState<OperationPermission>(
DEFAULT_ENTITY_PERMISSION DEFAULT_ENTITY_PERMISSION
); );
useEffect(() => {
setTablePermissions(permissions as OperationPermission);
}, [permissions]);
// Since we are showing test cases summary in the table summary panel, we are using ViewTests permission // Since we are showing test cases summary in the table summary panel, we are using ViewTests permission
const viewTestCasesPermission = useMemo( const viewTestCasesPermission = useMemo(
() => tablePermissions.ViewAll || tablePermissions.ViewTests, () => tablePermissions?.ViewAll || tablePermissions?.ViewTests,
[tablePermissions] [tablePermissions]
); );
@ -154,33 +154,21 @@ function TableSummary({ entityDetails: tableDetails }: TableSummaryProps) {
const init = useCallback(async () => { const init = useCallback(async () => {
if (tableDetails.id && !isTourPage) { if (tableDetails.id && !isTourPage) {
const tablePermission = await getEntityPermission(
ResourceEntity.TABLE,
tableDetails.id
);
setTablePermissions(tablePermission);
const shouldFetchTestCaseData = const shouldFetchTestCaseData =
!isTableDeleted && !isTableDeleted &&
tableDetails.service?.type === 'databaseService' && tableDetails.service?.type === 'databaseService' &&
(tablePermission.ViewAll || tablePermission.ViewTests); (permissions?.ViewAll || permissions?.ViewTests);
if (shouldFetchTestCaseData) { if (shouldFetchTestCaseData) {
fetchAllTests(); fetchAllTests();
} }
} else { } else {
setTablePermissions(mockTablePermission as OperationPermission); setTablePermissions(mockTablePermission as OperationPermission);
} }
}, [ }, [tableDetails, isTourPage, isTableDeleted, fetchAllTests, permissions]);
tableDetails,
isTourPage,
isTableDeleted,
fetchAllTests,
getEntityPermission,
]);
useEffect(() => { useEffect(() => {
init(); init();
}, [tableDetails.id]); }, [tableDetails.id, permissions]);
return ( return (
<Row className="p-md border-radius-card summary-panel-card" gutter={[0, 8]}> <Row className="p-md border-radius-card summary-panel-card" gutter={[0, 8]}>

View File

@ -11,10 +11,12 @@
* limitations under the License. * limitations under the License.
*/ */
import { OperationPermission } from '../../../../context/PermissionProvider/PermissionProvider.interface';
import { Table } from '../../../../generated/entity/data/table'; import { Table } from '../../../../generated/entity/data/table';
export interface TableSummaryProps { export interface TableSummaryProps {
entityDetails: Table; entityDetails: Table;
permissions: OperationPermission | null;
} }
export interface TableProfileDetails { export interface TableProfileDetails {

View File

@ -14,6 +14,7 @@
import { act, render, screen } from '@testing-library/react'; import { act, render, screen } from '@testing-library/react';
import React from 'react'; import React from 'react';
import { MemoryRouter } from 'react-router-dom'; import { MemoryRouter } from 'react-router-dom';
import { OperationPermission } from '../../../../context/PermissionProvider/PermissionProvider.interface';
import { getTestCaseExecutionSummary } from '../../../../rest/testAPI'; import { getTestCaseExecutionSummary } from '../../../../rest/testAPI';
import { mockTableEntityDetails } from '../mocks/TableSummary.mock'; import { mockTableEntityDetails } from '../mocks/TableSummary.mock';
import TableSummary from './TableSummary.component'; import TableSummary from './TableSummary.component';
@ -69,9 +70,15 @@ jest.mock('../../../../context/PermissionProvider/PermissionProvider', () => ({
describe('TableSummary component tests', () => { describe('TableSummary component tests', () => {
it('Component should render properly, when loaded in the Explore page.', async () => { it('Component should render properly, when loaded in the Explore page.', async () => {
await act(async () => { await act(async () => {
render(<TableSummary entityDetails={mockTableEntityDetails} />, { render(
wrapper: MemoryRouter, <TableSummary
}); entityDetails={mockTableEntityDetails}
permissions={mockEntityPermissions as OperationPermission}
/>,
{
wrapper: MemoryRouter,
}
);
}); });
const profilerHeader = screen.getByTestId('profiler-header'); const profilerHeader = screen.getByTestId('profiler-header');
@ -89,9 +96,15 @@ describe('TableSummary component tests', () => {
it('Component should render properly, when loaded in the Lineage page.', async () => { it('Component should render properly, when loaded in the Lineage page.', async () => {
await act(async () => { await act(async () => {
render(<TableSummary entityDetails={mockTableEntityDetails} />, { render(
wrapper: MemoryRouter, <TableSummary
}); entityDetails={mockTableEntityDetails}
permissions={mockEntityPermissions as OperationPermission}
/>,
{
wrapper: MemoryRouter,
}
);
}); });
const profilerHeader = screen.getByTestId('profiler-header'); const profilerHeader = screen.getByTestId('profiler-header');
@ -117,9 +130,15 @@ describe('TableSummary component tests', () => {
); );
await act(async () => { await act(async () => {
render(<TableSummary entityDetails={mockTableEntityDetails} />, { render(
wrapper: MemoryRouter, <TableSummary
}); entityDetails={mockTableEntityDetails}
permissions={mockEntityPermissions as OperationPermission}
/>,
{
wrapper: MemoryRouter,
}
);
}); });
const testsPassedLabel = screen.getByTestId('test-passed'); const testsPassedLabel = screen.getByTestId('test-passed');
@ -146,9 +165,15 @@ describe('TableSummary component tests', () => {
}) })
); );
await act(async () => { await act(async () => {
render(<TableSummary entityDetails={mockTableEntityDetails} />, { render(
wrapper: MemoryRouter, <TableSummary
}); entityDetails={mockTableEntityDetails}
permissions={mockEntityPermissions as OperationPermission}
/>,
{
wrapper: MemoryRouter,
}
);
}); });
const testsPassedValue = screen.getByTestId('test-passed-value'); const testsPassedValue = screen.getByTestId('test-passed-value');
const testsAbortedValue = screen.getByTestId('test-aborted-value'); const testsAbortedValue = screen.getByTestId('test-aborted-value');