Skip to content

Commit

Permalink
[fix]:(SqlExecWorkflow) Refine unit tests to submit only relevant dat…
Browse files Browse the repository at this point in the history
…a based on the SQL upload type during review
  • Loading branch information
LZS911 committed May 29, 2024
1 parent 0379e89 commit 16dae69
Show file tree
Hide file tree
Showing 8 changed files with 7,274 additions and 26,129 deletions.

Large diffs are not rendered by default.

26,140 changes: 6,829 additions & 19,311 deletions packages/sqle/src/page/SqlExecWorkflow/Create/__tests__/__snapshots__/index.test.tsx.snap

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -18,19 +18,8 @@ import {
import { mockDatabaseType } from '../../../../testUtils/mockHooks/mockDatabaseType';
import execWorkflow from '../../../../testUtils/mockApi/execWorkflow';
import instance from '../../../../testUtils/mockApi/instance';
import { getInstanceTipListV1FunctionalModuleEnum } from '@actiontech/shared/lib/api/sqle/service/instance/index.enum';
import { instanceTipsMockData } from '../../../../testUtils/mockApi/instance/data';

describe('sqle/SqlExecWorkflow/Create ce', () => {
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(<CreateSqlExecWorkflow />);
};
Expand All @@ -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(() => {
Expand All @@ -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();
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
});
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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',
Expand All @@ -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();
Expand Down Expand Up @@ -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));

// 提交工单
Expand Down Expand Up @@ -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',
Expand All @@ -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));
Expand Down Expand Up @@ -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 () => {
Expand Down

0 comments on commit 16dae69

Please sign in to comment.