@nocobase/plugin-workflow-action-trigger 0.20.0-alpha.6

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.
Files changed (41) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +9 -0
  3. package/README.zh-CN.md +9 -0
  4. package/client.d.ts +2 -0
  5. package/client.js +1 -0
  6. package/dist/client/ActionTrigger.d.ts +54 -0
  7. package/dist/client/index.d.ts +4 -0
  8. package/dist/client/index.js +1 -0
  9. package/dist/externalVersion.js +13 -0
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.js +39 -0
  12. package/dist/locale/en-US.json +9 -0
  13. package/dist/locale/index.d.ts +3 -0
  14. package/dist/locale/index.js +39 -0
  15. package/dist/locale/ko_KR.json +9 -0
  16. package/dist/locale/zh-CN.json +10 -0
  17. package/dist/server/ActionTrigger.d.ts +9 -0
  18. package/dist/server/ActionTrigger.js +130 -0
  19. package/dist/server/Plugin.d.ts +4 -0
  20. package/dist/server/Plugin.js +41 -0
  21. package/dist/server/index.d.ts +1 -0
  22. package/dist/server/index.js +33 -0
  23. package/dist/server/migrations/20240227172623-change-name.d.ts +6 -0
  24. package/dist/server/migrations/20240227172623-change-name.js +42 -0
  25. package/package.json +28 -0
  26. package/server.d.ts +2 -0
  27. package/server.js +1 -0
  28. package/src/client/ActionTrigger.tsx +132 -0
  29. package/src/client/__e2e__/configuration.test.ts +661 -0
  30. package/src/client/__e2e__/workflowCRUD.test.ts +178 -0
  31. package/src/client/index.ts +100 -0
  32. package/src/index.ts +2 -0
  33. package/src/locale/en-US.json +9 -0
  34. package/src/locale/index.ts +12 -0
  35. package/src/locale/ko_KR.json +9 -0
  36. package/src/locale/zh-CN.json +10 -0
  37. package/src/server/ActionTrigger.ts +132 -0
  38. package/src/server/Plugin.ts +11 -0
  39. package/src/server/__tests__/trigger.test.ts +503 -0
  40. package/src/server/index.ts +1 -0
  41. package/src/server/migrations/20240227172623-change-name.ts +22 -0
