From 4d49477365855f4c6e6be4eab1082e8438550ca2 Mon Sep 17 00:00:00 2001 From: zzyangh <799463087@qq.com> Date: Mon, 2 Dec 2024 16:42:14 +0800 Subject: [PATCH 1/3] [fix](SqlExecWorkflow): Capture unformatted SQL errors --- .../Common/ResultCard/SqlMode.tsx | 6 +- .../ResultCard/__tests__/SqlMode.test.tsx | 16 + .../__snapshots__/SqlMode.test.tsx.snap | 611 ++++++++++++++++++ 3 files changed, 632 insertions(+), 1 deletion(-) diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx index a208b1c23..2ffd24b36 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx +++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx @@ -85,7 +85,11 @@ const SqlMode: React.FC = ({ }; const formattedRollbackSql = useMemo(() => { - return props.rollback_sqls?.map((v) => formatterSQL(v))?.join('\n'); + try { + return props.rollback_sqls?.map((v) => formatterSQL(v))?.join('\n'); + } catch (error) { + return props.rollback_sqls?.join('\n'); + } }, [props.rollback_sqls]); return ( diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.test.tsx index e0f7016aa..6158465bc 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.test.tsx +++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.test.tsx @@ -216,4 +216,20 @@ describe('sqle/ExecWorkflow/AuditDetail/SqlMode', () => { expect(screen.getByText('关联回滚工单')).toBeInTheDocument(); expect(baseElement).toMatchSnapshot(); }); + + it('render can not format rollback sql', async () => { + const { baseElement } = customRender({ + number: 1, + exec_sql: 'exec_sql cont', + rollback_sqls: [ + "CREATE TABLE public.example_table (\nid int4 NOT NULL DEFAULT nextval('example_table_id_seq'::regclass),\nname varchar(255) NOT NULL,\nage int4 NOT NULL,\ncreated_at timestamp DEFAULT CURRENT_TIMESTAMP);", + '\n\nCREATE UNIQUE INDEX example_table_pkey ON public.example_table USING btree (id);' + ], + backup_strategy: AuditTaskSQLResV2BackupStrategyEnum.reverse_sql, + exec_result: 'success' + }); + fireEvent.click(screen.getByText('回滚语句')); + await act(async () => jest.advanceTimersByTime(500)); + expect(baseElement).toMatchSnapshot(); + }); }); diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/SqlMode.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/SqlMode.test.tsx.snap index ffe36eb54..7d62eb45d 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/SqlMode.test.tsx.snap +++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/SqlMode.test.tsx.snap @@ -852,6 +852,617 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render backup strategy tip 1`] = `; +exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render can not format rollback sql 1`] = ` + +
+
+
+
+
+ + # + 1 + +
+
+
+ + +
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+
+
+
+ + + + + + + 所在文件 + + - + + +
+
+
+
+
+
+ + + + + + + 所在行 + + - + + +
+
+
+
+
+
+                  
+                    
+ + 1 + + exec_sql cont +
+
+
+
+
+
+
+
+
+
+
+ + 基于反向SQL回滚 + +
+
+
+
+
+
+                      
+                        
+ + 1 + + + CREATE + + + + TABLE + + public.example_table ( +
+
+ + 2 + + id int4 + + NOT + + + + NULL + + + + DEFAULT + + nextval( + + 'example_table_id_seq' + + ::regclass), +
+
+ + 3 + + name + + varchar + + ( + + 255 + + ) + + NOT + + + + NULL + + , +
+
+ + 4 + + age int4 + + NOT + + + + NULL + + , +
+
+ + 5 + + created_at + + timestamp + + + + DEFAULT + + + + CURRENT_TIMESTAMP + + ); +
+
+ + 6 + +
+
+ + 7 + +
+
+ + 8 + + + CREATE + + + + UNIQUE + + INDEX example_table_pkey + + ON + + public.example_table + + USING + + btree (id); +
+
+
+
+
+
+
+
+
+
+
+ +
+ +
+ +
+
+ +`; + exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql & exec_result 1`] = `
From 3dd2535d66719a87bc7f67cd38753bc49bff9d9a Mon Sep 17 00:00:00 2001 From: zzyangh <799463087@qq.com> Date: Mon, 2 Dec 2024 17:45:01 +0800 Subject: [PATCH 2/3] [fix](SqlExecWorkflow): Provide language parameters that support formatting --- .../Common/ResultCard/SqlMode.tsx | 17 +- .../ResultCard/__tests__/SqlMode.ce.test.tsx | 5 +- .../ResultCard/__tests__/SqlMode.test.tsx | 32 +- .../__snapshots__/SqlMode.test.tsx.snap | 1116 ++++++++--------- .../Common/ResultCard/index.type.ts | 1 + .../PaginationList/SqlExecuteMode/index.tsx | 4 +- .../TaskResultList/index.type.ts | 1 + .../components/AuditExecResultPanel/index.tsx | 1 + 8 files changed, 596 insertions(+), 581 deletions(-) diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx index 2ffd24b36..21a205b26 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx +++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/SqlMode.tsx @@ -29,7 +29,10 @@ import { BackupStrategyDictionary } from '../../../../../../Common/AuditResultLi import { UpdateSqlBackupStrategyReqStrategyEnum } from '@actiontech/shared/lib/api/sqle/service/common.enum'; import { WarningFilled } from '@actiontech/icons'; import RollbackWorkflowEntry from './components/RollbackWorkflowEntry'; -import { formatterSQL } from '@actiontech/shared/lib/utils/FormatterSQL'; +import { + formatterSQL, + FormatLanguageSupport +} from '@actiontech/shared/lib/utils/FormatterSQL'; const SqlMode: React.FC = ({ projectID, @@ -85,12 +88,14 @@ const SqlMode: React.FC = ({ }; const formattedRollbackSql = useMemo(() => { - try { - return props.rollback_sqls?.map((v) => formatterSQL(v))?.join('\n'); - } catch (error) { - return props.rollback_sqls?.join('\n'); + const supportedLan = Object.keys(FormatLanguageSupport); + if (props.dbType && supportedLan.includes(props.dbType)) { + return props.rollback_sqls + ?.map((v) => formatterSQL(v, props.dbType)) + ?.join('\n'); } - }, [props.rollback_sqls]); + return props.rollback_sqls?.join('\n'); + }, [props.rollback_sqls, props.dbType]); return ( diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.ce.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.ce.test.tsx index df1e85234..024fc6e3a 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.ce.test.tsx +++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.ce.test.tsx @@ -24,11 +24,12 @@ describe('sqle/ExecWorkflow/AuditDetail/SqlMode ce', () => { ) => { const someParams: Pick< SqlExecuteResultCardProps, - 'projectID' | 'taskId' | 'onUpdateDescription' + 'projectID' | 'taskId' | 'onUpdateDescription' | 'dbType' > = { projectID, taskId, - onUpdateDescription: onUpdateDescriptionFn + onUpdateDescription: onUpdateDescriptionFn, + dbType: 'MySQL' }; return superRender(); }; diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.test.tsx b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.test.tsx index 6158465bc..7a1e3738c 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.test.tsx +++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/SqlMode.test.tsx @@ -23,8 +23,9 @@ describe('sqle/ExecWorkflow/AuditDetail/SqlMode', () => { const customRender = ( params: Omit< SqlExecuteResultCardProps, - 'projectID' | 'taskId' | 'onUpdateDescription' - > + 'projectID' | 'taskId' | 'onUpdateDescription' | 'dbType' + >, + dbType = 'MySQL' ) => { const someParams: Pick< SqlExecuteResultCardProps, @@ -34,7 +35,7 @@ describe('sqle/ExecWorkflow/AuditDetail/SqlMode', () => { taskId, onUpdateDescription: onUpdateDescriptionFn }; - return superRender(); + return superRender(); }; beforeEach(() => { @@ -217,17 +218,20 @@ describe('sqle/ExecWorkflow/AuditDetail/SqlMode', () => { expect(baseElement).toMatchSnapshot(); }); - it('render can not format rollback sql', async () => { - const { baseElement } = customRender({ - number: 1, - exec_sql: 'exec_sql cont', - rollback_sqls: [ - "CREATE TABLE public.example_table (\nid int4 NOT NULL DEFAULT nextval('example_table_id_seq'::regclass),\nname varchar(255) NOT NULL,\nage int4 NOT NULL,\ncreated_at timestamp DEFAULT CURRENT_TIMESTAMP);", - '\n\nCREATE UNIQUE INDEX example_table_pkey ON public.example_table USING btree (id);' - ], - backup_strategy: AuditTaskSQLResV2BackupStrategyEnum.reverse_sql, - exec_result: 'success' - }); + it('render unsupported database type', async () => { + const { baseElement } = customRender( + { + number: 1, + exec_sql: 'exec_sql cont', + rollback_sqls: [ + "CREATE TABLE public.example_table (\nid int4 NOT NULL DEFAULT nextval('example_table_id_seq'::regclass),\nname varchar(255) NOT NULL,\nage int4 NOT NULL,\ncreated_at timestamp DEFAULT CURRENT_TIMESTAMP);", + '\n\nCREATE UNIQUE INDEX example_table_pkey ON public.example_table USING btree (id);' + ], + backup_strategy: AuditTaskSQLResV2BackupStrategyEnum.reverse_sql, + exec_result: 'success' + }, + '' + ); fireEvent.click(screen.getByText('回滚语句')); await act(async () => jest.advanceTimersByTime(500)); expect(baseElement).toMatchSnapshot(); diff --git a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/SqlMode.test.tsx.snap b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/SqlMode.test.tsx.snap index 7d62eb45d..75cac6478 100644 --- a/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/SqlMode.test.tsx.snap +++ b/packages/sqle/src/page/SqlExecWorkflow/Detail/components/AuditExecResultPanel/TaskResultList/Common/ResultCard/__tests__/__snapshots__/SqlMode.test.tsx.snap @@ -852,7 +852,7 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render backup strategy tip 1`] = `; -exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render can not format rollback sql 1`] = ` +exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql & exec_result 1`] = `
-
-
-
-
-
-
- - 基于反向SQL回滚 - -
-
-
-
-
-
-                      
-                        
- - 1 - - - CREATE - - - - TABLE - - public.example_table ( -
-
- - 2 - - id int4 - - NOT - - - - NULL - - - - DEFAULT - - nextval( - - 'example_table_id_seq' - - ::regclass), -
-
- - 3 - - name - - varchar - - ( - - 255 - - ) - - NOT - - - - NULL - - , -
-
- - 4 - - age int4 - - NOT - - - - NULL - - , -
-
- - 5 - - created_at - - timestamp - - - - DEFAULT - - - - CURRENT_TIMESTAMP - - ); -
-
- - 6 - -
-
- - 7 - -
-
- - 8 - - - CREATE - - - - UNIQUE - - INDEX example_table_pkey - - ON - - public.example_table - - USING - - btree (id); -
-
-
-
-
-
-
`; -exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql & exec_result 1`] = ` +exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql & exec_result 2`] = `
-
-
-
-
- +
+
+
+
+
+ + 基于反向SQL回滚 + +
+
+
+
+
+
+                      
+                        
+ + 1 + + rollback_sql cont +
+
+
+
+
+
+
+
+
+
+
+ `; -exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql & exec_result 2`] = ` +exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql & exec_result 3`] = `
`; -exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql & exec_result 3`] = ` +exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql & exec_result 4`] = `
+
+ success +
`; -exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback_sql & exec_result 4`] = ` +exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 1`] = `
-
-                  
-                    
- - 1 - - exec_sql cont -
-
-
-
-
-
-
-
-
-
-
- - 基于反向SQL回滚 - -
-
-
-
-
-
-                      
-                        
- - 1 - - rollback_sql cont -
-
-
-
-
+ - +
-
- success -
@@ -3140,7 +2899,7 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render change exec_sql & rollback `; -exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 1`] = ` +exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 2`] = `
+
+
+ + + + + + +
+
@@ -3510,7 +3293,7 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 1`] = ` `; -exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 2`] = ` +exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click icon arrow when has result cont 1`] = `
@@ -3795,7 +3563,7 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 2`] = ` >
+ @@ -3836,44 +3611,51 @@ exports[`sqle/ExecWorkflow/AuditDetail/SqlMode render click add desc 2`] = `
-
-
-
-
-
-
- +
+
+
+
+
+
+