@nocobase/plugin-workflow-sql 1.0.0-alpha.1 → 1.0.0-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client/SQLInstruction.d.ts +8 -0
- package/dist/client/index.d.ts +8 -0
- package/dist/client/index.js +9 -0
- package/dist/externalVersion.js +15 -6
- package/dist/index.d.ts +8 -0
- package/dist/index.js +9 -0
- package/dist/locale/index.d.ts +8 -0
- package/dist/locale/index.js +9 -0
- package/dist/server/Plugin.d.ts +8 -0
- package/dist/server/Plugin.js +9 -0
- package/dist/server/SQLInstruction.d.ts +8 -0
- package/dist/server/SQLInstruction.js +9 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.js +9 -0
- package/package.json +2 -2
- package/src/client/SQLInstruction.tsx +0 -68
- package/src/client/__e2e__/dataCURD.test.ts +0 -1312
- package/src/client/index.ts +0 -18
- package/src/index.ts +0 -2
- package/src/locale/en-US.json +0 -5
- package/src/locale/index.ts +0 -12
- package/src/locale/ko_KR.json +0 -5
- package/src/locale/zh-CN.json +0 -6
- package/src/server/Plugin.ts +0 -11
- package/src/server/SQLInstruction.ts +0 -31
- package/src/server/__tests__/instruction.test.ts +0 -249
- package/src/server/index.ts +0 -1
|
@@ -1,1312 +0,0 @@
|
|
|
1
|
-
import { faker } from '@faker-js/faker';
|
|
2
|
-
import {
|
|
3
|
-
CollectionTriggerNode,
|
|
4
|
-
CreateWorkFlow,
|
|
5
|
-
EditWorkFlow,
|
|
6
|
-
WorkflowListRecords,
|
|
7
|
-
apiCreateWorkflow,
|
|
8
|
-
apiDeleteWorkflow,
|
|
9
|
-
apiGetWorkflow,
|
|
10
|
-
apiUpdateRecord,
|
|
11
|
-
apiGetWorkflowNodeExecutions,
|
|
12
|
-
apiUpdateWorkflowTrigger,
|
|
13
|
-
appendJsonCollectionName,
|
|
14
|
-
generalWithNoRelationalFields,
|
|
15
|
-
QueryRecordNode,
|
|
16
|
-
SQLNode,
|
|
17
|
-
apiGetRecord,
|
|
18
|
-
} from '@nocobase/plugin-workflow-test/e2e';
|
|
19
|
-
import { expect, test } from '@nocobase/test/e2e';
|
|
20
|
-
import { dayjs } from '@nocobase/utils';
|
|
21
|
-
|
|
22
|
-
test.describe('select data', () => {
|
|
23
|
-
test('No variable SQL, select 1 record', async ({ page, mockCollections, mockRecords }) => {
|
|
24
|
-
//数据表后缀标识
|
|
25
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
26
|
-
const SQLNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
27
|
-
// 创建触发器节点数据表
|
|
28
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
29
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
30
|
-
const triggerNodeFieldName = 'orgname';
|
|
31
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
32
|
-
await mockCollections(
|
|
33
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
34
|
-
.collections,
|
|
35
|
-
);
|
|
36
|
-
// 创建SQL节点数据表
|
|
37
|
-
const SQLNodeCollectionDisplayName = `自动>组织[普通表]${SQLNodeAppendText}`;
|
|
38
|
-
const SQLNodeCollectionName = `tt_amt_org${SQLNodeAppendText}`;
|
|
39
|
-
const SQLNodeFieldName = 'orgname';
|
|
40
|
-
const SQLNodeFieldDisplayName = '公司名称(单行文本)';
|
|
41
|
-
await mockCollections(
|
|
42
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), SQLNodeAppendText)
|
|
43
|
-
.collections,
|
|
44
|
-
);
|
|
45
|
-
const SQLNodeCollectioRecordOne = [{ orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10 }];
|
|
46
|
-
const SQLNodeCollectioRecordTwo = [{ orgname: '公司名称(单行文本)2', status_singleselect: '1', staffnum: 20 }];
|
|
47
|
-
const SQLNodeCollectioRecordThree = [{ orgname: '公司名称(单行文本)3', status_singleselect: '1', staffnum: 30 }];
|
|
48
|
-
const SQLNodeCollectioRecordFour = [{ orgname: '公司名称(单行文本)4', status_singleselect: '1', staffnum: 40 }];
|
|
49
|
-
const SQLNodeCollectioRecordFive = [{ orgname: '公司名称(单行文本)5', status_singleselect: '2', staffnum: 10 }];
|
|
50
|
-
const SQLNodeCollectioRecordSix = [{ orgname: '公司名称(单行文本)6', status_singleselect: '2', staffnum: 20 }];
|
|
51
|
-
const SQLNodeCollectioRecordSeven = [{ orgname: '公司名称(单行文本)7', status_singleselect: '2', staffnum: 30 }];
|
|
52
|
-
const SQLNodeCollectioRecordEight = [{ orgname: '公司名称(单行文本)8', status_singleselect: '2', staffnum: 40 }];
|
|
53
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordOne);
|
|
54
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordTwo);
|
|
55
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordThree);
|
|
56
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFour);
|
|
57
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFive);
|
|
58
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSix);
|
|
59
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSeven);
|
|
60
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordEight);
|
|
61
|
-
//添加工作流
|
|
62
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
63
|
-
const workflowData = {
|
|
64
|
-
current: true,
|
|
65
|
-
options: { deleteExecutionOnStatus: [] },
|
|
66
|
-
title: workFlowName,
|
|
67
|
-
type: 'collection',
|
|
68
|
-
enabled: true,
|
|
69
|
-
};
|
|
70
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
71
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
72
|
-
const workflowId = workflowObj.id;
|
|
73
|
-
//配置工作流触发器
|
|
74
|
-
const triggerNodeData = {
|
|
75
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
76
|
-
};
|
|
77
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
78
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
79
|
-
//配置SQL节点
|
|
80
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
81
|
-
await page.waitForLoadState('networkidle');
|
|
82
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
83
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
84
|
-
await page.getByRole('button', { name: 'sql', exact: true }).click();
|
|
85
|
-
const sqlNodeName = 'SQL action' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
86
|
-
await page.getByLabel('SQL action-SQL action', { exact: true }).getByRole('textbox').fill(sqlNodeName);
|
|
87
|
-
const sqlNode = new SQLNode(page, sqlNodeName);
|
|
88
|
-
const sqlNodeId = await sqlNode.node.locator('.workflow-node-id').innerText();
|
|
89
|
-
await sqlNode.nodeConfigure.click();
|
|
90
|
-
await sqlNode.sqlEditBox.fill(`select * from ${SQLNodeCollectionName} where id = 1`);
|
|
91
|
-
await sqlNode.submitButton.click();
|
|
92
|
-
|
|
93
|
-
// 2、测试步骤:添加数据触发工作流
|
|
94
|
-
const triggerNodeCollectionRecordOne =
|
|
95
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
96
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
97
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
98
|
-
]);
|
|
99
|
-
await page.waitForTimeout(1000);
|
|
100
|
-
// 3、预期结果:工作流成功触发,数据查询成功
|
|
101
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
102
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
103
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
104
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
105
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
106
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
107
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
108
|
-
return b.id - a.id;
|
|
109
|
-
});
|
|
110
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
111
|
-
const sqlNodeJob = jobs.find((job) => job.nodeId.toString() === sqlNodeId);
|
|
112
|
-
const sqlNodeJobResult = sqlNodeJob.result;
|
|
113
|
-
const nodeResultRecordOrgname = sqlNodeJobResult[0][0].orgname;
|
|
114
|
-
expect(nodeResultRecordOrgname).toBe('公司名称(单行文本)1');
|
|
115
|
-
// 4、后置处理:删除工作流
|
|
116
|
-
await apiDeleteWorkflow(workflowId);
|
|
117
|
-
});
|
|
118
|
-
|
|
119
|
-
test('No variable SQL, select Multiple Records', async ({ page, mockCollections, mockRecords }) => {
|
|
120
|
-
//数据表后缀标识
|
|
121
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
122
|
-
const SQLNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
123
|
-
// 创建触发器节点数据表
|
|
124
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
125
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
126
|
-
const triggerNodeFieldName = 'orgname';
|
|
127
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
128
|
-
await mockCollections(
|
|
129
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
130
|
-
.collections,
|
|
131
|
-
);
|
|
132
|
-
// 创建查询节点数据表
|
|
133
|
-
const SQLNodeCollectionDisplayName = `自动>组织[普通表]${SQLNodeAppendText}`;
|
|
134
|
-
const SQLNodeCollectionName = `tt_amt_org${SQLNodeAppendText}`;
|
|
135
|
-
const SQLNodeFieldName = 'orgname';
|
|
136
|
-
const SQLNodeFieldDisplayName = '公司名称(单行文本)';
|
|
137
|
-
await mockCollections(
|
|
138
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), SQLNodeAppendText)
|
|
139
|
-
.collections,
|
|
140
|
-
);
|
|
141
|
-
const SQLNodeCollectioRecordOne = [{ orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10 }];
|
|
142
|
-
const SQLNodeCollectioRecordTwo = [{ orgname: '公司名称(单行文本)2', status_singleselect: '1', staffnum: 20 }];
|
|
143
|
-
const SQLNodeCollectioRecordThree = [{ orgname: '公司名称(单行文本)3', status_singleselect: '1', staffnum: 30 }];
|
|
144
|
-
const SQLNodeCollectioRecordFour = [{ orgname: '公司名称(单行文本)4', status_singleselect: '1', staffnum: 40 }];
|
|
145
|
-
const SQLNodeCollectioRecordFive = [{ orgname: '公司名称(单行文本)5', status_singleselect: '2', staffnum: 10 }];
|
|
146
|
-
const SQLNodeCollectioRecordSix = [{ orgname: '公司名称(单行文本)6', status_singleselect: '2', staffnum: 20 }];
|
|
147
|
-
const SQLNodeCollectioRecordSeven = [{ orgname: '公司名称(单行文本)7', status_singleselect: '2', staffnum: 30 }];
|
|
148
|
-
const SQLNodeCollectioRecordEight = [{ orgname: '公司名称(单行文本)8', status_singleselect: '2', staffnum: 40 }];
|
|
149
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordOne);
|
|
150
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordTwo);
|
|
151
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordThree);
|
|
152
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFour);
|
|
153
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFive);
|
|
154
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSix);
|
|
155
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSeven);
|
|
156
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordEight);
|
|
157
|
-
//添加工作流
|
|
158
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
159
|
-
const workflowData = {
|
|
160
|
-
current: true,
|
|
161
|
-
options: { deleteExecutionOnStatus: [] },
|
|
162
|
-
title: workFlowName,
|
|
163
|
-
type: 'collection',
|
|
164
|
-
enabled: true,
|
|
165
|
-
};
|
|
166
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
167
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
168
|
-
const workflowId = workflowObj.id;
|
|
169
|
-
//配置工作流触发器
|
|
170
|
-
const triggerNodeData = {
|
|
171
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
172
|
-
};
|
|
173
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
174
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
175
|
-
//配置SQL节点
|
|
176
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
177
|
-
await page.waitForLoadState('networkidle');
|
|
178
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
179
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
180
|
-
await page.getByRole('button', { name: 'sql', exact: true }).click();
|
|
181
|
-
const sqlNodeName = 'SQL action' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
182
|
-
await page.getByLabel('SQL action-SQL action', { exact: true }).getByRole('textbox').fill(sqlNodeName);
|
|
183
|
-
const sqlNode = new SQLNode(page, sqlNodeName);
|
|
184
|
-
const sqlNodeId = await sqlNode.node.locator('.workflow-node-id').innerText();
|
|
185
|
-
await sqlNode.nodeConfigure.click();
|
|
186
|
-
await sqlNode.sqlEditBox.fill(`select * from ${SQLNodeCollectionName}`);
|
|
187
|
-
await sqlNode.submitButton.click();
|
|
188
|
-
|
|
189
|
-
// 2、测试步骤:添加数据触发工作流
|
|
190
|
-
const triggerNodeCollectionRecordOne =
|
|
191
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
192
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
193
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
194
|
-
]);
|
|
195
|
-
await page.waitForTimeout(1000);
|
|
196
|
-
// 3、预期结果:工作流成功触发,数据查询成功
|
|
197
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
198
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
199
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
200
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
201
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
202
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
203
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
204
|
-
return b.id - a.id;
|
|
205
|
-
});
|
|
206
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
207
|
-
const sqlNodeJob = jobs.find((job) => job.nodeId.toString() === sqlNodeId);
|
|
208
|
-
const sqlNodeJobResult = sqlNodeJob.result;
|
|
209
|
-
const nodeResultRecordLength = sqlNodeJobResult[0].length;
|
|
210
|
-
expect(nodeResultRecordLength).toBe(8);
|
|
211
|
-
// 4、后置处理:删除工作流
|
|
212
|
-
await apiDeleteWorkflow(workflowId);
|
|
213
|
-
});
|
|
214
|
-
|
|
215
|
-
test('Variables as where condition, select 1 record', async ({ page, mockCollections, mockRecords }) => {
|
|
216
|
-
//数据表后缀标识
|
|
217
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
218
|
-
const SQLNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
219
|
-
// 创建触发器节点数据表
|
|
220
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
221
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
222
|
-
const triggerNodeFieldName = 'orgname';
|
|
223
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
224
|
-
await mockCollections(
|
|
225
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
226
|
-
.collections,
|
|
227
|
-
);
|
|
228
|
-
// 创建SQL节点数据表
|
|
229
|
-
const SQLNodeCollectionDisplayName = `自动>组织[普通表]${SQLNodeAppendText}`;
|
|
230
|
-
const SQLNodeCollectionName = `tt_amt_org${SQLNodeAppendText}`;
|
|
231
|
-
const SQLNodeFieldName = 'orgname';
|
|
232
|
-
const SQLNodeFieldDisplayName = '公司名称(单行文本)';
|
|
233
|
-
await mockCollections(
|
|
234
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), SQLNodeAppendText)
|
|
235
|
-
.collections,
|
|
236
|
-
);
|
|
237
|
-
const SQLNodeCollectioRecordOne = [{ orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10 }];
|
|
238
|
-
const SQLNodeCollectioRecordTwo = [{ orgname: '公司名称(单行文本)2', status_singleselect: '1', staffnum: 20 }];
|
|
239
|
-
const SQLNodeCollectioRecordThree = [{ orgname: '公司名称(单行文本)3', status_singleselect: '1', staffnum: 30 }];
|
|
240
|
-
const SQLNodeCollectioRecordFour = [{ orgname: '公司名称(单行文本)4', status_singleselect: '1', staffnum: 40 }];
|
|
241
|
-
const SQLNodeCollectioRecordFive = [{ orgname: '公司名称(单行文本)5', status_singleselect: '2', staffnum: 10 }];
|
|
242
|
-
const SQLNodeCollectioRecordSix = [{ orgname: '公司名称(单行文本)6', status_singleselect: '2', staffnum: 20 }];
|
|
243
|
-
const SQLNodeCollectioRecordSeven = [{ orgname: '公司名称(单行文本)7', status_singleselect: '2', staffnum: 30 }];
|
|
244
|
-
const SQLNodeCollectioRecordEight = [{ orgname: '公司名称(单行文本)8', status_singleselect: '2', staffnum: 40 }];
|
|
245
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordOne);
|
|
246
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordTwo);
|
|
247
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordThree);
|
|
248
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFour);
|
|
249
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFive);
|
|
250
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSix);
|
|
251
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSeven);
|
|
252
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordEight);
|
|
253
|
-
//添加工作流
|
|
254
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
255
|
-
const workflowData = {
|
|
256
|
-
current: true,
|
|
257
|
-
options: { deleteExecutionOnStatus: [] },
|
|
258
|
-
title: workFlowName,
|
|
259
|
-
type: 'collection',
|
|
260
|
-
enabled: true,
|
|
261
|
-
};
|
|
262
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
263
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
264
|
-
const workflowId = workflowObj.id;
|
|
265
|
-
//配置工作流触发器
|
|
266
|
-
const triggerNodeData = {
|
|
267
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
268
|
-
};
|
|
269
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
270
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
271
|
-
//配置SQL节点
|
|
272
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
273
|
-
await page.waitForLoadState('networkidle');
|
|
274
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
275
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
276
|
-
await page.getByRole('button', { name: 'sql', exact: true }).click();
|
|
277
|
-
const sqlNodeName = 'SQL action' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
278
|
-
await page.getByLabel('SQL action-SQL action', { exact: true }).getByRole('textbox').fill(sqlNodeName);
|
|
279
|
-
const sqlNode = new SQLNode(page, sqlNodeName);
|
|
280
|
-
const sqlNodeId = await sqlNode.node.locator('.workflow-node-id').innerText();
|
|
281
|
-
await sqlNode.nodeConfigure.click();
|
|
282
|
-
await sqlNode.sqlEditBox.fill(`select * from ${SQLNodeCollectionName} where id = `);
|
|
283
|
-
await sqlNode.sqlEditBox.focus();
|
|
284
|
-
await page.keyboard.type(``);
|
|
285
|
-
await page.getByLabel('variable-button').click();
|
|
286
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger variables' }).click();
|
|
287
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger data' }).click();
|
|
288
|
-
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
|
289
|
-
await sqlNode.submitButton.click();
|
|
290
|
-
|
|
291
|
-
// 2、测试步骤:添加数据触发工作流
|
|
292
|
-
const triggerNodeCollectionRecordOne =
|
|
293
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
294
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
295
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
296
|
-
]);
|
|
297
|
-
await page.waitForTimeout(1000);
|
|
298
|
-
// 3、预期结果:工作流成功触发,数据查询成功
|
|
299
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
300
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
301
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
302
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
303
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
304
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
305
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
306
|
-
return b.id - a.id;
|
|
307
|
-
});
|
|
308
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
309
|
-
const sqlNodeJob = jobs.find((job) => job.nodeId.toString() === sqlNodeId);
|
|
310
|
-
const sqlNodeJobResult = sqlNodeJob.result;
|
|
311
|
-
const nodeResultRecordOrgname = sqlNodeJobResult[0][0].orgname;
|
|
312
|
-
expect(nodeResultRecordOrgname).toBe('公司名称(单行文本)1');
|
|
313
|
-
// 4、后置处理:删除工作流
|
|
314
|
-
await apiDeleteWorkflow(workflowId);
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
test('Variables as where condition, select Multiple Records', async ({ page, mockCollections, mockRecords }) => {
|
|
318
|
-
//数据表后缀标识
|
|
319
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
320
|
-
const SQLNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
321
|
-
// 创建触发器节点数据表
|
|
322
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
323
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
324
|
-
const triggerNodeFieldName = 'orgname';
|
|
325
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
326
|
-
await mockCollections(
|
|
327
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
328
|
-
.collections,
|
|
329
|
-
);
|
|
330
|
-
// 创建SQL节点数据表
|
|
331
|
-
const SQLNodeCollectionDisplayName = `自动>组织[普通表]${SQLNodeAppendText}`;
|
|
332
|
-
const SQLNodeCollectionName = `tt_amt_org${SQLNodeAppendText}`;
|
|
333
|
-
const SQLNodeFieldName = 'orgname';
|
|
334
|
-
const SQLNodeFieldDisplayName = '公司名称(单行文本)';
|
|
335
|
-
await mockCollections(
|
|
336
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), SQLNodeAppendText)
|
|
337
|
-
.collections,
|
|
338
|
-
);
|
|
339
|
-
const SQLNodeCollectioRecordOne = [{ orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10 }];
|
|
340
|
-
const SQLNodeCollectioRecordTwo = [{ orgname: '公司名称(单行文本)2', status_singleselect: '1', staffnum: 20 }];
|
|
341
|
-
const SQLNodeCollectioRecordThree = [{ orgname: '公司名称(单行文本)3', status_singleselect: '1', staffnum: 30 }];
|
|
342
|
-
const SQLNodeCollectioRecordFour = [{ orgname: '公司名称(单行文本)4', status_singleselect: '1', staffnum: 40 }];
|
|
343
|
-
const SQLNodeCollectioRecordFive = [{ orgname: '公司名称(单行文本)5', status_singleselect: '2', staffnum: 10 }];
|
|
344
|
-
const SQLNodeCollectioRecordSix = [{ orgname: '公司名称(单行文本)6', status_singleselect: '2', staffnum: 20 }];
|
|
345
|
-
const SQLNodeCollectioRecordSeven = [{ orgname: '公司名称(单行文本)7', status_singleselect: '2', staffnum: 30 }];
|
|
346
|
-
const SQLNodeCollectioRecordEight = [{ orgname: '公司名称(单行文本)8', status_singleselect: '2', staffnum: 40 }];
|
|
347
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordOne);
|
|
348
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordTwo);
|
|
349
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordThree);
|
|
350
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFour);
|
|
351
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFive);
|
|
352
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSix);
|
|
353
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSeven);
|
|
354
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordEight);
|
|
355
|
-
//添加工作流
|
|
356
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
357
|
-
const workflowData = {
|
|
358
|
-
current: true,
|
|
359
|
-
options: { deleteExecutionOnStatus: [] },
|
|
360
|
-
title: workFlowName,
|
|
361
|
-
type: 'collection',
|
|
362
|
-
enabled: true,
|
|
363
|
-
};
|
|
364
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
365
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
366
|
-
const workflowId = workflowObj.id;
|
|
367
|
-
//配置工作流触发器
|
|
368
|
-
const triggerNodeData = {
|
|
369
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
370
|
-
};
|
|
371
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
372
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
373
|
-
//配置SQL节点
|
|
374
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
375
|
-
await page.waitForLoadState('networkidle');
|
|
376
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
377
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
378
|
-
await page.getByRole('button', { name: 'sql', exact: true }).click();
|
|
379
|
-
const sqlNodeName = 'SQL action' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
380
|
-
await page.getByLabel('SQL action-SQL action', { exact: true }).getByRole('textbox').fill(sqlNodeName);
|
|
381
|
-
const sqlNode = new SQLNode(page, sqlNodeName);
|
|
382
|
-
const sqlNodeId = await sqlNode.node.locator('.workflow-node-id').innerText();
|
|
383
|
-
await sqlNode.nodeConfigure.click();
|
|
384
|
-
await sqlNode.sqlEditBox.fill(`select * from ${SQLNodeCollectionName} where id <> `);
|
|
385
|
-
await sqlNode.sqlEditBox.focus();
|
|
386
|
-
await page.keyboard.type(``);
|
|
387
|
-
await page.getByLabel('variable-button').click();
|
|
388
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger variables' }).click();
|
|
389
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger data' }).click();
|
|
390
|
-
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
|
391
|
-
await sqlNode.submitButton.click();
|
|
392
|
-
|
|
393
|
-
// 2、测试步骤:添加数据触发工作流
|
|
394
|
-
const triggerNodeCollectionRecordOne =
|
|
395
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
396
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
397
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
398
|
-
]);
|
|
399
|
-
await page.waitForTimeout(1000);
|
|
400
|
-
// 3、预期结果:工作流成功触发,数据查询成功
|
|
401
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
402
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
403
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
404
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
405
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
406
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
407
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
408
|
-
return b.id - a.id;
|
|
409
|
-
});
|
|
410
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
411
|
-
const sqlNodeJob = jobs.find((job) => job.nodeId.toString() === sqlNodeId);
|
|
412
|
-
const sqlNodeJobResult = sqlNodeJob.result;
|
|
413
|
-
const nodeResultRecordLength = sqlNodeJobResult[0].length;
|
|
414
|
-
expect(nodeResultRecordLength).toBe(7);
|
|
415
|
-
// 4、后置处理:删除工作流
|
|
416
|
-
await apiDeleteWorkflow(workflowId);
|
|
417
|
-
});
|
|
418
|
-
|
|
419
|
-
test('Variables as field data, select 1 record', async ({ page, mockCollections, mockRecords }) => {
|
|
420
|
-
//数据表后缀标识
|
|
421
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
422
|
-
const SQLNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
423
|
-
// 创建触发器节点数据表
|
|
424
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
425
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
426
|
-
const triggerNodeFieldName = 'orgname';
|
|
427
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
428
|
-
await mockCollections(
|
|
429
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
430
|
-
.collections,
|
|
431
|
-
);
|
|
432
|
-
// 创建SQL节点数据表
|
|
433
|
-
const SQLNodeCollectionDisplayName = `自动>组织[普通表]${SQLNodeAppendText}`;
|
|
434
|
-
const SQLNodeCollectionName = `tt_amt_org${SQLNodeAppendText}`;
|
|
435
|
-
const SQLNodeFieldName = 'orgname';
|
|
436
|
-
const SQLNodeFieldDisplayName = '公司名称(单行文本)';
|
|
437
|
-
await mockCollections(
|
|
438
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), SQLNodeAppendText)
|
|
439
|
-
.collections,
|
|
440
|
-
);
|
|
441
|
-
const SQLNodeCollectioRecordOne = [{ orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10 }];
|
|
442
|
-
const SQLNodeCollectioRecordTwo = [{ orgname: '公司名称(单行文本)2', status_singleselect: '1', staffnum: 20 }];
|
|
443
|
-
const SQLNodeCollectioRecordThree = [{ orgname: '公司名称(单行文本)3', status_singleselect: '1', staffnum: 30 }];
|
|
444
|
-
const SQLNodeCollectioRecordFour = [{ orgname: '公司名称(单行文本)4', status_singleselect: '1', staffnum: 40 }];
|
|
445
|
-
const SQLNodeCollectioRecordFive = [{ orgname: '公司名称(单行文本)5', status_singleselect: '2', staffnum: 10 }];
|
|
446
|
-
const SQLNodeCollectioRecordSix = [{ orgname: '公司名称(单行文本)6', status_singleselect: '2', staffnum: 20 }];
|
|
447
|
-
const SQLNodeCollectioRecordSeven = [{ orgname: '公司名称(单行文本)7', status_singleselect: '2', staffnum: 30 }];
|
|
448
|
-
const SQLNodeCollectioRecordEight = [{ orgname: '公司名称(单行文本)8', status_singleselect: '2', staffnum: 40 }];
|
|
449
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordOne);
|
|
450
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordTwo);
|
|
451
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordThree);
|
|
452
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFour);
|
|
453
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFive);
|
|
454
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSix);
|
|
455
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSeven);
|
|
456
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordEight);
|
|
457
|
-
//添加工作流
|
|
458
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
459
|
-
const workflowData = {
|
|
460
|
-
current: true,
|
|
461
|
-
options: { deleteExecutionOnStatus: [] },
|
|
462
|
-
title: workFlowName,
|
|
463
|
-
type: 'collection',
|
|
464
|
-
enabled: true,
|
|
465
|
-
};
|
|
466
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
467
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
468
|
-
const workflowId = workflowObj.id;
|
|
469
|
-
//配置工作流触发器
|
|
470
|
-
const triggerNodeData = {
|
|
471
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
472
|
-
};
|
|
473
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
474
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
475
|
-
//配置SQL节点
|
|
476
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
477
|
-
await page.waitForLoadState('networkidle');
|
|
478
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
479
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
480
|
-
await page.getByRole('button', { name: 'sql', exact: true }).click();
|
|
481
|
-
const sqlNodeName = 'SQL action' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
482
|
-
await page.getByLabel('SQL action-SQL action', { exact: true }).getByRole('textbox').fill(sqlNodeName);
|
|
483
|
-
const sqlNode = new SQLNode(page, sqlNodeName);
|
|
484
|
-
const sqlNodeId = await sqlNode.node.locator('.workflow-node-id').innerText();
|
|
485
|
-
await sqlNode.nodeConfigure.click();
|
|
486
|
-
await sqlNode.sqlEditBox.fill(`select '`);
|
|
487
|
-
await sqlNode.sqlEditBox.focus();
|
|
488
|
-
await page.keyboard.type(``);
|
|
489
|
-
await page.getByLabel('variable-button').click();
|
|
490
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger variables' }).click();
|
|
491
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger data' }).click();
|
|
492
|
-
await page.getByRole('menuitemcheckbox', { name: '公司名称(单行文本)', exact: true }).click();
|
|
493
|
-
await sqlNode.sqlEditBox.click();
|
|
494
|
-
await sqlNode.sqlEditBox.focus();
|
|
495
|
-
await page.keyboard.type(`' as orgname from ${SQLNodeCollectionName} where id =1`);
|
|
496
|
-
await sqlNode.submitButton.click();
|
|
497
|
-
|
|
498
|
-
// 2、测试步骤:添加数据触发工作流
|
|
499
|
-
const triggerNodeCollectionRecordOne =
|
|
500
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
501
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
502
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
503
|
-
]);
|
|
504
|
-
await page.waitForTimeout(1000);
|
|
505
|
-
// 3、预期结果:工作流成功触发,数据查询成功
|
|
506
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
507
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
508
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
509
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
510
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
511
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
512
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
513
|
-
return b.id - a.id;
|
|
514
|
-
});
|
|
515
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
516
|
-
const sqlNodeJob = jobs.find((job) => job.nodeId.toString() === sqlNodeId);
|
|
517
|
-
const sqlNodeJobResult = sqlNodeJob.result;
|
|
518
|
-
const nodeResultRecordOrgname = sqlNodeJobResult[0][0].orgname;
|
|
519
|
-
expect(nodeResultRecordOrgname).toBe(triggerNodeCollectionRecordOne);
|
|
520
|
-
// 4、后置处理:删除工作流
|
|
521
|
-
await apiDeleteWorkflow(workflowId);
|
|
522
|
-
});
|
|
523
|
-
|
|
524
|
-
test('Variables as field data, select Multiple Records', async ({ page, mockCollections, mockRecords }) => {
|
|
525
|
-
//数据表后缀标识
|
|
526
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
527
|
-
const SQLNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
528
|
-
// 创建触发器节点数据表
|
|
529
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
530
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
531
|
-
const triggerNodeFieldName = 'orgname';
|
|
532
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
533
|
-
await mockCollections(
|
|
534
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
535
|
-
.collections,
|
|
536
|
-
);
|
|
537
|
-
// 创建SQL节点数据表
|
|
538
|
-
const SQLNodeCollectionDisplayName = `自动>组织[普通表]${SQLNodeAppendText}`;
|
|
539
|
-
const SQLNodeCollectionName = `tt_amt_org${SQLNodeAppendText}`;
|
|
540
|
-
const SQLNodeFieldName = 'orgname';
|
|
541
|
-
const SQLNodeFieldDisplayName = '公司名称(单行文本)';
|
|
542
|
-
await mockCollections(
|
|
543
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), SQLNodeAppendText)
|
|
544
|
-
.collections,
|
|
545
|
-
);
|
|
546
|
-
const SQLNodeCollectioRecordOne = [{ orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10 }];
|
|
547
|
-
const SQLNodeCollectioRecordTwo = [{ orgname: '公司名称(单行文本)2', status_singleselect: '1', staffnum: 20 }];
|
|
548
|
-
const SQLNodeCollectioRecordThree = [{ orgname: '公司名称(单行文本)3', status_singleselect: '1', staffnum: 30 }];
|
|
549
|
-
const SQLNodeCollectioRecordFour = [{ orgname: '公司名称(单行文本)4', status_singleselect: '1', staffnum: 40 }];
|
|
550
|
-
const SQLNodeCollectioRecordFive = [{ orgname: '公司名称(单行文本)5', status_singleselect: '2', staffnum: 10 }];
|
|
551
|
-
const SQLNodeCollectioRecordSix = [{ orgname: '公司名称(单行文本)6', status_singleselect: '2', staffnum: 20 }];
|
|
552
|
-
const SQLNodeCollectioRecordSeven = [{ orgname: '公司名称(单行文本)7', status_singleselect: '2', staffnum: 30 }];
|
|
553
|
-
const SQLNodeCollectioRecordEight = [{ orgname: '公司名称(单行文本)8', status_singleselect: '2', staffnum: 40 }];
|
|
554
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordOne);
|
|
555
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordTwo);
|
|
556
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordThree);
|
|
557
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFour);
|
|
558
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFive);
|
|
559
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSix);
|
|
560
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSeven);
|
|
561
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordEight);
|
|
562
|
-
//添加工作流
|
|
563
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
564
|
-
const workflowData = {
|
|
565
|
-
current: true,
|
|
566
|
-
options: { deleteExecutionOnStatus: [] },
|
|
567
|
-
title: workFlowName,
|
|
568
|
-
type: 'collection',
|
|
569
|
-
enabled: true,
|
|
570
|
-
};
|
|
571
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
572
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
573
|
-
const workflowId = workflowObj.id;
|
|
574
|
-
//配置工作流触发器
|
|
575
|
-
const triggerNodeData = {
|
|
576
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
577
|
-
};
|
|
578
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
579
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
580
|
-
//配置SQL节点
|
|
581
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
582
|
-
await page.waitForLoadState('networkidle');
|
|
583
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
584
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
585
|
-
await page.getByRole('button', { name: 'sql', exact: true }).click();
|
|
586
|
-
const sqlNodeName = 'SQL action' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
587
|
-
await page.getByLabel('SQL action-SQL action', { exact: true }).getByRole('textbox').fill(sqlNodeName);
|
|
588
|
-
const sqlNode = new SQLNode(page, sqlNodeName);
|
|
589
|
-
const sqlNodeId = await sqlNode.node.locator('.workflow-node-id').innerText();
|
|
590
|
-
await sqlNode.nodeConfigure.click();
|
|
591
|
-
await sqlNode.sqlEditBox.fill(`select '`);
|
|
592
|
-
await sqlNode.sqlEditBox.focus();
|
|
593
|
-
await page.keyboard.type(``);
|
|
594
|
-
await page.getByLabel('variable-button').click();
|
|
595
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger variables' }).click();
|
|
596
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger data' }).click();
|
|
597
|
-
await page.getByRole('menuitemcheckbox', { name: '公司名称(单行文本)', exact: true }).click();
|
|
598
|
-
await sqlNode.sqlEditBox.click();
|
|
599
|
-
await sqlNode.sqlEditBox.focus();
|
|
600
|
-
await page.keyboard.type(`' as orgname from ${SQLNodeCollectionName}`);
|
|
601
|
-
await sqlNode.submitButton.click();
|
|
602
|
-
|
|
603
|
-
// 2、测试步骤:添加数据触发工作流
|
|
604
|
-
const triggerNodeCollectionRecordOne =
|
|
605
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
606
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
607
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
608
|
-
]);
|
|
609
|
-
await page.waitForTimeout(1000);
|
|
610
|
-
// 3、预期结果:工作流成功触发,数据查询成功
|
|
611
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
612
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
613
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
614
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
615
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
616
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
617
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
618
|
-
return b.id - a.id;
|
|
619
|
-
});
|
|
620
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
621
|
-
const sqlNodeJob = jobs.find((job) => job.nodeId.toString() === sqlNodeId);
|
|
622
|
-
const sqlNodeJobResult = sqlNodeJob.result;
|
|
623
|
-
const nodeResultRecordLength = sqlNodeJobResult[0].length;
|
|
624
|
-
expect(nodeResultRecordLength).toBe(8);
|
|
625
|
-
// 4、后置处理:删除工作流
|
|
626
|
-
await apiDeleteWorkflow(workflowId);
|
|
627
|
-
});
|
|
628
|
-
});
|
|
629
|
-
|
|
630
|
-
test.describe('insert data', () => {
|
|
631
|
-
test('No variable SQL, insert values,insert 1 record', async ({ page, mockCollections, mockRecords }) => {
|
|
632
|
-
//数据表后缀标识
|
|
633
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
634
|
-
const SQLNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
635
|
-
// 创建触发器节点数据表
|
|
636
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
637
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
638
|
-
const triggerNodeFieldName = 'orgname';
|
|
639
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
640
|
-
await mockCollections(
|
|
641
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
642
|
-
.collections,
|
|
643
|
-
);
|
|
644
|
-
// 创建查询节点数据表
|
|
645
|
-
const SQLNodeCollectionDisplayName = `自动>组织[普通表]${SQLNodeAppendText}`;
|
|
646
|
-
const SQLNodeCollectionName = `tt_amt_org${SQLNodeAppendText}`;
|
|
647
|
-
const SQLNodeFieldName = 'orgname';
|
|
648
|
-
const SQLNodeFieldDisplayName = '公司名称(单行文本)';
|
|
649
|
-
await mockCollections(
|
|
650
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), SQLNodeAppendText)
|
|
651
|
-
.collections,
|
|
652
|
-
);
|
|
653
|
-
//添加工作流
|
|
654
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
655
|
-
const workflowData = {
|
|
656
|
-
current: true,
|
|
657
|
-
options: { deleteExecutionOnStatus: [] },
|
|
658
|
-
title: workFlowName,
|
|
659
|
-
type: 'collection',
|
|
660
|
-
enabled: true,
|
|
661
|
-
};
|
|
662
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
663
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
664
|
-
const workflowId = workflowObj.id;
|
|
665
|
-
//配置工作流触发器
|
|
666
|
-
const triggerNodeData = {
|
|
667
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
668
|
-
};
|
|
669
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
670
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
671
|
-
//配置SQL节点
|
|
672
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
673
|
-
await page.waitForLoadState('networkidle');
|
|
674
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
675
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
676
|
-
await page.getByRole('button', { name: 'sql', exact: true }).click();
|
|
677
|
-
const sqlNodeName = 'SQL action' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
678
|
-
await page.getByLabel('SQL action-SQL action', { exact: true }).getByRole('textbox').fill(sqlNodeName);
|
|
679
|
-
const sqlNode = new SQLNode(page, sqlNodeName);
|
|
680
|
-
const sqlNodeId = await sqlNode.node.locator('.workflow-node-id').innerText();
|
|
681
|
-
await sqlNode.nodeConfigure.click();
|
|
682
|
-
await sqlNode.sqlEditBox.fill(
|
|
683
|
-
`insert into ${SQLNodeCollectionName}(orgname,status_singleselect,staffnum) values('公司名称(单行文本)1','1',10) returning *`,
|
|
684
|
-
);
|
|
685
|
-
await sqlNode.submitButton.click();
|
|
686
|
-
|
|
687
|
-
// 2、测试步骤:添加数据触发工作流
|
|
688
|
-
const triggerNodeCollectionRecordOne =
|
|
689
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
690
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
691
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
692
|
-
]);
|
|
693
|
-
await page.waitForTimeout(1000);
|
|
694
|
-
// 3、预期结果:工作流成功触发,数据查询成功
|
|
695
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
696
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
697
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
698
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
699
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
700
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
701
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
702
|
-
return b.id - a.id;
|
|
703
|
-
});
|
|
704
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
705
|
-
const sqlNodeJob = jobs.find((job) => job.nodeId.toString() === sqlNodeId);
|
|
706
|
-
const sqlNodeJobResult = sqlNodeJob.result;
|
|
707
|
-
const nodeResultRecordOrgname = sqlNodeJobResult[0][0].orgname;
|
|
708
|
-
expect(nodeResultRecordOrgname).toBe('公司名称(单行文本)1');
|
|
709
|
-
|
|
710
|
-
const insertRecordId = sqlNodeJobResult[0][0].id;
|
|
711
|
-
const getRecords = await apiGetRecord(SQLNodeCollectionName, insertRecordId);
|
|
712
|
-
const getRecordsObj = JSON.parse(JSON.stringify(getRecords));
|
|
713
|
-
expect(getRecordsObj.orgname).toBe('公司名称(单行文本)1');
|
|
714
|
-
|
|
715
|
-
// 4、后置处理:删除工作流
|
|
716
|
-
await apiDeleteWorkflow(workflowId);
|
|
717
|
-
});
|
|
718
|
-
|
|
719
|
-
test('No variable SQL, insert values, insert Multiple Records', async ({ page, mockCollections, mockRecords }) => {
|
|
720
|
-
//数据表后缀标识
|
|
721
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
722
|
-
const SQLNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
723
|
-
// 创建触发器节点数据表
|
|
724
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
725
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
726
|
-
const triggerNodeFieldName = 'orgname';
|
|
727
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
728
|
-
await mockCollections(
|
|
729
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
730
|
-
.collections,
|
|
731
|
-
);
|
|
732
|
-
// 创建查询节点数据表
|
|
733
|
-
const SQLNodeCollectionDisplayName = `自动>组织[普通表]${SQLNodeAppendText}`;
|
|
734
|
-
const SQLNodeCollectionName = `tt_amt_org${SQLNodeAppendText}`;
|
|
735
|
-
const SQLNodeFieldName = 'orgname';
|
|
736
|
-
const SQLNodeFieldDisplayName = '公司名称(单行文本)';
|
|
737
|
-
await mockCollections(
|
|
738
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), SQLNodeAppendText)
|
|
739
|
-
.collections,
|
|
740
|
-
);
|
|
741
|
-
//添加工作流
|
|
742
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
743
|
-
const workflowData = {
|
|
744
|
-
current: true,
|
|
745
|
-
options: { deleteExecutionOnStatus: [] },
|
|
746
|
-
title: workFlowName,
|
|
747
|
-
type: 'collection',
|
|
748
|
-
enabled: true,
|
|
749
|
-
};
|
|
750
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
751
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
752
|
-
const workflowId = workflowObj.id;
|
|
753
|
-
//配置工作流触发器
|
|
754
|
-
const triggerNodeData = {
|
|
755
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
756
|
-
};
|
|
757
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
758
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
759
|
-
//配置SQL节点
|
|
760
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
761
|
-
await page.waitForLoadState('networkidle');
|
|
762
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
763
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
764
|
-
await page.getByRole('button', { name: 'sql', exact: true }).click();
|
|
765
|
-
const sqlNodeName = 'SQL action' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
766
|
-
await page.getByLabel('SQL action-SQL action', { exact: true }).getByRole('textbox').fill(sqlNodeName);
|
|
767
|
-
const sqlNode = new SQLNode(page, sqlNodeName);
|
|
768
|
-
const sqlNodeId = await sqlNode.node.locator('.workflow-node-id').innerText();
|
|
769
|
-
await sqlNode.nodeConfigure.click();
|
|
770
|
-
await sqlNode.sqlEditBox.fill(
|
|
771
|
-
`insert into ${SQLNodeCollectionName}(orgname,status_singleselect,staffnum) values('公司名称(单行文本)1','1',10),('公司名称(单行文本)2','1',20),('公司名称(单行文本)3','1',30) returning *`,
|
|
772
|
-
);
|
|
773
|
-
await sqlNode.submitButton.click();
|
|
774
|
-
|
|
775
|
-
// 2、测试步骤:添加数据触发工作流
|
|
776
|
-
const triggerNodeCollectionRecordOne =
|
|
777
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
778
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
779
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
780
|
-
]);
|
|
781
|
-
await page.waitForTimeout(1000);
|
|
782
|
-
// 3、预期结果:工作流成功触发,数据查询成功
|
|
783
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
784
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
785
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
786
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
787
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
788
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
789
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
790
|
-
return b.id - a.id;
|
|
791
|
-
});
|
|
792
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
793
|
-
const sqlNodeJob = jobs.find((job) => job.nodeId.toString() === sqlNodeId);
|
|
794
|
-
const sqlNodeJobResult = sqlNodeJob.result;
|
|
795
|
-
const nodeResultRecordLength = sqlNodeJobResult[0].length;
|
|
796
|
-
expect(nodeResultRecordLength).toBe(3);
|
|
797
|
-
// 4、后置处理:删除工作流
|
|
798
|
-
await apiDeleteWorkflow(workflowId);
|
|
799
|
-
});
|
|
800
|
-
|
|
801
|
-
test('The variable is the values value, insert 1 record', async ({ page, mockCollections, mockRecords }) => {
|
|
802
|
-
//数据表后缀标识
|
|
803
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
804
|
-
const SQLNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
805
|
-
// 创建触发器节点数据表
|
|
806
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
807
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
808
|
-
const triggerNodeFieldName = 'orgname';
|
|
809
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
810
|
-
await mockCollections(
|
|
811
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
812
|
-
.collections,
|
|
813
|
-
);
|
|
814
|
-
// 创建SQL节点数据表
|
|
815
|
-
const SQLNodeCollectionDisplayName = `自动>组织[普通表]${SQLNodeAppendText}`;
|
|
816
|
-
const SQLNodeCollectionName = `tt_amt_org${SQLNodeAppendText}`;
|
|
817
|
-
const SQLNodeFieldName = 'orgname';
|
|
818
|
-
const SQLNodeFieldDisplayName = '公司名称(单行文本)';
|
|
819
|
-
await mockCollections(
|
|
820
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), SQLNodeAppendText)
|
|
821
|
-
.collections,
|
|
822
|
-
);
|
|
823
|
-
//添加工作流
|
|
824
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
825
|
-
const workflowData = {
|
|
826
|
-
current: true,
|
|
827
|
-
options: { deleteExecutionOnStatus: [] },
|
|
828
|
-
title: workFlowName,
|
|
829
|
-
type: 'collection',
|
|
830
|
-
enabled: true,
|
|
831
|
-
};
|
|
832
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
833
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
834
|
-
const workflowId = workflowObj.id;
|
|
835
|
-
//配置工作流触发器
|
|
836
|
-
const triggerNodeData = {
|
|
837
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
838
|
-
};
|
|
839
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
840
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
841
|
-
//配置SQL节点
|
|
842
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
843
|
-
await page.waitForLoadState('networkidle');
|
|
844
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
845
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
846
|
-
await page.getByRole('button', { name: 'sql', exact: true }).click();
|
|
847
|
-
const sqlNodeName = 'SQL action' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
848
|
-
await page.getByLabel('SQL action-SQL action', { exact: true }).getByRole('textbox').fill(sqlNodeName);
|
|
849
|
-
const sqlNode = new SQLNode(page, sqlNodeName);
|
|
850
|
-
const sqlNodeId = await sqlNode.node.locator('.workflow-node-id').innerText();
|
|
851
|
-
await sqlNode.nodeConfigure.click();
|
|
852
|
-
await sqlNode.sqlEditBox.fill(
|
|
853
|
-
`insert into ${SQLNodeCollectionName}(orgname,status_singleselect,staffnum) values('`,
|
|
854
|
-
);
|
|
855
|
-
await sqlNode.sqlEditBox.click({ clickCount: 3 });
|
|
856
|
-
await page.keyboard.press('ArrowRight');
|
|
857
|
-
await page.getByLabel('variable-button').click();
|
|
858
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger variables' }).click();
|
|
859
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger data' }).click();
|
|
860
|
-
await page.getByRole('menuitemcheckbox', { name: '公司名称(单行文本)', exact: true }).click();
|
|
861
|
-
await sqlNode.sqlEditBox.click({ clickCount: 3 });
|
|
862
|
-
await page.keyboard.press('ArrowRight');
|
|
863
|
-
await page.keyboard.type(`','`);
|
|
864
|
-
await page.getByLabel('variable-button').click();
|
|
865
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger variables' }).click();
|
|
866
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger data' }).click();
|
|
867
|
-
await page.getByRole('menuitemcheckbox', { name: '公司状态(下拉单选)', exact: true }).click();
|
|
868
|
-
await sqlNode.sqlEditBox.click({ clickCount: 3 });
|
|
869
|
-
await page.keyboard.press('ArrowRight');
|
|
870
|
-
await page.keyboard.type(`',`);
|
|
871
|
-
await page.getByLabel('variable-button').click();
|
|
872
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger variables' }).click();
|
|
873
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger data' }).click();
|
|
874
|
-
await page.getByRole('menuitemcheckbox', { name: '员工人数(整数)', exact: true }).click();
|
|
875
|
-
await sqlNode.sqlEditBox.click({ clickCount: 3 });
|
|
876
|
-
await page.keyboard.press('ArrowRight');
|
|
877
|
-
await page.keyboard.type(`) returning *`);
|
|
878
|
-
await sqlNode.submitButton.click();
|
|
879
|
-
// 2、测试步骤:添加数据触发工作流
|
|
880
|
-
await mockRecords(triggerNodeCollectionName, [
|
|
881
|
-
{ orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10 },
|
|
882
|
-
]);
|
|
883
|
-
await page.waitForTimeout(1000);
|
|
884
|
-
// 3、预期结果:工作流成功触发,数据查询成功
|
|
885
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
886
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
887
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
888
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
889
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
890
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
891
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
892
|
-
return b.id - a.id;
|
|
893
|
-
});
|
|
894
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
895
|
-
const sqlNodeJob = jobs.find((job) => job.nodeId.toString() === sqlNodeId);
|
|
896
|
-
const sqlNodeJobResult = sqlNodeJob.result;
|
|
897
|
-
const nodeResultRecordOrgname = sqlNodeJobResult[0][0].orgname;
|
|
898
|
-
expect(nodeResultRecordOrgname).toBe('公司名称(单行文本)1');
|
|
899
|
-
// 4、后置处理:删除工作流
|
|
900
|
-
await apiDeleteWorkflow(workflowId);
|
|
901
|
-
});
|
|
902
|
-
});
|
|
903
|
-
|
|
904
|
-
test.describe('update data', () => {
|
|
905
|
-
test('No variable SQL', async ({ page, mockCollections, mockRecords }) => {
|
|
906
|
-
//数据表后缀标识
|
|
907
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
908
|
-
const SQLNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
909
|
-
// 创建触发器节点数据表
|
|
910
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
911
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
912
|
-
const triggerNodeFieldName = 'orgname';
|
|
913
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
914
|
-
await mockCollections(
|
|
915
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
916
|
-
.collections,
|
|
917
|
-
);
|
|
918
|
-
// 创建查询节点数据表
|
|
919
|
-
const SQLNodeCollectionDisplayName = `自动>组织[普通表]${SQLNodeAppendText}`;
|
|
920
|
-
const SQLNodeCollectionName = `tt_amt_org${SQLNodeAppendText}`;
|
|
921
|
-
const SQLNodeFieldName = 'orgname';
|
|
922
|
-
const SQLNodeFieldDisplayName = '公司名称(单行文本)';
|
|
923
|
-
await mockCollections(
|
|
924
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), SQLNodeAppendText)
|
|
925
|
-
.collections,
|
|
926
|
-
);
|
|
927
|
-
const SQLNodeCollectioRecordOne = [{ orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10 }];
|
|
928
|
-
const SQLNodeCollectioRecordTwo = [{ orgname: '公司名称(单行文本)2', status_singleselect: '1', staffnum: 20 }];
|
|
929
|
-
const SQLNodeCollectioRecordThree = [{ orgname: '公司名称(单行文本)3', status_singleselect: '1', staffnum: 30 }];
|
|
930
|
-
const SQLNodeCollectioRecordFour = [{ orgname: '公司名称(单行文本)4', status_singleselect: '1', staffnum: 40 }];
|
|
931
|
-
const SQLNodeCollectioRecordFive = [{ orgname: '公司名称(单行文本)5', status_singleselect: '2', staffnum: 10 }];
|
|
932
|
-
const SQLNodeCollectioRecordSix = [{ orgname: '公司名称(单行文本)6', status_singleselect: '2', staffnum: 20 }];
|
|
933
|
-
const SQLNodeCollectioRecordSeven = [{ orgname: '公司名称(单行文本)7', status_singleselect: '2', staffnum: 30 }];
|
|
934
|
-
const SQLNodeCollectioRecordEight = [{ orgname: '公司名称(单行文本)8', status_singleselect: '2', staffnum: 40 }];
|
|
935
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordOne);
|
|
936
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordTwo);
|
|
937
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordThree);
|
|
938
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFour);
|
|
939
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFive);
|
|
940
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSix);
|
|
941
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSeven);
|
|
942
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordEight);
|
|
943
|
-
//添加工作流
|
|
944
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
945
|
-
const workflowData = {
|
|
946
|
-
current: true,
|
|
947
|
-
options: { deleteExecutionOnStatus: [] },
|
|
948
|
-
title: workFlowName,
|
|
949
|
-
type: 'collection',
|
|
950
|
-
enabled: true,
|
|
951
|
-
};
|
|
952
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
953
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
954
|
-
const workflowId = workflowObj.id;
|
|
955
|
-
//配置工作流触发器
|
|
956
|
-
const triggerNodeData = {
|
|
957
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
958
|
-
};
|
|
959
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
960
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
961
|
-
//配置SQL节点
|
|
962
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
963
|
-
await page.waitForLoadState('networkidle');
|
|
964
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
965
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
966
|
-
await page.getByRole('button', { name: 'sql', exact: true }).click();
|
|
967
|
-
const sqlNodeName = 'SQL action' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
968
|
-
await page.getByLabel('SQL action-SQL action', { exact: true }).getByRole('textbox').fill(sqlNodeName);
|
|
969
|
-
const sqlNode = new SQLNode(page, sqlNodeName);
|
|
970
|
-
const sqlNodeId = await sqlNode.node.locator('.workflow-node-id').innerText();
|
|
971
|
-
await sqlNode.nodeConfigure.click();
|
|
972
|
-
await sqlNode.sqlEditBox.fill(`update ${SQLNodeCollectionName} set orgname='orgname' returning *`);
|
|
973
|
-
await sqlNode.submitButton.click();
|
|
974
|
-
|
|
975
|
-
// 2、测试步骤:添加数据触发工作流
|
|
976
|
-
const triggerNodeCollectionRecordOne =
|
|
977
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
978
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
979
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
980
|
-
]);
|
|
981
|
-
await page.waitForTimeout(1000);
|
|
982
|
-
// 3、预期结果:工作流成功触发,数据查询成功
|
|
983
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
984
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
985
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
986
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
987
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
988
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
989
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
990
|
-
return b.id - a.id;
|
|
991
|
-
});
|
|
992
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
993
|
-
const sqlNodeJob = jobs.find((job) => job.nodeId.toString() === sqlNodeId);
|
|
994
|
-
const sqlNodeJobResult = sqlNodeJob.result;
|
|
995
|
-
const nodeResultRecordLength = sqlNodeJobResult[0].length;
|
|
996
|
-
expect(nodeResultRecordLength).toBe(8);
|
|
997
|
-
|
|
998
|
-
// 4、后置处理:删除工作流
|
|
999
|
-
await apiDeleteWorkflow(workflowId);
|
|
1000
|
-
});
|
|
1001
|
-
|
|
1002
|
-
test('Variables as where condition', async ({ page, mockCollections, mockRecords }) => {
|
|
1003
|
-
//数据表后缀标识
|
|
1004
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
1005
|
-
const SQLNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
1006
|
-
// 创建触发器节点数据表
|
|
1007
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
1008
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
1009
|
-
const triggerNodeFieldName = 'orgname';
|
|
1010
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
1011
|
-
await mockCollections(
|
|
1012
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
1013
|
-
.collections,
|
|
1014
|
-
);
|
|
1015
|
-
// 创建查询节点数据表
|
|
1016
|
-
const SQLNodeCollectionDisplayName = `自动>组织[普通表]${SQLNodeAppendText}`;
|
|
1017
|
-
const SQLNodeCollectionName = `tt_amt_org${SQLNodeAppendText}`;
|
|
1018
|
-
const SQLNodeFieldName = 'orgname';
|
|
1019
|
-
const SQLNodeFieldDisplayName = '公司名称(单行文本)';
|
|
1020
|
-
await mockCollections(
|
|
1021
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), SQLNodeAppendText)
|
|
1022
|
-
.collections,
|
|
1023
|
-
);
|
|
1024
|
-
const SQLNodeCollectioRecordOne = [{ orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10 }];
|
|
1025
|
-
const SQLNodeCollectioRecordTwo = [{ orgname: '公司名称(单行文本)2', status_singleselect: '1', staffnum: 20 }];
|
|
1026
|
-
const SQLNodeCollectioRecordThree = [{ orgname: '公司名称(单行文本)3', status_singleselect: '1', staffnum: 30 }];
|
|
1027
|
-
const SQLNodeCollectioRecordFour = [{ orgname: '公司名称(单行文本)4', status_singleselect: '1', staffnum: 40 }];
|
|
1028
|
-
const SQLNodeCollectioRecordFive = [{ orgname: '公司名称(单行文本)5', status_singleselect: '2', staffnum: 10 }];
|
|
1029
|
-
const SQLNodeCollectioRecordSix = [{ orgname: '公司名称(单行文本)6', status_singleselect: '2', staffnum: 20 }];
|
|
1030
|
-
const SQLNodeCollectioRecordSeven = [{ orgname: '公司名称(单行文本)7', status_singleselect: '2', staffnum: 30 }];
|
|
1031
|
-
const SQLNodeCollectioRecordEight = [{ orgname: '公司名称(单行文本)8', status_singleselect: '2', staffnum: 40 }];
|
|
1032
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordOne);
|
|
1033
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordTwo);
|
|
1034
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordThree);
|
|
1035
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFour);
|
|
1036
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFive);
|
|
1037
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSix);
|
|
1038
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSeven);
|
|
1039
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordEight);
|
|
1040
|
-
//添加工作流
|
|
1041
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
1042
|
-
const workflowData = {
|
|
1043
|
-
current: true,
|
|
1044
|
-
options: { deleteExecutionOnStatus: [] },
|
|
1045
|
-
title: workFlowName,
|
|
1046
|
-
type: 'collection',
|
|
1047
|
-
enabled: true,
|
|
1048
|
-
};
|
|
1049
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
1050
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
1051
|
-
const workflowId = workflowObj.id;
|
|
1052
|
-
//配置工作流触发器
|
|
1053
|
-
const triggerNodeData = {
|
|
1054
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
1055
|
-
};
|
|
1056
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
1057
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
1058
|
-
//配置SQL节点
|
|
1059
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
1060
|
-
await page.waitForLoadState('networkidle');
|
|
1061
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
1062
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
1063
|
-
await page.getByRole('button', { name: 'sql', exact: true }).click();
|
|
1064
|
-
const sqlNodeName = 'SQL action' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1065
|
-
await page.getByLabel('SQL action-SQL action', { exact: true }).getByRole('textbox').fill(sqlNodeName);
|
|
1066
|
-
const sqlNode = new SQLNode(page, sqlNodeName);
|
|
1067
|
-
const sqlNodeId = await sqlNode.node.locator('.workflow-node-id').innerText();
|
|
1068
|
-
await sqlNode.nodeConfigure.click();
|
|
1069
|
-
await sqlNode.sqlEditBox.fill(`update ${SQLNodeCollectionName} set orgname='orgname' where id=`);
|
|
1070
|
-
await sqlNode.sqlEditBox.click({ clickCount: 3 });
|
|
1071
|
-
await page.keyboard.press('ArrowRight');
|
|
1072
|
-
await page.getByLabel('variable-button').click();
|
|
1073
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger variables' }).click();
|
|
1074
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger data' }).click();
|
|
1075
|
-
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
|
1076
|
-
await sqlNode.sqlEditBox.click({ clickCount: 3 });
|
|
1077
|
-
await page.keyboard.press('ArrowRight');
|
|
1078
|
-
await page.keyboard.type(` returning *`);
|
|
1079
|
-
await sqlNode.submitButton.click();
|
|
1080
|
-
|
|
1081
|
-
// 2、测试步骤:添加数据触发工作流
|
|
1082
|
-
const triggerNodeCollectionRecordOne =
|
|
1083
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1084
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
1085
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
1086
|
-
]);
|
|
1087
|
-
await page.waitForTimeout(1000);
|
|
1088
|
-
// 3、预期结果:工作流成功触发,数据查询成功
|
|
1089
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
1090
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
1091
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
1092
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
1093
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
1094
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
1095
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
1096
|
-
return b.id - a.id;
|
|
1097
|
-
});
|
|
1098
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
1099
|
-
const sqlNodeJob = jobs.find((job) => job.nodeId.toString() === sqlNodeId);
|
|
1100
|
-
const sqlNodeJobResult = sqlNodeJob.result;
|
|
1101
|
-
const nodeResultRecordOrgname = sqlNodeJobResult[0][0].orgname;
|
|
1102
|
-
expect(nodeResultRecordOrgname).toBe('orgname');
|
|
1103
|
-
|
|
1104
|
-
// 4、后置处理:删除工作流
|
|
1105
|
-
await apiDeleteWorkflow(workflowId);
|
|
1106
|
-
});
|
|
1107
|
-
});
|
|
1108
|
-
|
|
1109
|
-
test.describe('delete data', () => {
|
|
1110
|
-
test('No variable SQL', async ({ page, mockCollections, mockRecords }) => {
|
|
1111
|
-
//数据表后缀标识
|
|
1112
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
1113
|
-
const SQLNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
1114
|
-
// 创建触发器节点数据表
|
|
1115
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
1116
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
1117
|
-
const triggerNodeFieldName = 'orgname';
|
|
1118
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
1119
|
-
await mockCollections(
|
|
1120
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
1121
|
-
.collections,
|
|
1122
|
-
);
|
|
1123
|
-
// 创建查询节点数据表
|
|
1124
|
-
const SQLNodeCollectionDisplayName = `自动>组织[普通表]${SQLNodeAppendText}`;
|
|
1125
|
-
const SQLNodeCollectionName = `tt_amt_org${SQLNodeAppendText}`;
|
|
1126
|
-
const SQLNodeFieldName = 'orgname';
|
|
1127
|
-
const SQLNodeFieldDisplayName = '公司名称(单行文本)';
|
|
1128
|
-
await mockCollections(
|
|
1129
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), SQLNodeAppendText)
|
|
1130
|
-
.collections,
|
|
1131
|
-
);
|
|
1132
|
-
const SQLNodeCollectioRecordOne = [{ orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10 }];
|
|
1133
|
-
const SQLNodeCollectioRecordTwo = [{ orgname: '公司名称(单行文本)2', status_singleselect: '1', staffnum: 20 }];
|
|
1134
|
-
const SQLNodeCollectioRecordThree = [{ orgname: '公司名称(单行文本)3', status_singleselect: '1', staffnum: 30 }];
|
|
1135
|
-
const SQLNodeCollectioRecordFour = [{ orgname: '公司名称(单行文本)4', status_singleselect: '1', staffnum: 40 }];
|
|
1136
|
-
const SQLNodeCollectioRecordFive = [{ orgname: '公司名称(单行文本)5', status_singleselect: '2', staffnum: 10 }];
|
|
1137
|
-
const SQLNodeCollectioRecordSix = [{ orgname: '公司名称(单行文本)6', status_singleselect: '2', staffnum: 20 }];
|
|
1138
|
-
const SQLNodeCollectioRecordSeven = [{ orgname: '公司名称(单行文本)7', status_singleselect: '2', staffnum: 30 }];
|
|
1139
|
-
const SQLNodeCollectioRecordEight = [{ orgname: '公司名称(单行文本)8', status_singleselect: '2', staffnum: 40 }];
|
|
1140
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordOne);
|
|
1141
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordTwo);
|
|
1142
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordThree);
|
|
1143
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFour);
|
|
1144
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFive);
|
|
1145
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSix);
|
|
1146
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSeven);
|
|
1147
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordEight);
|
|
1148
|
-
//添加工作流
|
|
1149
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
1150
|
-
const workflowData = {
|
|
1151
|
-
current: true,
|
|
1152
|
-
options: { deleteExecutionOnStatus: [] },
|
|
1153
|
-
title: workFlowName,
|
|
1154
|
-
type: 'collection',
|
|
1155
|
-
enabled: true,
|
|
1156
|
-
};
|
|
1157
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
1158
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
1159
|
-
const workflowId = workflowObj.id;
|
|
1160
|
-
//配置工作流触发器
|
|
1161
|
-
const triggerNodeData = {
|
|
1162
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
1163
|
-
};
|
|
1164
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
1165
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
1166
|
-
//配置SQL节点
|
|
1167
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
1168
|
-
await page.waitForLoadState('networkidle');
|
|
1169
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
1170
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
1171
|
-
await page.getByRole('button', { name: 'sql', exact: true }).click();
|
|
1172
|
-
const sqlNodeName = 'SQL action' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1173
|
-
await page.getByLabel('SQL action-SQL action', { exact: true }).getByRole('textbox').fill(sqlNodeName);
|
|
1174
|
-
const sqlNode = new SQLNode(page, sqlNodeName);
|
|
1175
|
-
const sqlNodeId = await sqlNode.node.locator('.workflow-node-id').innerText();
|
|
1176
|
-
await sqlNode.nodeConfigure.click();
|
|
1177
|
-
await sqlNode.sqlEditBox.fill(`delete from ${SQLNodeCollectionName} where id=1 returning *`);
|
|
1178
|
-
await sqlNode.submitButton.click();
|
|
1179
|
-
|
|
1180
|
-
// 2、测试步骤:添加数据触发工作流
|
|
1181
|
-
const triggerNodeCollectionRecordOne =
|
|
1182
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1183
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
1184
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
1185
|
-
]);
|
|
1186
|
-
await page.waitForTimeout(1000);
|
|
1187
|
-
// 3、预期结果:工作流成功触发,数据查询成功
|
|
1188
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
1189
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
1190
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
1191
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
1192
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
1193
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
1194
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
1195
|
-
return b.id - a.id;
|
|
1196
|
-
});
|
|
1197
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
1198
|
-
const sqlNodeJob = jobs.find((job) => job.nodeId.toString() === sqlNodeId);
|
|
1199
|
-
const sqlNodeJobResult = sqlNodeJob.result;
|
|
1200
|
-
const nodeResultRecordOrgname = sqlNodeJobResult[0][0].orgname;
|
|
1201
|
-
expect(nodeResultRecordOrgname).toBe('公司名称(单行文本)1');
|
|
1202
|
-
|
|
1203
|
-
// 4、后置处理:删除工作流
|
|
1204
|
-
await apiDeleteWorkflow(workflowId);
|
|
1205
|
-
});
|
|
1206
|
-
|
|
1207
|
-
test('Variables as where condition', async ({ page, mockCollections, mockRecords }) => {
|
|
1208
|
-
//数据表后缀标识
|
|
1209
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
1210
|
-
const SQLNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
1211
|
-
// 创建触发器节点数据表
|
|
1212
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
1213
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
1214
|
-
const triggerNodeFieldName = 'orgname';
|
|
1215
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
1216
|
-
await mockCollections(
|
|
1217
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
1218
|
-
.collections,
|
|
1219
|
-
);
|
|
1220
|
-
// 创建查询节点数据表
|
|
1221
|
-
const SQLNodeCollectionDisplayName = `自动>组织[普通表]${SQLNodeAppendText}`;
|
|
1222
|
-
const SQLNodeCollectionName = `tt_amt_org${SQLNodeAppendText}`;
|
|
1223
|
-
const SQLNodeFieldName = 'orgname';
|
|
1224
|
-
const SQLNodeFieldDisplayName = '公司名称(单行文本)';
|
|
1225
|
-
await mockCollections(
|
|
1226
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), SQLNodeAppendText)
|
|
1227
|
-
.collections,
|
|
1228
|
-
);
|
|
1229
|
-
const SQLNodeCollectioRecordOne = [{ orgname: '公司名称(单行文本)1', status_singleselect: '1', staffnum: 10 }];
|
|
1230
|
-
const SQLNodeCollectioRecordTwo = [{ orgname: '公司名称(单行文本)2', status_singleselect: '1', staffnum: 20 }];
|
|
1231
|
-
const SQLNodeCollectioRecordThree = [{ orgname: '公司名称(单行文本)3', status_singleselect: '1', staffnum: 30 }];
|
|
1232
|
-
const SQLNodeCollectioRecordFour = [{ orgname: '公司名称(单行文本)4', status_singleselect: '1', staffnum: 40 }];
|
|
1233
|
-
const SQLNodeCollectioRecordFive = [{ orgname: '公司名称(单行文本)5', status_singleselect: '2', staffnum: 10 }];
|
|
1234
|
-
const SQLNodeCollectioRecordSix = [{ orgname: '公司名称(单行文本)6', status_singleselect: '2', staffnum: 20 }];
|
|
1235
|
-
const SQLNodeCollectioRecordSeven = [{ orgname: '公司名称(单行文本)7', status_singleselect: '2', staffnum: 30 }];
|
|
1236
|
-
const SQLNodeCollectioRecordEight = [{ orgname: '公司名称(单行文本)8', status_singleselect: '2', staffnum: 40 }];
|
|
1237
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordOne);
|
|
1238
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordTwo);
|
|
1239
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordThree);
|
|
1240
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFour);
|
|
1241
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordFive);
|
|
1242
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSix);
|
|
1243
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordSeven);
|
|
1244
|
-
await mockRecords(SQLNodeCollectionName, SQLNodeCollectioRecordEight);
|
|
1245
|
-
//添加工作流
|
|
1246
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
1247
|
-
const workflowData = {
|
|
1248
|
-
current: true,
|
|
1249
|
-
options: { deleteExecutionOnStatus: [] },
|
|
1250
|
-
title: workFlowName,
|
|
1251
|
-
type: 'collection',
|
|
1252
|
-
enabled: true,
|
|
1253
|
-
};
|
|
1254
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
1255
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
1256
|
-
const workflowId = workflowObj.id;
|
|
1257
|
-
//配置工作流触发器
|
|
1258
|
-
const triggerNodeData = {
|
|
1259
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
1260
|
-
};
|
|
1261
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
1262
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
1263
|
-
//配置SQL节点
|
|
1264
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
1265
|
-
await page.waitForLoadState('networkidle');
|
|
1266
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
1267
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
1268
|
-
await page.getByRole('button', { name: 'sql', exact: true }).click();
|
|
1269
|
-
const sqlNodeName = 'SQL action' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1270
|
-
await page.getByLabel('SQL action-SQL action', { exact: true }).getByRole('textbox').fill(sqlNodeName);
|
|
1271
|
-
const sqlNode = new SQLNode(page, sqlNodeName);
|
|
1272
|
-
const sqlNodeId = await sqlNode.node.locator('.workflow-node-id').innerText();
|
|
1273
|
-
await sqlNode.nodeConfigure.click();
|
|
1274
|
-
await sqlNode.sqlEditBox.fill(`delete from ${SQLNodeCollectionName} where id=`);
|
|
1275
|
-
await sqlNode.sqlEditBox.click({ clickCount: 3 });
|
|
1276
|
-
await page.keyboard.press('ArrowRight');
|
|
1277
|
-
await page.getByLabel('variable-button').click();
|
|
1278
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger variables' }).click();
|
|
1279
|
-
await page.getByRole('menuitemcheckbox', { name: 'Trigger data' }).click();
|
|
1280
|
-
await page.getByRole('menuitemcheckbox', { name: 'ID', exact: true }).click();
|
|
1281
|
-
await sqlNode.sqlEditBox.click({ clickCount: 3 });
|
|
1282
|
-
await page.keyboard.press('ArrowRight');
|
|
1283
|
-
await page.keyboard.type(` returning *`);
|
|
1284
|
-
await sqlNode.submitButton.click();
|
|
1285
|
-
|
|
1286
|
-
// 2、测试步骤:添加数据触发工作流
|
|
1287
|
-
const triggerNodeCollectionRecordOne =
|
|
1288
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1289
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
1290
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
1291
|
-
]);
|
|
1292
|
-
await page.waitForTimeout(1000);
|
|
1293
|
-
// 3、预期结果:工作流成功触发,数据查询成功
|
|
1294
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
1295
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
1296
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
1297
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
1298
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
1299
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
1300
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
1301
|
-
return b.id - a.id;
|
|
1302
|
-
});
|
|
1303
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
1304
|
-
const sqlNodeJob = jobs.find((job) => job.nodeId.toString() === sqlNodeId);
|
|
1305
|
-
const sqlNodeJobResult = sqlNodeJob.result;
|
|
1306
|
-
const nodeResultRecordOrgname = sqlNodeJobResult[0][0].orgname;
|
|
1307
|
-
expect(nodeResultRecordOrgname).toBe('公司名称(单行文本)1');
|
|
1308
|
-
|
|
1309
|
-
// 4、后置处理:删除工作流
|
|
1310
|
-
await apiDeleteWorkflow(workflowId);
|
|
1311
|
-
});
|
|
1312
|
-
});
|