mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-07-25 18:30:00 +00:00
UI: Added unit test for profilerDashboardPage and profilerDashboard component [part 1] (#8178)
* UI: Added unit test for profilerDashboardPage * Added unit test for profilerDashboard component
This commit is contained in:
parent
5b3c877dd1
commit
dcf7df5d4d
@ -0,0 +1,240 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2022 Collate
|
||||||
|
* Licensed 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 {
|
||||||
|
act,
|
||||||
|
cleanup,
|
||||||
|
fireEvent,
|
||||||
|
render,
|
||||||
|
screen,
|
||||||
|
} from '@testing-library/react';
|
||||||
|
import React from 'react';
|
||||||
|
import { MemoryRouter } from 'react-router-dom';
|
||||||
|
import { ProfilerDashboardType } from '../../enums/table.enum';
|
||||||
|
import { MOCK_TABLE } from '../../mocks/TableData.mock';
|
||||||
|
import ProfilerDashboard from './ProfilerDashboard';
|
||||||
|
import {
|
||||||
|
ProfilerDashboardProps,
|
||||||
|
ProfilerDashboardTab,
|
||||||
|
} from './profilerDashboard.interface';
|
||||||
|
|
||||||
|
const profilerDashboardProps: ProfilerDashboardProps = {
|
||||||
|
onTableChange: jest.fn(),
|
||||||
|
table: MOCK_TABLE,
|
||||||
|
testCases: [],
|
||||||
|
profilerData: [],
|
||||||
|
fetchProfilerData: jest.fn(),
|
||||||
|
fetchTestCases: jest.fn(),
|
||||||
|
onTestCaseUpdate: jest.fn(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let mockParam: {
|
||||||
|
entityTypeFQN: string;
|
||||||
|
dashboardType: ProfilerDashboardType;
|
||||||
|
tab?: ProfilerDashboardTab;
|
||||||
|
} = {
|
||||||
|
entityTypeFQN: 'sample_data.ecommerce_db.shopify.dim_address.address_id',
|
||||||
|
dashboardType: ProfilerDashboardType.COLUMN,
|
||||||
|
tab: ProfilerDashboardTab.PROFILER,
|
||||||
|
};
|
||||||
|
|
||||||
|
const mockHistory = {
|
||||||
|
push: jest.fn(),
|
||||||
|
};
|
||||||
|
|
||||||
|
jest.mock('react-router-dom', () => {
|
||||||
|
return {
|
||||||
|
useParams: jest.fn().mockImplementation(() => mockParam),
|
||||||
|
useHistory: jest.fn().mockImplementation(() => mockHistory),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.mock('../containers/PageLayout', () => {
|
||||||
|
return jest
|
||||||
|
.fn()
|
||||||
|
.mockImplementation(({ children }) => (
|
||||||
|
<div data-testid="page-container">{children}</div>
|
||||||
|
));
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.mock('../common/entityPageInfo/EntityPageInfo', () => {
|
||||||
|
return jest
|
||||||
|
.fn()
|
||||||
|
.mockImplementation(() => <div>EntityPageInfo component</div>);
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.mock('./component/ProfilerTab', () => {
|
||||||
|
return jest.fn().mockImplementation(() => <div>ProfilerTab component</div>);
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.mock('./component/DataQualityTab', () => {
|
||||||
|
return jest
|
||||||
|
.fn()
|
||||||
|
.mockImplementation(() => <div>DataQualityTab component</div>);
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.mock('../../components/PermissionProvider/PermissionProvider', () => {
|
||||||
|
return {
|
||||||
|
usePermissionProvider: jest.fn().mockImplementation(() => ({
|
||||||
|
getEntityPermission: jest.fn().mockImplementation(() => ({
|
||||||
|
ViewAll: true,
|
||||||
|
ViewBasic: true,
|
||||||
|
ViewDataProfile: true,
|
||||||
|
ViewTests: true,
|
||||||
|
EditAll: true,
|
||||||
|
EditTests: true,
|
||||||
|
})),
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Test ProfilerDashboardPage component', () => {
|
||||||
|
beforeEach(() => cleanup());
|
||||||
|
|
||||||
|
it('ProfilerDashboardPage component should render properly for profiler tab', async () => {
|
||||||
|
await act(async () => {
|
||||||
|
render(<ProfilerDashboard {...profilerDashboardProps} />, {
|
||||||
|
wrapper: MemoryRouter,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
const pageContainer = await screen.findByTestId('page-container');
|
||||||
|
const profilerSwitch = await screen.findByTestId('profiler-switch');
|
||||||
|
const EntityPageInfo = await screen.findByText('EntityPageInfo component');
|
||||||
|
const ProfilerTab = await screen.findByText('ProfilerTab component');
|
||||||
|
const selectedTimeFrame = await screen.findByText('Last 3 days');
|
||||||
|
const DataQualityTab = screen.queryByText('DataQualityTab component');
|
||||||
|
|
||||||
|
expect(pageContainer).toBeInTheDocument();
|
||||||
|
expect(profilerSwitch).toBeInTheDocument();
|
||||||
|
expect(EntityPageInfo).toBeInTheDocument();
|
||||||
|
expect(ProfilerTab).toBeInTheDocument();
|
||||||
|
expect(selectedTimeFrame).toBeInTheDocument();
|
||||||
|
expect(DataQualityTab).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('ProfilerDashboardPage component should render properly for data quality tab', async () => {
|
||||||
|
mockParam = {
|
||||||
|
...mockParam,
|
||||||
|
tab: ProfilerDashboardTab.DATA_QUALITY,
|
||||||
|
};
|
||||||
|
await act(async () => {
|
||||||
|
render(<ProfilerDashboard {...profilerDashboardProps} />, {
|
||||||
|
wrapper: MemoryRouter,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
const pageContainer = await screen.findByTestId('page-container');
|
||||||
|
const profilerSwitch = await screen.findByTestId('profiler-switch');
|
||||||
|
const EntityPageInfo = await screen.findByText('EntityPageInfo component');
|
||||||
|
const ProfilerTab = screen.queryByText('ProfilerTab component');
|
||||||
|
const DataQualityTab = await screen.findByText('DataQualityTab component');
|
||||||
|
const deletedTestSwitch = await screen.findByText('Deleted Tests');
|
||||||
|
const statusDropdown = await screen.findByText('Status');
|
||||||
|
|
||||||
|
expect(pageContainer).toBeInTheDocument();
|
||||||
|
expect(profilerSwitch).toBeInTheDocument();
|
||||||
|
expect(EntityPageInfo).toBeInTheDocument();
|
||||||
|
expect(DataQualityTab).toBeInTheDocument();
|
||||||
|
expect(deletedTestSwitch).toBeInTheDocument();
|
||||||
|
expect(statusDropdown).toBeInTheDocument();
|
||||||
|
expect(ProfilerTab).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('If tab is not provided profiler tab should be selected default', async () => {
|
||||||
|
mockParam = {
|
||||||
|
...mockParam,
|
||||||
|
tab: undefined,
|
||||||
|
};
|
||||||
|
await act(async () => {
|
||||||
|
render(<ProfilerDashboard {...profilerDashboardProps} />, {
|
||||||
|
wrapper: MemoryRouter,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
const pageContainer = await screen.findByTestId('page-container');
|
||||||
|
const profilerSwitch = await screen.findByTestId('profiler-switch');
|
||||||
|
const EntityPageInfo = await screen.findByText('EntityPageInfo component');
|
||||||
|
const ProfilerTab = await screen.findByText('ProfilerTab component');
|
||||||
|
const selectedTimeFrame = await screen.findByText('Last 3 days');
|
||||||
|
const DataQualityTab = screen.queryByText('DataQualityTab component');
|
||||||
|
|
||||||
|
expect(pageContainer).toBeInTheDocument();
|
||||||
|
expect(profilerSwitch).toBeInTheDocument();
|
||||||
|
expect(EntityPageInfo).toBeInTheDocument();
|
||||||
|
expect(ProfilerTab).toBeInTheDocument();
|
||||||
|
expect(selectedTimeFrame).toBeInTheDocument();
|
||||||
|
expect(DataQualityTab).not.toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Tab change should work properly', async () => {
|
||||||
|
await act(async () => {
|
||||||
|
render(<ProfilerDashboard {...profilerDashboardProps} />, {
|
||||||
|
wrapper: MemoryRouter,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const dataQualityTabBtn = await screen.findByDisplayValue('Data Quality');
|
||||||
|
const profilerTabBtn = await screen.findByDisplayValue('Profiler');
|
||||||
|
const summaryTabBtn = await screen.findByDisplayValue('Summary');
|
||||||
|
const ProfilerTab = await screen.findByText('ProfilerTab component');
|
||||||
|
const DataQualityTab = screen.queryByText('DataQualityTab component');
|
||||||
|
|
||||||
|
expect(ProfilerTab).toBeInTheDocument();
|
||||||
|
expect(profilerTabBtn).toBeInTheDocument();
|
||||||
|
expect(summaryTabBtn).toBeInTheDocument();
|
||||||
|
expect(DataQualityTab).not.toBeInTheDocument();
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
fireEvent.click(dataQualityTabBtn);
|
||||||
|
});
|
||||||
|
|
||||||
|
const DQTab = await screen.findByText('DataQualityTab component');
|
||||||
|
|
||||||
|
expect(DQTab).toBeInTheDocument();
|
||||||
|
expect(profilerDashboardProps.fetchTestCases).toBeCalled();
|
||||||
|
expect(ProfilerTab).not.toBeInTheDocument();
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
fireEvent.click(profilerTabBtn);
|
||||||
|
});
|
||||||
|
const profilerContainer = await screen.findByText('ProfilerTab component');
|
||||||
|
|
||||||
|
expect(profilerContainer).toBeInTheDocument();
|
||||||
|
expect(profilerDashboardProps.fetchProfilerData).toBeCalled();
|
||||||
|
expect(DQTab).not.toBeInTheDocument();
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
fireEvent.click(summaryTabBtn);
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(mockHistory.push).toBeCalled();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Add test button should work properly', async () => {
|
||||||
|
await act(async () => {
|
||||||
|
render(<ProfilerDashboard {...profilerDashboardProps} />, {
|
||||||
|
wrapper: MemoryRouter,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const pageContainer = await screen.findByTestId('page-container');
|
||||||
|
const addTest = await screen.findByTestId('add-test');
|
||||||
|
|
||||||
|
expect(pageContainer).toBeInTheDocument();
|
||||||
|
expect(addTest).toBeInTheDocument();
|
||||||
|
|
||||||
|
await act(async () => {
|
||||||
|
fireEvent.click(addTest);
|
||||||
|
|
||||||
|
expect(mockHistory.push).toBeCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -509,6 +509,7 @@ const ProfilerDashboard: React.FC<ProfilerDashboardProps> = ({
|
|||||||
: NO_PERMISSION_FOR_ACTION
|
: NO_PERMISSION_FOR_ACTION
|
||||||
}>
|
}>
|
||||||
<Button
|
<Button
|
||||||
|
data-testid="add-test"
|
||||||
disabled={
|
disabled={
|
||||||
!(tablePermissions.EditAll || tablePermissions.EditTests)
|
!(tablePermissions.EditAll || tablePermissions.EditTests)
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,155 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2022 Collate
|
||||||
|
* Licensed 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 { act, cleanup, render, screen } from '@testing-library/react';
|
||||||
|
import React from 'react';
|
||||||
|
import { MemoryRouter } from 'react-router-dom';
|
||||||
|
import { getTableDetailsByFQN } from '../../axiosAPIs/tableAPI';
|
||||||
|
import { ProfilerDashboardTab } from '../../components/ProfilerDashboard/profilerDashboard.interface';
|
||||||
|
import { ProfilerDashboardType } from '../../enums/table.enum';
|
||||||
|
import { MOCK_TABLE } from '../../mocks/TableData.mock';
|
||||||
|
import ProfilerDashboardPage from './ProfilerDashboardPage';
|
||||||
|
|
||||||
|
let mockParam = {
|
||||||
|
entityTypeFQN: 'sample_data.ecommerce_db.shopify.dim_address.address_id',
|
||||||
|
dashboardType: ProfilerDashboardType.COLUMN,
|
||||||
|
tab: ProfilerDashboardTab.PROFILER,
|
||||||
|
};
|
||||||
|
|
||||||
|
jest.mock('react-router-dom', () => {
|
||||||
|
return {
|
||||||
|
useParams: jest.fn().mockImplementation(() => mockParam),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.mock('../../axiosAPIs/tableAPI', () => {
|
||||||
|
return {
|
||||||
|
getColumnProfilerList: jest
|
||||||
|
.fn()
|
||||||
|
.mockImplementation(() => Promise.resolve({ data: [] })),
|
||||||
|
getTableDetailsByFQN: jest
|
||||||
|
.fn()
|
||||||
|
.mockImplementation(() => Promise.resolve({ data: MOCK_TABLE })),
|
||||||
|
patchTableDetails: jest.fn(),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.mock('../../axiosAPIs/testAPI', () => {
|
||||||
|
return {
|
||||||
|
getListTestCase: jest.fn().mockImplementation(() => Promise.resolve()),
|
||||||
|
ListTestCaseParams: jest.fn().mockImplementation(() => Promise.resolve()),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.mock('../../components/PermissionProvider/PermissionProvider', () => {
|
||||||
|
return {
|
||||||
|
usePermissionProvider: jest.fn().mockImplementation(() => ({
|
||||||
|
getEntityPermission: jest.fn().mockImplementation(() => ({
|
||||||
|
ViewAll: true,
|
||||||
|
ViewBasic: true,
|
||||||
|
ViewDataProfile: true,
|
||||||
|
ViewTests: true,
|
||||||
|
})),
|
||||||
|
})),
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.mock(
|
||||||
|
'../../components/common/error-with-placeholder/ErrorPlaceHolder',
|
||||||
|
() => {
|
||||||
|
return jest.fn().mockImplementation(() => <div>No data placeholder</div>);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
jest.mock('../../components/containers/PageContainerV1', () => {
|
||||||
|
return jest
|
||||||
|
.fn()
|
||||||
|
.mockImplementation(({ children }) => (
|
||||||
|
<div data-testid="page-container">{children}</div>
|
||||||
|
));
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.mock('../../components/Loader/Loader', () => {
|
||||||
|
return jest.fn().mockImplementation(() => <p data-testid="loader">Loader</p>);
|
||||||
|
});
|
||||||
|
|
||||||
|
jest.mock('../../components/ProfilerDashboard/ProfilerDashboard', () => {
|
||||||
|
return jest
|
||||||
|
.fn()
|
||||||
|
.mockImplementation(() => (
|
||||||
|
<div data-testid="profiler-dashboard">ProfilerDashboard</div>
|
||||||
|
));
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Test ProfilerDashboardPage component', () => {
|
||||||
|
beforeEach(() => cleanup());
|
||||||
|
|
||||||
|
it('ProfilerDashboardPage component should render properly for profiler tab', async () => {
|
||||||
|
await act(async () => {
|
||||||
|
render(<ProfilerDashboardPage />, {
|
||||||
|
wrapper: MemoryRouter,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
const pageContainer = await screen.findByTestId('page-container');
|
||||||
|
|
||||||
|
expect(pageContainer).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Show error placeholder if table API fails', async () => {
|
||||||
|
(getTableDetailsByFQN as jest.Mock).mockImplementationOnce(() =>
|
||||||
|
Promise.reject()
|
||||||
|
);
|
||||||
|
await act(async () => {
|
||||||
|
render(<ProfilerDashboardPage />, {
|
||||||
|
wrapper: MemoryRouter,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
const pageContainer = screen.queryByTestId('page-container');
|
||||||
|
const noDataPlaceholder = await screen.findByText('No data placeholder');
|
||||||
|
|
||||||
|
expect(pageContainer).not.toBeInTheDocument();
|
||||||
|
expect(noDataPlaceholder).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('ProfilerDashboardPage component should render properly for data quality tab', async () => {
|
||||||
|
mockParam = {
|
||||||
|
...mockParam,
|
||||||
|
tab: ProfilerDashboardTab.DATA_QUALITY,
|
||||||
|
};
|
||||||
|
await act(async () => {
|
||||||
|
render(<ProfilerDashboardPage />, {
|
||||||
|
wrapper: MemoryRouter,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
const pageContainer = await screen.findByTestId('page-container');
|
||||||
|
|
||||||
|
expect(pageContainer).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Show error placeholder if there is no fqn available', async () => {
|
||||||
|
mockParam = {
|
||||||
|
...mockParam,
|
||||||
|
entityTypeFQN: '',
|
||||||
|
};
|
||||||
|
await act(async () => {
|
||||||
|
render(<ProfilerDashboardPage />, {
|
||||||
|
wrapper: MemoryRouter,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
const pageContainer = screen.queryByTestId('page-container');
|
||||||
|
const noDataPlaceholder = await screen.findByText('No data placeholder');
|
||||||
|
|
||||||
|
expect(pageContainer).not.toBeInTheDocument();
|
||||||
|
expect(noDataPlaceholder).toBeInTheDocument();
|
||||||
|
});
|
||||||
|
});
|
@ -97,7 +97,7 @@ const ProfilerDashboardPage = () => {
|
|||||||
startTs,
|
startTs,
|
||||||
endTs,
|
endTs,
|
||||||
});
|
});
|
||||||
setProfilerData(data || []);
|
setProfilerData(data);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
showErrorToast(error as AxiosError);
|
showErrorToast(error as AxiosError);
|
||||||
} finally {
|
} finally {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user