From ada74b7fb59ea536284381f42e9ca729f0f92a5f Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Tue, 10 Sep 2024 17:35:19 +0800
Subject: [PATCH 1/3] [feature](SqlAudit&SqlManagement&SqlManagementConf):
Automatic refresh logic
---
.../src/page/SqlAudit/List/index.test.tsx | 19 ++++++++++
.../sqle/src/page/SqlAudit/List/index.tsx | 38 ++++++++++++++++---
.../component/SQLEEIndex/index.test.tsx | 18 +++++++++
.../component/SQLEEIndex/index.tsx | 34 ++++++++++++++---
.../__tests__/index.test.tsx | 23 +++++++++++
.../Detail/ScanTypeSqlCollection/indx.tsx | 34 ++++++++++++++---
6 files changed, 150 insertions(+), 16 deletions(-)
diff --git a/packages/sqle/src/page/SqlAudit/List/index.test.tsx b/packages/sqle/src/page/SqlAudit/List/index.test.tsx
index 196b03db4..f9b8fdc50 100644
--- a/packages/sqle/src/page/SqlAudit/List/index.test.tsx
+++ b/packages/sqle/src/page/SqlAudit/List/index.test.tsx
@@ -198,4 +198,23 @@ describe('sqle/SqlAudit/List', () => {
expect(screen.getByText('更新业务标签成功')).toBeInTheDocument();
expect(sqlAuditRecordsSpy).toHaveBeenCalled();
});
+
+ it('render polling request when sql audit status is auditing', async () => {
+ sqlAuditRecordsSpy.mockImplementation(() =>
+ createSpySuccessResponse({
+ data: [
+ {
+ ...sqlAuditRecordMockData[0],
+ sql_audit_status: 'auditing'
+ }
+ ],
+ total_nums: 2
+ })
+ );
+ renderWithReduxAndTheme(customRender());
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(sqlAuditRecordsSpy).toHaveBeenCalledTimes(1);
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(sqlAuditRecordsSpy).toHaveBeenCalledTimes(2);
+ });
});
diff --git a/packages/sqle/src/page/SqlAudit/List/index.tsx b/packages/sqle/src/page/SqlAudit/List/index.tsx
index ba78973ec..4780d3add 100644
--- a/packages/sqle/src/page/SqlAudit/List/index.tsx
+++ b/packages/sqle/src/page/SqlAudit/List/index.tsx
@@ -31,6 +31,7 @@ import SqlAuditListColumn, {
import { getSQLAuditRecordsV1FilterSqlAuditStatusEnum } from '@actiontech/shared/lib/api/sqle/service/sql_audit_record/index.enum';
import { SQLAuditRecordListUrlParamsKey } from '../../SqlManagement/component/SQLEEIndex/index.data';
import { PlusOutlined } from '@actiontech/icons';
+import { useBoolean } from 'ahooks';
const SqlAuditList = () => {
const { t } = useTranslation();
@@ -39,6 +40,9 @@ const SqlAuditList = () => {
const { projectName, projectID, projectArchive } = useCurrentProject();
const { username } = useCurrentUser();
+ const [polling, { setFalse: finishPollRequest, setTrue: startPollRequest }] =
+ useBoolean();
+
const { requestErrorMessage, handleTableRequestError } =
useTableRequestError();
const {
@@ -71,7 +75,8 @@ const SqlAuditList = () => {
const {
data: dataList,
loading,
- refresh
+ refresh,
+ cancel
} = useRequest(
() => {
const params: IGetSQLAuditRecordsV1Params = {
@@ -94,7 +99,23 @@ const SqlAuditList = () => {
pagination,
filterStatus,
filterDataFromUrl
- ]
+ ],
+ pollingInterval: 1000,
+ pollingErrorRetryCount: 3,
+ onSuccess: (res) => {
+ if (
+ res.list?.some(
+ (i) =>
+ i.sql_audit_status ===
+ getSQLAuditRecordsV1FilterSqlAuditStatusEnum.auditing
+ )
+ ) {
+ startPollRequest();
+ } else {
+ cancel();
+ finishPollRequest();
+ }
+ }
}
);
@@ -156,6 +177,11 @@ const SqlAuditList = () => {
});
}, [projectName, updateInstanceList]);
+ const pageLoading = useMemo(
+ () => (polling ? false : loading),
+ [polling, loading]
+ );
+
return (
<>
{messageContextHolder}
@@ -180,7 +206,7 @@ const SqlAuditList = () => {
{/* table */}
{
},
placeholder: t('sqlAudit.list.filter.inputTagPlaceholder')
}}
- loading={loading}
+ loading={pageLoading}
>
{
{
total: dataList?.total ?? 0,
current: pagination.page_index
}}
- loading={loading}
+ loading={pageLoading}
columns={columns}
errorMessage={requestErrorMessage}
onChange={tableChange}
diff --git a/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx b/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx
index 63c73cbac..93a50b286 100644
--- a/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx
+++ b/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx
@@ -593,4 +593,22 @@ describe('page/SqlManagement/SQLEEIndex', () => {
payload: sqlManageListData.data[0]
});
});
+
+ it('render polling request when sql audit status is auditing', async () => {
+ const request = sqlManage.getSqlManageList();
+ request.mockImplementation(() =>
+ createSpySuccessResponse({
+ data: [
+ {
+ ...sqlManageListData.data[sqlManageListData.data.length - 1]
+ }
+ ]
+ })
+ );
+ superRender();
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(request).toHaveBeenCalledTimes(1);
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(request).toHaveBeenCalledTimes(2);
+ });
});
diff --git a/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.tsx b/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.tsx
index a28939c2e..706665680 100644
--- a/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.tsx
+++ b/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.tsx
@@ -52,6 +52,7 @@ import { DownArrowLineOutlined } from '@actiontech/icons';
import useSqlManagementExceptionRedux from '../../../SqlManagementException/hooks/useSqlManagementExceptionRedux';
import useWhitelistRedux from '../../../Whitelist/hooks/useWhitelistRedux';
import { SqlManagementTableStyleWrapper } from './style';
+import { SqlManageAuditStatusEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
const SQLEEIndex = () => {
const { t } = useTranslation();
@@ -67,6 +68,9 @@ const SQLEEIndex = () => {
const { preferredEnUS } = usePreferredLanguages();
+ const [polling, { setFalse: finishPollRequest, setTrue: startPollRequest }] =
+ useBoolean();
+
const { setSelectData, setBatchSelectData, updateModalStatus } =
useSqlManagementRedux();
@@ -121,7 +125,8 @@ const SQLEEIndex = () => {
data: sqlList,
loading: getListLoading,
refresh,
- error: getListError
+ error: getListError,
+ cancel
} = useRequest(
() => {
const { filter_rule_name, ...otherTableFilterInfo } = tableFilterInfo;
@@ -155,12 +160,26 @@ const SQLEEIndex = () => {
tableFilterInfo,
sortInfo
],
+ pollingInterval: 1000,
+ pollingErrorRetryCount: 3,
onFinally: (params, data) => {
setSQLNum({
SQLTotalNum: data?.otherData?.sql_manage_total_num ?? 0,
problemSQlNum: data?.otherData?.sql_manage_bad_num ?? 0,
optimizedSQLNum: data?.otherData?.sql_manage_optimized_num ?? 0
});
+
+ if (
+ data?.list?.some(
+ (item) =>
+ item?.audit_status === SqlManageAuditStatusEnum.being_audited
+ )
+ ) {
+ startPollRequest();
+ } else {
+ cancel();
+ finishPollRequest();
+ }
}
}
);
@@ -384,8 +403,13 @@ const SQLEEIndex = () => {
: defaultButton;
};
+ const loading = useMemo(
+ () => (polling ? false : getListLoading),
+ [polling, getListLoading]
+ );
+
return (
-
+
{messageContextHolder}
{
{/* table */}
{
{
let getInstanceAuditPlanSQLMetaSpy: jest.SpyInstance;
@@ -130,4 +132,25 @@ describe('test ScanTypeSqlCollection', () => {
await act(async () => jest.advanceTimersByTime(3000));
expect(baseElement).toMatchSnapshot();
});
+
+ it('should polling request when sql audit status is being_audited', async () => {
+ getInstanceAuditPlanSQLDataSpy.mockImplementation(() => {
+ return createSpySuccessResponse({
+ data: {
+ rows: [
+ {
+ ...mockAuditPlanSQLData?.rows?.[0],
+ audit_results: 'being_audited'
+ }
+ ]
+ }
+ });
+ });
+
+ customRender();
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(getInstanceAuditPlanSQLDataSpy).toHaveBeenCalledTimes(1);
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(getInstanceAuditPlanSQLDataSpy).toHaveBeenCalledTimes(2);
+ });
});
diff --git a/packages/sqle/src/page/SqlManagementConf/Detail/ScanTypeSqlCollection/indx.tsx b/packages/sqle/src/page/SqlManagementConf/Detail/ScanTypeSqlCollection/indx.tsx
index b3e8a18a9..4df87d144 100644
--- a/packages/sqle/src/page/SqlManagementConf/Detail/ScanTypeSqlCollection/indx.tsx
+++ b/packages/sqle/src/page/SqlManagementConf/Detail/ScanTypeSqlCollection/indx.tsx
@@ -43,6 +43,8 @@ import { ResponseCode } from '@actiontech/shared/lib/enum';
import { message } from 'antd';
import { Link } from 'react-router-dom';
+const BEING_AUDITED = 'being_audited';
+
const ScanTypeSqlCollection: React.FC = ({
instanceAuditPlanId,
auditPlanId,
@@ -64,6 +66,9 @@ const ScanTypeSqlCollection: React.FC = ({
useState();
const [messageApi, messageContextHolder] = message.useMessage();
+ const [polling, { setFalse: finishPollRequest, setTrue: startPollRequest }] =
+ useBoolean();
+
const {
tableChange,
pagination,
@@ -164,7 +169,8 @@ const ScanTypeSqlCollection: React.FC = ({
data: tableRows,
loading: getTableRowLoading,
refresh: refreshTableRows,
- error: getTableRowError
+ error: getTableRowError,
+ cancel
} = useRequest(
() => {
const params: IGetInstanceAuditPlanSQLDataV1Params = {
@@ -185,7 +191,17 @@ const ScanTypeSqlCollection: React.FC = ({
},
{
refreshDeps: [pagination, tableFilterInfo, sortInfo],
- ready: activeTabKey === auditPlanId
+ ready: activeTabKey === auditPlanId,
+ pollingInterval: 1000,
+ pollingErrorRetryCount: 3,
+ onSuccess: (res) => {
+ if (res.data?.some((i) => i?.audit_results === BEING_AUDITED)) {
+ startPollRequest();
+ } else {
+ cancel();
+ finishPollRequest();
+ }
+ }
}
);
@@ -266,6 +282,14 @@ const ScanTypeSqlCollection: React.FC = ({
};
}, [username, auditPlanType]);
+ const loading = useMemo(
+ () =>
+ polling && !getFilterMetaListLoading
+ ? false
+ : getFilterMetaListLoading || getTableRowLoading,
+ [polling, getFilterMetaListLoading, getTableRowLoading]
+ );
+
return (
@@ -283,7 +307,7 @@ const ScanTypeSqlCollection: React.FC = ({
rowKey="id"
setting={tableSetting}
errorMessage={getTableRowError && getErrorMessage(getTableRowError)}
- loading={getFilterMetaListLoading || getTableRowLoading}
+ loading={loading}
columns={sortableTableColumnFactory(tableMetas?.head ?? [], {
columnClassName: (type) =>
type === 'sql' ? 'ellipsis-column-large-width' : undefined,
@@ -291,7 +315,7 @@ const ScanTypeSqlCollection: React.FC = ({
if (fieldName === 'audit_results') {
let isAuditing = false;
let results: IAuditResult[] = [];
- if (text === 'being_audited') {
+ if (text === BEING_AUDITED) {
isAuditing = true;
} else {
try {
@@ -329,7 +353,7 @@ const ScanTypeSqlCollection: React.FC = ({
if (type === 'sql') {
let isAuditing = false;
- if (record?.audit_results === 'being_audited') {
+ if (record?.audit_results === BEING_AUDITED) {
isAuditing = true;
}
return (
From 7c18064660a6a850f3fc44f1909129b95365dd13 Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Tue, 10 Sep 2024 18:26:53 +0800
Subject: [PATCH 2/3] [test]: Add test case about stop polling request
---
.../src/page/SqlAudit/List/index.test.tsx | 19 +++++++++++++++++
.../component/SQLEEIndex/index.test.tsx | 14 +++++++++++++
.../__tests__/index.test.tsx | 21 +++++++++++++++++++
3 files changed, 54 insertions(+)
diff --git a/packages/sqle/src/page/SqlAudit/List/index.test.tsx b/packages/sqle/src/page/SqlAudit/List/index.test.tsx
index f9b8fdc50..a622833bb 100644
--- a/packages/sqle/src/page/SqlAudit/List/index.test.tsx
+++ b/packages/sqle/src/page/SqlAudit/List/index.test.tsx
@@ -217,4 +217,23 @@ describe('sqle/SqlAudit/List', () => {
await act(async () => jest.advanceTimersByTime(3000));
expect(sqlAuditRecordsSpy).toHaveBeenCalledTimes(2);
});
+
+ it('render stop polling request when sql audit status is not auditing', async () => {
+ sqlAuditRecordsSpy.mockImplementation(() =>
+ createSpySuccessResponse({
+ data: [
+ {
+ ...sqlAuditRecordMockData[0],
+ sql_audit_status: 'successfully'
+ }
+ ],
+ total_nums: 2
+ })
+ );
+ renderWithReduxAndTheme(customRender());
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(sqlAuditRecordsSpy).toHaveBeenCalledTimes(1);
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(sqlAuditRecordsSpy).not.toHaveBeenCalledTimes(2);
+ });
});
diff --git a/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx b/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx
index 93a50b286..c7b7bd352 100644
--- a/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx
+++ b/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx
@@ -611,4 +611,18 @@ describe('page/SqlManagement/SQLEEIndex', () => {
await act(async () => jest.advanceTimersByTime(3000));
expect(request).toHaveBeenCalledTimes(2);
});
+
+ it('render stop polling request when sql audit status is auditing', async () => {
+ const request = sqlManage.getSqlManageList();
+ request.mockImplementation(() =>
+ createSpySuccessResponse({
+ data: [sqlManageListData.data[0]]
+ })
+ );
+ superRender();
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(request).toHaveBeenCalledTimes(1);
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(request).not.toHaveBeenCalledTimes(2);
+ });
});
diff --git a/packages/sqle/src/page/SqlManagementConf/Detail/ScanTypeSqlCollection/__tests__/index.test.tsx b/packages/sqle/src/page/SqlManagementConf/Detail/ScanTypeSqlCollection/__tests__/index.test.tsx
index f01b2040f..5fd5d88e7 100644
--- a/packages/sqle/src/page/SqlManagementConf/Detail/ScanTypeSqlCollection/__tests__/index.test.tsx
+++ b/packages/sqle/src/page/SqlManagementConf/Detail/ScanTypeSqlCollection/__tests__/index.test.tsx
@@ -153,4 +153,25 @@ describe('test ScanTypeSqlCollection', () => {
await act(async () => jest.advanceTimersByTime(3000));
expect(getInstanceAuditPlanSQLDataSpy).toHaveBeenCalledTimes(2);
});
+
+ it('should stop polling request when sql audit status is not being_audited', async () => {
+ getInstanceAuditPlanSQLDataSpy.mockImplementation(() => {
+ return createSpySuccessResponse({
+ data: {
+ rows: [
+ {
+ ...mockAuditPlanSQLData?.rows?.[0],
+ audit_results: ''
+ }
+ ]
+ }
+ });
+ });
+
+ customRender();
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(getInstanceAuditPlanSQLDataSpy).toHaveBeenCalledTimes(1);
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(getInstanceAuditPlanSQLDataSpy).not.toHaveBeenCalledTimes(2);
+ });
});
From 4430366c055fc347e81538bc0ba666f1a156f3ab Mon Sep 17 00:00:00 2001
From: zzyangh <799463087@qq.com>
Date: Wed, 11 Sep 2024 10:55:20 +0800
Subject: [PATCH 3/3] [test]: Update unit test case
---
.../src/page/SqlAudit/List/index.test.tsx | 36 +++++++++++-------
.../component/SQLEEIndex/index.test.tsx | 26 +++++++------
.../__tests__/index.test.tsx | 37 ++++++++++++-------
3 files changed, 62 insertions(+), 37 deletions(-)
diff --git a/packages/sqle/src/page/SqlAudit/List/index.test.tsx b/packages/sqle/src/page/SqlAudit/List/index.test.tsx
index a622833bb..35e6b3849 100644
--- a/packages/sqle/src/page/SqlAudit/List/index.test.tsx
+++ b/packages/sqle/src/page/SqlAudit/List/index.test.tsx
@@ -200,17 +200,29 @@ describe('sqle/SqlAudit/List', () => {
});
it('render polling request when sql audit status is auditing', async () => {
- sqlAuditRecordsSpy.mockImplementation(() =>
- createSpySuccessResponse({
- data: [
- {
- ...sqlAuditRecordMockData[0],
- sql_audit_status: 'auditing'
- }
- ],
- total_nums: 2
- })
- );
+ sqlAuditRecordsSpy
+ .mockImplementationOnce(() =>
+ createSpySuccessResponse({
+ data: [
+ {
+ ...sqlAuditRecordMockData[0],
+ sql_audit_status: 'auditing'
+ }
+ ],
+ total_nums: 2
+ })
+ )
+ .mockImplementationOnce(() =>
+ createSpySuccessResponse({
+ data: [
+ {
+ ...sqlAuditRecordMockData[0],
+ sql_audit_status: 'successfully'
+ }
+ ],
+ total_nums: 2
+ })
+ );
renderWithReduxAndTheme(customRender());
await act(async () => jest.advanceTimersByTime(3000));
expect(sqlAuditRecordsSpy).toHaveBeenCalledTimes(1);
@@ -233,7 +245,5 @@ describe('sqle/SqlAudit/List', () => {
renderWithReduxAndTheme(customRender());
await act(async () => jest.advanceTimersByTime(3000));
expect(sqlAuditRecordsSpy).toHaveBeenCalledTimes(1);
- await act(async () => jest.advanceTimersByTime(3000));
- expect(sqlAuditRecordsSpy).not.toHaveBeenCalledTimes(2);
});
});
diff --git a/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx b/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx
index c7b7bd352..07a051d96 100644
--- a/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx
+++ b/packages/sqle/src/page/SqlManagement/component/SQLEEIndex/index.test.tsx
@@ -596,15 +596,21 @@ describe('page/SqlManagement/SQLEEIndex', () => {
it('render polling request when sql audit status is auditing', async () => {
const request = sqlManage.getSqlManageList();
- request.mockImplementation(() =>
- createSpySuccessResponse({
- data: [
- {
- ...sqlManageListData.data[sqlManageListData.data.length - 1]
- }
- ]
- })
- );
+ request
+ .mockImplementationOnce(() =>
+ createSpySuccessResponse({
+ data: [
+ {
+ ...sqlManageListData.data[sqlManageListData.data.length - 1]
+ }
+ ]
+ })
+ )
+ .mockImplementationOnce(() =>
+ createSpySuccessResponse({
+ data: [sqlManageListData.data[0]]
+ })
+ );
superRender();
await act(async () => jest.advanceTimersByTime(3000));
expect(request).toHaveBeenCalledTimes(1);
@@ -622,7 +628,5 @@ describe('page/SqlManagement/SQLEEIndex', () => {
superRender();
await act(async () => jest.advanceTimersByTime(3000));
expect(request).toHaveBeenCalledTimes(1);
- await act(async () => jest.advanceTimersByTime(3000));
- expect(request).not.toHaveBeenCalledTimes(2);
});
});
diff --git a/packages/sqle/src/page/SqlManagementConf/Detail/ScanTypeSqlCollection/__tests__/index.test.tsx b/packages/sqle/src/page/SqlManagementConf/Detail/ScanTypeSqlCollection/__tests__/index.test.tsx
index 5fd5d88e7..f5c97a740 100644
--- a/packages/sqle/src/page/SqlManagementConf/Detail/ScanTypeSqlCollection/__tests__/index.test.tsx
+++ b/packages/sqle/src/page/SqlManagementConf/Detail/ScanTypeSqlCollection/__tests__/index.test.tsx
@@ -134,18 +134,31 @@ describe('test ScanTypeSqlCollection', () => {
});
it('should polling request when sql audit status is being_audited', async () => {
- getInstanceAuditPlanSQLDataSpy.mockImplementation(() => {
- return createSpySuccessResponse({
- data: {
- rows: [
- {
- ...mockAuditPlanSQLData?.rows?.[0],
- audit_results: 'being_audited'
- }
- ]
- }
+ getInstanceAuditPlanSQLDataSpy
+ .mockImplementationOnce(() => {
+ return createSpySuccessResponse({
+ data: {
+ rows: [
+ {
+ ...mockAuditPlanSQLData?.rows?.[0],
+ audit_results: 'being_audited'
+ }
+ ]
+ }
+ });
+ })
+ .mockImplementationOnce(() => {
+ return createSpySuccessResponse({
+ data: {
+ rows: [
+ {
+ ...mockAuditPlanSQLData?.rows?.[0],
+ audit_results: ''
+ }
+ ]
+ }
+ });
});
- });
customRender();
await act(async () => jest.advanceTimersByTime(3000));
@@ -171,7 +184,5 @@ describe('test ScanTypeSqlCollection', () => {
customRender();
await act(async () => jest.advanceTimersByTime(3000));
expect(getInstanceAuditPlanSQLDataSpy).toHaveBeenCalledTimes(1);
- await act(async () => jest.advanceTimersByTime(3000));
- expect(getInstanceAuditPlanSQLDataSpy).not.toHaveBeenCalledTimes(2);
});
});