@@ -0,0 +1,661 @@
1
+ import { faker } from '@faker-js/faker';
2
+ import {
3
+ FormEventTriggerNode,
4
+ WorkflowListRecords,
5
+ apiCreateRecordTriggerFormEvent,
6
+ apiCreateWorkflow,
7
+ apiDeleteWorkflow,
8
+ apiGetWorkflow,
9
+ apiUpdateWorkflowTrigger,
10
+ appendJsonCollectionName,
11
+ generalWithNoRelationalFields,
12
+ } from '@nocobase/plugin-workflow-test/e2e';
13
+ import { expect, test } from '@nocobase/test/e2e';
14
+ import { dayjs } from '@nocobase/utils';
15
+
16
+ test.describe('Configuration page to configure the Trigger node', () => {
17
+ test('Form Submit Button Binding Workflow Add Data Trigger', async ({
18
+ page,
19
+ mockPage,
20
+ mockCollections,
21
+ mockRecords,
22
+ }) => {
23
+ //数据表后缀标识
24
+ const triggerNodeAppendText = faker.string.alphanumeric(5);
25
+
26
+ //创建触发器节点数据表
27
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
28
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
29
+ const triggerNodeFieldName = 'orgname';
30
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
31
+ await mockCollections(
32
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
33
+ .collections,
34
+ );
35
+ //添加工作流
36
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
37
+ const workflowData = {
38
+ current: true,
39
+ options: { deleteExecutionOnStatus: [] },
40
+ title: workFlowName,
41
+ type: 'action',
42
+ enabled: true,
43
+ };
44
+ const workflow = await apiCreateWorkflow(workflowData);
45
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
46
+ const workflowId = workflowObj.id;
47
+
48
+ //配置工作流触发器
49
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
50
+ await page.waitForLoadState('networkidle');
51
+ const formEventTriggerNode = new FormEventTriggerNode(page, workFlowName, triggerNodeCollectionName);
52
+ await formEventTriggerNode.nodeConfigure.click();
53
+ await formEventTriggerNode.collectionDropDown.click();
54
+ await page.getByRole('option', { name: triggerNodeCollectionDisplayName }).click();
55
+ await formEventTriggerNode.submitButton.click();
56
+
57
+ //配置录入数据区块
58
+ const newPage = mockPage();
59
+ await newPage.goto();
60
+ await page.waitForLoadState('networkidle');
61
+ await page.getByLabel('schema-initializer-Grid-BlockInitializers').hover();
62
+ await page.getByRole('menuitem', { name: 'table Table' }).hover();
63
+ await page.getByRole('menuitem', { name: `${triggerNodeCollectionDisplayName}` }).click();
64
+
65
+ // 移开鼠标,关闭菜单
66
+ await page.mouse.move(300, 0);
67
+
68
+ await page.getByText('Configure columns').hover();
69
+ await page.getByText(triggerNodeFieldDisplayName).click();
70
+ await page.getByText('Configure actions').hover();
71
+ await page.getByRole('menuitem', { name: 'Add new' }).getByRole('switch').click();
72
+ await expect(page.getByRole('menuitem', { name: 'Add new' }).getByRole('switch')).toBeEnabled();
73
+ await page.getByLabel(`action-Action-Add new-create-${triggerNodeCollectionName}-table`).click();
74
+ await page.getByLabel(`schema-initializer-Grid-CreateFormBlockInitializers-${triggerNodeCollectionName}`).hover();
75
+ await page.getByRole('menuitem', { name: 'form Form' }).click();
76
+ // 移开鼠标,关闭菜单
77
+ await page.mouse.move(300, 0);
78
+ await page
79
+ .getByLabel(`schema-initializer-ActionBar-CreateFormActionInitializers-${triggerNodeCollectionName}`)
80
+ .hover();
81
+ await page.getByRole('menuitem', { name: 'Submit' }).click();
82
+ // 绑定工作流
83
+ await page.getByLabel(`schema-initializer-Grid-FormItemInitializers-${triggerNodeCollectionName}`).hover();
84
+ await page.getByRole('menuitem', { name: `${triggerNodeFieldDisplayName}` }).click();
85
+ await page.mouse.move(300, 0);
86
+ await page.getByLabel(`action-Action-Submit-submit-${triggerNodeCollectionName}-form`).hover();
87
+ await page
88
+ .getByRole('button', {
89
+ name: `designer-schema-settings-Action-actionSettings:createSubmit-${triggerNodeCollectionName}`,
90
+ })
91
+ .hover();
92
+ await page.getByRole('menuitem', { name: 'Bind workflows' }).click();
93
+ await page.getByRole('button', { name: 'plus Add workflow' }).click();
94
+ await page.getByRole('button', { name: 'Select workflow' }).click();
95
+ await page.getByRole('option', { name: workFlowName }).click();
96
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
97
+
98
+ // 2、测试步骤:进入“数据区块”-“添加”按钮,填写表单,点击“确定”按钮
99
+ const fieldData = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
100
+ await page.getByRole('textbox').fill(fieldData);
101
+ await page.getByLabel(`action-Action-Submit-submit-${triggerNodeCollectionName}-form`, { exact: true }).click();
102
+ await page.waitForLoadState('networkidle');
103
+ await page.waitForTimeout(1000);
104
+ // 3、预期结果:触发次数为1
105
+ const getWorkflow = await apiGetWorkflow(workflowId);
106
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
107
+ const getWorkflowExecuted = getWorkflowObj.executed;
108
+ expect(getWorkflowExecuted).toBe(1);
109
+
110
+ // 4、后置处理:删除工作流
111
+ await apiDeleteWorkflow(workflowId);
112
+ });
113
+
114
+ test('Form Submit to Workflow Button Add Data Trigger', async ({ page, mockPage, mockCollections, mockRecords }) => {
115
+ //数据表后缀标识
116
+ const triggerNodeAppendText = faker.string.alphanumeric(5);
117
+
118
+ //创建触发器节点数据表
119
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
120
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
121
+ const triggerNodeFieldName = 'orgname';
122
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
123
+ await mockCollections(
124
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
125
+ .collections,
126
+ );
127
+ //添加工作流
128
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
129
+ const workflowData = {
130
+ current: true,
131
+ options: { deleteExecutionOnStatus: [] },
132
+ title: workFlowName,
133
+ type: 'action',
134
+ enabled: true,
135
+ };
136
+ const workflow = await apiCreateWorkflow(workflowData);
137
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
138
+ const workflowId = workflowObj.id;
139
+
140
+ //配置工作流触发器
141
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
142
+ await page.waitForLoadState('networkidle');
143
+ const formEventTriggerNode = new FormEventTriggerNode(page, workFlowName, triggerNodeCollectionName);
144
+ await formEventTriggerNode.nodeConfigure.click();
145
+ await formEventTriggerNode.collectionDropDown.click();
146
+ await page.getByRole('option', { name: triggerNodeCollectionDisplayName }).click();
147
+ await formEventTriggerNode.submitButton.click();
148
+
149
+ //配置录入数据区块
150
+ const newPage = mockPage();
151
+ await newPage.goto();
152
+ await page.waitForLoadState('networkidle');
153
+ await page.getByLabel('schema-initializer-Grid-BlockInitializers').hover();
154
+ await page.getByRole('menuitem', { name: 'table Table' }).hover();
155
+ await page.getByRole('menuitem', { name: `${triggerNodeCollectionDisplayName}` }).click();
156
+
157
+ // 移开鼠标,关闭菜单
158
+ await page.mouse.move(300, 0);
159
+
160
+ await page.getByText('Configure columns').hover();
161
+ await page.getByText(triggerNodeFieldDisplayName).click();
162
+ await page.getByText('Configure actions').hover();
163
+ await page.getByRole('menuitem', { name: 'Add new' }).getByRole('switch').click();
164
+ await expect(page.getByRole('menuitem', { name: 'Add new' }).getByRole('switch')).toBeEnabled();
165
+
166
+ await page.getByLabel(`action-Action-Add new-create-${triggerNodeCollectionName}-table`).click();
167
+ await page.getByLabel(`schema-initializer-Grid-CreateFormBlockInitializers-${triggerNodeCollectionName}`).hover();
168
+ await page.getByRole('menuitem', { name: 'form Form' }).click();
169
+
170
+ // 移开鼠标,关闭菜单
171
+ await page.mouse.move(300, 0);
172
+
173
+ // 绑定工作流
174
+ await page
175
+ .getByLabel(`schema-initializer-ActionBar-CreateFormActionInitializers-${triggerNodeCollectionName}`)
176
+ .hover();
177
+ await page.getByRole('menuitem', { name: 'Customize' }).hover();
178
+ await page.getByRole('menuitem', { name: 'Submit to workflow' }).click();
179
+ await page.getByLabel(`schema-initializer-Grid-FormItemInitializers-${triggerNodeCollectionName}`).hover();
180
+ await page.getByRole('menuitem', { name: `${triggerNodeFieldDisplayName}` }).click();
181
+ await page.mouse.move(300, 0);
182
+ await page.getByRole('button', { name: 'Submit to workflow' }).hover();
183
+ await page
184
+ .getByRole('button', {
185
+ name: `designer-schema-settings-Action-Action.Designer-${triggerNodeCollectionName}`,
186
+ })
187
+ .hover();
188
+ await page.getByRole('menuitem', { name: 'Bind workflows' }).click();
189
+ await page.getByRole('button', { name: 'plus Add workflow' }).click();
190
+ await page.getByRole('button', { name: 'Select workflow' }).click();
191
+ await page.getByRole('option', { name: workFlowName }).click();
192
+ await page.getByRole('button', { name: 'Submit', exact: true }).click();
193
+
194
+ // 2、测试步骤:进入“数据区块”-“添加”按钮,填写表单,点击“确定”按钮
195
+ const fieldData = triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
196
+ await page.getByRole('textbox').fill(fieldData);
197
+ await page
198
+ .getByLabel(`action-Action-Submit to workflow-customize:triggerWorkflows-${triggerNodeCollectionName}-form`)
199
+ .click();
200
+ await page.waitForLoadState('networkidle');
201
+ await page.waitForTimeout(1000);
202
+ // 3、预期结果:触发次数为1
203
+ const getWorkflow = await apiGetWorkflow(workflowId);
204
+ const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
205
+ const getWorkflowExecuted = getWorkflowObj.executed;
206
+ expect(getWorkflowExecuted).toBe(1);
207
+
208
+ // 4、后置处理:删除工作流
209
+ await apiDeleteWorkflow(workflowId);
210
+ });
211
+ });
212
+
213
+ test.describe('Configuration Page Path Jump Workflow Management Page', () => {
214
+ test('Action event Workflow Configuration Page Path Jump Workflow Management Page', async ({
215
+ page,
216
+ mockPage,
217
+ mockCollections,
218
+ mockRecords,
219
+ }) => {
220
+ //数据表后缀标识
221
+ const triggerNodeAppendText = faker.string.alphanumeric(5);
222
+
223
+ //创建触发器节点数据表
224
+ // const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
225
+ // const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
226
+ // const triggerNodeFieldName = 'orgname';
227
+ // const triggerNodeFieldDisplayName = '公司名称(单行文本)';
228
+ // await mockCollections(appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText).collections);
229
+ //添加工作流
230
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
231
+ const workflowData = {
232
+ current: true,
233
+ options: { deleteExecutionOnStatus: [] },
234
+ title: workFlowName,
235
+ type: 'action',
236
+ enabled: true,
237
+ };
238
+ const workflow = await apiCreateWorkflow(workflowData);
239
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
240
+ const workflowId = workflowObj.id;
241
+
242
+ //配置工作流触发器
243
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
244
+ await page.waitForLoadState('networkidle');
245
+
246
+ // 2、测试步骤:跳转到工作流管理页面
247
+ await page.getByRole('link', { name: 'Workflow' }).click();
248
+
249
+ // 3、预期结果:跳转路径正确
250
+ await page.waitForLoadState('networkidle');
251
+ expect(page.url()).toBe(`${process.env.APP_BASE_URL}/admin/settings/workflow`);
252
+
253
+ // 4、后置处理:删除工作流
254
+ await apiDeleteWorkflow(workflowId);
255
+ });
256
+
257
+ test('Action event Workflow History Version Configuration Page Path Jump Workflow Management Page', async ({
258
+ page,
259
+ mockPage,
260
+ mockCollections,
261
+ mockRecords,
262
+ }) => {
263
+ //数据表后缀标识
264
+ const triggerNodeAppendText = faker.string.alphanumeric(5);
265
+
266
+ //创建触发器节点数据表
267
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
268
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
269
+ const triggerNodeFieldName = 'orgname';
270
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
271
+ await mockCollections(
272
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
273
+ .collections,
274
+ );
275
+ //添加工作流
276
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
277
+ const workflowData = {
278
+ current: true,
279
+ options: { deleteExecutionOnStatus: [] },
280
+ title: workFlowName,
281
+ type: 'action',
282
+ enabled: true,
283
+ };
284
+ const workflow = await apiCreateWorkflow(workflowData);
285
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
286
+ const workflowId = workflowObj.id;
287
+ const WorkflowKey = workflowObj.key;
288
+
289
+ //配置工作流触发器
290
+ const triggerNodeData = { config: { collection: triggerNodeCollectionName, appends: [] } };
291
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
292
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
293
+
294
+ // 2、测试步骤:添加数据触发工作流
295
+ const triggerNodeCollectionRecordOne =
296
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
297
+ const triggerWorkflows = WorkflowKey;
298
+ const triggerNodeCollectionRecords = await apiCreateRecordTriggerFormEvent(
299
+ triggerNodeCollectionName,
300
+ triggerWorkflows,
301
+ { orgname: triggerNodeCollectionRecordOne },
302
+ );
303
+ await page.waitForTimeout(1000);
304
+
305
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
306
+ await page.waitForLoadState('networkidle');
307
+ await page.getByLabel('more').click();
308
+ await page.getByLabel('revision').click();
309
+ await page.waitForLoadState('networkidle');
310
+ //元素重复
311
+ await page.getByLabel('version', { exact: true }).click();
312
+ await page.getByLabel('version-1').click();
313
+ await page.getByRole('link', { name: 'Workflow' }).click();
314
+
315
+ // 3、预期结果:跳转路径正确
316
+ await page.waitForLoadState('networkidle');
317
+ expect(page.url()).toBe(`${process.env.APP_BASE_URL}/admin/settings/workflow`);
318
+
319
+ // 4、后置处理:删除工作流
320
+ await apiDeleteWorkflow(workflowId);
321
+ });
322
+
323
+ test('Action event Workflow Execution Log Page Path Jump Workflow Management Page', async ({
324
+ page,
325
+ mockPage,
326
+ mockCollections,
327
+ mockRecords,
328
+ }) => {
329
+ //数据表后缀标识
330
+ const triggerNodeAppendText = faker.string.alphanumeric(5);
331
+
332
+ //创建触发器节点数据表
333
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
334
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
335
+ const triggerNodeFieldName = 'orgname';
336
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
337
+ await mockCollections(
338
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
339
+ .collections,
340
+ );
341
+ //添加工作流
342
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
343
+ const workflowData = {
344
+ current: true,
345
+ options: { deleteExecutionOnStatus: [] },
346
+ title: workFlowName,
347
+ type: 'action',
348
+ enabled: true,
349
+ };
350
+ const workflow = await apiCreateWorkflow(workflowData);
351
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
352
+ const workflowId = workflowObj.id;
353
+ const WorkflowKey = workflowObj.key;
354
+
355
+ //配置工作流触发器
356
+ const triggerNodeData = { config: { collection: triggerNodeCollectionName, appends: [] } };
357
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
358
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
359
+
360
+ // 2、测试步骤:添加数据触发工作流
361
+ const triggerNodeCollectionRecordOne =
362
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
363
+ const triggerWorkflows = WorkflowKey;
364
+ const triggerNodeCollectionRecords = await apiCreateRecordTriggerFormEvent(
365
+ triggerNodeCollectionName,
366
+ triggerWorkflows,
367
+ { orgname: triggerNodeCollectionRecordOne },
368
+ );
369
+ await page.waitForTimeout(1000);
370
+
371
+ await page.goto('/admin/settings/workflow');
372
+ await page.waitForLoadState('networkidle');
373
+ const workflowListRecords = new WorkflowListRecords(page, workFlowName);
374
+ await workflowListRecords.executionCountPopup.click();
375
+ await page.getByText('View').click();
376
+ await page.waitForLoadState('networkidle');
377
+ await page.getByRole('link', { name: 'Workflow', exact: true }).click();
378
+
379
+ // 3、预期结果:跳转路径正确
380
+ await page.waitForLoadState('networkidle');
381
+ expect(page.url()).toBe(`${process.env.APP_BASE_URL}/admin/settings/workflow`);
382
+
383
+ // 4、后置处理:删除工作流
384
+ await apiDeleteWorkflow(workflowId);
385
+ });
386
+
387
+ test.skip('Action event Workflow Execution Log Page Path Jump Execution Log Screen', async ({
388
+ page,
389
+ mockCollections,
390
+ mockRecords,
391
+ }) => {
392
+ //数据表后缀标识
393
+ const triggerNodeAppendText = faker.string.alphanumeric(5);
394
+
395
+ //创建触发器节点数据表
396
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
397
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
398
+ const triggerNodeFieldName = 'orgname';
399
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
400
+ await mockCollections(
401
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
402
+ .collections,
403
+ );
404
+ //添加工作流
405
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
406
+ const workflowData = {
407
+ current: true,
408
+ options: { deleteExecutionOnStatus: [] },
409
+ title: workFlowName,
410
+ type: 'action',
411
+ enabled: true,
412
+ };
413
+ const workflow = await apiCreateWorkflow(workflowData);
414
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
415
+ const workflowId = workflowObj.id;
416
+ const WorkflowKey = workflowObj.key;
417
+
418
+ //配置工作流触发器
419
+ const triggerNodeData = { config: { collection: triggerNodeCollectionName, appends: [] } };
420
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
421
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
422
+
423
+ // 2、测试步骤:添加数据触发工作流
424
+ const triggerNodeCollectionRecordOne =
425
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
426
+ const triggerWorkflows = WorkflowKey;
427
+ const triggerNodeCollectionRecords = await apiCreateRecordTriggerFormEvent(
428
+ triggerNodeCollectionName,
429
+ triggerWorkflows,
430
+ { orgname: triggerNodeCollectionRecordOne },
431
+ );
432
+ await page.waitForTimeout(1000);
433
+
434
+ await page.goto('/admin/settings/workflow');
435
+ await page.waitForLoadState('networkidle');
436
+ const workflowListRecords = new WorkflowListRecords(page, workFlowName);
437
+ await workflowListRecords.executionCountPopup.click();
438
+ await page.getByText('View').click();
439
+ await page.waitForLoadState('networkidle');
440
+ //跳转其他执行日志界面,元素无法定位
441
+
442
+ // 3、预期结果:跳转路径正确
443
+ await page.waitForLoadState('networkidle');
444
+ // expect(page.url()).toBe(`${process.env.APP_BASE_URL}/admin/settings/workflow`);
445
+
446
+ // 4、后置处理:删除工作流
447
+ await apiDeleteWorkflow(workflowId);
448
+ });
449
+ });
450
+
451
+ test.describe('Configuration page version switching', () => {});
452
+
453
+ test.describe('Configuration page disable enable', () => {
454
+ test('Action event Workflow Add Data Trigger Disable Do Not Trigger', async ({
455
+ page,
456
+ mockCollections,
457
+ mockRecords,
458
+ }) => {
459
+ //数据表后缀标识
460
+ const triggerNodeAppendText = faker.string.alphanumeric(5);
461
+
462
+ //创建触发器节点数据表
463
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
464
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
465
+ const triggerNodeFieldName = 'orgname';
466
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
467
+ await mockCollections(
468
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
469
+ .collections,
470
+ );
471
+ //添加工作流
472
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
473
+ const workflowData = {
474
+ current: true,
475
+ options: { deleteExecutionOnStatus: [] },
476
+ title: workFlowName,
477
+ type: 'action',
478
+ enabled: false,
479
+ };
480
+ const workflow = await apiCreateWorkflow(workflowData);
481
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
482
+ const workflowId = workflowObj.id;
483
+ const WorkflowKey = workflowObj.key;
484
+
485
+ //配置工作流触发器
486
+ const triggerNodeData = { config: { collection: triggerNodeCollectionName, appends: [] } };
487
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
488
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
489
+
490
+ // 2、测试步骤:添加数据触发工作流
491
+ const triggerNodeCollectionRecordOne =
492
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
493
+ const triggerWorkflows = WorkflowKey;
494
+ const triggerNodeCollectionRecords = await apiCreateRecordTriggerFormEvent(
495
+ triggerNodeCollectionName,
496
+ triggerWorkflows,
497
+ { orgname: triggerNodeCollectionRecordOne },
498
+ );
499
+ await page.waitForTimeout(1000);
500
+
501
+ // 3、预期结果:触发次数为1
502
+ let getWorkflow = await apiGetWorkflow(workflowId);
503
+ let getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
504
+ let getWorkflowExecuted = getWorkflowObj.executed;
505
+ expect(getWorkflowExecuted).toBe(0);
506
+
507
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
508
+ await page.waitForLoadState('networkidle');
509
+ await page.getByRole('switch', { name: 'On Off' }).click();
510
+
511
+ await apiCreateRecordTriggerFormEvent(triggerNodeCollectionName, triggerWorkflows, {
512
+ orgname: triggerNodeCollectionRecordOne + '1',
513
+ });
514
+ await page.waitForTimeout(1000);
515
+
516
+ getWorkflow = await apiGetWorkflow(workflowId);
517
+ getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
518
+ getWorkflowExecuted = getWorkflowObj.executed;
519
+ expect(getWorkflowExecuted).toBe(1);
520
+
521
+ // 4、后置处理:删除工作流
522
+ await apiDeleteWorkflow(workflowId);
523
+ });
524
+
525
+ test('Action event Workflow Add Data Trigger Disable Enable Post Trigger', async ({
526
+ page,
527
+ mockCollections,
528
+ mockRecords,
529
+ }) => {
530
+ //数据表后缀标识
531
+ const triggerNodeAppendText = faker.string.alphanumeric(5);
532
+
533
+ //创建触发器节点数据表
534
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
535
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
536
+ const triggerNodeFieldName = 'orgname';
537
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
538
+ await mockCollections(
539
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
540
+ .collections,
541
+ );
542
+ //添加工作流
543
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
544
+ const workflowData = {
545
+ current: true,
546
+ options: { deleteExecutionOnStatus: [] },
547
+ title: workFlowName,
548
+ type: 'action',
549
+ enabled: true,
550
+ };
551
+ const workflow = await apiCreateWorkflow(workflowData);
552
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
553
+ const workflowId = workflowObj.id;
554
+ const WorkflowKey = workflowObj.key;
555
+
556
+ //配置工作流触发器
557
+ const triggerNodeData = { config: { collection: triggerNodeCollectionName, appends: [] } };
558
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
559
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
560
+
561
+ // 2、测试步骤:添加数据触发工作流
562
+ const triggerNodeCollectionRecordOne =
563
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
564
+ const triggerWorkflows = WorkflowKey;
565
+ const triggerNodeCollectionRecords = await apiCreateRecordTriggerFormEvent(
566
+ triggerNodeCollectionName,
567
+ triggerWorkflows,
568
+ { orgname: triggerNodeCollectionRecordOne },
569
+ );
570
+ await page.waitForTimeout(1000);
571
+
572
+ // 3、预期结果:触发次数为1
573
+ let getWorkflow = await apiGetWorkflow(workflowId);
574
+ let getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
575
+ let getWorkflowExecuted = getWorkflowObj.executed;
576
+ expect(getWorkflowExecuted).toBe(1);
577
+
578
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
579
+ await page.waitForLoadState('networkidle');
580
+ await page.getByRole('switch', { name: 'On Off' }).click();
581
+
582
+ await apiCreateRecordTriggerFormEvent(triggerNodeCollectionName, triggerWorkflows, {
583
+ orgname: triggerNodeCollectionRecordOne + '1',
584
+ });
585
+ await page.waitForTimeout(1000);
586
+
587
+ getWorkflow = await apiGetWorkflow(workflowId);
588
+ getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
589
+ getWorkflowExecuted = getWorkflowObj.executed;
590
+ expect(getWorkflowExecuted).toBe(1);
591
+
592
+ // 4、后置处理:删除工作流
593
+ await apiDeleteWorkflow(workflowId);
594
+ });
595
+ });
596
+
597
+ test.describe('Configuration page execution history', () => {});
598
+
599
+ test.describe('Configuration page copy to new version', () => {
600
+ test('Copy the action event of the Configuration Trigger node', async ({ page, mockCollections, mockRecords }) => {
601
+ //数据表后缀标识
602
+ const triggerNodeAppendText = faker.string.alphanumeric(5);
603
+
604
+ //创建触发器节点数据表
605
+ const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
606
+ const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
607
+ const triggerNodeFieldName = 'orgname';
608
+ const triggerNodeFieldDisplayName = '公司名称(单行文本)';
609
+ await mockCollections(
610
+ appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
611
+ .collections,
612
+ );
613
+ //添加工作流
614
+ const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
615
+ const workflowData = {
616
+ current: true,
617
+ options: { deleteExecutionOnStatus: [] },
618
+ title: workFlowName,
619
+ type: 'action',
620
+ enabled: true,
621
+ };
622
+ const workflow = await apiCreateWorkflow(workflowData);
623
+ const workflowObj = JSON.parse(JSON.stringify(workflow));
624
+ const workflowId = workflowObj.id;
625
+ const WorkflowKey = workflowObj.key;
626
+
627
+ //配置工作流触发器
628
+ const triggerNodeData = { config: { collection: triggerNodeCollectionName, appends: [] } };
629
+ const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
630
+ const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
631
+
632
+ // 2、测试步骤:添加数据触发工作流
633
+ const triggerNodeCollectionRecordOne =
634
+ triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
635
+ const triggerWorkflows = WorkflowKey;
636
+ const triggerNodeCollectionRecords = await apiCreateRecordTriggerFormEvent(
637
+ triggerNodeCollectionName,
638
+ triggerWorkflows,
639
+ { orgname: triggerNodeCollectionRecordOne },
640
+ );
641
+ await page.waitForTimeout(1000);
642
+
643
+ await page.goto(`admin/workflow/workflows/${workflowId}`);
644
+ await page.waitForLoadState('networkidle');
645
+ await page.getByLabel('more').click();
646
+ await page.getByLabel('revision').click();
647
+ await page.waitForLoadState('networkidle');
648
+
649
+ // 3、预期结果:新版本工作流配置内容同旧版本一样
650
+ const formEventTriggerNode = new FormEventTriggerNode(page, workFlowName, triggerNodeCollectionName);
651
+ await formEventTriggerNode.nodeConfigure.click();
652
+ await expect(page.getByRole('button', { name: triggerNodeCollectionDisplayName })).toBeVisible();
653
+
654
+ // 4、后置处理:删除工作流
655
+ await apiDeleteWorkflow(workflowId);
656
+ });
657
+ });
658
+
659
+ test.describe('Configuration page delete version', () => {});
660
+
661
+ test.describe('Node Add Modify Delete', () => {});