From c57d43903fb7bf1307291cf01f48470893e49702 Mon Sep 17 00:00:00 2001 From: lizhensheng Date: Wed, 29 May 2024 10:36:57 +0800 Subject: [PATCH 1/3] [test]: fix] Refine data export styles and implement unit tests --- .../__snapshots__/index.test.tsx.snap | 18 +- .../Common/BasicInfoWrapper/style.ts | 2 +- .../__snapshots__/index.test.tsx.snap | 4 +- .../BaseInfoForm/BaseInfoFormItem.tsx | 2 +- .../BaseInfoFormItem.test.tsx.snap | 2 +- .../__snapshots__/index.test.tsx.snap | 4 +- .../__snapshots__/index.test.tsx.snap | 4 +- .../__snapshots__/index.test.tsx.snap | 4 +- .../__snapshots__/index.test.tsx.snap | 10 +- .../components/LazyLoadComponent/index.tsx | 3 +- .../LazyLoadComponent/index.type.ts | 2 +- .../lib/components/LazyLoadComponent/style.ts | 6 +- packages/shared/lib/utils/FormRule.ts | 10 +- .../lib/utils/__tests__/FormRule.test.ts | 11 + .../__snapshots__/index.test.tsx.snap | 241 + .../Common/BackToList/index.test.tsx | 21 + .../__tests__/SqlExecModeSelector.test.tsx | 73 + .../SqlFormatterAndSubmitter.test.tsx | 164 + .../__tests__/SqlUploadContent.test.tsx | 40 + .../SqlUploadContent.test.tsx.snap | 109 + .../__snapshots__/index.ce.test.tsx.snap | 457 + .../__snapshots__/index.test.tsx.snap | 1101 + .../__tests__/index.ce.test.tsx | 51 + .../__tests__/index.test.tsx | 70 + .../components/SqlExecModeSelector.tsx | 13 +- .../components/SqlFormatterAndSubmitter.tsx | 10 +- .../components/SqlUploadContent.tsx | 43 +- .../components/index.type.ts | 16 +- .../SqlStatementFormItem/index.tsx | 14 +- .../__snapshots__/index.ce.test.tsx.snap | 421 + .../__snapshots__/index.test.tsx.snap | 1350 + .../__tests__/index.ce.test.tsx | 33 + .../__tests__/index.test.tsx | 75 + .../SqlStatementFormController/index.tsx | 13 +- .../SqlStatementFormController/index.type.ts | 11 + .../__snapshots__/index.test.tsx.snap | 14 + .../__tests__/index.test.tsx | 57 + .../__snapshots__/index.ce.test.tsx.snap | 9720 ++--- .../__snapshots__/index.test.tsx.snap | 36114 ++++++---------- .../Create/__tests__/index.ce.test.tsx | 8 +- .../Create/__tests__/index.test.tsx | 50 +- .../Create/hooks/useAuditWorkflow.tsx | 1 - .../Create/hooks/useCheckTaskAuditSqlCount.ts | 1 - .../src/page/SqlExecWorkflow/Create/index.tsx | 21 +- .../__snapshots__/index.test.tsx.snap | 2 +- .../__snapshots__/index.test.tsx.snap | 208 +- .../__snapshots__/index.test.tsx.snap | 2 +- .../sqle/src/testUtils/mockApi/task/index.ts | 13 + 48 files changed, 20638 insertions(+), 29981 deletions(-) create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/BackToList/__snapshots__/index.test.tsx.snap create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/BackToList/index.test.tsx create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlExecModeSelector.test.tsx create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlFormatterAndSubmitter.test.tsx create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlUploadContent.test.tsx create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/SqlUploadContent.test.tsx.snap create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/index.ce.test.tsx.snap create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/index.test.tsx.snap create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.ce.test.tsx create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.test.tsx create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/__snapshots__/index.ce.test.tsx.snap create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/__snapshots__/index.test.tsx.snap create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/index.ce.test.tsx create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/index.test.tsx create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/index.type.ts create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SubmitWorkflowButton/__tests__/__snapshots__/index.test.tsx.snap create mode 100644 packages/sqle/src/page/SqlExecWorkflow/Common/SubmitWorkflowButton/__tests__/index.test.tsx diff --git a/packages/base/src/page/DataExportManagement/Common/BasicInfoWrapper/__snapshots__/index.test.tsx.snap b/packages/base/src/page/DataExportManagement/Common/BasicInfoWrapper/__snapshots__/index.test.tsx.snap index a942c1ecf..50d68f148 100644 --- a/packages/base/src/page/DataExportManagement/Common/BasicInfoWrapper/__snapshots__/index.test.tsx.snap +++ b/packages/base/src/page/DataExportManagement/Common/BasicInfoWrapper/__snapshots__/index.test.tsx.snap @@ -3,7 +3,7 @@ exports[`test base/DataExport/Common/BasicInfoWrapper should match snapshot 1`] = `
diff --git a/packages/base/src/page/DataExportManagement/Create/__tests__/__snapshots__/index.test.tsx.snap b/packages/base/src/page/DataExportManagement/Create/__tests__/__snapshots__/index.test.tsx.snap index 60ffe5c15..8b59b749f 100644 --- a/packages/base/src/page/DataExportManagement/Create/__tests__/__snapshots__/index.test.tsx.snap +++ b/packages/base/src/page/DataExportManagement/Create/__tests__/__snapshots__/index.test.tsx.snap @@ -129,7 +129,7 @@ exports[`first should match snapshot when pageState is equal CREATE_TASK 1`] = `
= ({ slot }) => { {slot} diff --git a/packages/base/src/page/DataExportManagement/Create/components/CreateTask/BaseInfoForm/__tests__/__snapshots__/BaseInfoFormItem.test.tsx.snap b/packages/base/src/page/DataExportManagement/Create/components/CreateTask/BaseInfoForm/__tests__/__snapshots__/BaseInfoFormItem.test.tsx.snap index da9b8db79..1bade907a 100644 --- a/packages/base/src/page/DataExportManagement/Create/components/CreateTask/BaseInfoForm/__tests__/__snapshots__/BaseInfoFormItem.test.tsx.snap +++ b/packages/base/src/page/DataExportManagement/Create/components/CreateTask/BaseInfoForm/__tests__/__snapshots__/BaseInfoFormItem.test.tsx.snap @@ -46,7 +46,7 @@ exports[`test base/DataExport/Create/BaseInfoForm/BaseInfoFormItem should match slot
= ({ animation={animation} className={classnames('lazy-load-wrapper', className, { 'lazy-load-wrapper-hidden': status === 'hidden', - 'lazy-load-wrapper-show': status === 'show' + 'lazy-load-wrapper-show': status === 'show', + 'lazy-load-wrapper-animation': animation !== false })} > {children} diff --git a/packages/shared/lib/components/LazyLoadComponent/index.type.ts b/packages/shared/lib/components/LazyLoadComponent/index.type.ts index 7552ed71d..9ed74c80c 100644 --- a/packages/shared/lib/components/LazyLoadComponent/index.type.ts +++ b/packages/shared/lib/components/LazyLoadComponent/index.type.ts @@ -2,7 +2,7 @@ import { ReactNode } from 'react'; export type LazyLoadComponentProps = { open?: boolean; - animation?: string; + animation?: string | false; forceRender?: boolean; destroyOnClose?: boolean; diff --git a/packages/shared/lib/components/LazyLoadComponent/style.ts b/packages/shared/lib/components/LazyLoadComponent/style.ts index 7b0979ac0..1a2cad75a 100644 --- a/packages/shared/lib/components/LazyLoadComponent/style.ts +++ b/packages/shared/lib/components/LazyLoadComponent/style.ts @@ -1,7 +1,7 @@ import { styled } from '@mui/material'; export const LazyLoadComponentStyleWrapper = styled('div')<{ - animation?: string; + animation?: string | false; }>` @keyframes slide-right { from { @@ -14,7 +14,9 @@ export const LazyLoadComponentStyleWrapper = styled('div')<{ } } - animation: ${({ animation }) => animation ?? ' slide-right 300ms'}; + &.lazy-load-wrapper-animation { + animation: ${({ animation }) => animation || ' slide-right 300ms'}; + } &.lazy-load-wrapper-hidden { display: none; diff --git a/packages/shared/lib/utils/FormRule.ts b/packages/shared/lib/utils/FormRule.ts index 84bf00360..208eeac04 100644 --- a/packages/shared/lib/utils/FormRule.ts +++ b/packages/shared/lib/utils/FormRule.ts @@ -78,18 +78,20 @@ export const roleNameRuleValidator = (): FormValidatorRule => { }; }; -export const whiteSpaceSql = (): Rule[] => { +export const whiteSpaceSql = (enableRule = true): Rule[] => { return [ { - validator: whiteSpaceSqlValidator() + validator: whiteSpaceSqlValidator(enableRule) } ]; }; -export const whiteSpaceSqlValidator = (): FormValidatorRule => { +export const whiteSpaceSqlValidator = ( + enableRule = true +): FormValidatorRule => { return (_, values) => { const placeholder = '/* input your sql */'; - if (values === placeholder) { + if (values === placeholder && enableRule) { return Promise.reject( i18n.t('common.form.placeholder.input', { name: i18n.t('common.sqlStatements') diff --git a/packages/shared/lib/utils/__tests__/FormRule.test.ts b/packages/shared/lib/utils/__tests__/FormRule.test.ts index 5422f244f..63cff590e 100644 --- a/packages/shared/lib/utils/__tests__/FormRule.test.ts +++ b/packages/shared/lib/utils/__tests__/FormRule.test.ts @@ -75,6 +75,17 @@ describe('utils/FormRule', () => { expect(message).toBe('请输入SQL语句'); }); + it('should not check white space sql when enableRule is false', async () => { + const check = whiteSpaceSqlValidator(false); + let message = ''; + try { + await check?.({} as any, '/* input your sql */', () => {}); + } catch (error: any) { + message = error; + } + expect(message).toBe(''); + }); + it('should check prot is between min and max', async () => { const cases = [ { diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/BackToList/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Common/BackToList/__snapshots__/index.test.tsx.snap new file mode 100644 index 000000000..a2388d350 --- /dev/null +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/BackToList/__snapshots__/index.test.tsx.snap @@ -0,0 +1,241 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`test BackToList render snapshot when isAuditing is falsy 1`] = ` +{ + "asFragment": [Function], + "baseElement": + + , + "container": , + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; + +exports[`test BackToList render snapshot when isAuditing is truthy 1`] = ` +{ + "asFragment": [Function], + "baseElement": + + , + "container": , + "debug": [Function], + "findAllByAltText": [Function], + "findAllByDisplayValue": [Function], + "findAllByLabelText": [Function], + "findAllByPlaceholderText": [Function], + "findAllByRole": [Function], + "findAllByTestId": [Function], + "findAllByText": [Function], + "findAllByTitle": [Function], + "findByAltText": [Function], + "findByDisplayValue": [Function], + "findByLabelText": [Function], + "findByPlaceholderText": [Function], + "findByRole": [Function], + "findByTestId": [Function], + "findByText": [Function], + "findByTitle": [Function], + "getAllByAltText": [Function], + "getAllByDisplayValue": [Function], + "getAllByLabelText": [Function], + "getAllByPlaceholderText": [Function], + "getAllByRole": [Function], + "getAllByTestId": [Function], + "getAllByText": [Function], + "getAllByTitle": [Function], + "getByAltText": [Function], + "getByDisplayValue": [Function], + "getByLabelText": [Function], + "getByPlaceholderText": [Function], + "getByRole": [Function], + "getByTestId": [Function], + "getByText": [Function], + "getByTitle": [Function], + "queryAllByAltText": [Function], + "queryAllByDisplayValue": [Function], + "queryAllByLabelText": [Function], + "queryAllByPlaceholderText": [Function], + "queryAllByRole": [Function], + "queryAllByTestId": [Function], + "queryAllByText": [Function], + "queryAllByTitle": [Function], + "queryByAltText": [Function], + "queryByDisplayValue": [Function], + "queryByLabelText": [Function], + "queryByPlaceholderText": [Function], + "queryByRole": [Function], + "queryByTestId": [Function], + "queryByText": [Function], + "queryByTitle": [Function], + "rerender": [Function], + "unmount": [Function], +} +`; diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/BackToList/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/BackToList/index.test.tsx new file mode 100644 index 000000000..297e883dd --- /dev/null +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/BackToList/index.test.tsx @@ -0,0 +1,21 @@ +import { mockUseCurrentProject } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentProject'; +import BackToList from '.'; +import { superRender } from '../../../../testUtils/customRender'; + +describe('test BackToList', () => { + beforeEach(() => { + mockUseCurrentProject(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('render snapshot when isAuditing is truthy', () => { + expect(superRender()).toMatchSnapshot(); + }); + + it('render snapshot when isAuditing is falsy', () => { + expect(superRender()).toMatchSnapshot(); + }); +}); diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlExecModeSelector.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlExecModeSelector.test.tsx new file mode 100644 index 000000000..6bbabb13f --- /dev/null +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlExecModeSelector.test.tsx @@ -0,0 +1,73 @@ +import { Form } from 'antd'; +import { superRender } from '../../../../../../testUtils/customRender'; +import task from '../../../../../../testUtils/mockApi/task'; +import SqlExecModeSelector from '../components/SqlExecModeSelector'; +import { act, fireEvent, renderHook, screen } from '@testing-library/react'; +import { AuditTaskResV1SqlSourceEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum'; +import { SqlExecModeSelectorProps } from '../components/index.type'; + +describe('test SqlExecModeSelector', () => { + let getSqlFileOrderMethodSpy: jest.SpyInstance; + beforeEach(() => { + getSqlFileOrderMethodSpy = task.getSqlFileOrderMethod(); + jest.useFakeTimers(); + }); + afterEach(() => { + jest.useRealTimers(); + jest.clearAllMocks(); + jest.clearAllTimers(); + }); + + const customRender = (params?: Partial) => { + const { result } = renderHook(() => Form.useForm()); + return superRender( +
+ + + ); + }; + + it('should not render the execute mode selector when file mode execute SQL is not supported', () => { + customRender({ + currentSqlUploadType: AuditTaskResV1SqlSourceEnum.zip_file + }); + expect(screen.queryByText('选择上线模式')).not.toBeInTheDocument(); + }); + + it('should not render the execute mode selector when the upload type is form data', () => { + customRender({ + isSupportFileModeExecuteSql: true, + currentSqlUploadType: AuditTaskResV1SqlSourceEnum.form_data + }); + expect(screen.queryByText('选择上线模式')).not.toBeInTheDocument(); + }); + + it('should render the execute mode selector for SQL file upload with supported file mode execute SQL', () => { + customRender({ + isSupportFileModeExecuteSql: true, + currentSqlUploadType: AuditTaskResV1SqlSourceEnum.sql_file + }); + expect(screen.queryByText('选择上线模式')).toBeInTheDocument(); + + expect(getSqlFileOrderMethodSpy).not.toHaveBeenCalled(); + }); + + it('should trigger SQL file order method fetch on file mode click for zip upload type', async () => { + customRender({ + isSupportFileModeExecuteSql: true, + currentSqlUploadType: AuditTaskResV1SqlSourceEnum.zip_file + }); + expect(screen.queryByText('选择上线模式')).toBeInTheDocument(); + + fireEvent.click(screen.getByText('文件模式')); + + expect(getSqlFileOrderMethodSpy).toHaveBeenCalledTimes(1); + + await act(async () => jest.advanceTimersByTime(3000)); + }); +}); diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlFormatterAndSubmitter.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlFormatterAndSubmitter.test.tsx new file mode 100644 index 000000000..64fbe050a --- /dev/null +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlFormatterAndSubmitter.test.tsx @@ -0,0 +1,164 @@ +import { act, fireEvent, renderHook, screen } from '@testing-library/react'; +import { Form, Input } from 'antd'; +import SqlFormatterAndSubmitter from '../components/SqlFormatterAndSubmitter'; +import { SqlFormatterAndSubmitterProps } from '../components/index.type'; +import instance from '../../../../../../testUtils/mockApi/instance'; +import { AuditTaskResV1SqlSourceEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum'; +import { superRender } from '../../../../../../testUtils/customRender'; +import { mockUseCurrentProject } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentProject'; +import { mockProjectInfo } from '@actiontech/shared/lib/testUtil/mockHook/data'; +import { formatterSQL } from '@actiontech/shared/lib/utils/FormatterSQL'; +import { SqlFiledInitialValue } from '../../../../../../data/common'; + +describe('test SqlFormatterAndSubmitter', () => { + let getInstanceSpy: jest.SpyInstance; + const auditActionSpy = jest.fn(); + beforeEach(() => { + getInstanceSpy = instance.getInstance(); + jest.useFakeTimers(); + mockUseCurrentProject(); + }); + afterEach(() => { + jest.useRealTimers(); + jest.clearAllMocks(); + jest.clearAllTimers(); + }); + + const customRender = (params: Partial) => { + const { result } = renderHook(() => Form.useForm()); + + return superRender( +
+ + + + + + ); + }; + + it('renders SqlFormatterAndSubmitter component', () => { + customRender({ + fieldPrefixPath: '1', + currentSqlUploadType: AuditTaskResV1SqlSourceEnum.zip_file + }); + expect(screen.getByText('审 核')).toBeInTheDocument(); + expect(screen.queryByText('SQL美化')).not.toBeInTheDocument(); + }); + + it('renders format button when currentSqlUploadType is form_data', () => { + customRender({ + fieldPrefixPath: '1', + currentSqlUploadType: AuditTaskResV1SqlSourceEnum.form_data + }); + expect(screen.getByText('SQL美化')).toBeInTheDocument(); + }); + + it('calls form.validateFields on submit button click', async () => { + customRender({ + fieldPrefixPath: '1' + }); + + fireEvent.click(screen.getByText('审 核')); + await act(async () => jest.advanceTimersByTime(0)); + expect(auditActionSpy).toHaveBeenCalledTimes(1); + }); + + it('formats SQL when format button is clicked and isSameSqlForAll equal true and instanceName is defined', async () => { + customRender({ isSameSqlForAll: true }); + + fireEvent.change(screen.getByLabelText('sql语句'), { + target: { value: 'select 1' } + }); + const formatButton = screen.getByText('SQL美化'); + fireEvent.click(formatButton); + + expect(getInstanceSpy).toHaveBeenCalledTimes(1); + expect(getInstanceSpy).toHaveBeenCalledWith({ + project_name: mockProjectInfo.projectName, + instance_name: 'mysql-1' + }); + + await act(async () => jest.advanceTimersByTime(3000)); + expect(screen.getByLabelText('sql语句')).toHaveValue( + formatterSQL('select 1', 'MySQL') + ); + }); + + it('formats SQL when format button is clicked and isSameSqlForAll equal true and instanceName is undefined', async () => { + customRender({ isSameSqlForAll: true, databaseInfo: [] }); + + fireEvent.change(screen.getByLabelText('sql语句'), { + target: { value: 'select 1' } + }); + const formatButton = screen.getByText('SQL美化'); + fireEvent.click(formatButton); + + expect(getInstanceSpy).toHaveBeenCalledTimes(0); + + expect(screen.getByLabelText('sql语句')).toHaveValue( + formatterSQL('select 1') + ); + }); + + it('formats SQL when format button is clicked and isSameSqlForAll equal false and instanceName is defined', async () => { + customRender({ + isSameSqlForAll: false, + fieldPrefixPath: '2', + databaseInfo: [ + { key: '1', instanceName: 'mysql-1', schemaName: 'test' }, + { key: '2', instanceName: 'mysql-2', schemaName: 'test' } + ] + }); + + fireEvent.change(screen.getByLabelText('sql语句'), { + target: { value: 'select 1' } + }); + const formatButton = screen.getByText('SQL美化'); + fireEvent.click(formatButton); + + expect(getInstanceSpy).toHaveBeenCalledTimes(1); + expect(getInstanceSpy).toHaveBeenCalledWith({ + project_name: mockProjectInfo.projectName, + instance_name: 'mysql-2' + }); + + await act(async () => jest.advanceTimersByTime(3000)); + expect(screen.getByLabelText('sql语句')).toHaveValue( + formatterSQL('select 1', 'MySQL') + ); + }); + + it('formats SQL when format button is clicked and form_data value is SqlFiledInitialValue', async () => { + customRender({ + isSameSqlForAll: false, + fieldPrefixPath: '2', + databaseInfo: [ + { key: '1', instanceName: 'mysql-1', schemaName: 'test' }, + { key: '2', instanceName: 'mysql-2', schemaName: 'test' } + ] + }); + + fireEvent.change(screen.getByLabelText('sql语句'), { + target: { value: SqlFiledInitialValue } + }); + const formatButton = screen.getByText('SQL美化'); + fireEvent.click(formatButton); + + expect(getInstanceSpy).toHaveBeenCalledTimes(0); + expect(screen.getByLabelText('sql语句')).toHaveValue(SqlFiledInitialValue); + }); +}); diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlUploadContent.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlUploadContent.test.tsx new file mode 100644 index 000000000..76ac9f69b --- /dev/null +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/SqlUploadContent.test.tsx @@ -0,0 +1,40 @@ +import { renderHook } from '@testing-library/react'; +import { Form } from 'antd'; +import SqlUploadContent from '../components/SqlUploadContent'; +import { SqlUploadContentProps } from '../components/index.type'; +import { AuditTaskResV1SqlSourceEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum'; + +describe('test SqlUploadContent', () => { + const customRender = (params: SqlUploadContentProps) => { + const { result } = renderHook(() => Form.useForm()); + + return ( +
+ + + ); + }; + + it('renders SQL upload content based on the current upload type', () => { + expect( + customRender({ + currentSqlUploadType: AuditTaskResV1SqlSourceEnum.form_data, + fieldPrefixPath: '1' + }) + ).toMatchSnapshot(); + + expect( + customRender({ + currentSqlUploadType: AuditTaskResV1SqlSourceEnum.zip_file, + fieldPrefixPath: '1' + }) + ).toMatchSnapshot(); + + expect( + customRender({ + currentSqlUploadType: AuditTaskResV1SqlSourceEnum.audit_plan, + fieldPrefixPath: '1' + }) + ).toMatchSnapshot(); + }); +}); diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/SqlUploadContent.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/SqlUploadContent.test.tsx.snap new file mode 100644 index 000000000..e80c40396 --- /dev/null +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/SqlUploadContent.test.tsx.snap @@ -0,0 +1,109 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`test SqlUploadContent renders SQL upload content based on the current upload type 1`] = ` +
+ + +`; + +exports[`test SqlUploadContent renders SQL upload content based on the current upload type 2`] = ` +
+ + +`; + +exports[`test SqlUploadContent renders SQL upload content based on the current upload type 3`] = ` +
+ + +`; diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/index.ce.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/index.ce.test.tsx.snap new file mode 100644 index 000000000..a9142f6ce --- /dev/null +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/index.ce.test.tsx.snap @@ -0,0 +1,457 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`test SqlStatementFormItem renders SqlStatementFormItem component 1`] = ` +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + 输入SQL语句 + + +
+
+
+
+ + + + + + + + + 上传SQL文件 + + +
+
+
+
+ + + + + + + + + 上传ZIP文件 + +
+ + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + +
+ + + + + +
+ 点击选择zip文件或将文件拖拽到此区域 +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+`; diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/index.test.tsx.snap new file mode 100644 index 000000000..9be6868f6 --- /dev/null +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/__snapshots__/index.test.tsx.snap @@ -0,0 +1,1101 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`test SqlStatementFormItem renders SqlStatementFormItem component 1`] = ` +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + 输入SQL语句 + +
+ + + + + + + +
+
+
+
+
+ + + + + + + + + 上传SQL文件 + + +
+
+
+
+ + + + + + + + + 上传ZIP文件 + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+ + + +
+
+
+
+
+
+
+
+
+ +
+`; + +exports[`test SqlStatementFormItem renders SqlStatementFormItem component 2`] = ` +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + 输入SQL语句 + + +
+
+
+
+ + + + + + + + + 上传SQL文件 + + +
+
+
+
+ + + + + + + + + 上传ZIP文件 + +
+ + + + + + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+ + +
+ + + + + +
+ 点击选择zip文件或将文件拖拽到此区域 +
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + SQL模式 + +
+ + + + + + + +
+
+
+
+
+ + + + + + + + + 文件模式 + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+`; diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.ce.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.ce.test.tsx new file mode 100644 index 000000000..18cf9e87b --- /dev/null +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.ce.test.tsx @@ -0,0 +1,51 @@ +/** + * @test_version ce + */ + +import { mockUseCurrentProject } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentProject'; +import { SqlStatementFormItemProps } from '../index.type'; +import { act, fireEvent, renderHook, screen } from '@testing-library/react'; +import { Form } from 'antd'; +import SqlStatementFormItem from '..'; +import { superRender } from '../../../../../../testUtils/customRender'; +import { getBySelector } from '@actiontech/shared/lib/testUtil/customQuery'; +import { SqlFiledInitialValue } from '../../../../../../data/common'; + +describe('test SqlStatementFormItem', () => { + beforeEach(() => { + mockUseCurrentProject(); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.clearAllTimers(); + }); + + const customRender = (params?: Partial) => { + const { result } = renderHook(() => Form.useForm()); + return superRender( +
+ + + ); + }; + + it('renders SqlStatementFormItem component', () => { + const { container } = customRender(); + + fireEvent.click(screen.getByText('上传ZIP文件')); + + expect(container).toMatchSnapshot(); + expect(screen.queryByText('选择上线模式')).not.toBeInTheDocument(); + }); +}); diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.test.tsx new file mode 100644 index 000000000..14c8b8b76 --- /dev/null +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/__tests__/index.test.tsx @@ -0,0 +1,70 @@ +import { mockUseCurrentProject } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentProject'; +import { SqlStatementFormItemProps } from '../index.type'; +import { act, fireEvent, renderHook, screen } from '@testing-library/react'; +import { Form } from 'antd'; +import SqlStatementFormItem from '..'; +import { superRender } from '../../../../../../testUtils/customRender'; +import { getBySelector } from '@actiontech/shared/lib/testUtil/customQuery'; +import { SqlFiledInitialValue } from '../../../../../../data/common'; + +describe('test SqlStatementFormItem', () => { + beforeEach(() => { + mockUseCurrentProject(); + }); + + afterEach(() => { + jest.clearAllMocks(); + jest.clearAllTimers(); + }); + + const customRender = (params?: Partial) => { + const { result } = renderHook(() => Form.useForm()); + return superRender( +
+ + + ); + }; + + it('renders SqlStatementFormItem component', () => { + const { container } = customRender(); + + expect(container).toMatchSnapshot(); + + fireEvent.click(screen.getByText('上传ZIP文件')); + + expect(container).toMatchSnapshot(); + expect(screen.queryByText('选择上线模式')).toBeInTheDocument(); + }); + + it('resets form fields on upload type change when clearSqlContentFormWhenChangeUploadType is true', async () => { + customRender({ + clearSqlContentFormWhenChangeUploadType: true, + fieldPrefixPath: 'prefix' + }); + + await act(async () => { + fireEvent.input(getBySelector('input.custom-monaco-editor'), { + target: { value: 'SELECT 1' } + }); + }); + + fireEvent.click(screen.getByText('上传SQL文件')); + + fireEvent.click(screen.getByText('输入SQL语句')); + + expect(getBySelector('input.custom-monaco-editor')).toHaveValue( + SqlFiledInitialValue + ); + }); +}); diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlExecModeSelector.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlExecModeSelector.tsx index 1c9d48ad7..ddf927e9d 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlExecModeSelector.tsx +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlExecModeSelector.tsx @@ -19,14 +19,11 @@ import { ResponseCode } from '@actiontech/shared/lib/enum'; const SqlExecModeSelector: React.FC = ({ fieldPrefixPath, - isSupportFileModeExecuteSql + isSupportFileModeExecuteSql, + currentSqlUploadType }) => { const { t } = useTranslation(); const form = Form.useFormInstance(); - const currentSqlUploadType = Form.useWatch( - [fieldPrefixPath, 'currentUploadType'], - form - ) as AuditTaskResV1SqlSourceEnum; const currentExecuteMode = Form.useWatch( [fieldPrefixPath, 'exec_mode'], @@ -60,8 +57,10 @@ const SqlExecModeSelector: React.FC = ({ return ( = ({ isAuditing, auditAction, databaseInfo, - isSameSqlForAll + isSameSqlForAll, + currentSqlUploadType }) => { const { t } = useTranslation(); const { projectName } = useCurrentProject(); const form = Form.useFormInstance(); - const currentSqlUploadType = Form.useWatch( - [fieldPrefixPath, 'currentUploadType'], - form - ) as AuditTaskResV1SqlSourceEnum; const [ formatterLoading, @@ -54,8 +51,9 @@ const SqlFormatterAndSubmitter: React.FC = ({ }; const originSql = form.getFieldValue([fieldPrefixPath, 'form_data']); const instanceName = isSameSqlForAll - ? databaseInfo[0].instanceName + ? databaseInfo?.[0]?.instanceName : databaseInfo.find((v) => v.key === fieldPrefixPath)?.instanceName; + if (originSql && originSql !== SqlFiledInitialValue) { if (instanceName) { const dbType = (await getInstanceType(instanceName))?.db_type; diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlUploadContent.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlUploadContent.tsx index dde319a58..8c607aacd 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlUploadContent.tsx +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/SqlUploadContent.tsx @@ -1,7 +1,7 @@ import { Form } from 'antd'; import { SqlUploadContentProps } from './index.type'; import { SqlAuditInfoFormFields } from '../../../../Create/index.type'; -import { CustomDraggerUpload, EmptyBox } from '@actiontech/shared'; +import { CustomDraggerUpload, LazyLoadComponent } from '@actiontech/shared'; import { AuditTaskResV1SqlSourceEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum'; import { FormItemNoLabel } from '@actiontech/shared/lib/components/FormCom'; import { getFileFromUploadChangeEvent } from '@actiontech/shared/lib/utils/Common'; @@ -15,14 +15,11 @@ import { import { NamePath } from 'antd/es/form/interface'; const SqlUploadContent: React.FC = ({ - fieldPrefixPath + fieldPrefixPath, + currentSqlUploadType }) => { const { t } = useTranslation(); const form = Form.useFormInstance(); - const currentSqlUploadType = Form.useWatch( - [fieldPrefixPath, 'currentUploadType'], - form - ) as AuditTaskResV1SqlSourceEnum; const generateFieldName = (name: string) => { return [fieldPrefixPath, name]; @@ -38,20 +35,24 @@ const SqlUploadContent: React.FC = ({ return ( <> - = ({ }} /> - - + = ({ title={t('execWorkflow.create.form.sqlInfo.sqlFileTips')} /> - - + = ({ title={t('execWorkflow.create.form.sqlInfo.zipFileTips')} /> - + ); }; diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts index cac64a38e..c186d8ddf 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/components/index.type.ts @@ -1,16 +1,20 @@ +import { AuditTaskResV1SqlSourceEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum'; import { SqlStatementFormItemProps } from '../index.type'; -export type SqlUploadContentProps = Pick< - SqlStatementFormItemProps, - 'fieldPrefixPath' ->; +export type SqlUploadContentProps = { + currentSqlUploadType: AuditTaskResV1SqlSourceEnum; +} & Pick; -export type SqlExecModeSelectorProps = Pick< +export type SqlExecModeSelectorProps = { + currentSqlUploadType: AuditTaskResV1SqlSourceEnum; +} & Pick< SqlStatementFormItemProps, 'fieldPrefixPath' | 'isSupportFileModeExecuteSql' >; -export type SqlFormatterAndSubmitterProps = Pick< +export type SqlFormatterAndSubmitterProps = { + currentSqlUploadType: AuditTaskResV1SqlSourceEnum; +} & Pick< SqlStatementFormItemProps, | 'fieldPrefixPath' | 'isAuditing' diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx index 63dbdc4c5..ce8195f3f 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/SqlStatementFormItem/index.tsx @@ -32,6 +32,11 @@ const SqlStatementFormItem: React.FC = ({ return [fieldPrefixPath, 'currentUploadType']; }, [fieldPrefixPath]); + const currentUploadType = Form.useWatch( + currentUploadTypeFieldName, + form + ) as AuditTaskResV1SqlSourceEnum; + const uploadTypeChangeHandle = () => { if (clearSqlContentFormWhenChangeUploadType) { form.resetFields([ @@ -66,14 +71,21 @@ const SqlStatementFormItem: React.FC = ({ /> - + + {/* #if [ee] */} + {/* #endif */} +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + + + + 输入SQL语句 + +
+ + + + + + + +
+
+
+
+
+ + + + + + + + + 上传SQL文件 + + +
+
+
+
+ + + + + + + + + 上传ZIP文件 + + +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+ +
+
+ + + +
+
+
+
+
+
+
+
+
+ +
+`; diff --git a/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/__snapshots__/index.test.tsx.snap new file mode 100644 index 000000000..2150977ab --- /dev/null +++ b/packages/sqle/src/page/SqlExecWorkflow/Common/SqlStatementFormController/__tests__/__snapshots__/index.test.tsx.snap @@ -0,0 +1,1350 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`test SqlStatementFormController matches snapshot with different SQL mode and data sources 1`] = ` +
+
+
+
+ + +
+
+
+
-
+ + + +
+
+

+ 审核SQL语句信息 +

+
- xin-test-database(10.186.62.15:33063) +
-
-
- mysql-5(139.196.241.182:33061) -
-
-
-
- - - PostgreSQL -
-
+
+
+
- progres-1(10.186.62.16:5432) -
-
-
-
-
- -
-
-
-
-
-
-
- - - - - - - - - - - - -
-
-
-
-
-
-
- testSchema -
-
-
-
- dms -
-
-
-
- sqle -
-
-
-
- test123 -
-
-
-
- test -
-
-
-
-
-
-
-
-
-
- -`; - -exports[`sqle/SqlExecWorkflow/Create render create workflow when task info list is null 2`] = ` - - - - - 13 / 3000 - - - -
-
-
-
-
- - - -
-
-

- 审核SQL语句信息 -

-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
+
+
- +
+ +
@@ -3674,7 +2869,7 @@ exports[`sqle/SqlExecWorkflow/Create render create workflow when task info list
@@ -3797,7 +3018,64 @@ exports[`sqle/SqlExecWorkflow/Create render create workflow when task info list
+ > + +
- - + + 100 + % + @@ -3857,7 +3140,11 @@ exports[`sqle/SqlExecWorkflow/Create render create workflow when task info list
- - + + 100 + @@ -3867,7 +3154,22 @@ exports[`sqle/SqlExecWorkflow/Create render create workflow when task info list
+ > +
+ + dms + + + Schema + +
+
+
+
+
+
+
+
+ + + + + + + + + + + + +
+
+
+ + + -
- -
-
-
- - - - - - - - - - - - -
-
- -
-
-
-
-
- -
- - - MySQL - -
-
-
-
-
- mysql-1(10.186.62.13:33061) -
-
- -
-
-
-
-
-
-
- - - - - - - - - - - - -
-
-
-
-
-
-
- testSchema -
-
-
-
- dms -
-
-
-
- sqle -
-
-
-
- test123 -
-
-
-
- test + test
-
-
+ + + + + 2023-12-18 + +
-
-
- - - -
-
-

- 审核SQL语句信息 -

-
-
-
- -
-
-
-
-
-
-
-
-
-
- - - - - - - - - - - - - - - -
+ workflow desc + -
+
-
+
-
-
-
- -
-
+
+ +
+
+
+ +
+
+
-
-
- -
-
-
-
-
-
+
+
- -
-
- -
-
-
-
-
-
-
-
-
+
+ +
+
+ +
+
+
+
+
+
+
-
- -
-
-
- + +
+
-
-
-
-
- -
-
-
-
+
+
+ class="ant-col ant-form-item-label ant-form-item-label-left css-dev-only-do-not-override-txh9fw" + > + +
+
+
+
+
+
-
-
-
-
-
-
+
+
- - - - - - - - - 输入SQL语句 -
- - - - - - - -
-
-
-
-
- - - + + + + + - - - - - - 上传SQL文件 - + 输入SQL语句 + +
+ + + + + + + +
+
+
-
-
-
-
- - - + + + + + - - - - - - 上传ZIP文件 - + 上传SQL文件 + + +
+
@@ -13413,130 +11247,134 @@ exports[`sqle/SqlExecWorkflow/Create render form for click audit btn for diff sa
-
-
-
-
-
-
- +
+
+
+
+
+ +
+
+
-
-
-
-
-
-
+
+
- -
-
- - - + +
+
+ + + +
+
@@ -13545,1781 +11383,915 @@ exports[`sqle/SqlExecWorkflow/Create render form for click audit btn for diff sa
-
+
- - - +
+
+
-
-
+ +
+ +`; + +exports[`sqle/SqlExecWorkflow/Create should handle form submission and audit action for different SQLs 4`] = ` + + + + + 13 / 3000 + + + +
+
- -
-
-
-
+ + + +
-
-
- 全部等级 -
-
- 普通(Normal) -
-
- 提示(Notice) -
-
- 告警(Warning) -
-
- 错误(Error) -
-
-
-
-
- - 100 - % - - - 审核通过率 - -
-
-
-
- - 100 - - - 审核结果评分 - -
-
+ 审核SQL语句信息 +
- - dms - - + + + + + + + + 数据源 + + +
+
- Schema - +
+
+
+
-
-
-
-
- - - - - - - - - - - - - - - - - - + +
+
-
- - - - - - - + + + + + + + + + + +
+
+
+
+
+
+
+
-
- - - - - - -
- 序号 - - 执行语句 - - 审核结果 - - 说明 - - 操作 -
+ + + + +
+
+
+
-
    -
  • - - 共 1 条数据 - -
  • -
  • - -
  • -
  • - - 1 - -
  • -
  • - -
  • -
+
+
- - -
-
-
- -
- +
+
+
+
+
-
- 工单创建成功 -
-
- workflow desc -
- -
- -
-
-
-
-
-
-
- - - - - - - - - - - - -
-
- -
-
-
-
-
-
- - - MySQL - + mysql-2-sqle
-
-
-
-
- mysql-1(10.186.62.13:33061) -
-
-
-
- mysql-2(10.186.62.14:33062) -
-
-
-
- xin-test-database(10.186.62.15:33063) -
-
+
+
- mysql-5(139.196.241.182:33061) -
-
-
-
- - - PostgreSQL - + + + + + + + + 选择SQL语句上传方式 + + +
+
+
+
+
- -
-
-
- progres-1(10.186.62.16:5432) -
-
-
-
-
- -
-
-
-
-
-
-
- - - - - - - - - - - - -
-
-
-
-
-
-
- testSchema -
-
-
-
- dms
-
- sqle -
-
-
-
- test123 -
-
-
-
- test -
-
-
-
-
-
-
-
-
-
- -`; - -exports[`sqle/SqlExecWorkflow/Create render form for click audit btn for diff same sql 3`] = ` - - - - - 13 / 3000 - - - + +
- - - -
-
-

- 审核SQL语句信息 -

-
- -
-
-
-
-
-
-
-
-
-
-
-
- - - - - - - - - - - + + -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- - sqle -
- - - - - - - -
- -
+
- - - - - + + +
+
@@ -15749,7157 +12680,1863 @@ exports[`sqle/SqlExecWorkflow/Create render form for click audit btn for diff sa
-
+
+
+ + +
+
+ +
+
+
+ +
+
+ +
+
+
+
+
+
+ workflow_name_2 +
+
+ workflow desc +
+
+
+
+
+
+
+ +
+
+
+
- + 数据去重
+
+ -
-
- -
-
-
+ + +
- - - -
-
-
- -
-
+ 下载 +
- + +
+ +
+ + +
+
+
+ 全部等级 +
+
+ 普通(Normal) +
+
+ 提示(Notice) +
+
+ 告警(Warning) +
+
+ 错误(Error) +
+
+
+
+
+ + 100 + % + + + 审核通过率 +
- + 100 + + + 审核结果评分 +
-
+
-
-
- -
-
-
-
-
-
-
+ dms + + + Schema +
+
+
+
+
+
+
-
-
-
-
+ + + + + + + -
+ + 序号 + + + 执行语句 + + + 审核结果 + + + 说明 + + + 操作 + + + + + -
- + + +
+   +
+ + +
+   +
+ + +
+   +
+ + +
+   +
+ + + + + 1 + + +
+
+ + + SELECT + + + + 1 + + ; + +
+
- - - 输入SQL语句 - +
+
+ + +
- - - - + - - - + + + + test message + +
-
-
+
- - +
- +
-
-
+
- - - - - - - - - 上传ZIP文件 -
-
-
-
-
+ + + +
-
-
-
-
-
+ 共 1 条数据 + + +
  • +
  • -
    -
    -
    -
    + + + +
  • -
    -
    + 1 + +
  • +
  • + +
  • +
  • -
    -
    -
    - -
    -
    -
    -
    - -
    -
    - - - -
    -
    -
    -
    -
    + + + + 20 / page +
    +
    -
  • -
    + +
    - - +
    +
    -
    -
    +
    +
    +
    +
    +
    + + + - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    + + + + + + +
    -
    -
    +
    -
    -
    -
    +
    - 数据去重 +
    + mysql-2(10.186.62.14:33062) +
    +
    -
    -
    -
    -
    +
    +
    + mysql-5(139.196.241.182:33061) +
    +
    +
    +
    - - - - - -
    -
    - 下载 -
    -
    + - - - + PostgreSQL
    +
    +
    +
    +
    + progres-1(10.186.62.16:5432)
    - +
    +
    +
    +
    +
    +
    +
    +
    + + + + + -
    - 全部等级 -
    -
    - 普通(Normal) -
    -
    - 提示(Notice) -
    -
    - 告警(Warning) -
    -
    - 错误(Error) -
    -
    -
    + + + + + + +
    +
    +
    +
    - - 100 - % - + testSchema +
    - 审核通过率 - + aria-hidden="true" + class="ant-select-item-option-state" + style="user-select: none;" + unselectable="on" + />
    -
    -
    - - 100 - + dms +
    - 审核结果评分 - + aria-hidden="true" + class="ant-select-item-option-state" + style="user-select: none;" + unselectable="on" + />
    -
    -
    +
    + sqle +
    +
    +
    - dms - + test123 +
    +
    +
    - Schema - + test +
    +
    +
    +
    +
    +
    + +
    +
    + - -
    -
    -
    -
    -
    - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    - -
    - - - MySQL - -
    -
    -
    -
    -
    - mysql-1(10.186.62.13:33061) -
    -
    -
    -
    - mysql-2(10.186.62.14:33062) -
    -
    -
    -
    - xin-test-database(10.186.62.15:33063) -
    -
    -
    -
    - mysql-5(139.196.241.182:33061) -
    -
    -
    - -
    - - - PostgreSQL - -
    -
    -
    -
    -
    - progres-1(10.186.62.16:5432) -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -
    - testSchema -
    -
    -
    -
    - dms -
    -
    -
    -
    - sqle -
    -
    -
    -
    - test123 -
    -
    -
    -
    - test -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    - - - -
    -
    -

    - 审核SQL语句信息 -

    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - sqle - -
    - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - 输入SQL语句 - -
    - - - - - - - -
    -
    -
    -
    -
    - - - - - - - - - 上传SQL文件 - - -
    -
    -
    -
    - - - - - - - - - 上传ZIP文件 - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    - workflow_name_2 -
    -
    - workflow desc -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - 数据去重 -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    - 全部等级 -
    -
    - 普通(Normal) -
    -
    - 提示(Notice) -
    -
    - 告警(Warning) -
    -
    - 错误(Error) -
    -
    -
    -
    -
    - - 100 - % - - - 审核通过率 - -
    -
    -
    -
    - - 100 - - - 审核结果评分 - -
    -
    -
    -
    - - dms - - - Schema - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - 序号 - - 执行语句 - - 审核结果 - - 说明 - - 操作 -
    - 1 - -
    -
    - - - SELECT - - - - 1 - - ; - -
    -
    - - - -
    -
    -
    -
    -
    -
    - - - - - - - test message - -
    -
    -
    -
    -
    - test -
    - - - - - -
    - - -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
      -
    • - - 共 1 条数据 - -
    • -
    • - -
    • -
    • - - 1 - -
    • -
    • - -
    • -
    • - -
    • -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    - -
    - - - MySQL - -
    -
    -
    -
    -
    - mysql-1(10.186.62.13:33061) -
    -
    -
    -
    - mysql-2(10.186.62.14:33062) -
    -
    -
    -
    - xin-test-database(10.186.62.15:33063) -
    -
    -
    -
    - mysql-5(139.196.241.182:33061) -
    -
    -
    - -
    - - - PostgreSQL - -
    -
    -
    -
    -
    - progres-1(10.186.62.16:5432) -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -
    - testSchema -
    -
    -
    -
    - dms -
    -
    -
    -
    - sqle -
    -
    -
    -
    - test123 -
    -
    -
    -
    - test -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - -
    -
    -

    - 审核SQL语句信息 -

    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    + + 审核结果 + + + 说明 + + + 操作 + + + + - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    + + - - sqle - +   +
    + +
    - + + +
    +   +
    + + + + + 1 + + +
    +
    - - - + + SELECT + + + + 1 + + ; + +
    +
    + + +
    +
    + + +
    +
    +
    - - - - - + + - - +
    +
    - - -
    -
    -
    -
    -
    +
    + + +
    +
    +
    + +
    +
    +
    + + + +
    -
    - -
    -
    -
    + 共 1 条数据 + + +
  • + -
  • -
    -
    -
    - + +
  • - - - - - - -
  • -
    -
    -
    -
    -
    -
    + +
  • -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
  • -
    -
    -
    -
    -
    - -
    -
    + + + + +
  • - + + + 20 / page +
    -
    -
  • -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    - +
    -
    -
    -
    -
    + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    + +
    + + + MySQL +
    +
    +
    +
    +
    + mysql-1(10.186.62.13:33061) +
    +
    +
    +
    + mysql-2(10.186.62.14:33062)
    +
    + xin-test-database(10.186.62.15:33063) +
    +
    +
    +
    + mysql-5(139.196.241.182:33061) +
    +
    +
    +
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - 输入SQL语句 - -
    - - - - - - - -
    -
    -
    -
    -
    - - - - - - - - - 上传SQL文件 - - -
    -
    -
    -
    - - - - - - - - - 上传ZIP文件 - - -
    -
    -
    -
    -
    + PostgreSQL +
    -
    +
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    + progres-1(10.186.62.16:5432)
    +
    - - - -
    -
    -
    -
    +
    +
    +
    +
    +
    +
    + + + -
    - workflow_name_2 -
    -
    - workflow desc -
    -
    -
    +
    +
    +
    +
    + +`; + +exports[`sqle/SqlExecWorkflow/Create should handle form submission and audit action for different SQLs 2`] = ` + + + + + 13 / 3000 + + + +
    +
    + - - - - - - - - - -
    + +
    +
    -
    -

    - 审核SQL语句信息 -

    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - sqle - -
    - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - 输入SQL语句 - -
    - - - - - - - -
    -
    -
    -
    -
    - - - - - - - - - 上传SQL文件 - - -
    -
    -
    -
    - - - - - - - - - 上传ZIP文件 - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    - -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    - workflow_name_2 -
    -
    - workflow desc -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - 数据去重 -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    - 全部等级 -
    -
    - 普通(Normal) -
    -
    - 提示(Notice) -
    -
    - 告警(Warning) -
    -
    - 错误(Error) -
    -
    -
    -
    -
    - - 100 - % - - - 审核通过率 - -
    -
    -
    -
    - - 100 - - - 审核结果评分 - -
    -
    -
    -
    - - dms - - - Schema - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - 序号 - - 执行语句 - - 审核结果 - - 说明 - - 操作 -
    - 1 - -
    -
    - - - SELECT - - - - 1 - - ; - -
    -
    - - - -
    -
    -
    -
    -
    -
    - - - - - - - test message - -
    -
    -
    -
    -
    - test -
    - - - - - -
    - - -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
      -
    • - - 共 1 条数据 - -
    • -
    • - -
    • -
    • - - 1 - -
    • -
    • - -
    • -
    • - -
    • -
    -
    -
    -
    -
    -
    - - - -
    -
    -
    - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    - -
    - - - MySQL - -
    -
    -
    -
    -
    - mysql-1(10.186.62.13:33061) -
    -
    -
    -
    - mysql-2(10.186.62.14:33062) -
    -
    -
    -
    - xin-test-database(10.186.62.15:33063) -
    -
    -
    -
    - mysql-5(139.196.241.182:33061) -
    -
    -
    - -
    - - - PostgreSQL - -
    -
    -
    -
    -
    - progres-1(10.186.62.16:5432) -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -
    - testSchema -
    -
    -
    -
    - dms -
    -
    -
    -
    - sqle -
    -
    -
    -
    - test123 -
    -
    -
    -
    - test -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    - - - -
    -
    -

    - 审核SQL语句信息 -

    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - sqle - -
    - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - 输入SQL语句 - -
    - - - - - - - -
    -
    -
    -
    -
    - - - - - - - - - 上传SQL文件 - - -
    -
    -
    -
    - - - - - - - - - 上传ZIP文件 - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    - workflow_name_2 -
    -
    - workflow desc -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - 数据去重 -
    -
    -
    - -
    - -
    -
    -
    -
    -
    -
    - 全部等级 -
    -
    - 普通(Normal) -
    -
    - 提示(Notice) -
    -
    - 告警(Warning) -
    -
    - 错误(Error) -
    -
    -
    -
    -
    - - 100 - % - - - 审核通过率 - -
    -
    -
    -
    - - 100 - - - 审核结果评分 - -
    -
    -
    -
    - - dms - - - Schema - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - 序号 - - 执行语句 - - 审核结果 - - 说明 - - 操作 -
    - 1 - -
    -
    - - - SELECT - - - - 1 - - ; - -
    -
    - - - -
    -
    -
    -
    -
    -
    - - - - - - - test message - -
    -
    -
    -
    -
    - test -
    - - - - - -
    - - -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
      -
    • - - 共 1 条数据 - -
    • -
    • - -
    • -
    • - - 1 - -
    • -
    • - -
    • -
    • - -
    • -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    - 工单创建成功 -
    -
    - workflow desc -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    - -
    - - - MySQL - -
    -
    -
    -
    -
    - mysql-1(10.186.62.13:33061) -
    -
    -
    -
    - mysql-2(10.186.62.14:33062) -
    -
    -
    -
    - xin-test-database(10.186.62.15:33063) -
    -
    -
    -
    - mysql-5(139.196.241.182:33061) -
    -
    -
    - -
    - - - PostgreSQL - -
    -
    -
    -
    -
    - progres-1(10.186.62.16:5432) -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -
    - testSchema -
    -
    -
    -
    - dms -
    -
    -
    -
    - sqle -
    -
    -
    -
    - test123 -
    -
    -
    -
    - test -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    - - - -
    -
    -

    - 审核SQL语句信息 -

    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - - - - - - - -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - sqle - -
    - - - - - - - - - - - - - - - -
    - - -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - - - - - - - 输入SQL语句 - -
    - - - - - - - -
    -
    -
    -
    -
    - - - - - - - - - 上传SQL文件 - - -
    -
    -
    -
    - - - - - - - - - 上传ZIP文件 - - -
    -
    -
    -
    -
    -
    -
    -
    -
    + + + + + + + + + + + + + + + + + + + + + -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    -
    -
    -
    + + + + + + + + + -
    -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    - -
    -
    - - - -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    + + + + + +
    +
    + 工单创建成功 +
    +
    + workflow desc +
    + +
    @@ -20949,439 +8862,96 @@ exports[`sqle/SqlExecWorkflow/Create should prevent workflow creation when task />
    -
    - test -
    -
    - - - - - - - - - -`; - -exports[`sqle/SqlExecWorkflow/Create should prevent workflow creation when task SQL list is empty 2`] = ` - - - - - 13 / 3000 - - - - - - - - - - - -
    -
    -

    - 审核SQL语句信息 -

    -
    -
    - -
    -
    -
    -
    -
    + test
    +
    +
    + + + + + + +
    +
    +
    - - - -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    -
    -
    -
    -
    - workflow_name_2 -
    -
    - workflow desc -
    -
    -
    -
    -
    -
    - -
    -
    -
    -
    -
    - 数据去重 -
    -
    -
    - -
    -
    -
    -
    -
    -
    - 全部等级 -
    -
    - 普通(Normal) -
    -
    - 提示(Notice) -
    -
    - 告警(Warning) -
    -
    - 错误(Error) -
    -
    -
    -
    -
    - - - - 审核通过率 - -
    -
    -
    -
    - - - - 审核结果评分 - -
    -
    -
    -
    -
    -
    -
    -
    -
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    - - - - - - - - - - - - - - - - - - + + + + + + 选择SQL语句上传方式 + + + +
    +
    +
    +
    +
    +
    + +
    +
    +
    -
    + +
    +
    -
    - - - - - - + + + + +
    +
    +
    +
    - - -
    - 序号 - - 执行语句 - +
    + + + + + + + + 选择相同SQL + +
    +
    - 审核结果 -
    + + + +
    +
    +
    +
    + + + + + + + + + + +
    +
    + +
    +
    +
    +
    +
    +
    +
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - - - -
    -
    -
    - - - - - - - - - - - - -
    -
    - -
    -
    -
    -
    -
    - +
    + + + + + + + + 选择上线模式 + +
    +
    + 当选择文件模式上线时,审核结果将以文件为单位进行聚合展示 +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    - - - MySQL - +
    +
    +
    +
    +
    +
    +
    +
    + + + + + + + + + SQL模式 + +
    + + + + + + + +
    +
    +
    +
    +
    + + + + + + + + + 文件模式 + + +
    +
    +
    +
    +
    +
    +
    - -
    -
    -
    - mysql-1(10.186.62.13:33061) -
    -
    -
    -
    - mysql-2(10.186.62.14:33062) -
    -
    -
    -
    - xin-test-database(10.186.62.15:33063) -
    -
    -
    -
    - mysql-5(139.196.241.182:33061) -
    -
    -
    -
    - - - PostgreSQL - +
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    - -
    -
    -
    - progres-1(10.186.62.16:5432) -
    -
    -
    -
    -
    - -
    - - - -
    -
    -
    - - - - - - - - - - - - -
    -
    -
    -
    -
    -
    -
    - testSchema -
    -
    -
    -
    - dms -
    -
    -
    -
    - sqle -
    -
    -
    -
    - test123 -
    -
    -
    -
    - test
    -
    +
    +
    @@ -29443,42 +16997,6 @@ from `; exports[`sqle/SqlExecWorkflow/Create should snapshot render initial workflow creation UI 1`] = ` - - 创建工单 - -`; - -exports[`sqle/SqlExecWorkflow/Create should snapshot render initial workflow creation UI 2`] = ` - - 返回工单列表 - -`; - -exports[`sqle/SqlExecWorkflow/Create should snapshot render initial workflow creation UI 3`] = ` - - 重 置 - -`; - -exports[`sqle/SqlExecWorkflow/Create should snapshot render initial workflow creation UI 4`] = ` - -`; - -exports[`sqle/SqlExecWorkflow/Create should snapshot render initial workflow creation UI 5`] = ` -

    - 审核SQL语句信息 -

    -`; - -exports[`sqle/SqlExecWorkflow/Create should snapshot render initial workflow creation UI 6`] = `
    { - const projectName = mockProjectInfo.projectName; - let RequestCreateWorkflow: jest.SpyInstance; - let requestAudit: jest.SpyInstance; - let requestAuditTask: jest.SpyInstance; - - let requestInstanceTip: jest.SpyInstance; - let requestInstanceSchemas: jest.SpyInstance; - let requestInstance: jest.SpyInstance; - const customRender = () => { return superRender(); }; @@ -46,12 +35,7 @@ describe('sqle/SqlExecWorkflow/Create ce', () => { mockUseCurrentProject(); mockUseCurrentUser(); execWorkflow.mockAllApi(); - RequestCreateWorkflow = execWorkflow.createWorkflow(); - requestInstanceTip = instance.getInstanceTipList(); - requestInstanceSchemas = instance.getInstanceSchemas(); - requestInstance = instance.getInstance(); - requestAudit = execWorkflow.createAndAuditTask(); - requestAuditTask = execWorkflow.createAuditTasks(); + instance.getInstanceTipList(); }); afterEach(() => { @@ -64,168 +48,8 @@ describe('sqle/SqlExecWorkflow/Create ce', () => { it('should snapshot render initial workflow creation UI', async () => { const { baseElement } = customRender(); - expect(screen.getByText('创建工单')).toMatchSnapshot(); - expect(screen.getAllByText('返回工单列表')[0]).toMatchSnapshot(); - expect(screen.getByText('重 置')).toMatchSnapshot(); - expect(screen.getByText('工单描述')).toMatchSnapshot(); - expect(screen.getByText('审核SQL语句信息')).toMatchSnapshot(); - - expect(baseElement).toMatchSnapshot(); - }); - - it('should reset form fields and snapshot UI after reset action', async () => { - const { baseElement } = customRender(); - - // workflow_subject - const workflowName = getBySelector('#workflow_subject', baseElement); - fireEvent.change(workflowName, { - target: { - value: 'workflow_name_1' - } - }); - await act(async () => jest.advanceTimersByTime(300)); - - // change upload type - fireEvent.click(screen.getByText('上传SQL文件')); - await act(async () => jest.advanceTimersByTime(500)); - - expect(baseElement).toMatchSnapshot(); - - fireEvent.click(screen.getByText('重 置')); - await act(async () => jest.advanceTimersByTime(500)); - expect(baseElement).toMatchSnapshot(); - }); - - it('should snapshot UI and perform SQL audit in the same mode', async () => { - const { baseElement } = customRender(); - - await act(async () => jest.advanceTimersByTime(3300)); - expect(requestInstanceTip).toHaveBeenCalled(); - expect(requestInstanceTip).toHaveBeenCalledWith({ - functional_module: - getInstanceTipListV1FunctionalModuleEnum.create_workflow, - project_name: projectName - }); - expect(baseElement).toMatchSnapshot(); - - const instanceNameEle = getBySelector( - '#databaseInfo_0_instanceName', - baseElement - ); - fireEvent.mouseDown(instanceNameEle); - await act(async () => jest.advanceTimersByTime(600)); - const instanceNameLabel = `${instanceTipsMockData[0].instance_name}(${instanceTipsMockData[0].host}:${instanceTipsMockData[0].port})`; - expect(screen.getByText(instanceNameLabel)).toBeInTheDocument(); - await act(async () => { - fireEvent.click(getBySelector(`div[title="${instanceNameLabel}"]`)); - await act(async () => jest.advanceTimersByTime(3300)); - }); - expect(requestInstanceSchemas).toHaveBeenCalled(); - expect(requestInstanceSchemas).toHaveBeenCalledWith({ - instance_name: instanceTipsMockData[0].instance_name, - project_name: projectName - }); - await act(async () => jest.advanceTimersByTime(3300)); - expect(requestInstance).toHaveBeenCalled(); - expect(requestInstance).toHaveBeenCalledWith({ - instance_name: instanceTipsMockData[0].instance_name, - project_name: projectName - }); - const SchemaNameEle = getBySelector( - '#databaseInfo_0_instanceSchema', - baseElement - ); - fireEvent.mouseDown(SchemaNameEle); - await act(async () => jest.advanceTimersByTime(600)); - await act(async () => { - fireEvent.click(getBySelector(`div[title="test123"]`)); - await act(async () => jest.advanceTimersByTime(300)); - }); - expect(baseElement).toMatchSnapshot(); - - // SQL美化 - const monacoEditor = getBySelector('.custom-monaco-editor', baseElement); - fireEvent.change(monacoEditor, { - target: { - value: 'select * from user.list join in all' - } - }); - await act(async () => jest.advanceTimersByTime(300)); - fireEvent.click(screen.getByText('SQL美化')); - await act(async () => jest.advanceTimersByTime(3300)); - expect(requestInstance).toHaveBeenCalled(); expect(baseElement).toMatchSnapshot(); - }); - - it('should handle form submission and audit action for different SQLs', async () => { - const { baseElement } = customRender(); - - await act(async () => jest.advanceTimersByTime(3300)); - expect(requestInstanceTip).toHaveBeenCalled(); - - // workflow_subject - const workflowName = getBySelector('#workflow_subject', baseElement); - fireEvent.change(workflowName, { - target: { - value: 'workflow_name_3' - } - }); - await act(async () => jest.advanceTimersByTime(300)); - - const instanceNameEle = getBySelector( - '#databaseInfo_0_instanceName', - baseElement - ); - fireEvent.mouseDown(instanceNameEle); - await act(async () => jest.advanceTimersByTime(600)); - const instanceNameLabel = `${instanceTipsMockData[2].instance_name}(${instanceTipsMockData[2].host}:${instanceTipsMockData[2].port})`; - expect(screen.getByText(instanceNameLabel)).toBeInTheDocument(); - await act(async () => { - fireEvent.click(getBySelector(`div[title="${instanceNameLabel}"]`)); - await act(async () => jest.advanceTimersByTime(3300)); - }); - expect(requestInstanceSchemas).toHaveBeenCalled(); - await act(async () => jest.advanceTimersByTime(3300)); - expect(requestInstance).toHaveBeenCalled(); - const SchemaNameEle = getBySelector( - '#databaseInfo_0_instanceSchema', - baseElement - ); - fireEvent.mouseDown(SchemaNameEle); - await act(async () => jest.advanceTimersByTime(600)); - await act(async () => { - fireEvent.click(getBySelector(`div[title="test"]`)); - await act(async () => jest.advanceTimersByTime(300)); - }); - - // 上传SQL文件 - fireEvent.click(screen.getByText('上传SQL文件')); - await act(async () => jest.advanceTimersByTime(300)); - const sqlFile = new File( - [new Blob(['this is sql info'], { type: 'file/sql' })], - 'test.sql' - ); - // 0_sqlFile - fireEvent.change( - getBySelector('.ant-upload input[type=file]', baseElement), - { - target: { files: [sqlFile] } - } - ); - await act(async () => jest.advanceTimersByTime(2000)); - // audit btn - await act(async () => { - fireEvent.click(screen.getByText('审 核')); - await act(async () => jest.advanceTimersByTime(600)); - }); - expect(requestAuditTask).toHaveBeenCalled(); - expect(requestAuditTask).toHaveBeenCalledWith({ - instances: [ - { instance_name: 'xin-test-database', instance_schema: 'test' } - ], - project_name: projectName - }); - await act(async () => jest.advanceTimersByTime(3300)); + expect(screen.queryByText('添加数据源')).not.toBeInTheDocument(); }); }); diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/index.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/index.test.tsx index b93124392..bf2cad92b 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/index.test.tsx +++ b/packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/index.test.tsx @@ -22,6 +22,7 @@ import { UtilsConsoleErrorStringsEnum, ignoreConsoleErrors } from '@actiontech/shared/lib/testUtil/common'; +import { formatterSQL } from '@actiontech/shared/lib/utils/FormatterSQL'; describe('sqle/SqlExecWorkflow/Create', () => { const projectName = mockProjectInfo.projectName; @@ -77,11 +78,11 @@ describe('sqle/SqlExecWorkflow/Create', () => { it('should snapshot render initial workflow creation UI', async () => { const { baseElement } = customRender(); - expect(screen.getByText('创建工单')).toMatchSnapshot(); - expect(screen.getAllByText('返回工单列表')[0]).toMatchSnapshot(); - expect(screen.getByText('重 置')).toMatchSnapshot(); - expect(screen.getByText('工单描述')).toMatchSnapshot(); - expect(screen.getByText('审核SQL语句信息')).toMatchSnapshot(); + expect(screen.getByText('创建工单')).toBeInTheDocument(); + expect(screen.getByText('返回工单列表')).toBeInTheDocument(); + expect(screen.getByText('重 置')).toBeInTheDocument(); + expect(screen.getByText('工单描述')).toBeInTheDocument(); + expect(screen.getByText('审核SQL语句信息')).toBeInTheDocument(); expect(baseElement).toMatchSnapshot(); }); @@ -229,8 +230,18 @@ describe('sqle/SqlExecWorkflow/Create', () => { fireEvent.click(screen.getByText('审 核')); await act(async () => jest.advanceTimersByTime(0)); expect(requestAuditTask).toHaveBeenCalledTimes(1); + expect(requestAuditTask).toHaveBeenCalledWith({ + exec_mode: undefined, + file_order_method: undefined, + instances: [{ instance_name: 'mysql-1', instance_schema: 'test123' }], + project_name: projectName + }); await act(async () => jest.advanceTimersByTime(3000)); expect(auditTaskGroupId).toHaveBeenCalledTimes(1); + expect(auditTaskGroupId).toHaveBeenCalledWith({ + task_group_id: 99, + sql: formatterSQL('select * from user.list join in all', 'MySQL') + }); await act(async () => jest.advanceTimersByTime(3000)); expect(baseElement).toMatchSnapshot(); @@ -294,15 +305,13 @@ describe('sqle/SqlExecWorkflow/Create', () => { fireEvent.click(screen.getByText('审 核')); await act(async () => jest.advanceTimersByTime(300)); }); - expect(screen.getByText('审 核').parentNode).toHaveClass('ant-btn-loading'); - expect(baseElement).toMatchSnapshot(); + expect(screen.getByText('审 核').closest('button')).toHaveClass( + 'ant-btn-loading' + ); await act(async () => jest.advanceTimersByTime(3000)); - expect(requestAudit).toHaveBeenCalled(); - expect(requestAudit).toHaveBeenCalledWith({ + expect(requestAudit).toHaveBeenCalledTimes(1); + expect(requestAudit).toHaveBeenNthCalledWith(1, { exec_mode: undefined, - input_mybatis_xml_file: undefined, - input_sql_file: undefined, - input_zip_file: undefined, instance_name: 'mysql-2', instance_schema: 'sqle', project_name: 'default', @@ -318,15 +327,39 @@ describe('sqle/SqlExecWorkflow/Create', () => { await act(async () => jest.advanceTimersByTime(400)); expect(baseElement).toMatchSnapshot(); + fireEvent.click(screen.getAllByText('上传SQL文件')[1]); + await act(async () => jest.advanceTimersByTime(300)); + const sqlFile = new File( + [new Blob(['this is sql info'], { type: 'file/sql' })], + 'test.sql' + ); + // 0_sqlFile + fireEvent.change( + getBySelector('.ant-upload input[type=file]', baseElement), + { + target: { files: [sqlFile] } + } + ); + await act(async () => jest.advanceTimersByTime(2000)); + await act(async () => { fireEvent.click(screen.getAllByText('审 核')[1]); await act(async () => jest.advanceTimersByTime(0)); }); + expect(requestAudit).toHaveBeenCalledTimes(2); + expect(requestAudit).toHaveBeenNthCalledWith(2, { + exec_mode: 'sqls', + input_sql_file: sqlFile, + instance_name: 'mysql-2', + instance_schema: 'sqle', + project_name: 'default' + }); + // 提交工单 fireEvent.click(screen.getByText('提交工单')); await act(async () => jest.advanceTimersByTime(0)); - expect(baseElement).toMatchSnapshot(); + await act(async () => jest.advanceTimersByTime(3000)); expect(RequestCreateWorkflow).toHaveBeenCalled(); @@ -403,22 +436,19 @@ describe('sqle/SqlExecWorkflow/Create', () => { fireEvent.click(screen.getByText('审 核')); await act(async () => jest.advanceTimersByTime(300)); }); - expect(screen.getByText('审 核').parentNode).toHaveClass('ant-btn-loading'); - expect(baseElement).toMatchSnapshot(); + expect(screen.getByText('审 核').closest('button')).toHaveClass( + 'ant-btn-loading' + ); await act(async () => jest.advanceTimersByTime(3000)); expect(requestAudit).toHaveBeenCalled(); expect(requestAudit).toHaveBeenCalledWith({ exec_mode: undefined, - input_mybatis_xml_file: undefined, - input_sql_file: undefined, - input_zip_file: undefined, instance_name: 'mysql-2', instance_schema: 'sqle', project_name: 'default', sql: 'select * from user' }); - expect(baseElement).toMatchSnapshot(); await act(async () => jest.advanceTimersByTime(3000)); // 提交工单 @@ -495,15 +525,13 @@ describe('sqle/SqlExecWorkflow/Create', () => { fireEvent.click(screen.getByText('审 核')); await act(async () => jest.advanceTimersByTime(300)); }); - expect(screen.getByText('审 核').parentNode).toHaveClass('ant-btn-loading'); - expect(baseElement).toMatchSnapshot(); + expect(screen.getByText('审 核').closest('button')).toHaveClass( + 'ant-btn-loading' + ); await act(async () => jest.advanceTimersByTime(3000)); expect(requestAudit).toHaveBeenCalled(); expect(requestAudit).toHaveBeenCalledWith({ exec_mode: undefined, - input_mybatis_xml_file: undefined, - input_sql_file: undefined, - input_zip_file: undefined, instance_name: 'mysql-2', instance_schema: 'sqle', project_name: 'default', @@ -513,7 +541,6 @@ describe('sqle/SqlExecWorkflow/Create', () => { expect(getAuditTaskSQLsSpy).toHaveBeenCalledTimes(1); await act(async () => jest.advanceTimersByTime(500)); - expect(baseElement).toMatchSnapshot(); // 提交工单 fireEvent.click(screen.getByText('提交工单')); await act(async () => jest.advanceTimersByTime(0)); @@ -593,6 +620,11 @@ describe('sqle/SqlExecWorkflow/Create', () => { project_name: projectName }); await act(async () => jest.advanceTimersByTime(3000)); + expect(auditTaskGroupId).toHaveBeenCalledTimes(1); + expect(auditTaskGroupId).toHaveBeenCalledWith({ + task_group_id: 99, + input_sql_file: sqlFile + }); }); it('should validate "workflow_subject" and prevent audit with invalid name', async () => { diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/__tests__/useAuditWorkflow.ce.test.ts b/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/__tests__/useAuditWorkflow.ce.test.ts new file mode 100644 index 000000000..7ffaffbb7 --- /dev/null +++ b/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/__tests__/useAuditWorkflow.ce.test.ts @@ -0,0 +1,237 @@ +/** + * @test_version ce + */ + +import { + AuditTaskResV1SqlSourceEnum, + CreateAuditTasksGroupReqV1ExecModeEnum +} from '@actiontech/shared/lib/api/sqle/service/common.enum'; +import { createSpySuccessResponse } from '@actiontech/shared/lib/testUtil/mockApi'; +import { mockProjectInfo } from '@actiontech/shared/lib/testUtil/mockHook/data'; +import { mockUseCurrentProject } from '@actiontech/shared/lib/testUtil/mockHook/mockUseCurrentProject'; +import { renderHook } from '@testing-library/react'; +import { act } from 'react-dom/test-utils'; +import { AuditTaskResData } from '../../../../../testUtils/mockApi/execWorkflow/data'; +import { SAME_SQL_MODE_DEFAULT_FIELD_KEY } from '../../../Common/SqlStatementFormController/SqlStatementFormItem/index.data'; +import { SqlAuditInfoFormFields, SqlStatementFields } from '../../index.type'; +import useAuditWorkflow from '../useAuditWorkflow'; +import execWorkflow from '../../../../../testUtils/mockApi/execWorkflow'; + +describe('test useAuditWorkflow ce', () => { + const sqlFile = new File( + [new Blob(['this is sql info'], { type: 'file/sql' })], + 'test.sql' + ); + const zipFile = new File( + [new Blob(['this is sql info'], { type: 'file/zip' })], + 'test.zip' + ); + let mockCreateAuditTasksV1: jest.SpyInstance; + let mockAuditTaskGroupId: jest.SpyInstance; + let mockCreateAndAuditTaskV1: jest.SpyInstance; + beforeEach(() => { + jest.useFakeTimers(); + mockUseCurrentProject(); + mockCreateAuditTasksV1 = execWorkflow.createAuditTasks(); + mockAuditTaskGroupId = execWorkflow.auditTaskGroupId(); + mockCreateAndAuditTaskV1 = execWorkflow.createAndAuditTask(); + execWorkflow.getWorkflowTemplate(); + }); + afterEach(() => { + jest.useRealTimers(); + jest.clearAllMocks(); + jest.clearAllTimers(); + }); + + it('should handle same sql workflow audit correctly', async () => { + const onSuccessSpy = jest.fn(); + + const { result } = renderHook(() => useAuditWorkflow()); + const values: SqlAuditInfoFormFields = { + isSameSqlForAll: true, + [SAME_SQL_MODE_DEFAULT_FIELD_KEY]: { + currentUploadType: AuditTaskResV1SqlSourceEnum.form_data, + form_data: 'SELECT * FROM table', + exec_mode: CreateAuditTasksGroupReqV1ExecModeEnum.sqls, + sql_file: [sqlFile], + zip_file: [zipFile], + file_sort_method: 'desc' + } as SqlStatementFields, + databaseInfo: [{ instanceName: 'instance1', instanceSchema: 'schema1' }] + }; + + await act(async () => { + result.current.auditWorkflowWithSameSql(values, onSuccessSpy); + }); + + expect(mockCreateAuditTasksV1).toHaveBeenCalledTimes(1); + expect(mockCreateAuditTasksV1).toHaveBeenNthCalledWith(1, { + project_name: mockProjectInfo.projectName, + instances: [{ instance_name: 'instance1', instance_schema: 'schema1' }] + }); + await act(() => jest.advanceTimersByTime(3000)); + + expect(mockAuditTaskGroupId).toHaveBeenCalledTimes(1); + expect(mockAuditTaskGroupId).toHaveBeenNthCalledWith(1, { + task_group_id: 99, + sql: 'SELECT * FROM table' + }); + await act(async () => jest.advanceTimersByTime(3000)); + + expect(onSuccessSpy).toHaveBeenCalledTimes(1); + expect(result.current.taskInfos).toEqual(AuditTaskResData); + + await act(async () => { + result.current.auditWorkflowWithSameSql( + { + ...values, + [SAME_SQL_MODE_DEFAULT_FIELD_KEY]: { + currentUploadType: AuditTaskResV1SqlSourceEnum.sql_file, + form_data: 'SELECT * FROM table', + exec_mode: CreateAuditTasksGroupReqV1ExecModeEnum.sql_file, + sql_file: [sqlFile], + zip_file: [zipFile] + } as SqlStatementFields + }, + onSuccessSpy + ); + }); + + expect(mockCreateAuditTasksV1).toHaveBeenCalledTimes(2); + expect(mockCreateAuditTasksV1).toHaveBeenNthCalledWith(2, { + project_name: mockProjectInfo.projectName, + instances: [{ instance_name: 'instance1', instance_schema: 'schema1' }] + }); + await act(() => jest.advanceTimersByTime(3000)); + + expect(mockAuditTaskGroupId).toHaveBeenCalledTimes(2); + expect(mockAuditTaskGroupId).toHaveBeenNthCalledWith(2, { + task_group_id: 99, + input_sql_file: sqlFile + }); + await act(async () => jest.advanceTimersByTime(3000)); + + await act(async () => { + result.current.auditWorkflowWithSameSql( + { + ...values, + [SAME_SQL_MODE_DEFAULT_FIELD_KEY]: { + currentUploadType: AuditTaskResV1SqlSourceEnum.zip_file, + form_data: 'SELECT * FROM table', + exec_mode: CreateAuditTasksGroupReqV1ExecModeEnum.sql_file, + sql_file: [sqlFile], + zip_file: [zipFile] + } as SqlStatementFields + }, + onSuccessSpy + ); + }); + + expect(mockCreateAuditTasksV1).toHaveBeenCalledTimes(3); + expect(mockCreateAuditTasksV1).toHaveBeenNthCalledWith(3, { + project_name: mockProjectInfo.projectName, + instances: [{ instance_name: 'instance1', instance_schema: 'schema1' }] + }); + await act(() => jest.advanceTimersByTime(3000)); + + expect(mockAuditTaskGroupId).toHaveBeenCalledTimes(3); + expect(mockAuditTaskGroupId).toHaveBeenNthCalledWith(3, { + task_group_id: 99, + input_zip_file: zipFile + }); + await act(async () => jest.advanceTimersByTime(3000)); + + await act(() => { + result.current.clearTaskInfos(); + }); + + expect(result.current.taskInfos).toEqual([]); + }); + + it('should handle different sql workflow audit correctly', async () => { + const onSuccessSpy = jest.fn(); + mockCreateAndAuditTaskV1 + .mockImplementationOnce(() => + createSpySuccessResponse({ + data: AuditTaskResData[0] + }) + ) + .mockImplementationOnce(() => + createSpySuccessResponse({ + data: AuditTaskResData[1] + }) + ) + .mockImplementationOnce(() => + createSpySuccessResponse({ + data: AuditTaskResData[1] + }) + ); + const { result } = renderHook(() => useAuditWorkflow()); + const values: SqlAuditInfoFormFields = { + isSameSqlForAll: true, + 0: { + exec_mode: 'sql_file', + zip_file: [zipFile], + currentUploadType: AuditTaskResV1SqlSourceEnum.zip_file, + file_sort_method: 'desc' + } as SqlStatementFields, + 1: { + exec_mode: 'sql_file', + sql_file: [sqlFile], + currentUploadType: AuditTaskResV1SqlSourceEnum.sql_file + } as SqlStatementFields, + 2: { + exec_mode: 'sqls', + form_data: 'SELECT * FROM table', + currentUploadType: AuditTaskResV1SqlSourceEnum.form_data + } as SqlStatementFields, + databaseInfo: [ + { instanceName: 'instance1', instanceSchema: 'schema1' }, + { instanceName: 'instance2', instanceSchema: 'schema2' }, + { instanceName: 'instance3', instanceSchema: 'schema3' } + ] + }; + + await act(async () => { + result.current.auditWorkflowWthDifferenceSql( + values, + [ + { key: '0', instanceName: 'instance1', schemaName: 'schema1' }, + { key: '1', instanceName: 'instance2', schemaName: 'schema2' }, + { key: '2', instanceName: 'instance3', schemaName: 'schema3' } + ], + onSuccessSpy + ); + }); + + expect(mockCreateAndAuditTaskV1).toHaveBeenCalledTimes( + values.databaseInfo.length + ); + expect(mockCreateAndAuditTaskV1).toHaveBeenCalledWith({ + project_name: mockProjectInfo.projectName, + instance_name: 'instance1', + instance_schema: 'schema1', + input_zip_file: zipFile + }); + expect(mockCreateAndAuditTaskV1).toHaveBeenCalledWith({ + project_name: mockProjectInfo.projectName, + instance_name: 'instance2', + instance_schema: 'schema2', + input_sql_file: sqlFile + }); + expect(mockCreateAndAuditTaskV1).toHaveBeenCalledWith({ + project_name: mockProjectInfo.projectName, + instance_name: 'instance3', + instance_schema: 'schema3', + sql: 'SELECT * FROM table' + }); + await act(async () => jest.advanceTimersByTime(3000)); + + expect(onSuccessSpy).toHaveBeenCalledTimes(1); + expect(result.current.taskInfos).toEqual([ + AuditTaskResData[0], + AuditTaskResData[1], + AuditTaskResData[1] + ]); + }); +}); diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/__tests__/useAuditWorkflow.test.ts b/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/__tests__/useAuditWorkflow.test.ts index 122c5c47d..f67eb5c6d 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/__tests__/useAuditWorkflow.test.ts +++ b/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/__tests__/useAuditWorkflow.test.ts @@ -7,8 +7,20 @@ import { mockProjectInfo } from '@actiontech/shared/lib/testUtil/mockHook/data'; import { SqlAuditInfoFormFields, SqlStatementFields } from '../../index.type'; import { AuditTaskResData } from '../../../../../testUtils/mockApi/execWorkflow/data'; import { createSpySuccessResponse } from '@actiontech/shared/lib/testUtil/mockApi'; +import { + AuditTaskResV1SqlSourceEnum, + CreateAuditTasksGroupReqV1ExecModeEnum +} from '@actiontech/shared/lib/api/sqle/service/common.enum'; describe('test useAuditWorkflow', () => { + const sqlFile = new File( + [new Blob(['this is sql info'], { type: 'file/sql' })], + 'test.sql' + ); + const zipFile = new File( + [new Blob(['this is sql info'], { type: 'file/zip' })], + 'test.zip' + ); let mockCreateAuditTasksV1: jest.SpyInstance; let mockAuditTaskGroupId: jest.SpyInstance; let mockCreateAndAuditTaskV1: jest.SpyInstance; @@ -39,13 +51,12 @@ describe('test useAuditWorkflow', () => { const values: SqlAuditInfoFormFields = { isSameSqlForAll: true, [SAME_SQL_MODE_DEFAULT_FIELD_KEY]: { + currentUploadType: AuditTaskResV1SqlSourceEnum.form_data, form_data: 'SELECT * FROM table', - exec_mode: 'sqls', - sql_file: undefined, - mybatis_xml_file: undefined, - audit_plan: undefined, - zip_file: undefined, - git_repository: undefined + exec_mode: CreateAuditTasksGroupReqV1ExecModeEnum.sqls, + sql_file: [sqlFile], + zip_file: [zipFile], + file_sort_method: 'desc' } as SqlStatementFields, databaseInfo: [{ instanceName: 'instance1', instanceSchema: 'schema1' }] }; @@ -54,15 +65,17 @@ describe('test useAuditWorkflow', () => { result.current.auditWorkflowWithSameSql(values, onSuccessSpy); }); - expect(mockCreateAuditTasksV1).toHaveBeenCalledWith({ - exec_mode: 'sqls', + expect(mockCreateAuditTasksV1).toHaveBeenCalledTimes(1); + expect(mockCreateAuditTasksV1).toHaveBeenNthCalledWith(1, { + exec_mode: CreateAuditTasksGroupReqV1ExecModeEnum.sqls, + file_order_method: 'desc', project_name: mockProjectInfo.projectName, instances: [{ instance_name: 'instance1', instance_schema: 'schema1' }] }); await act(() => jest.advanceTimersByTime(3000)); expect(mockAuditTaskGroupId).toHaveBeenCalledTimes(1); - expect(mockAuditTaskGroupId).toHaveBeenCalledWith({ + expect(mockAuditTaskGroupId).toHaveBeenNthCalledWith(1, { task_group_id: 99, sql: 'SELECT * FROM table' }); @@ -71,6 +84,68 @@ describe('test useAuditWorkflow', () => { expect(onSuccessSpy).toHaveBeenCalledTimes(1); expect(result.current.taskInfos).toEqual(AuditTaskResData); + await act(async () => { + result.current.auditWorkflowWithSameSql( + { + ...values, + [SAME_SQL_MODE_DEFAULT_FIELD_KEY]: { + currentUploadType: AuditTaskResV1SqlSourceEnum.sql_file, + form_data: 'SELECT * FROM table', + exec_mode: CreateAuditTasksGroupReqV1ExecModeEnum.sql_file, + sql_file: [sqlFile], + zip_file: [zipFile] + } as SqlStatementFields + }, + onSuccessSpy + ); + }); + + expect(mockCreateAuditTasksV1).toHaveBeenCalledTimes(2); + expect(mockCreateAuditTasksV1).toHaveBeenNthCalledWith(2, { + exec_mode: CreateAuditTasksGroupReqV1ExecModeEnum.sql_file, + project_name: mockProjectInfo.projectName, + instances: [{ instance_name: 'instance1', instance_schema: 'schema1' }] + }); + await act(() => jest.advanceTimersByTime(3000)); + + expect(mockAuditTaskGroupId).toHaveBeenCalledTimes(2); + expect(mockAuditTaskGroupId).toHaveBeenNthCalledWith(2, { + task_group_id: 99, + input_sql_file: sqlFile + }); + await act(async () => jest.advanceTimersByTime(3000)); + + await act(async () => { + result.current.auditWorkflowWithSameSql( + { + ...values, + [SAME_SQL_MODE_DEFAULT_FIELD_KEY]: { + currentUploadType: AuditTaskResV1SqlSourceEnum.zip_file, + form_data: 'SELECT * FROM table', + exec_mode: CreateAuditTasksGroupReqV1ExecModeEnum.sql_file, + sql_file: [sqlFile], + zip_file: [zipFile] + } as SqlStatementFields + }, + onSuccessSpy + ); + }); + + expect(mockCreateAuditTasksV1).toHaveBeenCalledTimes(3); + expect(mockCreateAuditTasksV1).toHaveBeenNthCalledWith(3, { + exec_mode: CreateAuditTasksGroupReqV1ExecModeEnum.sql_file, + project_name: mockProjectInfo.projectName, + instances: [{ instance_name: 'instance1', instance_schema: 'schema1' }] + }); + await act(() => jest.advanceTimersByTime(3000)); + + expect(mockAuditTaskGroupId).toHaveBeenCalledTimes(3); + expect(mockAuditTaskGroupId).toHaveBeenNthCalledWith(3, { + task_group_id: 99, + input_zip_file: zipFile + }); + await act(async () => jest.advanceTimersByTime(3000)); + await act(() => { result.current.clearTaskInfos(); }); @@ -86,6 +161,11 @@ describe('test useAuditWorkflow', () => { data: AuditTaskResData[0] }) ) + .mockImplementationOnce(() => + createSpySuccessResponse({ + data: AuditTaskResData[1] + }) + ) .mockImplementationOnce(() => createSpySuccessResponse({ data: AuditTaskResData[1] @@ -95,26 +175,25 @@ describe('test useAuditWorkflow', () => { const values: SqlAuditInfoFormFields = { isSameSqlForAll: true, 0: { - form_data: 'SELECT * FROM table', - exec_mode: 'sqls', - sql_file: undefined, - mybatis_xml_file: undefined, - audit_plan: undefined, - zip_file: undefined, - git_repository: undefined + exec_mode: 'sql_file', + zip_file: [zipFile], + currentUploadType: AuditTaskResV1SqlSourceEnum.zip_file, + file_sort_method: 'desc' } as SqlStatementFields, 1: { - form_data: 'SELECT * FROM table WHERE ID = 1', exec_mode: 'sql_file', - sql_file: undefined, - mybatis_xml_file: undefined, - audit_plan: undefined, - zip_file: undefined, - git_repository: undefined + sql_file: [sqlFile], + currentUploadType: AuditTaskResV1SqlSourceEnum.sql_file + } as SqlStatementFields, + 2: { + exec_mode: 'sqls', + form_data: 'SELECT * FROM table', + currentUploadType: AuditTaskResV1SqlSourceEnum.form_data } as SqlStatementFields, databaseInfo: [ { instanceName: 'instance1', instanceSchema: 'schema1' }, - { instanceName: 'instance2', instanceSchema: 'schema2' } + { instanceName: 'instance2', instanceSchema: 'schema2' }, + { instanceName: 'instance3', instanceSchema: 'schema3' } ] }; @@ -123,7 +202,8 @@ describe('test useAuditWorkflow', () => { values, [ { key: '0', instanceName: 'instance1', schemaName: 'schema1' }, - { key: '1', instanceName: 'instance2', schemaName: 'schema2' } + { key: '1', instanceName: 'instance2', schemaName: 'schema2' }, + { key: '2', instanceName: 'instance3', schemaName: 'schema3' } ], onSuccessSpy ); @@ -136,21 +216,30 @@ describe('test useAuditWorkflow', () => { project_name: mockProjectInfo.projectName, instance_name: 'instance1', instance_schema: 'schema1', - sql: 'SELECT * FROM table', - exec_mode: 'sqls' + input_zip_file: zipFile, + exec_mode: 'sql_file', + file_order_method: 'desc' }); expect(mockCreateAndAuditTaskV1).toHaveBeenCalledWith({ project_name: mockProjectInfo.projectName, instance_name: 'instance2', instance_schema: 'schema2', - sql: 'SELECT * FROM table WHERE ID = 1', + input_sql_file: sqlFile, exec_mode: 'sql_file' }); + expect(mockCreateAndAuditTaskV1).toHaveBeenCalledWith({ + project_name: mockProjectInfo.projectName, + instance_name: 'instance3', + instance_schema: 'schema3', + sql: 'SELECT * FROM table', + exec_mode: 'sqls' + }); await act(async () => jest.advanceTimersByTime(3000)); expect(onSuccessSpy).toHaveBeenCalledTimes(1); expect(result.current.taskInfos).toEqual([ AuditTaskResData[0], + AuditTaskResData[1], AuditTaskResData[1] ]); }); diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useAuditWorkflow.tsx b/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useAuditWorkflow.tsx index 261f18da2..a60e0a721 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useAuditWorkflow.tsx +++ b/packages/sqle/src/page/SqlExecWorkflow/Create/hooks/useAuditWorkflow.tsx @@ -4,6 +4,7 @@ import { useCurrentProject } from '@actiontech/shared/lib/global'; import { useAllowAuditLevel } from './useAllowAuditLevel'; import { IAuditTaskResV1 } from '@actiontech/shared/lib/api/sqle/service/common'; import { + AuditTaskResV1SqlSourceEnum, CreateAuditTaskReqV1ExecModeEnum, WorkflowTemplateDetailResV1AllowSubmitWhenLessAuditLevelEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum'; @@ -65,6 +66,33 @@ const useAuditWorkflow = () => { ] ); + const getSqlSourceWithUploadType = ( + sqlStatementInfo: SqlStatementFields + ): + | Pick< + IAuditTaskGroupIdV1Params | ICreateAndAuditTaskV1Params, + 'sql' | 'input_sql_file' | 'input_zip_file' + > + | undefined => { + const currentSqlUpload = sqlStatementInfo.currentUploadType; + + if (currentSqlUpload === AuditTaskResV1SqlSourceEnum.form_data) { + return { + sql: sqlStatementInfo.form_data + }; + } + if (currentSqlUpload === AuditTaskResV1SqlSourceEnum.sql_file) { + return { + input_sql_file: sqlStatementInfo.sql_file?.[0] + }; + } + if (currentSqlUpload === AuditTaskResV1SqlSourceEnum.zip_file) { + return { + input_zip_file: sqlStatementInfo.zip_file?.[0] + }; + } + }; + /** * 相同 sql 模式下的表单提交 * @param values 提交的表单数据 @@ -87,6 +115,7 @@ const useAuditWorkflow = () => { const sqlStatementInfo = values[ SAME_SQL_MODE_DEFAULT_FIELD_KEY ] as SqlStatementFields; + const createAuditTasksParams: ICreateAuditTasksV1Params = { // #if [ee] exec_mode: sqlStatementInfo.exec_mode, @@ -108,9 +137,7 @@ const useAuditWorkflow = () => { ) { const auditTaskPrams: IAuditTaskGroupIdV1Params = { task_group_id: taskGroupInfo.data.data?.task_group_id, - sql: sqlStatementInfo.form_data, - input_sql_file: sqlStatementInfo.sql_file?.[0], - input_zip_file: sqlStatementInfo.zip_file?.[0] + ...getSqlSourceWithUploadType(sqlStatementInfo) }; const res = await task.auditTaskGroupIdV1(auditTaskPrams); if (res && res.data.code === ResponseCode.SUCCESS) { @@ -153,13 +180,12 @@ const useAuditWorkflow = () => { ) => { const params: ICreateAndAuditTaskV1Params[] = databaseInfo.map((item) => { const sqlStatementInfo = values[item.key] as SqlStatementFields; + return { project_name: projectName, instance_name: item.instanceName!, instance_schema: item.schemaName, - sql: sqlStatementInfo.form_data, - input_sql_file: sqlStatementInfo.sql_file?.[0], - input_zip_file: sqlStatementInfo.zip_file?.[0], + ...getSqlSourceWithUploadType(sqlStatementInfo), // #if [ee] exec_mode: sqlStatementInfo.exec_mode as unknown as CreateAuditTaskReqV1ExecModeEnum, diff --git a/packages/sqle/src/page/SqlExecWorkflow/Create/index.type.ts b/packages/sqle/src/page/SqlExecWorkflow/Create/index.type.ts index 7315cd35e..c9ea094e6 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Create/index.type.ts +++ b/packages/sqle/src/page/SqlExecWorkflow/Create/index.type.ts @@ -25,6 +25,7 @@ export type SqlStatementFields = Record< > & { exec_mode: CreateAuditTasksGroupReqV1ExecModeEnum; file_sort_method: string; + currentUploadType: AuditTaskResV1SqlSourceEnum; }; export type CreateWorkflowDatabaseInfo = Array<{