diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/WaterfallList.test.tsx b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/WaterfallList.test.tsx
new file mode 100644
index 000000000..6715bc078
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/WaterfallList.test.tsx
@@ -0,0 +1,80 @@
+import { renderWithTheme } from '../../../../testUtils/customRender';
+import { cleanup } from '@testing-library/react';
+
+import { DataSourceResultWaterfallListProps } from '../index.type';
+import DataSourceWaterfallList from './WaterfallList';
+
+import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser';
+import { IAuditTaskSQLResV2 } from '@actiontech/shared/lib/api/sqle/service/common';
+
+const mockListData: IAuditTaskSQLResV2[] = [];
+for (let i = 0; i < 50; i++) {
+ mockListData.push({
+ number: i + 1,
+ audit_level: '',
+ audit_result: [
+ {
+ level: 'level'
+ }
+ ],
+ audit_status: 'audit_status' + i,
+ description: 'description' + i,
+ exec_result: 'exec_result' + i,
+ exec_sql: 'exec_sql' + i,
+ exec_status: 'exec_status' + i,
+ rollback_sql: 'rollback_sql' + i
+ });
+}
+
+describe('sqle/Order/AuditDetail/DataSourceWaterfallList', () => {
+ const customRender = (params: DataSourceResultWaterfallListProps) => {
+ return renderWithTheme();
+ };
+
+ beforeEach(() => {
+ jest.useFakeTimers();
+ mockUseCurrentUser();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ cleanup();
+ });
+
+ it('render snap when loading', () => {
+ const { baseElement } = customRender({
+ hasMore: false,
+ loading: true,
+ taskId: 'task id',
+ scrollPage: 1,
+ refreshScrollList: jest.fn(),
+ list: undefined
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render all data', async () => {
+ const { baseElement } = customRender({
+ hasMore: false,
+ loading: false,
+ taskId: 'task id',
+ scrollPage: 1,
+ refreshScrollList: jest.fn(),
+ list: mockListData
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render has more data', async () => {
+ const { baseElement } = customRender({
+ hasMore: true,
+ loading: false,
+ taskId: 'task id',
+ scrollPage: 5,
+ refreshScrollList: jest.fn(),
+ list: mockListData
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/__snapshots__/WaterfallList.test.tsx.snap b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/__snapshots__/WaterfallList.test.tsx.snap
new file mode 100644
index 000000000..db56215f7
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/__snapshots__/WaterfallList.test.tsx.snap
@@ -0,0 +1,32032 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/AuditDetail/DataSourceWaterfallList render all data 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/DataSourceWaterfallList render has more data 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/DataSourceWaterfallList render snap when loading 1`] = `
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/__snapshots__/index.test.tsx.snap
new file mode 100644
index 000000000..e256126a2
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,3620 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/AuditDetail/DataSourceResultList render snap when load is false 1`] = `
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql5
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql7
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/DataSourceResultList render snap when loading 1`] = `
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/AuditResultTag.tsx b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/AuditResultTag.tsx
index 461d971b3..4a7009e70 100644
--- a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/AuditResultTag.tsx
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/AuditResultTag.tsx
@@ -11,9 +11,11 @@ import { RuleResV1LevelEnum } from '@actiontech/shared/lib/api/sqle/service/comm
import { useMemo } from 'react';
import { Space } from 'antd';
-const AuditResultTag: React.FC<{ auditResult?: IAuditResult[] }> = ({
- auditResult
-}) => {
+export interface AuditResultTagProps {
+ auditResult?: IAuditResult[];
+}
+
+const AuditResultTag: React.FC = ({ auditResult }) => {
const { t } = useTranslation();
const noticeResult = useMemo(() => {
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/AuditResultTree.tsx b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/AuditResultTree.tsx
index e168bd110..6213efce6 100644
--- a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/AuditResultTree.tsx
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/AuditResultTree.tsx
@@ -8,9 +8,11 @@ import rule_template from '@actiontech/shared/lib/api/sqle/service/rule_template
import { ResponseCode } from '@actiontech/shared/lib/enum';
import AuditResultMessage from '../../../../../components/AuditResultMessage';
-const AuditResultTree: React.FC<{ auditResult?: IAuditResult[] }> = ({
- auditResult
-}) => {
+export interface AuditResultTreeProps {
+ auditResult?: IAuditResult[];
+}
+
+const AuditResultTree: React.FC = ({ auditResult }) => {
const { t } = useTranslation();
const [treeData, setTreeData] = useState([
@@ -99,7 +101,7 @@ const AuditResultTree: React.FC<{ auditResult?: IAuditResult[] }> = ({
treeData={treeData}
selectable={false}
loadData={onLoadData}
- >
+ />
);
};
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/ExecStatusTag.tsx b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/ExecStatusTag.tsx
index d320b6ef3..5ba5b24bb 100644
--- a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/ExecStatusTag.tsx
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/ExecStatusTag.tsx
@@ -17,9 +17,11 @@ const execStatusMap: {
[getAuditTaskSQLsV2FilterExecStatusEnum.terminating]: 'geekblue'
};
-const ExecStatusTag: React.FC<{
+export interface ExecStatusTagProps {
status: getAuditTaskSQLsV2FilterExecStatusEnum;
-}> = ({ status }) => {
+}
+
+const ExecStatusTag: React.FC = ({ status }) => {
const { t } = useTranslation();
return (
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/ResultCard.tsx b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/ResultCard.tsx
index 0b2819165..5ad6724a0 100644
--- a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/ResultCard.tsx
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/ResultCard.tsx
@@ -18,13 +18,18 @@ import ResultDescribe from './ResultDescribe';
import task from '@actiontech/shared/lib/api/sqle/service/task';
import { ResponseCode } from '@actiontech/shared/lib/enum';
-const ResultCard: React.FC<
- IAuditTaskSQLResV2 & {
- projectName: string;
- taskId: string;
- onUpdateDescription?: () => void;
- }
-> = ({ projectName, taskId, onUpdateDescription, ...props }) => {
+export type ResultCardProps = IAuditTaskSQLResV2 & {
+ projectName: string;
+ taskId: string;
+ onUpdateDescription?: () => void;
+};
+
+const ResultCard: React.FC = ({
+ projectName,
+ taskId,
+ onUpdateDescription,
+ ...props
+}) => {
const { t } = useTranslation();
const [messageApi, contextHolder] = message.useMessage();
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/AuditResultTag.test.tsx b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/AuditResultTag.test.tsx
new file mode 100644
index 000000000..0e8c056e2
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/AuditResultTag.test.tsx
@@ -0,0 +1,65 @@
+import { renderWithTheme } from '../../../../../../testUtils/customRender';
+
+import AuditResultTag, { AuditResultTagProps } from '../AuditResultTag';
+import { RuleResV1LevelEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+
+describe('sqle/Order/AuditDetail/AuditResultTag', () => {
+ const customRender = (params: AuditResultTagProps = {}) => {
+ return renderWithTheme();
+ };
+
+ it('render tag is audit success', () => {
+ const { baseElement } = customRender();
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render tag is notice & warn & error', () => {
+ const { baseElement } = customRender({
+ auditResult: [
+ {
+ level: RuleResV1LevelEnum.notice
+ },
+ {
+ level: RuleResV1LevelEnum.error
+ },
+ {
+ level: RuleResV1LevelEnum.warn
+ }
+ ]
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render tag is error', () => {
+ const { baseElement } = customRender({
+ auditResult: [
+ {
+ level: RuleResV1LevelEnum.error
+ }
+ ]
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render tag is notice', () => {
+ const { baseElement } = customRender({
+ auditResult: [
+ {
+ level: RuleResV1LevelEnum.notice
+ }
+ ]
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render tag is warn', () => {
+ const { baseElement } = customRender({
+ auditResult: [
+ {
+ level: RuleResV1LevelEnum.warn
+ }
+ ]
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/AuditResultTree.test.tsx b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/AuditResultTree.test.tsx
new file mode 100644
index 000000000..65e110cb9
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/AuditResultTree.test.tsx
@@ -0,0 +1,58 @@
+import { renderWithTheme } from '../../../../../../testUtils/customRender';
+import { act, cleanup, fireEvent } from '@testing-library/react';
+
+import AuditResultTree, { AuditResultTreeProps } from '../AuditResultTree';
+
+import rule_template from '../../../../../../testUtils/mockApi/rule_template';
+import { getBySelector } from '@actiontech/shared/lib/testUtil/customQuery';
+
+describe('sqle/Order/AuditDetail/AuditResultTree', () => {
+ let requestRuleList: jest.SpyInstance;
+
+ const customRender = (params: AuditResultTreeProps = {}) => {
+ return renderWithTheme();
+ };
+
+ beforeEach(() => {
+ jest.useFakeTimers();
+ requestRuleList = rule_template.getRuleList();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ cleanup();
+ });
+
+ it('render tree when auditResult is null', () => {
+ const { baseElement } = customRender({
+ auditResult: []
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render tree snap', async () => {
+ const { baseElement } = customRender({
+ auditResult: [
+ {
+ rule_name: 'rule name a'
+ },
+ {
+ rule_name: 'rule name b'
+ }
+ ]
+ });
+ expect(baseElement).toMatchSnapshot();
+
+ const iconArrow = getBySelector('.custom-icon-arrow-down', baseElement);
+ fireEvent.click(iconArrow);
+ await act(async () => jest.advanceTimersByTime(1000));
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(2300));
+ expect(requestRuleList).toBeCalled();
+ expect(requestRuleList).toBeCalledWith({
+ filter_rule_names: 'rule name a,rule name b'
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/ExecStatusTag.test.tsx b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/ExecStatusTag.test.tsx
new file mode 100644
index 000000000..39bff1dc9
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/ExecStatusTag.test.tsx
@@ -0,0 +1,68 @@
+import { renderWithTheme } from '../../../../../../testUtils/customRender';
+
+import ExecStatusTag, { ExecStatusTagProps } from '../ExecStatusTag';
+import { getAuditTaskSQLsV2FilterExecStatusEnum } from '@actiontech/shared/lib/api/sqle/service/task/index.enum';
+
+describe('sqle/Order/AuditDetail/execStatusMap', () => {
+ const customRender = (
+ params: ExecStatusTagProps = {
+ status: getAuditTaskSQLsV2FilterExecStatusEnum.initialized
+ }
+ ) => {
+ return renderWithTheme();
+ };
+
+ it('render initialized tag', () => {
+ const { baseElement } = customRender();
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render failed tag', () => {
+ const { baseElement } = customRender({
+ status: getAuditTaskSQLsV2FilterExecStatusEnum.failed
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render succeeded tag', () => {
+ const { baseElement } = customRender({
+ status: getAuditTaskSQLsV2FilterExecStatusEnum.succeeded
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render doing tag', () => {
+ const { baseElement } = customRender({
+ status: getAuditTaskSQLsV2FilterExecStatusEnum.doing
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render manually_executed tag', () => {
+ const { baseElement } = customRender({
+ status: getAuditTaskSQLsV2FilterExecStatusEnum.manually_executed
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render terminate_failed tag', () => {
+ const { baseElement } = customRender({
+ status: getAuditTaskSQLsV2FilterExecStatusEnum.terminate_failed
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render terminate_succeeded tag', () => {
+ const { baseElement } = customRender({
+ status: getAuditTaskSQLsV2FilterExecStatusEnum.terminate_succeeded
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render terminating tag', () => {
+ const { baseElement } = customRender({
+ status: getAuditTaskSQLsV2FilterExecStatusEnum.terminating
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/ResultCard.ce.test.tsx b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/ResultCard.ce.test.tsx
new file mode 100644
index 000000000..854f65caf
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/ResultCard.ce.test.tsx
@@ -0,0 +1,163 @@
+/**
+ * @test_version ce
+ */
+
+import { renderWithTheme } from '../../../../../../testUtils/customRender';
+import {
+ getAllBySelector,
+ getBySelector
+} from '@actiontech/shared/lib/testUtil/customQuery';
+import { act, cleanup, fireEvent, screen } from '@testing-library/react';
+
+import task from '../../../../../../testUtils/mockApi/task';
+import rule_template from '../../../../../../testUtils/mockApi/rule_template';
+import { getAuditTaskSQLsV2FilterExecStatusEnum } from '@actiontech/shared/lib/api/sqle/service/task/index.enum';
+import { Copy } from '@actiontech/shared';
+
+import ResultCard, { ResultCardProps } from '../ResultCard';
+
+const projectName = 'default';
+const taskId = 'task_id_1234';
+
+describe('sqle/Order/AuditDetail/ResultCard', () => {
+ let requestUpdateSqlDesc: jest.SpyInstance;
+ const onUpdateDescriptionFn = jest.fn();
+
+ const customRender = (
+ params: Omit<
+ ResultCardProps,
+ 'projectName' | 'taskId' | 'onUpdateDescription'
+ >
+ ) => {
+ const someParams: Pick<
+ ResultCardProps,
+ 'projectName' | 'taskId' | 'onUpdateDescription'
+ > = {
+ projectName,
+ taskId,
+ onUpdateDescription: onUpdateDescriptionFn
+ };
+ return renderWithTheme();
+ };
+
+ beforeEach(() => {
+ jest.useFakeTimers();
+ requestUpdateSqlDesc = task.updateAuditTaskSQLs();
+ rule_template.getRuleList();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ cleanup();
+ });
+
+ it('render snap when data is empty', () => {
+ const { baseElement } = customRender({
+ number: 1,
+ exec_status: '',
+ audit_result: []
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render click add desc', async () => {
+ const { baseElement } = customRender({
+ number: 1,
+ description: 'into desc params'
+ });
+ expect(baseElement).toMatchSnapshot();
+ const descInput = getBySelector('input[placeholder="添加说明"]');
+ fireEvent.change(descInput, {
+ target: {
+ value: 'desc text'
+ }
+ });
+ await act(async () => jest.advanceTimersByTime(300));
+ fireEvent.blur(descInput);
+ await act(async () => jest.advanceTimersByTime(300));
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(2800));
+ expect(requestUpdateSqlDesc).toBeCalled();
+ expect(requestUpdateSqlDesc).toBeCalledWith({
+ number: '1',
+ description: 'desc text',
+ task_id: taskId
+ });
+ expect(onUpdateDescriptionFn).toBeCalled();
+ });
+
+ it('render click icon arrow when has result cont', async () => {
+ const { baseElement } = customRender({
+ number: 1,
+ exec_result: 'exec_result cont',
+ audit_result: [
+ {
+ rule_name: 'rule_name a'
+ }
+ ]
+ });
+
+ const iconArrows = getAllBySelector('.custom-icon-arrow-down', baseElement);
+ expect(iconArrows.length).toBe(2);
+
+ fireEvent.click(iconArrows[0]);
+ await act(async () => jest.advanceTimersByTime(500));
+
+ fireEvent.click(iconArrows[1]);
+ await act(async () => jest.advanceTimersByTime(500));
+
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render click icon arrow when no cont', async () => {
+ const { baseElement } = customRender({
+ number: 1
+ });
+
+ const iconArrows = getAllBySelector('.custom-icon-arrow-down', baseElement);
+ expect(iconArrows.length).toBe(2);
+
+ fireEvent.click(iconArrows[0]);
+ await act(async () => jest.advanceTimersByTime(500));
+
+ fireEvent.click(iconArrows[1]);
+ await act(async () => jest.advanceTimersByTime(500));
+
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render change exec_sql & rollback_sql', async () => {
+ const { baseElement } = customRender({
+ number: 1,
+ exec_sql: 'exec_sql cont',
+ rollback_sql: 'rollback_sql cont'
+ });
+
+ expect(screen.getByText('执行语句')).toBeInTheDocument();
+ expect(screen.getByText('回滚语句')).toBeInTheDocument();
+ expect(baseElement).toMatchSnapshot();
+ fireEvent.click(screen.getByText('回滚语句'));
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(baseElement).toMatchSnapshot();
+ fireEvent.click(screen.getByText('执行语句'));
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render copy exec_sql', async () => {
+ const mockCopyTextByTextarea = jest.fn();
+ jest
+ .spyOn(Copy, 'copyTextByTextarea')
+ .mockImplementation(mockCopyTextByTextarea);
+ customRender({
+ number: 1,
+ exec_status: getAuditTaskSQLsV2FilterExecStatusEnum.succeeded,
+ exec_sql: 'exec_sql cont'
+ });
+ expect(screen.getByText('复制执行语句')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('复制执行语句'));
+ expect(mockCopyTextByTextarea).toBeCalled();
+ expect(screen.getByText('复制成功')).toBeInTheDocument();
+ });
+});
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/ResultCard.test.tsx b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/ResultCard.test.tsx
new file mode 100644
index 000000000..cb038c552
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/ResultCard.test.tsx
@@ -0,0 +1,174 @@
+import { renderWithTheme } from '../../../../../../testUtils/customRender';
+import {
+ getAllBySelector,
+ getBySelector
+} from '@actiontech/shared/lib/testUtil/customQuery';
+import { act, cleanup, fireEvent, screen } from '@testing-library/react';
+
+import task from '../../../../../../testUtils/mockApi/task';
+import rule_template from '../../../../../../testUtils/mockApi/rule_template';
+import { getAuditTaskSQLsV2FilterExecStatusEnum } from '@actiontech/shared/lib/api/sqle/service/task/index.enum';
+import { Copy } from '@actiontech/shared';
+
+import ResultCard, { ResultCardProps } from '../ResultCard';
+
+const projectName = 'default';
+const taskId = 'task_id_1234';
+
+describe('sqle/Order/AuditDetail/ResultCard', () => {
+ let requestUpdateSqlDesc: jest.SpyInstance;
+ const onUpdateDescriptionFn = jest.fn();
+
+ const customRender = (
+ params: Omit<
+ ResultCardProps,
+ 'projectName' | 'taskId' | 'onUpdateDescription'
+ >
+ ) => {
+ const someParams: Pick<
+ ResultCardProps,
+ 'projectName' | 'taskId' | 'onUpdateDescription'
+ > = {
+ projectName,
+ taskId,
+ onUpdateDescription: onUpdateDescriptionFn
+ };
+ return renderWithTheme();
+ };
+
+ beforeEach(() => {
+ jest.useFakeTimers();
+ requestUpdateSqlDesc = task.updateAuditTaskSQLs();
+ rule_template.getRuleList();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ cleanup();
+ });
+
+ it('render snap when data is empty', () => {
+ const { baseElement } = customRender({
+ number: 1,
+ exec_status: '',
+ audit_result: []
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render click add desc', async () => {
+ const { baseElement } = customRender({
+ number: 1,
+ description: 'into desc params'
+ });
+ expect(baseElement).toMatchSnapshot();
+ const descInput = getBySelector('input[placeholder="添加说明"]');
+ fireEvent.change(descInput, {
+ target: {
+ value: 'desc text'
+ }
+ });
+ await act(async () => jest.advanceTimersByTime(300));
+ fireEvent.blur(descInput);
+ await act(async () => jest.advanceTimersByTime(300));
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(2800));
+ expect(requestUpdateSqlDesc).toBeCalled();
+ expect(requestUpdateSqlDesc).toBeCalledWith({
+ number: '1',
+ description: 'desc text',
+ task_id: taskId
+ });
+ expect(onUpdateDescriptionFn).toBeCalled();
+ });
+
+ it('render click icon arrow when has result cont', async () => {
+ const { baseElement } = customRender({
+ number: 1,
+ exec_result: 'exec_result cont',
+ audit_result: [
+ {
+ rule_name: 'rule_name a'
+ }
+ ]
+ });
+
+ const iconArrows = getAllBySelector('.custom-icon-arrow-down', baseElement);
+ expect(iconArrows.length).toBe(2);
+
+ fireEvent.click(iconArrows[0]);
+ await act(async () => jest.advanceTimersByTime(500));
+
+ fireEvent.click(iconArrows[1]);
+ await act(async () => jest.advanceTimersByTime(500));
+
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render click icon arrow when no cont', async () => {
+ const { baseElement } = customRender({
+ number: 1
+ });
+
+ const iconArrows = getAllBySelector('.custom-icon-arrow-down', baseElement);
+ expect(iconArrows.length).toBe(2);
+
+ fireEvent.click(iconArrows[0]);
+ await act(async () => jest.advanceTimersByTime(500));
+
+ fireEvent.click(iconArrows[1]);
+ await act(async () => jest.advanceTimersByTime(500));
+
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render change exec_sql & rollback_sql', async () => {
+ const { baseElement } = customRender({
+ number: 1,
+ exec_sql: 'exec_sql cont',
+ rollback_sql: 'rollback_sql cont'
+ });
+
+ expect(screen.getByText('执行语句')).toBeInTheDocument();
+ expect(screen.getByText('回滚语句')).toBeInTheDocument();
+ expect(baseElement).toMatchSnapshot();
+ fireEvent.click(screen.getByText('回滚语句'));
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(baseElement).toMatchSnapshot();
+ fireEvent.click(screen.getByText('执行语句'));
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render skip analyze page', async () => {
+ const openSpy = jest.spyOn(window, 'open').mockImplementation(() => null);
+ customRender({
+ number: 2
+ });
+ expect(screen.getByText('分 析')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('分 析'));
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(openSpy).toBeCalled();
+ expect(openSpy).toBeCalledWith(
+ `/sqle/project/${projectName}/order/${taskId}/2/analyze`
+ );
+ openSpy.mockRestore();
+ });
+
+ it('render copy exec_sql', async () => {
+ const mockCopyTextByTextarea = jest.fn();
+ jest
+ .spyOn(Copy, 'copyTextByTextarea')
+ .mockImplementation(mockCopyTextByTextarea);
+ customRender({
+ number: 1,
+ exec_status: getAuditTaskSQLsV2FilterExecStatusEnum.succeeded,
+ exec_sql: 'exec_sql cont'
+ });
+ expect(screen.getByText('复制执行语句')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('复制执行语句'));
+ expect(mockCopyTextByTextarea).toBeCalled();
+ expect(screen.getByText('复制成功')).toBeInTheDocument();
+ });
+});
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/ResultDescribe.test.tsx b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/ResultDescribe.test.tsx
new file mode 100644
index 000000000..6bc784bdf
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/ResultDescribe.test.tsx
@@ -0,0 +1,45 @@
+import { renderWithTheme } from '../../../../../../testUtils/customRender';
+import { act, cleanup, fireEvent } from '@testing-library/react';
+
+import ResultDescribe from '../ResultDescribe';
+import { getBySelector } from '@actiontech/shared/lib/testUtil/customQuery';
+
+describe('sqle/Order/AuditDetail/ResultDescribe', () => {
+ const onSubmitFn = jest.fn();
+ const customRender = (value: string = '') => {
+ return renderWithTheme(
+
+ );
+ };
+
+ beforeEach(() => {
+ jest.useFakeTimers();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ cleanup();
+ });
+
+ it('render snap when value is empty', () => {
+ const { baseElement } = customRender();
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when has value', async () => {
+ const { baseElement } = customRender('this is a desc');
+ expect(baseElement).toMatchSnapshot();
+ const descInput = getBySelector('input[placeholder="添加说明"]');
+ fireEvent.change(descInput, {
+ target: {
+ value: 'desc text'
+ }
+ });
+ await act(async () => jest.advanceTimersByTime(300));
+ fireEvent.blur(descInput);
+ await act(async () => jest.advanceTimersByTime(300));
+ expect(onSubmitFn).toBeCalled();
+ expect(onSubmitFn).toBeCalledWith('desc text');
+ });
+});
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/AuditResultTag.test.tsx.snap b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/AuditResultTag.test.tsx.snap
new file mode 100644
index 000000000..635e9aeb6
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/AuditResultTag.test.tsx.snap
@@ -0,0 +1,274 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/AuditDetail/AuditResultTag render tag is audit success 1`] = `
+
+
+
+
+
+
+
+ 审核通过
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/AuditResultTag render tag is error 1`] = `
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/AuditResultTag render tag is notice & warn & error 1`] = `
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/AuditResultTag render tag is notice 1`] = `
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/AuditResultTag render tag is warn 1`] = `
+
+
+
+
+
+
+
+
+
+ 1
+
+
+
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/AuditResultTree.test.tsx.snap b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/AuditResultTree.test.tsx.snap
new file mode 100644
index 000000000..030422a34
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/AuditResultTree.test.tsx.snap
@@ -0,0 +1,551 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/AuditDetail/AuditResultTree render tree snap 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/AuditResultTree render tree snap 2`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/AuditResultTree render tree snap 3`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/AuditResultTree render tree when auditResult is null 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/ExecStatusTag.test.tsx.snap b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/ExecStatusTag.test.tsx.snap
new file mode 100644
index 000000000..c7bec7ead
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/ExecStatusTag.test.tsx.snap
@@ -0,0 +1,97 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/AuditDetail/execStatusMap render doing tag 1`] = `
+
+
+
+ 正在执行
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/execStatusMap render failed tag 1`] = `
+
+
+
+ 执行失败
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/execStatusMap render initialized tag 1`] = `
+
+
+
+ 准备执行
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/execStatusMap render manually_executed tag 1`] = `
+
+
+
+ 人工执行
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/execStatusMap render succeeded tag 1`] = `
+
+
+
+ 执行成功
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/execStatusMap render terminate_failed tag 1`] = `
+
+
+
+ 中止失败
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/execStatusMap render terminate_succeeded tag 1`] = `
+
+
+
+ 中止成功
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/execStatusMap render terminating tag 1`] = `
+
+
+
+ 正在中止
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/ResultCard.ce.test.tsx.snap b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/ResultCard.ce.test.tsx.snap
new file mode 100644
index 000000000..0e2e3ddcf
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/ResultCard.ce.test.tsx.snap
@@ -0,0 +1,2788 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/AuditDetail/ResultCard render change exec_sql & rollback_sql 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql cont
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultCard render change exec_sql & rollback_sql 2`] = `
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+ rollback_sql cont
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultCard render change exec_sql & rollback_sql 3`] = `
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql cont
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultCard render click add desc 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultCard render click add desc 2`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultCard render click icon arrow when has result cont 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+ exec_result cont
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultCard render click icon arrow when no cont 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultCard render snap when data is empty 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/ResultCard.test.tsx.snap b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/ResultCard.test.tsx.snap
new file mode 100644
index 000000000..230188a6e
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/ResultCard.test.tsx.snap
@@ -0,0 +1,2892 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/AuditDetail/ResultCard render change exec_sql & rollback_sql 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql cont
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultCard render change exec_sql & rollback_sql 2`] = `
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+ rollback_sql cont
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultCard render change exec_sql & rollback_sql 3`] = `
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+ exec_sql cont
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultCard render click add desc 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultCard render click add desc 2`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultCard render click icon arrow when has result cont 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+ exec_result cont
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultCard render click icon arrow when no cont 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultCard render snap when data is empty 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 执行结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/ResultDescribe.test.tsx.snap b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/ResultDescribe.test.tsx.snap
new file mode 100644
index 000000000..9255108a4
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/components/test/__snapshots__/ResultDescribe.test.tsx.snap
@@ -0,0 +1,69 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/AuditDetail/ResultDescribe render snap when has value 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ResultDescribe render snap when value is empty 1`] = `
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/index.test.tsx b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/index.test.tsx
new file mode 100644
index 000000000..e77878384
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/DataSourceResultList/index.test.tsx
@@ -0,0 +1,76 @@
+import { renderWithTheme } from '../../../../testUtils/customRender';
+import { cleanup } from '@testing-library/react';
+
+import { DataSourceResultListProps } from '../index.type';
+import DataSourceResultList from '.';
+
+import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser';
+import { IAuditTaskSQLResV2 } from '@actiontech/shared/lib/api/sqle/service/common';
+
+const mockListData: IAuditTaskSQLResV2[] = [];
+for (let i = 0; i < 50; i++) {
+ mockListData.push({
+ number: i + 1,
+ audit_level: '',
+ audit_result: [
+ {
+ level: 'level'
+ }
+ ],
+ audit_status: 'audit_status' + i,
+ description: 'description' + i,
+ exec_result: 'exec_result' + i,
+ exec_sql: 'exec_sql' + i,
+ exec_status: 'exec_status' + i,
+ rollback_sql: 'rollback_sql' + i
+ });
+}
+
+describe('sqle/Order/AuditDetail/DataSourceResultList', () => {
+ const customRender = (params: DataSourceResultListProps) => {
+ return renderWithTheme();
+ };
+
+ beforeEach(() => {
+ jest.useFakeTimers();
+ mockUseCurrentUser();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ cleanup();
+ });
+
+ it('render snap when loading', () => {
+ const { baseElement } = customRender({
+ list: undefined,
+ total: undefined,
+ pagination: {
+ page_index: 1,
+ page_size: 10
+ },
+ onChange: jest.fn(),
+ loading: true,
+ taskId: 'task id',
+ refresh: jest.fn()
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when load is false', () => {
+ const { baseElement } = customRender({
+ list: mockListData,
+ total: mockListData.length,
+ pagination: {
+ page_index: 1,
+ page_size: 10
+ },
+ onChange: jest.fn(),
+ loading: false,
+ taskId: 'task id',
+ refresh: jest.fn()
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/Order/AuditDetail/InstanceTasksStatus/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/Order/AuditDetail/InstanceTasksStatus/__snapshots__/index.test.tsx.snap
new file mode 100644
index 000000000..48611e6da
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/InstanceTasksStatus/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,383 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/AuditDetail/InstanceTasksStatus render snap when status is exec_failed 1`] = `
+
+
+
+
+
+
+
+ 上线失败
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/InstanceTasksStatus render snap when status is exec_scheduled 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/InstanceTasksStatus render snap when status is exec_succeeded 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/InstanceTasksStatus render snap when status is executing 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/InstanceTasksStatus render snap when status is manually_executed 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/InstanceTasksStatus render snap when status is terminate_failed 1`] = `
+
+
+
+
+
+
+
+ 中止失败
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/InstanceTasksStatus render snap when status is terminate_succeeded 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/InstanceTasksStatus render snap when status is terminating 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/InstanceTasksStatus render snap when status is undefined 1`] = `
+
+
+
+ -
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/InstanceTasksStatus render snap when status is wait_for_audit 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/InstanceTasksStatus render snap when status is wait_for_execution 1`] = `
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/AuditDetail/InstanceTasksStatus/index.test.tsx b/packages/sqle/src/page/Order/AuditDetail/InstanceTasksStatus/index.test.tsx
new file mode 100644
index 000000000..34ea70606
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/InstanceTasksStatus/index.test.tsx
@@ -0,0 +1,86 @@
+import InstanceTasksStatus from '.';
+
+import { renderWithTheme } from '../../../../testUtils/customRender';
+
+import { GetWorkflowTasksItemV2StatusEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+
+describe('sqle/Order/AuditDetail/InstanceTasksStatus', () => {
+ const customRender = (status?: GetWorkflowTasksItemV2StatusEnum) => {
+ return renderWithTheme();
+ };
+
+ it('render snap when status is undefined', () => {
+ const { baseElement } = customRender();
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when status is wait_for_audit', () => {
+ const { baseElement } = customRender(
+ GetWorkflowTasksItemV2StatusEnum.wait_for_audit
+ );
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when status is wait_for_execution', () => {
+ const { baseElement } = customRender(
+ GetWorkflowTasksItemV2StatusEnum.wait_for_execution
+ );
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when status is exec_scheduled', () => {
+ const { baseElement } = customRender(
+ GetWorkflowTasksItemV2StatusEnum.exec_scheduled
+ );
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when status is exec_succeeded', () => {
+ const { baseElement } = customRender(
+ GetWorkflowTasksItemV2StatusEnum.exec_succeeded
+ );
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when status is executing', () => {
+ const { baseElement } = customRender(
+ GetWorkflowTasksItemV2StatusEnum.executing
+ );
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when status is exec_failed', () => {
+ const { baseElement } = customRender(
+ GetWorkflowTasksItemV2StatusEnum.exec_failed
+ );
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when status is manually_executed', () => {
+ const { baseElement } = customRender(
+ GetWorkflowTasksItemV2StatusEnum.manually_executed
+ );
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when status is terminate_failed', () => {
+ const { baseElement } = customRender(
+ GetWorkflowTasksItemV2StatusEnum.terminate_failed
+ );
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when status is terminate_succeeded', () => {
+ const { baseElement } = customRender(
+ GetWorkflowTasksItemV2StatusEnum.terminate_succeeded
+ );
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when status is terminating', () => {
+ const { baseElement } = customRender(
+ GetWorkflowTasksItemV2StatusEnum.terminating
+ );
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/Order/AuditDetail/List/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/Order/AuditDetail/List/__snapshots__/index.test.tsx.snap
new file mode 100644
index 000000000..6a7b385fc
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/List/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,609 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/AuditDetail/OrderDetailAuditResultList render snap list when isArchive is false 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/OrderDetailAuditResultList render snap list when isArchive is true 1`] = `
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/AuditDetail/List/index.test.tsx b/packages/sqle/src/page/Order/AuditDetail/List/index.test.tsx
new file mode 100644
index 000000000..59f244ece
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/List/index.test.tsx
@@ -0,0 +1,80 @@
+import OrderDetailAuditResultList from '.';
+import { OrderDetailAuditResultListProps } from './index.type';
+
+import { renderWithThemeAndRedux } from '../../../../testUtils/customRender';
+import { cleanup, act } from '@testing-library/react';
+import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser';
+import order from '../../../../testUtils/mockApi/order';
+import { WorkflowRecordResV2StatusEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+
+const workflowID = 'workflow ID';
+const projectName = 'project Name default';
+
+describe('sqle/Order/AuditDetail/OrderDetailAuditResultList', () => {
+ const getOverviewListSuccessFn = jest.fn();
+ const setAuditResultActiveKeyFn = jest.fn();
+ const refreshOrderFn = jest.fn();
+
+ let requestGetSummaryOfInstanceTasks: jest.SpyInstance;
+
+ const customRender = (
+ params: {
+ orderStatus?: WorkflowRecordResV2StatusEnum;
+ isArchive: boolean;
+ refreshOverviewFlag: boolean;
+ } = {
+ isArchive: false,
+ refreshOverviewFlag: false
+ }
+ ) => {
+ const defaultParams: OrderDetailAuditResultListProps = {
+ workflowID,
+ projectName,
+ getOverviewListSuccessHandle: getOverviewListSuccessFn,
+ setAuditResultActiveKey: setAuditResultActiveKeyFn,
+ refreshOrder: refreshOrderFn,
+ ...params
+ };
+ return renderWithThemeAndRedux(
+
+ );
+ };
+
+ beforeEach(() => {
+ jest.useFakeTimers();
+ mockUseCurrentUser();
+ order.mockAllApi();
+ requestGetSummaryOfInstanceTasks = order.getSummaryOfInstanceTasks();
+ // MUI: the styled(component)(...args) API requires all its args to be defined.
+ jest.spyOn(console, 'error').mockImplementation(() => {});
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ (console.error as jest.Mock).mockRestore();
+ cleanup();
+ });
+
+ it('render snap list when isArchive is false', async () => {
+ const { baseElement } = customRender();
+ await act(async () => jest.advanceTimersByTime(1000));
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(2000));
+ expect(requestGetSummaryOfInstanceTasks).toBeCalled();
+ expect(requestGetSummaryOfInstanceTasks).toBeCalledWith({
+ workflow_id: workflowID,
+ project_name: projectName
+ });
+ });
+
+ it('render snap list when isArchive is true', async () => {
+ const { baseElement } = customRender({
+ isArchive: true,
+ refreshOverviewFlag: true
+ });
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(requestGetSummaryOfInstanceTasks).toBeCalled();
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/Order/AuditDetail/List/useOverviewActions.test.tsx b/packages/sqle/src/page/Order/AuditDetail/List/useOverviewActions.test.tsx
new file mode 100644
index 000000000..e5223f387
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/List/useOverviewActions.test.tsx
@@ -0,0 +1,140 @@
+import useOverviewActions from './useOverviewActions';
+
+import { renderWithTheme } from '../../../../testUtils/customRender';
+import {
+ cleanup,
+ renderHook,
+ act,
+ screen,
+ fireEvent
+} from '@testing-library/react';
+import order from '../../../../testUtils/mockApi/order';
+import { GetWorkflowTasksItemV2StatusEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+
+const projectName = 'default';
+const workflowID = 'workflow ID';
+const recordData = {
+ instance_name: 'instance_name',
+ status: GetWorkflowTasksItemV2StatusEnum.exec_failed,
+ task_id: 1,
+ task_score: 10
+};
+
+const MockComponent = () => {
+ const { contextHolder, ...otherParams } = useOverviewActions({
+ projectName,
+ workflowID,
+ refreshOverview: () => {},
+ refreshOrder: () => {}
+ });
+
+ const clickFn = (
+ name: 'sqlExecuteHandle' | 'sqlTerminateHandle' | 'scheduleTimeHandle'
+ ) => {
+ otherParams?.[name]('params string for mock component');
+ };
+ return (
+ <>
+ {contextHolder}
+
+
+
+ >
+ );
+};
+
+describe('sqle/Order/AuditDetail/OrderDetailAuditResultList/useOverviewActions', () => {
+ const refreshOverviewFn = jest.fn();
+ const refreshOrderFn = jest.fn();
+
+ let requestSqlExecute: jest.SpyInstance;
+ let requestSqlTerminateTime: jest.SpyInstance;
+ let requestScheduleTime: jest.SpyInstance;
+
+ const customRender = () => {
+ return renderHook(() =>
+ useOverviewActions({
+ projectName,
+ workflowID,
+ refreshOverview: refreshOverviewFn,
+ refreshOrder: refreshOrderFn
+ })
+ );
+ };
+
+ beforeEach(() => {
+ jest.useFakeTimers();
+ order.mockAllApi();
+ requestSqlExecute = order.executeOneTaskOnWorkflow();
+ requestSqlTerminateTime = order.terminateSingleTaskByWorkflow();
+ requestScheduleTime = order.updateWorkflowSchedule();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ cleanup();
+ });
+
+ it('render execute openScheduleModalAndSetCurrentTask', async () => {
+ const { result } = customRender();
+
+ expect(result.current.scheduleModalVisible).toBeFalsy();
+ expect(result.current.currentTask).toBeNull();
+
+ await act(async () => {
+ result.current.openScheduleModalAndSetCurrentTask(recordData);
+ });
+ expect(result.current.scheduleModalVisible).toBeTruthy();
+ expect(result.current.currentTask).toEqual(recordData);
+ });
+
+ it('render execute sqlExecuteHandle', async () => {
+ renderWithTheme();
+
+ expect(screen.getByText('sqlExecuteHandle')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('sqlExecuteHandle'));
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(requestSqlExecute).toBeCalled();
+ expect(requestSqlExecute).toBeCalledWith({
+ workflow_id: workflowID,
+ task_id: 'params string for mock component',
+ project_name: projectName
+ });
+ });
+
+ it('render execute sqlTerminateHandle', async () => {
+ renderWithTheme();
+
+ expect(screen.getByText('sqlTerminateHandle')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('sqlTerminateHandle'));
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(requestSqlTerminateTime).toBeCalled();
+ expect(requestSqlTerminateTime).toBeCalledWith({
+ workflow_id: workflowID,
+ task_id: 'params string for mock component',
+ project_name: projectName
+ });
+ });
+
+ it('render execute scheduleTimeHandle', async () => {
+ renderWithTheme();
+
+ expect(screen.getByText('scheduleTimeHandle')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('scheduleTimeHandle'));
+ await act(async () => jest.advanceTimersByTime(3000));
+ expect(requestScheduleTime).toBeCalled();
+ expect(requestScheduleTime).toBeCalledWith({
+ workflow_id: workflowID,
+ task_id: '',
+ schedule_time: 'params string for mock component',
+ project_name: projectName
+ });
+ });
+});
diff --git a/packages/sqle/src/page/Order/AuditDetail/ScheduleTimeModal/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/Order/AuditDetail/ScheduleTimeModal/__snapshots__/index.test.tsx.snap
new file mode 100644
index 000000000..684bc68ca
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/ScheduleTimeModal/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,777 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/AuditDetail/ScheduleTimeModal render snap when has maintenanceTime 1`] = `
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ScheduleTimeModal render snap when has maintenanceTime 2`] = `
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ScheduleTimeModal render snap when open is false 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ScheduleTimeModal render snap when open is true 1`] = `
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail/ScheduleTimeModal render snap when open is true 2`] = `
+
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/AuditDetail/ScheduleTimeModal/index.test.tsx b/packages/sqle/src/page/Order/AuditDetail/ScheduleTimeModal/index.test.tsx
new file mode 100644
index 000000000..516b92a99
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/ScheduleTimeModal/index.test.tsx
@@ -0,0 +1,125 @@
+import ScheduleTimeModal from '.';
+import { ScheduleTimeModalProps } from './index.type';
+
+import { renderWithTheme } from '../../../../testUtils/customRender';
+import { act, cleanup, fireEvent, screen } from '@testing-library/react';
+import MockDate from 'mockdate';
+import dayjs from 'dayjs';
+import { getBySelector } from '@actiontech/shared/lib/testUtil/customQuery';
+
+describe('sqle/Order/AuditDetail/ScheduleTimeModal', () => {
+ const closeScheduleModalFn = jest.fn();
+ let submitFn = jest.fn();
+
+ const customRender = (
+ params: Pick
+ ) => {
+ return renderWithTheme(
+
+ );
+ };
+
+ beforeEach(() => {
+ MockDate.set(dayjs('2023-12-18 12:00:00').valueOf());
+ jest.useFakeTimers();
+ // date picker : custom attr [hideSuperIcon]
+ jest.spyOn(console, 'error').mockImplementation(() => {});
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ MockDate.reset();
+ (console.error as jest.Mock).mockRestore();
+ cleanup();
+ });
+
+ it('render snap when open is false', () => {
+ const { baseElement } = customRender({ open: false });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when open is true', async () => {
+ const { baseElement } = customRender({ open: true });
+
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(baseElement).toMatchSnapshot();
+ expect(screen.getByText('取 消')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('取 消'));
+ await act(async () => jest.advanceTimersByTime(300));
+ expect(closeScheduleModalFn).toBeCalled();
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when has maintenanceTime', async () => {
+ const { baseElement } = customRender({
+ open: true,
+ maintenanceTime: [
+ {
+ maintenance_start_time: {
+ hour: 1,
+ minute: 20
+ },
+ maintenance_stop_time: {
+ hour: 2,
+ minute: 0
+ }
+ },
+ {
+ maintenance_start_time: {
+ hour: 5,
+ minute: 20
+ }
+ }
+ ]
+ });
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(baseElement).toMatchSnapshot();
+
+ const timeInput = getBySelector(
+ '.ant-picker-input input#schedule_time',
+ baseElement
+ );
+ fireEvent.input(timeInput, {
+ target: {
+ value: '2023-12-18 12:00:00'
+ }
+ });
+ await act(async () => jest.advanceTimersByTime(500));
+ fireEvent.blur(timeInput);
+ await act(async () => jest.advanceTimersByTime(300));
+
+ expect(screen.getAllByText('定时上线').length).toBe(2);
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render submit btn', async () => {
+ submitFn.mockImplementation(() => new Promise(() => 1));
+ const { baseElement } = customRender({
+ open: true
+ });
+
+ const timeInput = getBySelector(
+ '.ant-picker-input input#schedule_time',
+ baseElement
+ );
+ fireEvent.click(timeInput);
+ await act(async () => jest.advanceTimersByTime(300));
+
+ const dateEle = screen.getAllByText('29')[0];
+ fireEvent.click(dateEle);
+ await act(async () => jest.advanceTimersByTime(300));
+ fireEvent.click(screen.getByText('OK'));
+ await act(async () => jest.advanceTimersByTime(300));
+
+ const submitBtn = screen.getAllByText('定时上线')[1];
+ fireEvent.click(submitBtn);
+ await act(async () => jest.advanceTimersByTime(300));
+ expect(submitFn).toBeCalled();
+ expect(submitFn).toBeCalledWith('2024-01-29T00:00:00+08:00');
+ });
+});
diff --git a/packages/sqle/src/page/Order/AuditDetail/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/Order/AuditDetail/__snapshots__/index.test.tsx.snap
new file mode 100644
index 000000000..0e2cd10c8
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,3003 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/AuditDetail render snap when has order info data 1`] = `
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail render snap when has order info data 2`] = `
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail render snap when has order info data 3`] = `
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3000
+ %
+
+
+ 审核通过率
+
+
+
+
+
+
+ 40
+
+
+ 审核结果评分
+
+
+
+
+
+
+ instance_schema 1
+
+
+ Schema
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail render snap when no taskInfos 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/AuditDetail render snap when order info has action btn 1`] = `
+
+
+
+
+ 审核结果
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/AuditDetail/index.test.tsx b/packages/sqle/src/page/Order/AuditDetail/index.test.tsx
new file mode 100644
index 000000000..07b3aba7a
--- /dev/null
+++ b/packages/sqle/src/page/Order/AuditDetail/index.test.tsx
@@ -0,0 +1,224 @@
+import AuditDetail from '.';
+import { OrderDetailAuditResultProps } from './index.type';
+
+import MockDate from 'mockdate';
+import dayjs from 'dayjs';
+import { act, cleanup, fireEvent, screen } from '@testing-library/react';
+import { renderWithTheme } from '../../../testUtils/customRender';
+
+import order from '../../../testUtils/mockApi/order';
+import { mockUseCurrentUser } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentUser';
+import {
+ AuditTaskResData,
+ workflowsOverviewListData
+} from '../../../testUtils/mockApi/order/data';
+import { IWorkflowResV2 } from '@actiontech/shared/lib/api/sqle/service/common';
+import { getAllBySelector } from '@actiontech/shared/lib/testUtil/customQuery';
+import {
+ AuditTaskResV1StatusEnum,
+ WorkflowRecordResV2StatusEnum
+} from '@actiontech/shared/lib/api/sqle/service/common.enum';
+
+const projectName = 'project name';
+
+describe('sqle/Order/AuditDetail', () => {
+ const refreshOrderFn = jest.fn();
+ const getOverviewListSuccessFn = jest.fn();
+
+ let requestGetAuditTaskSQLs: jest.SpyInstance;
+
+ const customRender = (
+ params: Omit<
+ OrderDetailAuditResultProps,
+ 'projectName' | 'getOverviewListSuccessHandle' | 'refreshOrder'
+ >
+ ) => {
+ return renderWithTheme(
+
+ );
+ };
+
+ beforeEach(() => {
+ MockDate.set(dayjs('2023-12-18 12:00:00').valueOf());
+ jest.useFakeTimers();
+ // date picker : custom attr [hideSuperIcon]
+ jest.spyOn(console, 'error').mockImplementation(() => {});
+ order.mockAllApi();
+ mockUseCurrentUser();
+ requestGetAuditTaskSQLs = order.getAuditTaskSQLs();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ MockDate.reset();
+ (console.error as jest.Mock).mockRestore();
+ cleanup();
+ });
+
+ it('render snap when no taskInfos', () => {
+ const { baseElement } = customRender({
+ taskInfos: [],
+ isArchive: true,
+ refreshOverviewFlag: true
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when has order info data', async () => {
+ const { baseElement } = customRender({
+ taskInfos: AuditTaskResData,
+ orderInfo: workflowsOverviewListData as unknown as IWorkflowResV2,
+ isArchive: true,
+ refreshOverviewFlag: true
+ });
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(2600));
+ expect(baseElement).toMatchSnapshot();
+
+ const segmentItems = getAllBySelector(
+ '.instance-segmented-label',
+ baseElement
+ );
+ expect(segmentItems.length).toBe(AuditTaskResData.length);
+
+ fireEvent.click(segmentItems[1]);
+ await act(async () => jest.advanceTimersByTime(300));
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(2800));
+ expect(requestGetAuditTaskSQLs).toBeCalled();
+ });
+
+ it('render snap when order info has action btn', async () => {
+ const { baseElement } = customRender({
+ taskInfos: [
+ {
+ ...AuditTaskResData[0],
+ status: AuditTaskResV1StatusEnum.exec_success
+ },
+ {
+ ...AuditTaskResData[1],
+ status: AuditTaskResV1StatusEnum.initialized
+ }
+ ],
+ orderInfo: {
+ ...workflowsOverviewListData,
+ record: {
+ status: WorkflowRecordResV2StatusEnum.wait_for_execution,
+ workflow_step_list: []
+ },
+ record_history_list: []
+ } as unknown as IWorkflowResV2,
+ isArchive: true,
+ refreshOverviewFlag: false
+ });
+ await act(async () => jest.advanceTimersByTime(3300));
+ expect(baseElement).toMatchSnapshot();
+
+ const segmentItems = getAllBySelector(
+ '.instance-segmented-label',
+ baseElement
+ );
+ fireEvent.click(segmentItems[1]);
+ await act(async () => jest.advanceTimersByTime(3300));
+ expect(requestGetAuditTaskSQLs).toBeCalled();
+ expect(requestGetAuditTaskSQLs).toBeCalledWith({
+ filter_exec_status: undefined,
+ no_duplicate: false,
+ page_index: '1',
+ page_size: '20',
+ task_id: '2'
+ });
+ expect(screen.getByText('筛选')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('筛选'));
+ await act(async () => jest.advanceTimersByTime(300));
+ expect(screen.getByText('收起筛选')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('收起筛选'));
+ await act(async () => jest.advanceTimersByTime(300));
+ });
+
+ it('render snap when click detail action', async () => {
+ const { baseElement } = customRender({
+ taskInfos: [
+ {
+ ...AuditTaskResData[0],
+ status: AuditTaskResV1StatusEnum.exec_success
+ },
+ {
+ ...AuditTaskResData[1],
+ status: AuditTaskResV1StatusEnum.initialized
+ }
+ ],
+ orderInfo: {
+ ...workflowsOverviewListData,
+ record: {
+ status: WorkflowRecordResV2StatusEnum.wait_for_execution,
+ workflow_step_list: []
+ },
+ record_history_list: []
+ } as unknown as IWorkflowResV2,
+ isArchive: true,
+ refreshOverviewFlag: false
+ });
+ await act(async () => jest.advanceTimersByTime(3300));
+
+ const segmentItems = getAllBySelector(
+ '.instance-segmented-label',
+ baseElement
+ );
+ fireEvent.click(segmentItems[1]);
+
+ const statusItems = getAllBySelector(
+ '.audit-result-filter-container-borderless > div .ant-space-item'
+ );
+ expect(statusItems.length).toBe(12);
+ expect(screen.getByText('执行失败')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('执行失败'));
+ await act(async () => jest.advanceTimersByTime(3300));
+ expect(requestGetAuditTaskSQLs).nthCalledWith(1, {
+ filter_exec_status: undefined,
+ no_duplicate: false,
+ page_index: '1',
+ page_size: '20',
+ task_id: '2'
+ });
+
+ expect(screen.getByText('数据去重')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('数据去重'));
+ await act(async () => jest.advanceTimersByTime(3300));
+ expect(requestGetAuditTaskSQLs).nthCalledWith(2, {
+ filter_exec_status: 'failed',
+ no_duplicate: false,
+ page_index: '1',
+ page_size: '20',
+ task_id: '2'
+ });
+ expect(requestGetAuditTaskSQLs).nthCalledWith(3, {
+ filter_exec_status: 'failed',
+ no_duplicate: true,
+ page_index: '1',
+ page_size: '20',
+ task_id: '2'
+ });
+
+ expect(screen.getByText('分页展示')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('分页展示'));
+ await act(async () => jest.advanceTimersByTime(300));
+ expect(screen.getByText('瀑布流展示')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('瀑布流展示'));
+ await act(async () => jest.advanceTimersByTime(3300));
+ expect(requestGetAuditTaskSQLs).nthCalledWith(4, {
+ filter_exec_status: 'failed',
+ no_duplicate: true,
+ page_index: '1',
+ page_size: '20',
+ task_id: '2'
+ });
+ });
+});
diff --git a/packages/sqle/src/page/Order/Common/AuditResultFilterContainer/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/Order/Common/AuditResultFilterContainer/__snapshots__/index.test.tsx.snap
new file mode 100644
index 000000000..ed99326b9
--- /dev/null
+++ b/packages/sqle/src/page/Order/Common/AuditResultFilterContainer/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,578 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/Common/AuditResultFilterContainer render snap when auditLevel is error 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultFilterContainer render snap when auditLevel is normal 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultFilterContainer render snap when auditLevel is notice 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultFilterContainer render snap when auditLevel is warn 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultFilterContainer render snap when border is false 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultFilterContainer render snap when no optional parameters 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultFilterContainer render snap when other params 1`] = `
+
+
+
+
+
+
+
+
+ 100
+ %
+
+
+ 审核通过率
+
+
+
+
+
+
+ 9
+
+
+ 审核结果评分
+
+
+
+
+
+
+ schema name
+
+
+ Schema
+
+
+
+
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/Common/AuditResultFilterContainer/index.test.tsx b/packages/sqle/src/page/Order/Common/AuditResultFilterContainer/index.test.tsx
new file mode 100644
index 000000000..a970c8907
--- /dev/null
+++ b/packages/sqle/src/page/Order/Common/AuditResultFilterContainer/index.test.tsx
@@ -0,0 +1,95 @@
+import AuditResultFilterContainer from '.';
+import { AuditResultFilterContainerProps } from './index.type';
+
+import { renderWithTheme } from '../../../../testUtils/customRender';
+import { AuditTaskResV1AuditLevelEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum';
+
+const filterOptionsData = [
+ {
+ value: 'a1',
+ label: 'a'
+ },
+ {
+ value: 'b1',
+ label: 'b'
+ }
+];
+
+describe('sqle/Order/Common/AuditResultFilterContainer', () => {
+ const filterValueChangeFn = jest.fn();
+
+ const customRender = (
+ params: Omit, 'filterValueChange'>
+ ) => {
+ return renderWithTheme(
+
+ );
+ };
+
+ it('render snap when no optional parameters', () => {
+ const { baseElement } = customRender({
+ filterOptions: filterOptionsData,
+ filterValue: 'a'
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when auditLevel is normal', () => {
+ const { baseElement } = customRender({
+ filterOptions: filterOptionsData,
+ filterValue: '',
+ auditLevel: AuditTaskResV1AuditLevelEnum.normal
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when auditLevel is error', () => {
+ const { baseElement } = customRender({
+ filterOptions: filterOptionsData,
+ filterValue: '',
+ auditLevel: AuditTaskResV1AuditLevelEnum.error
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when auditLevel is notice', () => {
+ const { baseElement } = customRender({
+ filterOptions: filterOptionsData,
+ filterValue: '',
+ auditLevel: AuditTaskResV1AuditLevelEnum.notice
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when auditLevel is warn', () => {
+ const { baseElement } = customRender({
+ filterOptions: filterOptionsData,
+ filterValue: '',
+ auditLevel: AuditTaskResV1AuditLevelEnum.warn
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when border is false', () => {
+ const { baseElement } = customRender({
+ filterOptions: filterOptionsData,
+ filterValue: '',
+ bordered: false
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when other params', () => {
+ const { baseElement } = customRender({
+ filterOptions: filterOptionsData,
+ filterValue: '',
+ passRate: 1,
+ score: 9,
+ instanceSchemaName: 'schema name'
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/Order/Common/AuditResultList/List/AuditResultDrawer.test.tsx b/packages/sqle/src/page/Order/Common/AuditResultList/List/AuditResultDrawer.test.tsx
new file mode 100644
index 000000000..df06c739a
--- /dev/null
+++ b/packages/sqle/src/page/Order/Common/AuditResultList/List/AuditResultDrawer.test.tsx
@@ -0,0 +1,63 @@
+import { AuditResultDrawerProps } from '../../../Create/AuditResult/index.type';
+import AuditResultDrawer from './AuditResultDrawer';
+
+import { renderWithTheme } from '../../../../../testUtils/customRender';
+import { getBySelector } from '@actiontech/shared/lib/testUtil/customQuery';
+import { fireEvent, act, cleanup } from '@testing-library/react';
+
+describe('sqle/Order/Common/AuditResultList/AuditResultDrawer', () => {
+ const onCloseFn = jest.fn();
+
+ const customRender = (params: Omit) => {
+ return renderWithTheme(
+
+ );
+ };
+
+ beforeEach(() => {
+ jest.useFakeTimers();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ cleanup();
+ });
+
+ it('render snap when open is false', () => {
+ const { baseElement } = customRender({
+ open: false
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when data is empty and click closed', async () => {
+ const { baseElement } = customRender({
+ open: true
+ });
+
+ const closedIcon = getBySelector('.closed-icon-custom', baseElement);
+ fireEvent.click(closedIcon);
+ await act(async () => jest.advanceTimersByTime(300));
+ expect(onCloseFn).toBeCalled();
+ });
+
+ it('render snap when title has data', () => {
+ const { baseElement } = customRender({
+ open: true,
+ auditResultRecord: {
+ audit_level: '',
+ audit_result: [],
+ audit_status: '',
+ description: 'description cont',
+ exec_result: '',
+ exec_sql: 'exec sql',
+ exec_status: '',
+ number: 30,
+ rollback_sql: 'rollback sql',
+ sql_source_file: 'sql file'
+ }
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/Order/Common/AuditResultList/List/__snapshots__/AuditResultDrawer.test.tsx.snap b/packages/sqle/src/page/Order/Common/AuditResultList/List/__snapshots__/AuditResultDrawer.test.tsx.snap
new file mode 100644
index 000000000..4500e941e
--- /dev/null
+++ b/packages/sqle/src/page/Order/Common/AuditResultList/List/__snapshots__/AuditResultDrawer.test.tsx.snap
@@ -0,0 +1,191 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/Common/AuditResultList/AuditResultDrawer render snap when open is false 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList/AuditResultDrawer render snap when title has data 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ SQL语句
+
+
+
+
+
+
+ 来源
+ :
+ sql file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/Common/AuditResultList/List/__snapshots__/index.ce.test.tsx.snap b/packages/sqle/src/page/Order/Common/AuditResultList/List/__snapshots__/index.ce.test.tsx.snap
new file mode 100644
index 000000000..7d53c862f
--- /dev/null
+++ b/packages/sqle/src/page/Order/Common/AuditResultList/List/__snapshots__/index.ce.test.tsx.snap
@@ -0,0 +1,1075 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/Common/AuditResultList render snap when add note 1`] = `
+
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList render snap when add note 2`] = `
+
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList render snap when data is empty 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList render snap when get table error 1`] = `
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/Common/AuditResultList/List/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/Order/Common/AuditResultList/List/__snapshots__/index.test.tsx.snap
new file mode 100644
index 000000000..68b31f3f7
--- /dev/null
+++ b/packages/sqle/src/page/Order/Common/AuditResultList/List/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,1805 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/Common/AuditResultList/List render snap when add note 1`] = `
+
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList/List render snap when add note 2`] = `
+
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList/List render snap when data is empty 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList/List render snap when get table data 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList/List render snap when get table data 2`] = `
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList/List render snap when get table error 1`] = `
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/Common/AuditResultList/List/index.ce.test.tsx b/packages/sqle/src/page/Order/Common/AuditResultList/List/index.ce.test.tsx
new file mode 100644
index 000000000..19355d7b4
--- /dev/null
+++ b/packages/sqle/src/page/Order/Common/AuditResultList/List/index.ce.test.tsx
@@ -0,0 +1,100 @@
+/**
+ * @test_version ce
+ */
+
+import AuditResultForCreateList from '.';
+import { AuditResultForCreateListProps } from './index.type';
+
+import { superRender } from '../../../../../testUtils/customRender';
+import { fireEvent, act, cleanup, screen } from '@testing-library/react';
+import order from '../../../../../testUtils/mockApi/order';
+import { getAuditTaskSQLsV2FilterAuditLevelEnum } from '@actiontech/shared/lib/api/sqle/service/task/index.enum';
+import { createSpyFailResponse } from '@actiontech/shared/lib/testUtil/mockApi';
+import { getBySelector } from '@actiontech/shared/lib/testUtil/customQuery';
+
+describe('sqle/Order/Common/AuditResultList', () => {
+ let requestUpdateAuditTaskSQLs: jest.SpyInstance;
+ let requestGetAuditTaskSQLs: jest.SpyInstance;
+
+ const customRender = (params: AuditResultForCreateListProps) => {
+ return superRender();
+ };
+
+ beforeEach(() => {
+ jest.useFakeTimers();
+ requestUpdateAuditTaskSQLs = order.updateAuditTaskSQLs();
+ requestGetAuditTaskSQLs = order.getAuditTaskSQLs();
+ order.mockAllApi();
+ // MUI: the styled(component)(...args) API requires all its args to be defined.
+ jest.spyOn(console, 'error').mockImplementation(() => {});
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ (console.error as jest.Mock).mockRestore();
+ cleanup();
+ });
+
+ it('render snap when data is empty', () => {
+ const { baseElement } = customRender({
+ duplicate: true,
+ projectID: 'projectID',
+ auditLevelFilterValue: 'all'
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when get table error', async () => {
+ requestGetAuditTaskSQLs.mockImplementation(() =>
+ createSpyFailResponse({ message: 'error' })
+ );
+ const { baseElement } = customRender({
+ duplicate: true,
+ taskID: 'taskID',
+ projectID: 'projectID',
+ auditLevelFilterValue: getAuditTaskSQLsV2FilterAuditLevelEnum.normal
+ });
+
+ await act(async () => jest.advanceTimersByTime(3300));
+ expect(baseElement).toMatchSnapshot();
+ expect(requestGetAuditTaskSQLs).toBeCalled();
+ expect(requestGetAuditTaskSQLs).toBeCalledWith({
+ filter_audit_level: 'normal',
+ no_duplicate: true,
+ page_index: '1',
+ page_size: '20',
+ task_id: 'taskID'
+ });
+ });
+
+ it('render snap when add note', async () => {
+ const { baseElement } = customRender({
+ duplicate: true,
+ taskID: 'taskID',
+ projectID: 'projectID',
+ auditLevelFilterValue: getAuditTaskSQLsV2FilterAuditLevelEnum.normal
+ });
+
+ await act(async () => jest.advanceTimersByTime(3300));
+ expect(screen.getByText('添加说明')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('添加说明'));
+ await act(async () => jest.advanceTimersByTime(500));
+ const descInput = getBySelector('textarea.ant-input', baseElement);
+ fireEvent.change(descInput, {
+ target: {
+ value: 'desc text'
+ }
+ });
+ await act(async () => jest.advanceTimersByTime(200));
+ fireEvent.keyDown(descInput, {
+ key: 'Enter',
+ code: 'Enter',
+ keyCode: 13
+ });
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(2600));
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/Order/Common/AuditResultList/List/index.test.tsx b/packages/sqle/src/page/Order/Common/AuditResultList/List/index.test.tsx
new file mode 100644
index 000000000..e4734488d
--- /dev/null
+++ b/packages/sqle/src/page/Order/Common/AuditResultList/List/index.test.tsx
@@ -0,0 +1,129 @@
+import AuditResultForCreateList from '.';
+import { AuditResultForCreateListProps } from './index.type';
+
+import { superRender } from '../../../../../testUtils/customRender';
+import { fireEvent, act, cleanup, screen } from '@testing-library/react';
+import order from '../../../../../testUtils/mockApi/order';
+import { getAuditTaskSQLsV2FilterAuditLevelEnum } from '@actiontech/shared/lib/api/sqle/service/task/index.enum';
+import { createSpyFailResponse } from '@actiontech/shared/lib/testUtil/mockApi';
+import { getBySelector } from '@actiontech/shared/lib/testUtil/customQuery';
+
+describe('sqle/Order/Common/AuditResultList/List', () => {
+ let requestUpdateAuditTaskSQLs: jest.SpyInstance;
+ let requestGetAuditTaskSQLs: jest.SpyInstance;
+
+ const customRender = (params: AuditResultForCreateListProps) => {
+ return superRender();
+ };
+
+ beforeEach(() => {
+ jest.useFakeTimers();
+ requestUpdateAuditTaskSQLs = order.updateAuditTaskSQLs();
+ requestGetAuditTaskSQLs = order.getAuditTaskSQLs();
+ order.mockAllApi();
+ // MUI: the styled(component)(...args) API requires all its args to be defined.
+ jest.spyOn(console, 'error').mockImplementation(() => {});
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ (console.error as jest.Mock).mockRestore();
+ cleanup();
+ });
+
+ it('render snap when data is empty', () => {
+ const { baseElement } = customRender({
+ duplicate: true,
+ projectID: 'projectID',
+ auditLevelFilterValue: 'all'
+ });
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when get table data', async () => {
+ const openSpy = jest.spyOn(window, 'open').mockImplementation(() => null);
+ const { baseElement } = customRender({
+ duplicate: true,
+ taskID: 'taskID',
+ projectID: 'projectID',
+ auditLevelFilterValue: getAuditTaskSQLsV2FilterAuditLevelEnum.normal
+ });
+
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(2600));
+ expect(baseElement).toMatchSnapshot();
+ expect(requestGetAuditTaskSQLs).toBeCalled();
+ expect(requestGetAuditTaskSQLs).toBeCalledWith({
+ filter_audit_level: 'normal',
+ no_duplicate: true,
+ page_index: '1',
+ page_size: '20',
+ task_id: 'taskID'
+ });
+
+ const analyzeBtn = screen.getAllByText('分 析');
+ expect(analyzeBtn.length).toBe(1);
+ fireEvent.click(screen.getByText('分 析'));
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(openSpy).toBeCalled();
+ expect(openSpy).toBeCalledWith(
+ `/sqle/project/projectID/order/taskID/1/analyze`
+ );
+ openSpy.mockRestore();
+ });
+
+ it('render snap when get table error', async () => {
+ requestGetAuditTaskSQLs.mockImplementation(() =>
+ createSpyFailResponse({ message: 'error' })
+ );
+ const { baseElement } = customRender({
+ duplicate: true,
+ taskID: 'taskID',
+ projectID: 'projectID',
+ auditLevelFilterValue: getAuditTaskSQLsV2FilterAuditLevelEnum.normal
+ });
+
+ await act(async () => jest.advanceTimersByTime(3300));
+ expect(baseElement).toMatchSnapshot();
+ expect(requestGetAuditTaskSQLs).toBeCalled();
+ expect(requestGetAuditTaskSQLs).toBeCalledWith({
+ filter_audit_level: 'normal',
+ no_duplicate: true,
+ page_index: '1',
+ page_size: '20',
+ task_id: 'taskID'
+ });
+ });
+
+ it('render snap when add note', async () => {
+ const { baseElement } = customRender({
+ duplicate: true,
+ taskID: 'taskID',
+ projectID: 'projectID',
+ auditLevelFilterValue: getAuditTaskSQLsV2FilterAuditLevelEnum.normal
+ });
+
+ await act(async () => jest.advanceTimersByTime(3300));
+ expect(screen.getByText('添加说明')).toBeInTheDocument();
+ fireEvent.click(screen.getByText('添加说明'));
+ await act(async () => jest.advanceTimersByTime(500));
+ const descInput = getBySelector('textarea.ant-input', baseElement);
+ fireEvent.change(descInput, {
+ target: {
+ value: 'desc text'
+ }
+ });
+ await act(async () => jest.advanceTimersByTime(200));
+ fireEvent.keyDown(descInput, {
+ key: 'Enter',
+ code: 'Enter',
+ keyCode: 13
+ });
+ await act(async () => jest.advanceTimersByTime(500));
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(2600));
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/Order/Common/AuditResultList/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/Order/Common/AuditResultList/__snapshots__/index.test.tsx.snap
new file mode 100644
index 000000000..639c18cea
--- /dev/null
+++ b/packages/sqle/src/page/Order/Common/AuditResultList/__snapshots__/index.test.tsx.snap
@@ -0,0 +1,3435 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`sqle/Order/Common/AuditResultList render snap has task when mode is order 1`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1000
+ %
+
+
+ 审核通过率
+
+
+
+
+
+
+ 30
+
+
+ 审核结果评分
+
+
+
+
+
+
+ schema a
+
+
+ Schema
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList render snap has task when mode is order 2`] = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1000
+ %
+
+
+ 审核通过率
+
+
+
+
+
+
+ 30
+
+
+ 审核结果评分
+
+
+
+
+
+
+ schema a
+
+
+ Schema
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList render snap has task when mode is order 3`] = `
+
+
+
+
+
+
+
+
+
+
+ 1000
+ %
+
+
+ 审核通过率
+
+
+
+
+
+
+ 30
+
+
+ 审核结果评分
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList render snap has task when mode is order 4`] = `
+
+
+
+
+
+
+
+
+
+
+ 1000
+ %
+
+
+ 审核通过率
+
+
+
+
+
+
+ 30
+
+
+ 审核结果评分
+
+
+
+
+
+
+
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList render snap when mode is order 1`] = `
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList render snap when mode is order 2`] = `
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList render snap when mode is order 3`] = `
+
+
+
+`;
+
+exports[`sqle/Order/Common/AuditResultList render snap when mode is order 4`] = `
+
+
+
+`;
diff --git a/packages/sqle/src/page/Order/Common/AuditResultList/index.test.tsx b/packages/sqle/src/page/Order/Common/AuditResultList/index.test.tsx
new file mode 100644
index 000000000..d86b46322
--- /dev/null
+++ b/packages/sqle/src/page/Order/Common/AuditResultList/index.test.tsx
@@ -0,0 +1,105 @@
+import AuditResultList from '.';
+import { AuditResultListProps } from './index.type';
+
+import { superRender } from '../../../../testUtils/customRender';
+import { act, cleanup } from '@testing-library/react';
+import order from '../../../../testUtils/mockApi/order';
+import {
+ AuditTaskResV1AuditLevelEnum,
+ AuditTaskResV1SqlSourceEnum,
+ AuditTaskResV1StatusEnum
+} from '@actiontech/shared/lib/api/sqle/service/common.enum';
+
+const projectID = 'project ID';
+const tasksData = [
+ {
+ audit_level: AuditTaskResV1AuditLevelEnum.warn,
+ exec_end_time: '1970-12-31 00:00:00',
+ exec_start_time: '1970-01-01 00:00:00',
+ instance_db_type: 'mysql',
+ instance_name: 'instance a',
+ instance_schema: 'schema a',
+ pass_rate: 10,
+ score: 30,
+ sql_source: AuditTaskResV1SqlSourceEnum.form_data,
+ status: AuditTaskResV1StatusEnum.audited,
+ task_id: 1
+ },
+ {
+ audit_level: AuditTaskResV1AuditLevelEnum.error,
+ exec_end_time: '1970-12-31 00:00:00',
+ exec_start_time: '1970-01-01 00:00:00',
+ instance_db_type: 'mysql',
+ instance_name: 'instance a',
+ instance_schema: 'schema a',
+ pass_rate: 10,
+ score: 30,
+ sql_source: AuditTaskResV1SqlSourceEnum.sql_file,
+ status: AuditTaskResV1StatusEnum.exec_failed,
+ task_id: 2
+ }
+];
+
+describe('sqle/Order/Common/AuditResultList', () => {
+ const updateTaskRecordTotalNumFn = jest.fn();
+ const customRender = (
+ params: Pick
+ ) => {
+ return superRender(
+
+ );
+ };
+
+ beforeEach(() => {
+ jest.useFakeTimers();
+ order.mockAllApi();
+ });
+
+ afterEach(() => {
+ jest.useRealTimers();
+ jest.clearAllMocks();
+ cleanup();
+ });
+
+ it('render snap when mode is order', async () => {
+ const { baseElement } = customRender({
+ tasks: []
+ });
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(3200));
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap has task when mode is order', async () => {
+ const { baseElement } = customRender({
+ tasks: tasksData
+ });
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(3200));
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap when mode is order', async () => {
+ const { baseElement } = customRender({
+ tasks: [],
+ mode: 'sql-audit'
+ });
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(3200));
+ expect(baseElement).toMatchSnapshot();
+ });
+
+ it('render snap has task when mode is order', async () => {
+ const { baseElement } = customRender({
+ tasks: tasksData,
+ mode: 'sql-audit'
+ });
+ expect(baseElement).toMatchSnapshot();
+ await act(async () => jest.advanceTimersByTime(3200));
+ expect(baseElement).toMatchSnapshot();
+ });
+});
diff --git a/packages/sqle/src/page/Order/Common/AuditResultList/index.tsx b/packages/sqle/src/page/Order/Common/AuditResultList/index.tsx
index c10b1fa9d..32a522c07 100644
--- a/packages/sqle/src/page/Order/Common/AuditResultList/index.tsx
+++ b/packages/sqle/src/page/Order/Common/AuditResultList/index.tsx
@@ -104,7 +104,6 @@ const AuditResultList: React.FC = ({
-
{/* todo: 数据需要后端接口支持 http://10.186.18.11/jira/browse/DMS-424*/}
passRate={currentTask?.pass_rate}
@@ -122,7 +121,6 @@ const AuditResultList: React.FC = ({
filterValueChange={setAuditLevelFilterValue}
auditLevel={currentTask?.audit_level}
/>
-
+
+
+
+
+
+
+
+ 上线失败
+
+
+
+ basic title
+
+
+ this is a desc str
+
+
+
+
+
+
+
+ basic title
+
+
+ -
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+