mirror of
https://github.com/open-metadata/OpenMetadata.git
synced 2025-08-18 05:57:17 +00:00
Test: added test suits for ingestionPage and ingestion component (#1374)
* Test: unit test for ingestionpage and ingestion component * updated ingestion component test * miner change
This commit is contained in:
parent
dc627bd1a3
commit
9c01d574fc
@ -226,7 +226,7 @@ const Ingestion: React.FC<Props> = ({
|
||||
|
||||
return (
|
||||
<PageContainer className="tw-bg-white">
|
||||
<div className="tw-px-4">
|
||||
<div className="tw-px-4" data-testid="ingestion-container">
|
||||
<div className="tw-flex">
|
||||
<div className="tw-w-4/12">
|
||||
{searchText || getSearchedIngestions().length > 0 ? (
|
||||
@ -246,7 +246,7 @@ const Ingestion: React.FC<Props> = ({
|
||||
className={classNames('tw-h-8 tw-rounded tw-mb-2', {
|
||||
'tw-opacity-40': !isAdminUser && !isAuthDisabled,
|
||||
})}
|
||||
data-testid="add-new-user-button"
|
||||
data-testid="add-new-ingestion-button"
|
||||
size="small"
|
||||
theme="primary"
|
||||
variant="contained"
|
||||
@ -260,7 +260,7 @@ const Ingestion: React.FC<Props> = ({
|
||||
<div className="tw-table-responsive tw-my-6">
|
||||
<table className="tw-w-full" data-testid="ingestion-table">
|
||||
<thead>
|
||||
<tr className="tableHead-row">
|
||||
<tr className="tableHead-row" data-testid="table-header">
|
||||
<th className="tableHead-cell">Name</th>
|
||||
<th className="tableHead-cell">Type</th>
|
||||
<th className="tableHead-cell">Service</th>
|
||||
|
@ -0,0 +1,223 @@
|
||||
import {
|
||||
findByTestId,
|
||||
findByText,
|
||||
fireEvent,
|
||||
render,
|
||||
} from '@testing-library/react';
|
||||
import React from 'react';
|
||||
import { MemoryRouter } from 'react-router';
|
||||
import { mockIngestionWorkFlow } from '../../pages/IngestionPage/IngestionPage.mock';
|
||||
import Ingestion from './Ingestion.component';
|
||||
import { IngestionData } from './ingestion.interface';
|
||||
|
||||
const mockPaging = {
|
||||
after: 'after',
|
||||
before: 'befor',
|
||||
total: 1,
|
||||
};
|
||||
|
||||
const mockFunction = jest.fn();
|
||||
const mockPaginghandler = jest.fn();
|
||||
const mockDeleteIngestion = jest.fn();
|
||||
const mockTriggerIngestion = jest
|
||||
.fn()
|
||||
.mockImplementation(() => Promise.resolve());
|
||||
|
||||
jest.mock('../common/non-admin-action/NonAdminAction', () => {
|
||||
return jest
|
||||
.fn()
|
||||
.mockImplementation(({ children }: { children: React.ReactNode }) => (
|
||||
<div>{children}</div>
|
||||
));
|
||||
});
|
||||
|
||||
jest.mock('../containers/PageContainer', () => {
|
||||
return jest
|
||||
.fn()
|
||||
.mockImplementation(({ children }: { children: React.ReactNode }) => (
|
||||
<div>{children}</div>
|
||||
));
|
||||
});
|
||||
|
||||
jest.mock('../common/searchbar/Searchbar', () => {
|
||||
return jest.fn().mockImplementation(() => <div>Searchbar</div>);
|
||||
});
|
||||
|
||||
jest.mock('../common/next-previous/NextPrevious', () => {
|
||||
return jest.fn().mockImplementation(() => <div>NextPrevious</div>);
|
||||
});
|
||||
|
||||
jest.mock('../IngestionModal/IngestionModal.component', () => {
|
||||
return jest.fn().mockImplementation(() => <div>IngestionModal</div>);
|
||||
});
|
||||
|
||||
jest.mock('../Modals/ConfirmationModal/ConfirmationModal', () => {
|
||||
return jest.fn().mockImplementation(() => <div>ConfirmationModal</div>);
|
||||
});
|
||||
|
||||
describe('Test Ingestion page', () => {
|
||||
it('Page Should render', async () => {
|
||||
const { container } = render(
|
||||
<Ingestion
|
||||
addIngestion={mockFunction}
|
||||
deleteIngestion={mockDeleteIngestion}
|
||||
ingestionList={mockIngestionWorkFlow.data.data as IngestionData[]}
|
||||
paging={mockPaging}
|
||||
pagingHandler={mockPaginghandler}
|
||||
serviceList={[]}
|
||||
triggerIngestion={mockTriggerIngestion}
|
||||
updateIngestion={mockFunction}
|
||||
/>,
|
||||
{
|
||||
wrapper: MemoryRouter,
|
||||
}
|
||||
);
|
||||
|
||||
const ingestionPageContainer = await findByTestId(
|
||||
container,
|
||||
'ingestion-container'
|
||||
);
|
||||
const searchBox = await findByText(container, /Searchbar/i);
|
||||
const addIngestionButton = await findByTestId(
|
||||
container,
|
||||
'add-new-ingestion-button'
|
||||
);
|
||||
const ingestionTable = await findByTestId(container, 'ingestion-table');
|
||||
|
||||
expect(ingestionPageContainer).toBeInTheDocument();
|
||||
expect(searchBox).toBeInTheDocument();
|
||||
expect(addIngestionButton).toBeInTheDocument();
|
||||
expect(ingestionTable).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('Table should render necessary fields', async () => {
|
||||
const { container } = render(
|
||||
<Ingestion
|
||||
addIngestion={mockFunction}
|
||||
deleteIngestion={mockDeleteIngestion}
|
||||
ingestionList={mockIngestionWorkFlow.data.data as IngestionData[]}
|
||||
paging={mockPaging}
|
||||
pagingHandler={mockPaginghandler}
|
||||
serviceList={[]}
|
||||
triggerIngestion={mockTriggerIngestion}
|
||||
updateIngestion={mockFunction}
|
||||
/>,
|
||||
{
|
||||
wrapper: MemoryRouter,
|
||||
}
|
||||
);
|
||||
|
||||
const ingestionTable = await findByTestId(container, 'ingestion-table');
|
||||
const tableHeaderContainer = await findByTestId(container, 'table-header');
|
||||
const runButton = await findByTestId(container, 'run');
|
||||
const editButton = await findByTestId(container, 'edit');
|
||||
const deleteButton = await findByTestId(container, 'delete');
|
||||
const tableHeaders: string[] = [];
|
||||
|
||||
tableHeaderContainer.childNodes.forEach(
|
||||
(node) => node.textContent && tableHeaders.push(node.textContent)
|
||||
);
|
||||
|
||||
expect(ingestionTable).toBeInTheDocument();
|
||||
expect(tableHeaderContainer).toBeInTheDocument();
|
||||
expect(tableHeaders.length).toBe(6);
|
||||
expect(tableHeaders).toStrictEqual([
|
||||
'Name',
|
||||
'Type',
|
||||
'Service',
|
||||
'Schedule',
|
||||
'Recent Runs',
|
||||
'Actions',
|
||||
]);
|
||||
expect(runButton).toBeInTheDocument();
|
||||
expect(editButton).toBeInTheDocument();
|
||||
expect(deleteButton).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('Pagination should be render if paging is provided', async () => {
|
||||
const mockPagingAfter = {
|
||||
after: 'afterKey',
|
||||
before: 'beforeKey',
|
||||
};
|
||||
const { container } = render(
|
||||
<Ingestion
|
||||
addIngestion={mockFunction}
|
||||
deleteIngestion={mockDeleteIngestion}
|
||||
ingestionList={mockIngestionWorkFlow.data.data as IngestionData[]}
|
||||
paging={mockPagingAfter}
|
||||
pagingHandler={mockPaginghandler}
|
||||
serviceList={[]}
|
||||
triggerIngestion={mockTriggerIngestion}
|
||||
updateIngestion={mockFunction}
|
||||
/>,
|
||||
{
|
||||
wrapper: MemoryRouter,
|
||||
}
|
||||
);
|
||||
|
||||
const nextPrevious = await findByText(container, /NextPrevious/i);
|
||||
|
||||
expect(nextPrevious).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('CTA should work', async () => {
|
||||
const mockPagingAfter = {
|
||||
after: 'afterKey',
|
||||
before: 'beforeKey',
|
||||
};
|
||||
|
||||
const { container } = render(
|
||||
<Ingestion
|
||||
addIngestion={mockFunction}
|
||||
deleteIngestion={mockDeleteIngestion}
|
||||
ingestionList={mockIngestionWorkFlow.data.data as IngestionData[]}
|
||||
paging={mockPagingAfter}
|
||||
pagingHandler={mockPaginghandler}
|
||||
serviceList={[]}
|
||||
triggerIngestion={mockTriggerIngestion}
|
||||
updateIngestion={mockFunction}
|
||||
/>,
|
||||
{
|
||||
wrapper: MemoryRouter,
|
||||
}
|
||||
);
|
||||
|
||||
// on click of add ingestion
|
||||
const addIngestionButton = await findByTestId(
|
||||
container,
|
||||
'add-new-ingestion-button'
|
||||
);
|
||||
fireEvent.click(addIngestionButton);
|
||||
|
||||
expect(await findByText(container, /IngestionModal/i)).toBeInTheDocument();
|
||||
|
||||
(await findByText(container, /IngestionModal/i)).remove();
|
||||
|
||||
// on click of run button
|
||||
|
||||
const runButton = await findByTestId(container, 'run');
|
||||
fireEvent.click(runButton);
|
||||
|
||||
expect(mockTriggerIngestion).toBeCalled();
|
||||
|
||||
// on click of edit button
|
||||
|
||||
const editButton = await findByTestId(container, 'edit');
|
||||
fireEvent.click(editButton);
|
||||
|
||||
expect(await findByText(container, /IngestionModal/i)).toBeInTheDocument();
|
||||
|
||||
(await findByText(container, /IngestionModal/i)).remove();
|
||||
|
||||
// on click of delete button
|
||||
|
||||
const deleteButton = await findByTestId(container, 'delete');
|
||||
fireEvent.click(deleteButton);
|
||||
|
||||
expect(
|
||||
await findByText(container, /ConfirmationModal/i)
|
||||
).toBeInTheDocument();
|
||||
|
||||
(await findByText(container, /ConfirmationModal/i)).remove();
|
||||
});
|
||||
});
|
@ -0,0 +1,80 @@
|
||||
export const mockIngestionWorkFlow = {
|
||||
data: {
|
||||
data: [
|
||||
{
|
||||
id: '3dae41fd-0469-483b-9d48-622577f2e075',
|
||||
name: 'test1',
|
||||
displayName: 'Test1',
|
||||
owner: {
|
||||
id: '360d5fd9-ba6b-4205-a92c-8eb98286c1c5',
|
||||
type: 'user',
|
||||
name: 'Aaron Johnson',
|
||||
href: 'http://localhost:8585/api/v1/users/360d5fd9-ba6b-4205-a92c-8eb98286c1c5',
|
||||
},
|
||||
fullyQualifiedName: 'bigquery.test1',
|
||||
ingestionType: 'bigquery',
|
||||
tags: [],
|
||||
forceDeploy: true,
|
||||
pauseWorkflow: false,
|
||||
concurrency: 1,
|
||||
startDate: '2021-11-24',
|
||||
endDate: '2022-11-25',
|
||||
workflowTimezone: 'UTC',
|
||||
retries: 1,
|
||||
retryDelay: 300,
|
||||
workflowCatchup: false,
|
||||
scheduleInterval: '0 12 * * *',
|
||||
workflowTimeout: 60,
|
||||
connectorConfig: {
|
||||
username: 'test',
|
||||
password: 'test',
|
||||
host: 'http://localhost:3000/ingestion',
|
||||
database: 'mysql',
|
||||
includeViews: true,
|
||||
enableDataProfiler: false,
|
||||
includeFilterPattern: [],
|
||||
excludeFilterPattern: [],
|
||||
},
|
||||
ingestionStatuses: [],
|
||||
service: {
|
||||
id: 'e7e34bc7-fc12-40d6-9478-a6297cdefe7a',
|
||||
type: 'databaseService',
|
||||
name: 'bigquery',
|
||||
description: 'BigQuery service used for shopify data',
|
||||
href: 'http://localhost:8585/api/v1/services/databaseServices/e7e34bc7-fc12-40d6-9478-a6297cdefe7a',
|
||||
},
|
||||
href: 'http://localhost:8585/api/ingestion/3dae41fd-0469-483b-9d48-622577f2e075',
|
||||
version: 0.1,
|
||||
updatedAt: 1637736180218,
|
||||
updatedBy: 'anonymous',
|
||||
},
|
||||
],
|
||||
paging: {
|
||||
total: 1,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export const mockService = {
|
||||
data: {
|
||||
data: [
|
||||
{
|
||||
id: 'e7e34bc7-fc12-40d6-9478-a6297cdefe7a',
|
||||
name: 'bigquery',
|
||||
serviceType: 'BigQuery',
|
||||
description: 'BigQuery service used for shopify data',
|
||||
version: 0.1,
|
||||
updatedAt: 1637734235276,
|
||||
updatedBy: 'anonymous',
|
||||
href: 'http://localhost:8585/api/v1/services/databaseServices/e7e34bc7-fc12-40d6-9478-a6297cdefe7a',
|
||||
jdbc: {
|
||||
driverClass: 'jdbc',
|
||||
connectionUrl: 'jdbc://localhost',
|
||||
},
|
||||
},
|
||||
],
|
||||
paging: {
|
||||
total: 1,
|
||||
},
|
||||
},
|
||||
};
|
@ -0,0 +1,36 @@
|
||||
import { findByText, render } from '@testing-library/react';
|
||||
import React from 'react';
|
||||
import IngestionPage from './IngestionPage.component';
|
||||
import { mockIngestionWorkFlow, mockService } from './IngestionPage.mock';
|
||||
|
||||
jest.mock('../../components/Ingestion/Ingestion.component', () => {
|
||||
return jest.fn().mockReturnValue(<p>Ingestion Component</p>);
|
||||
});
|
||||
|
||||
jest.mock('../../axiosAPIs/serviceAPI', () => ({
|
||||
getServices: jest.fn().mockImplementation(() => Promise.resolve(mockService)),
|
||||
}));
|
||||
|
||||
jest.mock('../../axiosAPIs/ingestionWorkflowAPI', () => ({
|
||||
addIngestionWorkflow: jest.fn(),
|
||||
deleteIngestionWorkflowsById: jest
|
||||
.fn()
|
||||
.mockImplementation(() => Promise.resolve()),
|
||||
getIngestionWorkflows: jest
|
||||
.fn()
|
||||
.mockImplementation(() => Promise.resolve(mockIngestionWorkFlow)),
|
||||
triggerIngestionWorkflowsById: jest
|
||||
.fn()
|
||||
.mockImplementation(() => Promise.resolve()),
|
||||
updateIngestionWorkflow: jest.fn(),
|
||||
}));
|
||||
|
||||
describe('Test Ingestion page', () => {
|
||||
it('Page Should render', async () => {
|
||||
const { container } = render(<IngestionPage />);
|
||||
|
||||
const ingestionPage = await findByText(container, /Ingestion Component/i);
|
||||
|
||||
expect(ingestionPage).toBeInTheDocument();
|
||||
});
|
||||
});
|
Loading…
x
Reference in New Issue
Block a user