@nocobase/plugin-workflow-manual 1.0.0-alpha.2 → 1.0.0-alpha.4
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/WorkflowTodo.d.ts +8 -0
- package/dist/client/WorkflowTodoBlockInitializer.d.ts +8 -0
- package/dist/client/index.d.ts +8 -0
- package/dist/client/index.js +9 -0
- package/dist/client/instruction/AssigneesSelect.d.ts +8 -0
- package/dist/client/instruction/FormBlockInitializer.d.ts +8 -0
- package/dist/client/instruction/FormBlockProvider.d.ts +8 -0
- package/dist/client/instruction/ModeConfig.d.ts +8 -0
- package/dist/client/instruction/SchemaConfig.d.ts +8 -0
- package/dist/client/instruction/createManualFormBlockUISchema.d.ts +8 -0
- package/dist/client/instruction/forms/create.d.ts +8 -0
- package/dist/client/instruction/forms/custom.d.ts +8 -0
- package/dist/client/instruction/forms/update.d.ts +8 -0
- package/dist/client/instruction/index.d.ts +8 -0
- package/dist/client/instruction/utils.d.ts +8 -0
- package/dist/externalVersion.js +18 -9
- 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/ManualInstruction.d.ts +8 -0
- package/dist/server/ManualInstruction.js +9 -0
- package/dist/server/Plugin.d.ts +8 -0
- package/dist/server/Plugin.js +9 -0
- package/dist/server/actions.d.ts +8 -0
- package/dist/server/actions.js +9 -0
- package/dist/server/collections/1-users_jobs.d.ts +8 -0
- package/dist/server/collections/1-users_jobs.js +9 -0
- package/dist/server/collections/2-jobs.d.ts +8 -0
- package/dist/server/collections/2-jobs.js +9 -0
- package/dist/server/collections/3-users.d.ts +8 -0
- package/dist/server/collections/3-users.js +9 -0
- package/dist/server/forms/create.d.ts +8 -0
- package/dist/server/forms/create.js +9 -0
- package/dist/server/forms/index.d.ts +8 -0
- package/dist/server/forms/index.js +9 -0
- package/dist/server/forms/update.d.ts +8 -0
- package/dist/server/forms/update.js +9 -0
- package/dist/server/index.d.ts +8 -0
- package/dist/server/index.js +9 -0
- package/dist/server/migrations/20240325213145-fix-schema.d.ts +8 -0
- package/dist/server/migrations/20240325213145-fix-schema.js +9 -0
- package/package.json +2 -2
- package/src/client/WorkflowTodo.tsx +0 -647
- package/src/client/WorkflowTodoBlockInitializer.tsx +0 -32
- package/src/client/__e2e__/assignees.test.ts +0 -0
- package/src/client/__e2e__/createRecordForm.test.ts +0 -2287
- package/src/client/__e2e__/customFormBlocks.test.ts +0 -1933
- package/src/client/__e2e__/datablocks.test.ts +0 -1208
- package/src/client/__e2e__/updateRecordForm.test.ts +0 -2338
- package/src/client/__e2e__/workflowTodo.test.ts +0 -242
- package/src/client/index.ts +0 -51
- package/src/client/instruction/AssigneesSelect.tsx +0 -39
- package/src/client/instruction/FormBlockInitializer.tsx +0 -79
- package/src/client/instruction/FormBlockProvider.tsx +0 -92
- package/src/client/instruction/ModeConfig.tsx +0 -85
- package/src/client/instruction/SchemaConfig.tsx +0 -659
- package/src/client/instruction/createManualFormBlockUISchema.ts +0 -5
- package/src/client/instruction/forms/create.tsx +0 -123
- package/src/client/instruction/forms/custom.tsx +0 -439
- package/src/client/instruction/forms/update.tsx +0 -167
- package/src/client/instruction/index.tsx +0 -160
- package/src/client/instruction/utils.ts +0 -19
- package/src/index.ts +0 -2
- package/src/locale/en-US.json +0 -30
- package/src/locale/index.ts +0 -14
- package/src/locale/ko_KR.json +0 -32
- package/src/locale/zh-CN.json +0 -32
- package/src/server/ManualInstruction.ts +0 -157
- package/src/server/Plugin.ts +0 -43
- package/src/server/__tests__/assignees.test.ts +0 -153
- package/src/server/__tests__/collections/categories.ts +0 -15
- package/src/server/__tests__/collections/comments.ts +0 -24
- package/src/server/__tests__/collections/posts.ts +0 -40
- package/src/server/__tests__/collections/replies.ts +0 -9
- package/src/server/__tests__/collections/tags.ts +0 -15
- package/src/server/__tests__/data-source.test.ts +0 -223
- package/src/server/__tests__/form.test.ts +0 -637
- package/src/server/__tests__/mode.test.ts +0 -561
- package/src/server/actions.ts +0 -103
- package/src/server/collections/1-users_jobs.ts +0 -52
- package/src/server/collections/2-jobs.ts +0 -19
- package/src/server/collections/3-users.ts +0 -17
- package/src/server/forms/create.ts +0 -30
- package/src/server/forms/index.ts +0 -13
- package/src/server/forms/update.ts +0 -30
- package/src/server/index.ts +0 -1
- package/src/server/migrations/20240325213145-fix-schema.ts +0 -82
|
@@ -1,1933 +0,0 @@
|
|
|
1
|
-
import { faker } from '@faker-js/faker';
|
|
2
|
-
import {
|
|
3
|
-
CollectionTriggerNode,
|
|
4
|
-
ManualNode,
|
|
5
|
-
apiCreateWorkflow,
|
|
6
|
-
apiDeleteWorkflow,
|
|
7
|
-
apiGetWorkflow,
|
|
8
|
-
apiGetWorkflowNodeExecutions,
|
|
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('block configuration', () => {});
|
|
17
|
-
|
|
18
|
-
test.describe('field configuration', () => {});
|
|
19
|
-
|
|
20
|
-
test.describe('field data entry', () => {
|
|
21
|
-
test('Collection event to add a data trigger, entering a single line of text data', async ({
|
|
22
|
-
page,
|
|
23
|
-
mockPage,
|
|
24
|
-
mockCollections,
|
|
25
|
-
mockRecords,
|
|
26
|
-
}) => {
|
|
27
|
-
//数据表后缀标识
|
|
28
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
29
|
-
const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
30
|
-
|
|
31
|
-
// 创建触发器节点数据表
|
|
32
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
33
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
34
|
-
const triggerNodeFieldName = 'orgname';
|
|
35
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
36
|
-
await mockCollections(
|
|
37
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
38
|
-
.collections,
|
|
39
|
-
);
|
|
40
|
-
// 创建Manual节点数据表
|
|
41
|
-
const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
|
|
42
|
-
const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
|
|
43
|
-
const manualNodeFieldName = 'orgname';
|
|
44
|
-
const manualNodeFieldDisplayName = '公司名称(单行文本)';
|
|
45
|
-
await mockCollections(
|
|
46
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
|
|
47
|
-
.collections,
|
|
48
|
-
);
|
|
49
|
-
//添加工作流
|
|
50
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
51
|
-
const workflowData = {
|
|
52
|
-
current: true,
|
|
53
|
-
options: { deleteExecutionOnStatus: [] },
|
|
54
|
-
title: workFlowName,
|
|
55
|
-
type: 'collection',
|
|
56
|
-
enabled: true,
|
|
57
|
-
};
|
|
58
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
59
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
60
|
-
const workflowId = workflowObj.id;
|
|
61
|
-
//配置工作流触发器
|
|
62
|
-
const triggerNodeData = {
|
|
63
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
64
|
-
};
|
|
65
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
66
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
67
|
-
//配置Manual节点
|
|
68
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
69
|
-
await page.waitForLoadState('networkidle');
|
|
70
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
71
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
72
|
-
await page.getByRole('button', { name: 'manual', exact: true }).click();
|
|
73
|
-
const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
74
|
-
await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
|
|
75
|
-
const manualNode = new ManualNode(page, manualNodeName);
|
|
76
|
-
const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
|
|
77
|
-
await manualNode.nodeConfigure.click();
|
|
78
|
-
await manualNode.assigneesDropDown.click();
|
|
79
|
-
await page.getByRole('option', { name: 'Super Admin' }).click();
|
|
80
|
-
await manualNode.configureUserInterfaceButton.click();
|
|
81
|
-
await manualNode.addBlockButton.hover();
|
|
82
|
-
await manualNode.customFormMenu.click();
|
|
83
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
84
|
-
// 获取自定义表单的随机值
|
|
85
|
-
const configureFieldsButton = page.locator(
|
|
86
|
-
'button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-"]',
|
|
87
|
-
);
|
|
88
|
-
const ariaLabel = await configureFieldsButton.getAttribute('aria-label');
|
|
89
|
-
const randomValue = ariaLabel.split('-').pop();
|
|
90
|
-
|
|
91
|
-
await page
|
|
92
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
93
|
-
.hover();
|
|
94
|
-
await page.getByLabel(`designer-schema-settings-CardItem-SimpleDesigner-${randomValue}`).hover();
|
|
95
|
-
await page.getByRole('menuitem', { name: 'Edit block title' }).click();
|
|
96
|
-
const blockTitle = 'Form' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
97
|
-
await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
|
|
98
|
-
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
99
|
-
await page
|
|
100
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
101
|
-
.hover();
|
|
102
|
-
await page.getByRole('menuitem', { name: 'Single line text' }).click();
|
|
103
|
-
await page
|
|
104
|
-
.getByLabel(`block-item-Input-${randomValue}-Field display name`)
|
|
105
|
-
.getByRole('textbox')
|
|
106
|
-
.fill(manualNodeFieldDisplayName);
|
|
107
|
-
await page.getByLabel(`block-item-Input-${randomValue}-Field name`).getByRole('textbox').fill(manualNodeFieldName);
|
|
108
|
-
await page.getByLabel(`action-Action-Submit-${randomValue}`).click();
|
|
109
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
110
|
-
await page.mouse.click(300, 0);
|
|
111
|
-
await manualNode.submitButton.click();
|
|
112
|
-
await page.waitForLoadState('networkidle');
|
|
113
|
-
|
|
114
|
-
// 2、测试步骤:添加数据触发工作流
|
|
115
|
-
const triggerNodeCollectionRecordOne =
|
|
116
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
117
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
118
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
119
|
-
]);
|
|
120
|
-
await page.waitForTimeout(1000);
|
|
121
|
-
// 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
|
|
122
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
123
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
124
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
125
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
126
|
-
|
|
127
|
-
const newPage = mockPage();
|
|
128
|
-
await newPage.goto();
|
|
129
|
-
await page.waitForLoadState('networkidle');
|
|
130
|
-
await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
|
|
131
|
-
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
|
132
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
133
|
-
await page.waitForTimeout(300);
|
|
134
|
-
await page
|
|
135
|
-
.locator(`//td[span[text()="${manualNodeName}"]]`)
|
|
136
|
-
.locator('xpath=preceding-sibling::td[1]')
|
|
137
|
-
.locator('text=View')
|
|
138
|
-
.click();
|
|
139
|
-
const manualNodeRecord = manualNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
140
|
-
await page.getByRole('textbox').fill(manualNodeRecord);
|
|
141
|
-
await page.getByRole('button', { name: 'Continue the process' }).click();
|
|
142
|
-
|
|
143
|
-
await page.waitForTimeout(1000);
|
|
144
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
145
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
146
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
147
|
-
return b.id - a.id;
|
|
148
|
-
});
|
|
149
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
150
|
-
const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
|
|
151
|
-
const manualNodeJobStatus = manualNodeJob.status;
|
|
152
|
-
expect(manualNodeJobStatus).toBe(1);
|
|
153
|
-
|
|
154
|
-
const manualNodeJobResult = manualNodeJob.result;
|
|
155
|
-
const hasOrgname = Object.values(manualNodeJobResult).some(
|
|
156
|
-
(value) => (value as { orgname: string }).orgname === manualNodeRecord,
|
|
157
|
-
);
|
|
158
|
-
expect(hasOrgname).toBe(true);
|
|
159
|
-
|
|
160
|
-
// 4、后置处理:删除工作流
|
|
161
|
-
await apiDeleteWorkflow(workflowId);
|
|
162
|
-
});
|
|
163
|
-
|
|
164
|
-
test('Collection event to add a data trigger, entering multi-line text data', async ({
|
|
165
|
-
page,
|
|
166
|
-
mockPage,
|
|
167
|
-
mockCollections,
|
|
168
|
-
mockRecords,
|
|
169
|
-
}) => {
|
|
170
|
-
//数据表后缀标识
|
|
171
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
172
|
-
const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
173
|
-
|
|
174
|
-
// 创建触发器节点数据表
|
|
175
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
176
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
177
|
-
const triggerNodeFieldName = 'orgname';
|
|
178
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
179
|
-
await mockCollections(
|
|
180
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
181
|
-
.collections,
|
|
182
|
-
);
|
|
183
|
-
// 创建Manual节点数据表
|
|
184
|
-
const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
|
|
185
|
-
const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
|
|
186
|
-
const manualNodeFieldName = 'address';
|
|
187
|
-
const manualNodeFieldDisplayName = '公司地址(多行文本)';
|
|
188
|
-
await mockCollections(
|
|
189
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
|
|
190
|
-
.collections,
|
|
191
|
-
);
|
|
192
|
-
//添加工作流
|
|
193
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
194
|
-
const workflowData = {
|
|
195
|
-
current: true,
|
|
196
|
-
options: { deleteExecutionOnStatus: [] },
|
|
197
|
-
title: workFlowName,
|
|
198
|
-
type: 'collection',
|
|
199
|
-
enabled: true,
|
|
200
|
-
};
|
|
201
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
202
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
203
|
-
const workflowId = workflowObj.id;
|
|
204
|
-
//配置工作流触发器
|
|
205
|
-
const triggerNodeData = {
|
|
206
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
207
|
-
};
|
|
208
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
209
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
210
|
-
//配置Manual节点
|
|
211
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
212
|
-
await page.waitForLoadState('networkidle');
|
|
213
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
214
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
215
|
-
await page.getByRole('button', { name: 'manual', exact: true }).click();
|
|
216
|
-
const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
217
|
-
await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
|
|
218
|
-
const manualNode = new ManualNode(page, manualNodeName);
|
|
219
|
-
const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
|
|
220
|
-
await manualNode.nodeConfigure.click();
|
|
221
|
-
await manualNode.assigneesDropDown.click();
|
|
222
|
-
await page.getByRole('option', { name: 'Super Admin' }).click();
|
|
223
|
-
await manualNode.configureUserInterfaceButton.click();
|
|
224
|
-
await manualNode.addBlockButton.hover();
|
|
225
|
-
await manualNode.customFormMenu.click();
|
|
226
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
227
|
-
// 获取自定义表单的随机值
|
|
228
|
-
const configureFieldsButton = page.locator(
|
|
229
|
-
'button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-"]',
|
|
230
|
-
);
|
|
231
|
-
const ariaLabel = await configureFieldsButton.getAttribute('aria-label');
|
|
232
|
-
const randomValue = ariaLabel.split('-').pop();
|
|
233
|
-
|
|
234
|
-
await page
|
|
235
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
236
|
-
.hover();
|
|
237
|
-
await page.getByLabel(`designer-schema-settings-CardItem-SimpleDesigner-${randomValue}`).hover();
|
|
238
|
-
await page.getByRole('menuitem', { name: 'Edit block title' }).click();
|
|
239
|
-
const blockTitle = 'Form' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
240
|
-
await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
|
|
241
|
-
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
242
|
-
await page
|
|
243
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
244
|
-
.hover();
|
|
245
|
-
await page.getByRole('menuitem', { name: 'Long text' }).click();
|
|
246
|
-
await page
|
|
247
|
-
.getByLabel(`block-item-Input-${randomValue}-Field display name`)
|
|
248
|
-
.getByRole('textbox')
|
|
249
|
-
.fill(manualNodeFieldDisplayName);
|
|
250
|
-
await page.getByLabel(`block-item-Input-${randomValue}-Field name`).getByRole('textbox').fill(manualNodeFieldName);
|
|
251
|
-
await page.getByLabel(`action-Action-Submit-${randomValue}`).click();
|
|
252
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
253
|
-
await page.mouse.click(300, 0);
|
|
254
|
-
await manualNode.submitButton.click();
|
|
255
|
-
await page.waitForLoadState('networkidle');
|
|
256
|
-
|
|
257
|
-
// 2、测试步骤:添加数据触发工作流
|
|
258
|
-
const triggerNodeCollectionRecordOne =
|
|
259
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
260
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
261
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
262
|
-
]);
|
|
263
|
-
await page.waitForTimeout(1000);
|
|
264
|
-
// 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
|
|
265
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
266
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
267
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
268
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
269
|
-
|
|
270
|
-
const newPage = mockPage();
|
|
271
|
-
await newPage.goto();
|
|
272
|
-
await page.waitForLoadState('networkidle');
|
|
273
|
-
await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
|
|
274
|
-
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
|
275
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
276
|
-
await page.waitForTimeout(300);
|
|
277
|
-
await page
|
|
278
|
-
.locator(`//td[span[text()="${manualNodeName}"]]`)
|
|
279
|
-
.locator('xpath=preceding-sibling::td[1]')
|
|
280
|
-
.locator('text=View')
|
|
281
|
-
.click();
|
|
282
|
-
const manualNodeRecord = manualNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
283
|
-
await page.getByRole('textbox').fill(manualNodeRecord);
|
|
284
|
-
await page.getByRole('button', { name: 'Continue the process' }).click();
|
|
285
|
-
|
|
286
|
-
await page.waitForTimeout(1000);
|
|
287
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
288
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
289
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
290
|
-
return b.id - a.id;
|
|
291
|
-
});
|
|
292
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
293
|
-
const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
|
|
294
|
-
const manualNodeJobStatus = manualNodeJob.status;
|
|
295
|
-
expect(manualNodeJobStatus).toBe(1);
|
|
296
|
-
|
|
297
|
-
const manualNodeJobResult = manualNodeJob.result;
|
|
298
|
-
const hasAddress = Object.values(manualNodeJobResult).some(
|
|
299
|
-
(value) => (value as { address: string }).address === manualNodeRecord,
|
|
300
|
-
);
|
|
301
|
-
expect(hasAddress).toBe(true);
|
|
302
|
-
|
|
303
|
-
// 4、后置处理:删除工作流
|
|
304
|
-
await apiDeleteWorkflow(workflowId);
|
|
305
|
-
});
|
|
306
|
-
|
|
307
|
-
test('Collection event to add a data trigger, entering mobile phone number data', async ({
|
|
308
|
-
page,
|
|
309
|
-
mockPage,
|
|
310
|
-
mockCollections,
|
|
311
|
-
mockRecords,
|
|
312
|
-
}) => {
|
|
313
|
-
//数据表后缀标识
|
|
314
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
315
|
-
const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
316
|
-
|
|
317
|
-
// 创建触发器节点数据表
|
|
318
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
319
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
320
|
-
const triggerNodeFieldName = 'orgname';
|
|
321
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
322
|
-
await mockCollections(
|
|
323
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
324
|
-
.collections,
|
|
325
|
-
);
|
|
326
|
-
// 创建Manual节点数据表
|
|
327
|
-
const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
|
|
328
|
-
const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
|
|
329
|
-
const manualNodeFieldName = 'phone';
|
|
330
|
-
const manualNodeFieldDisplayName = '负责人电话(手机号码)';
|
|
331
|
-
await mockCollections(
|
|
332
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
|
|
333
|
-
.collections,
|
|
334
|
-
);
|
|
335
|
-
//添加工作流
|
|
336
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
337
|
-
const workflowData = {
|
|
338
|
-
current: true,
|
|
339
|
-
options: { deleteExecutionOnStatus: [] },
|
|
340
|
-
title: workFlowName,
|
|
341
|
-
type: 'collection',
|
|
342
|
-
enabled: true,
|
|
343
|
-
};
|
|
344
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
345
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
346
|
-
const workflowId = workflowObj.id;
|
|
347
|
-
//配置工作流触发器
|
|
348
|
-
const triggerNodeData = {
|
|
349
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
350
|
-
};
|
|
351
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
352
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
353
|
-
//配置Manual节点
|
|
354
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
355
|
-
await page.waitForLoadState('networkidle');
|
|
356
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
357
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
358
|
-
await page.getByRole('button', { name: 'manual', exact: true }).click();
|
|
359
|
-
const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
360
|
-
await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
|
|
361
|
-
const manualNode = new ManualNode(page, manualNodeName);
|
|
362
|
-
const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
|
|
363
|
-
await manualNode.nodeConfigure.click();
|
|
364
|
-
await manualNode.assigneesDropDown.click();
|
|
365
|
-
await page.getByRole('option', { name: 'Super Admin' }).click();
|
|
366
|
-
await manualNode.configureUserInterfaceButton.click();
|
|
367
|
-
await manualNode.addBlockButton.hover();
|
|
368
|
-
await manualNode.customFormMenu.click();
|
|
369
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
370
|
-
// 获取自定义表单的随机值
|
|
371
|
-
const configureFieldsButton = page.locator(
|
|
372
|
-
'button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-"]',
|
|
373
|
-
);
|
|
374
|
-
const ariaLabel = await configureFieldsButton.getAttribute('aria-label');
|
|
375
|
-
const randomValue = ariaLabel.split('-').pop();
|
|
376
|
-
|
|
377
|
-
await page
|
|
378
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
379
|
-
.hover();
|
|
380
|
-
await page.getByLabel(`designer-schema-settings-CardItem-SimpleDesigner-${randomValue}`).hover();
|
|
381
|
-
await page.getByRole('menuitem', { name: 'Edit block title' }).click();
|
|
382
|
-
const blockTitle = 'Form' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
383
|
-
await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
|
|
384
|
-
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
385
|
-
await page
|
|
386
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
387
|
-
.hover();
|
|
388
|
-
await page.getByRole('menuitem', { name: 'Phone' }).click();
|
|
389
|
-
await page
|
|
390
|
-
.getByLabel(`block-item-Input-${randomValue}-Field display name`)
|
|
391
|
-
.getByRole('textbox')
|
|
392
|
-
.fill(manualNodeFieldDisplayName);
|
|
393
|
-
await page.getByLabel(`block-item-Input-${randomValue}-Field name`).getByRole('textbox').fill(manualNodeFieldName);
|
|
394
|
-
await page.getByLabel(`action-Action-Submit-${randomValue}`).click();
|
|
395
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
396
|
-
await page.mouse.click(300, 0);
|
|
397
|
-
await manualNode.submitButton.click();
|
|
398
|
-
await page.waitForLoadState('networkidle');
|
|
399
|
-
|
|
400
|
-
// 2、测试步骤:添加数据触发工作流
|
|
401
|
-
const triggerNodeCollectionRecordOne =
|
|
402
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
403
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
404
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
405
|
-
]);
|
|
406
|
-
await page.waitForTimeout(1000);
|
|
407
|
-
// 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
|
|
408
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
409
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
410
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
411
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
412
|
-
|
|
413
|
-
const newPage = mockPage();
|
|
414
|
-
await newPage.goto();
|
|
415
|
-
await page.waitForLoadState('networkidle');
|
|
416
|
-
await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
|
|
417
|
-
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
|
418
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
419
|
-
await page.waitForTimeout(300);
|
|
420
|
-
await page
|
|
421
|
-
.locator(`//td[span[text()="${manualNodeName}"]]`)
|
|
422
|
-
.locator('xpath=preceding-sibling::td[1]')
|
|
423
|
-
.locator('text=View')
|
|
424
|
-
.click();
|
|
425
|
-
const manualNodeRecord = manualNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
426
|
-
await page.getByRole('textbox').fill(manualNodeRecord);
|
|
427
|
-
await page.getByRole('button', { name: 'Continue the process' }).click();
|
|
428
|
-
|
|
429
|
-
await page.waitForTimeout(1000);
|
|
430
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
431
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
432
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
433
|
-
return b.id - a.id;
|
|
434
|
-
});
|
|
435
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
436
|
-
const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
|
|
437
|
-
const manualNodeJobStatus = manualNodeJob.status;
|
|
438
|
-
expect(manualNodeJobStatus).toBe(1);
|
|
439
|
-
|
|
440
|
-
const manualNodeJobResult = manualNodeJob.result;
|
|
441
|
-
const hasPhone = Object.values(manualNodeJobResult).some(
|
|
442
|
-
(value) => (value as { phone: string }).phone === manualNodeRecord,
|
|
443
|
-
);
|
|
444
|
-
expect(hasPhone).toBe(true);
|
|
445
|
-
|
|
446
|
-
// 4、后置处理:删除工作流
|
|
447
|
-
await apiDeleteWorkflow(workflowId);
|
|
448
|
-
});
|
|
449
|
-
|
|
450
|
-
test('Collection event to add a data trigger, entering mailbox data', async ({
|
|
451
|
-
page,
|
|
452
|
-
mockPage,
|
|
453
|
-
mockCollections,
|
|
454
|
-
mockRecords,
|
|
455
|
-
}) => {
|
|
456
|
-
//数据表后缀标识
|
|
457
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
458
|
-
const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
459
|
-
|
|
460
|
-
// 创建触发器节点数据表
|
|
461
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
462
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
463
|
-
const triggerNodeFieldName = 'orgname';
|
|
464
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
465
|
-
await mockCollections(
|
|
466
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
467
|
-
.collections,
|
|
468
|
-
);
|
|
469
|
-
// 创建Manual节点数据表
|
|
470
|
-
const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
|
|
471
|
-
const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
|
|
472
|
-
const manualNodeFieldName = 'email';
|
|
473
|
-
const manualNodeFieldDisplayName = '电子邮箱(电子邮箱)';
|
|
474
|
-
await mockCollections(
|
|
475
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
|
|
476
|
-
.collections,
|
|
477
|
-
);
|
|
478
|
-
//添加工作流
|
|
479
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
480
|
-
const workflowData = {
|
|
481
|
-
current: true,
|
|
482
|
-
options: { deleteExecutionOnStatus: [] },
|
|
483
|
-
title: workFlowName,
|
|
484
|
-
type: 'collection',
|
|
485
|
-
enabled: true,
|
|
486
|
-
};
|
|
487
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
488
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
489
|
-
const workflowId = workflowObj.id;
|
|
490
|
-
//配置工作流触发器
|
|
491
|
-
const triggerNodeData = {
|
|
492
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
493
|
-
};
|
|
494
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
495
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
496
|
-
//配置Manual节点
|
|
497
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
498
|
-
await page.waitForLoadState('networkidle');
|
|
499
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
500
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
501
|
-
await page.getByRole('button', { name: 'manual', exact: true }).click();
|
|
502
|
-
const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
503
|
-
await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
|
|
504
|
-
const manualNode = new ManualNode(page, manualNodeName);
|
|
505
|
-
const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
|
|
506
|
-
await manualNode.nodeConfigure.click();
|
|
507
|
-
await manualNode.assigneesDropDown.click();
|
|
508
|
-
await page.getByRole('option', { name: 'Super Admin' }).click();
|
|
509
|
-
await manualNode.configureUserInterfaceButton.click();
|
|
510
|
-
await manualNode.addBlockButton.hover();
|
|
511
|
-
await manualNode.customFormMenu.click();
|
|
512
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
513
|
-
// 获取自定义表单的随机值
|
|
514
|
-
const configureFieldsButton = page.locator(
|
|
515
|
-
'button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-"]',
|
|
516
|
-
);
|
|
517
|
-
const ariaLabel = await configureFieldsButton.getAttribute('aria-label');
|
|
518
|
-
const randomValue = ariaLabel.split('-').pop();
|
|
519
|
-
|
|
520
|
-
await page
|
|
521
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
522
|
-
.hover();
|
|
523
|
-
await page.getByLabel(`designer-schema-settings-CardItem-SimpleDesigner-${randomValue}`).hover();
|
|
524
|
-
await page.getByRole('menuitem', { name: 'Edit block title' }).click();
|
|
525
|
-
const blockTitle = 'Form' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
526
|
-
await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
|
|
527
|
-
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
528
|
-
await page
|
|
529
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
530
|
-
.hover();
|
|
531
|
-
await page.getByRole('menuitem', { name: 'Email' }).click();
|
|
532
|
-
await page
|
|
533
|
-
.getByLabel(`block-item-Input-${randomValue}-Field display name`)
|
|
534
|
-
.getByRole('textbox')
|
|
535
|
-
.fill(manualNodeFieldDisplayName);
|
|
536
|
-
await page.getByLabel(`block-item-Input-${randomValue}-Field name`).getByRole('textbox').fill(manualNodeFieldName);
|
|
537
|
-
await page.getByLabel(`action-Action-Submit-${randomValue}`).click();
|
|
538
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
539
|
-
await page.mouse.click(300, 0);
|
|
540
|
-
await manualNode.submitButton.click();
|
|
541
|
-
await page.waitForLoadState('networkidle');
|
|
542
|
-
|
|
543
|
-
// 2、测试步骤:添加数据触发工作流
|
|
544
|
-
const triggerNodeCollectionRecordOne =
|
|
545
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
546
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
547
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
548
|
-
]);
|
|
549
|
-
await page.waitForTimeout(1000);
|
|
550
|
-
// 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
|
|
551
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
552
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
553
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
554
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
555
|
-
|
|
556
|
-
const newPage = mockPage();
|
|
557
|
-
await newPage.goto();
|
|
558
|
-
await page.waitForLoadState('networkidle');
|
|
559
|
-
await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
|
|
560
|
-
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
|
561
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
562
|
-
await page.waitForTimeout(300);
|
|
563
|
-
await page
|
|
564
|
-
.locator(`//td[span[text()="${manualNodeName}"]]`)
|
|
565
|
-
.locator('xpath=preceding-sibling::td[1]')
|
|
566
|
-
.locator('text=View')
|
|
567
|
-
.click();
|
|
568
|
-
const manualNodeRecord = faker.internet.email();
|
|
569
|
-
await page.getByRole('textbox').fill(manualNodeRecord);
|
|
570
|
-
await page.getByRole('button', { name: 'Continue the process' }).click();
|
|
571
|
-
|
|
572
|
-
await page.waitForTimeout(1000);
|
|
573
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
574
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
575
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
576
|
-
return b.id - a.id;
|
|
577
|
-
});
|
|
578
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
579
|
-
const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
|
|
580
|
-
const manualNodeJobStatus = manualNodeJob.status;
|
|
581
|
-
expect(manualNodeJobStatus).toBe(1);
|
|
582
|
-
|
|
583
|
-
const manualNodeJobResult = manualNodeJob.result;
|
|
584
|
-
const hasEmail = Object.values(manualNodeJobResult).some(
|
|
585
|
-
(value) => (value as { email: string }).email === manualNodeRecord,
|
|
586
|
-
);
|
|
587
|
-
expect(hasEmail).toBe(true);
|
|
588
|
-
|
|
589
|
-
// 4、后置处理:删除工作流
|
|
590
|
-
await apiDeleteWorkflow(workflowId);
|
|
591
|
-
});
|
|
592
|
-
|
|
593
|
-
test('Collection event to add a data trigger, entering integer data', async ({
|
|
594
|
-
page,
|
|
595
|
-
mockPage,
|
|
596
|
-
mockCollections,
|
|
597
|
-
mockRecords,
|
|
598
|
-
}) => {
|
|
599
|
-
//数据表后缀标识
|
|
600
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
601
|
-
const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
602
|
-
|
|
603
|
-
// 创建触发器节点数据表
|
|
604
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
605
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
606
|
-
const triggerNodeFieldName = 'orgname';
|
|
607
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
608
|
-
await mockCollections(
|
|
609
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
610
|
-
.collections,
|
|
611
|
-
);
|
|
612
|
-
// 创建Manual节点数据表
|
|
613
|
-
const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
|
|
614
|
-
const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
|
|
615
|
-
const manualNodeFieldName = 'staffnum';
|
|
616
|
-
const manualNodeFieldDisplayName = '员工人数(整数)';
|
|
617
|
-
await mockCollections(
|
|
618
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
|
|
619
|
-
.collections,
|
|
620
|
-
);
|
|
621
|
-
//添加工作流
|
|
622
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
623
|
-
const workflowData = {
|
|
624
|
-
current: true,
|
|
625
|
-
options: { deleteExecutionOnStatus: [] },
|
|
626
|
-
title: workFlowName,
|
|
627
|
-
type: 'collection',
|
|
628
|
-
enabled: true,
|
|
629
|
-
};
|
|
630
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
631
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
632
|
-
const workflowId = workflowObj.id;
|
|
633
|
-
//配置工作流触发器
|
|
634
|
-
const triggerNodeData = {
|
|
635
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
636
|
-
};
|
|
637
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
638
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
639
|
-
//配置Manual节点
|
|
640
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
641
|
-
await page.waitForLoadState('networkidle');
|
|
642
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
643
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
644
|
-
await page.getByRole('button', { name: 'manual', exact: true }).click();
|
|
645
|
-
const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
646
|
-
await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
|
|
647
|
-
const manualNode = new ManualNode(page, manualNodeName);
|
|
648
|
-
const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
|
|
649
|
-
await manualNode.nodeConfigure.click();
|
|
650
|
-
await manualNode.assigneesDropDown.click();
|
|
651
|
-
await page.getByRole('option', { name: 'Super Admin' }).click();
|
|
652
|
-
await manualNode.configureUserInterfaceButton.click();
|
|
653
|
-
await manualNode.addBlockButton.hover();
|
|
654
|
-
await manualNode.customFormMenu.click();
|
|
655
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
656
|
-
// 获取自定义表单的随机值
|
|
657
|
-
const configureFieldsButton = page.locator(
|
|
658
|
-
'button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-"]',
|
|
659
|
-
);
|
|
660
|
-
const ariaLabel = await configureFieldsButton.getAttribute('aria-label');
|
|
661
|
-
const randomValue = ariaLabel.split('-').pop();
|
|
662
|
-
|
|
663
|
-
await page
|
|
664
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
665
|
-
.hover();
|
|
666
|
-
await page.getByLabel(`designer-schema-settings-CardItem-SimpleDesigner-${randomValue}`).hover();
|
|
667
|
-
await page.getByRole('menuitem', { name: 'Edit block title' }).click();
|
|
668
|
-
const blockTitle = 'Form' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
669
|
-
await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
|
|
670
|
-
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
671
|
-
await page
|
|
672
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
673
|
-
.hover();
|
|
674
|
-
await page.getByRole('menuitem', { name: 'Integer' }).click();
|
|
675
|
-
await page
|
|
676
|
-
.getByLabel(`block-item-Input-${randomValue}-Field display name`)
|
|
677
|
-
.getByRole('textbox')
|
|
678
|
-
.fill(manualNodeFieldDisplayName);
|
|
679
|
-
await page.getByLabel(`block-item-Input-${randomValue}-Field name`).getByRole('textbox').fill(manualNodeFieldName);
|
|
680
|
-
await page.getByLabel(`action-Action-Submit-${randomValue}`).click();
|
|
681
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
682
|
-
await page.mouse.click(300, 0);
|
|
683
|
-
await manualNode.submitButton.click();
|
|
684
|
-
await page.waitForLoadState('networkidle');
|
|
685
|
-
|
|
686
|
-
// 2、测试步骤:添加数据触发工作流
|
|
687
|
-
const triggerNodeCollectionRecordOne =
|
|
688
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
689
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
690
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
691
|
-
]);
|
|
692
|
-
await page.waitForTimeout(1000);
|
|
693
|
-
// 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
|
|
694
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
695
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
696
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
697
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
698
|
-
|
|
699
|
-
const newPage = mockPage();
|
|
700
|
-
await newPage.goto();
|
|
701
|
-
await page.waitForLoadState('networkidle');
|
|
702
|
-
await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
|
|
703
|
-
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
|
704
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
705
|
-
await page.waitForTimeout(300);
|
|
706
|
-
await page
|
|
707
|
-
.locator(`//td[span[text()="${manualNodeName}"]]`)
|
|
708
|
-
.locator('xpath=preceding-sibling::td[1]')
|
|
709
|
-
.locator('text=View')
|
|
710
|
-
.click();
|
|
711
|
-
const manualNodeRecord = faker.number.int();
|
|
712
|
-
await page.getByRole('spinbutton').fill(manualNodeRecord.toString());
|
|
713
|
-
await page.getByRole('button', { name: 'Continue the process' }).click();
|
|
714
|
-
|
|
715
|
-
await page.waitForTimeout(1000);
|
|
716
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
717
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
718
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
719
|
-
return b.id - a.id;
|
|
720
|
-
});
|
|
721
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
722
|
-
const manualNodeJob = jobs.find((job) => job.nodeId.toString() == manualNodeId);
|
|
723
|
-
const manualNodeJobStatus = manualNodeJob.status;
|
|
724
|
-
expect(manualNodeJobStatus).toBe(1);
|
|
725
|
-
|
|
726
|
-
const manualNodeJobResult = manualNodeJob.result;
|
|
727
|
-
const hasStaffnum = Object.values(manualNodeJobResult).some(
|
|
728
|
-
(value) => (value as { staffnum: number }).staffnum == manualNodeRecord,
|
|
729
|
-
);
|
|
730
|
-
expect(hasStaffnum).toBe(true);
|
|
731
|
-
|
|
732
|
-
// 4、后置处理:删除工作流
|
|
733
|
-
await apiDeleteWorkflow(workflowId);
|
|
734
|
-
});
|
|
735
|
-
|
|
736
|
-
test('Collection event to add a data trigger, entering number data', async ({
|
|
737
|
-
page,
|
|
738
|
-
mockPage,
|
|
739
|
-
mockCollections,
|
|
740
|
-
mockRecords,
|
|
741
|
-
}) => {
|
|
742
|
-
//数据表后缀标识
|
|
743
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
744
|
-
const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
745
|
-
|
|
746
|
-
// 创建触发器节点数据表
|
|
747
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
748
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
749
|
-
const triggerNodeFieldName = 'orgname';
|
|
750
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
751
|
-
await mockCollections(
|
|
752
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
753
|
-
.collections,
|
|
754
|
-
);
|
|
755
|
-
// 创建Manual节点数据表
|
|
756
|
-
const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
|
|
757
|
-
const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
|
|
758
|
-
const manualNodeFieldName = 'regcapital';
|
|
759
|
-
const manualNodeFieldDisplayName = '注册资本(数字)';
|
|
760
|
-
await mockCollections(
|
|
761
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
|
|
762
|
-
.collections,
|
|
763
|
-
);
|
|
764
|
-
//添加工作流
|
|
765
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
766
|
-
const workflowData = {
|
|
767
|
-
current: true,
|
|
768
|
-
options: { deleteExecutionOnStatus: [] },
|
|
769
|
-
title: workFlowName,
|
|
770
|
-
type: 'collection',
|
|
771
|
-
enabled: true,
|
|
772
|
-
};
|
|
773
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
774
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
775
|
-
const workflowId = workflowObj.id;
|
|
776
|
-
//配置工作流触发器
|
|
777
|
-
const triggerNodeData = {
|
|
778
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
779
|
-
};
|
|
780
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
781
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
782
|
-
//配置Manual节点
|
|
783
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
784
|
-
await page.waitForLoadState('networkidle');
|
|
785
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
786
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
787
|
-
await page.getByRole('button', { name: 'manual', exact: true }).click();
|
|
788
|
-
const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
789
|
-
await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
|
|
790
|
-
const manualNode = new ManualNode(page, manualNodeName);
|
|
791
|
-
const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
|
|
792
|
-
await manualNode.nodeConfigure.click();
|
|
793
|
-
await manualNode.assigneesDropDown.click();
|
|
794
|
-
await page.getByRole('option', { name: 'Super Admin' }).click();
|
|
795
|
-
await manualNode.configureUserInterfaceButton.click();
|
|
796
|
-
await manualNode.addBlockButton.hover();
|
|
797
|
-
await manualNode.customFormMenu.click();
|
|
798
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
799
|
-
// 获取自定义表单的随机值
|
|
800
|
-
const configureFieldsButton = page.locator(
|
|
801
|
-
'button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-"]',
|
|
802
|
-
);
|
|
803
|
-
const ariaLabel = await configureFieldsButton.getAttribute('aria-label');
|
|
804
|
-
const randomValue = ariaLabel.split('-').pop();
|
|
805
|
-
|
|
806
|
-
await page
|
|
807
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
808
|
-
.hover();
|
|
809
|
-
await page.getByLabel(`designer-schema-settings-CardItem-SimpleDesigner-${randomValue}`).hover();
|
|
810
|
-
await page.getByRole('menuitem', { name: 'Edit block title' }).click();
|
|
811
|
-
const blockTitle = 'Form' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
812
|
-
await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
|
|
813
|
-
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
814
|
-
await page
|
|
815
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
816
|
-
.hover();
|
|
817
|
-
await page.getByRole('menuitem', { name: 'Number' }).click();
|
|
818
|
-
await page
|
|
819
|
-
.getByLabel(`block-item-Input-${randomValue}-Field display name`)
|
|
820
|
-
.getByRole('textbox')
|
|
821
|
-
.fill(manualNodeFieldDisplayName);
|
|
822
|
-
await page.getByLabel(`block-item-Input-${randomValue}-Field name`).getByRole('textbox').fill(manualNodeFieldName);
|
|
823
|
-
await page.getByLabel(`action-Action-Submit-${randomValue}`).click();
|
|
824
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
825
|
-
await page.mouse.click(300, 0);
|
|
826
|
-
await manualNode.submitButton.click();
|
|
827
|
-
await page.waitForLoadState('networkidle');
|
|
828
|
-
|
|
829
|
-
// 2、测试步骤:添加数据触发工作流
|
|
830
|
-
const triggerNodeCollectionRecordOne =
|
|
831
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
832
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
833
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
834
|
-
]);
|
|
835
|
-
await page.waitForTimeout(1000);
|
|
836
|
-
// 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
|
|
837
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
838
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
839
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
840
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
841
|
-
|
|
842
|
-
const newPage = mockPage();
|
|
843
|
-
await newPage.goto();
|
|
844
|
-
await page.waitForLoadState('networkidle');
|
|
845
|
-
await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
|
|
846
|
-
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
|
847
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
848
|
-
await page.waitForTimeout(300);
|
|
849
|
-
await page
|
|
850
|
-
.locator(`//td[span[text()="${manualNodeName}"]]`)
|
|
851
|
-
.locator('xpath=preceding-sibling::td[1]')
|
|
852
|
-
.locator('text=View')
|
|
853
|
-
.click();
|
|
854
|
-
const manualNodeRecord = faker.number.float();
|
|
855
|
-
await page.getByRole('spinbutton').fill(manualNodeRecord.toString());
|
|
856
|
-
await page.getByRole('button', { name: 'Continue the process' }).click();
|
|
857
|
-
|
|
858
|
-
await page.waitForTimeout(1000);
|
|
859
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
860
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
861
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
862
|
-
return b.id - a.id;
|
|
863
|
-
});
|
|
864
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
865
|
-
const manualNodeJob = jobs.find((job) => job.nodeId.toString() == manualNodeId);
|
|
866
|
-
const manualNodeJobStatus = manualNodeJob.status;
|
|
867
|
-
expect(manualNodeJobStatus).toBe(1);
|
|
868
|
-
|
|
869
|
-
const manualNodeJobResult = manualNodeJob.result;
|
|
870
|
-
const hasRegcapital = Object.values(manualNodeJobResult).some(
|
|
871
|
-
(value) => (value as { regcapital: number }).regcapital == manualNodeRecord,
|
|
872
|
-
);
|
|
873
|
-
expect(hasRegcapital).toBe(true);
|
|
874
|
-
|
|
875
|
-
// 4、后置处理:删除工作流
|
|
876
|
-
await apiDeleteWorkflow(workflowId);
|
|
877
|
-
});
|
|
878
|
-
|
|
879
|
-
test('Collection event to add a data trigger, entering percentage data', async ({
|
|
880
|
-
page,
|
|
881
|
-
mockPage,
|
|
882
|
-
mockCollections,
|
|
883
|
-
mockRecords,
|
|
884
|
-
}) => {
|
|
885
|
-
//数据表后缀标识
|
|
886
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
887
|
-
const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
888
|
-
|
|
889
|
-
// 创建触发器节点数据表
|
|
890
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
891
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
892
|
-
const triggerNodeFieldName = 'orgname';
|
|
893
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
894
|
-
await mockCollections(
|
|
895
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
896
|
-
.collections,
|
|
897
|
-
);
|
|
898
|
-
// 创建Manual节点数据表
|
|
899
|
-
const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
|
|
900
|
-
const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
|
|
901
|
-
const manualNodeFieldName = 'insuranceratio';
|
|
902
|
-
const manualNodeFieldDisplayName = '参保占比(百分比)';
|
|
903
|
-
await mockCollections(
|
|
904
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
|
|
905
|
-
.collections,
|
|
906
|
-
);
|
|
907
|
-
//添加工作流
|
|
908
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
909
|
-
const workflowData = {
|
|
910
|
-
current: true,
|
|
911
|
-
options: { deleteExecutionOnStatus: [] },
|
|
912
|
-
title: workFlowName,
|
|
913
|
-
type: 'collection',
|
|
914
|
-
enabled: true,
|
|
915
|
-
};
|
|
916
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
917
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
918
|
-
const workflowId = workflowObj.id;
|
|
919
|
-
//配置工作流触发器
|
|
920
|
-
const triggerNodeData = {
|
|
921
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
922
|
-
};
|
|
923
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
924
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
925
|
-
//配置Manual节点
|
|
926
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
927
|
-
await page.waitForLoadState('networkidle');
|
|
928
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
929
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
930
|
-
await page.getByRole('button', { name: 'manual', exact: true }).click();
|
|
931
|
-
const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
932
|
-
await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
|
|
933
|
-
const manualNode = new ManualNode(page, manualNodeName);
|
|
934
|
-
const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
|
|
935
|
-
await manualNode.nodeConfigure.click();
|
|
936
|
-
await manualNode.assigneesDropDown.click();
|
|
937
|
-
await page.getByRole('option', { name: 'Super Admin' }).click();
|
|
938
|
-
await manualNode.configureUserInterfaceButton.click();
|
|
939
|
-
await manualNode.addBlockButton.hover();
|
|
940
|
-
await manualNode.customFormMenu.click();
|
|
941
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
942
|
-
// 获取自定义表单的随机值
|
|
943
|
-
const configureFieldsButton = page.locator(
|
|
944
|
-
'button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-"]',
|
|
945
|
-
);
|
|
946
|
-
const ariaLabel = await configureFieldsButton.getAttribute('aria-label');
|
|
947
|
-
const randomValue = ariaLabel.split('-').pop();
|
|
948
|
-
|
|
949
|
-
await page
|
|
950
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
951
|
-
.hover();
|
|
952
|
-
await page.getByLabel(`designer-schema-settings-CardItem-SimpleDesigner-${randomValue}`).hover();
|
|
953
|
-
await page.getByRole('menuitem', { name: 'Edit block title' }).click();
|
|
954
|
-
const blockTitle = 'Form' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
955
|
-
await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
|
|
956
|
-
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
957
|
-
await page
|
|
958
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
959
|
-
.hover();
|
|
960
|
-
await page.getByRole('menuitem', { name: 'Percent' }).click();
|
|
961
|
-
await page
|
|
962
|
-
.getByLabel(`block-item-Input-${randomValue}-Field display name`)
|
|
963
|
-
.getByRole('textbox')
|
|
964
|
-
.fill(manualNodeFieldDisplayName);
|
|
965
|
-
await page.getByLabel(`block-item-Input-${randomValue}-Field name`).getByRole('textbox').fill(manualNodeFieldName);
|
|
966
|
-
await page.getByLabel(`action-Action-Submit-${randomValue}`).click();
|
|
967
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
968
|
-
await page.mouse.click(300, 0);
|
|
969
|
-
await manualNode.submitButton.click();
|
|
970
|
-
await page.waitForLoadState('networkidle');
|
|
971
|
-
|
|
972
|
-
// 2、测试步骤:添加数据触发工作流
|
|
973
|
-
const triggerNodeCollectionRecordOne =
|
|
974
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
975
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
976
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
977
|
-
]);
|
|
978
|
-
await page.waitForTimeout(1000);
|
|
979
|
-
// 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
|
|
980
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
981
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
982
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
983
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
984
|
-
|
|
985
|
-
const newPage = mockPage();
|
|
986
|
-
await newPage.goto();
|
|
987
|
-
await page.waitForLoadState('networkidle');
|
|
988
|
-
await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
|
|
989
|
-
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
|
990
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
991
|
-
await page.waitForTimeout(300);
|
|
992
|
-
await page
|
|
993
|
-
.locator(`//td[span[text()="${manualNodeName}"]]`)
|
|
994
|
-
.locator('xpath=preceding-sibling::td[1]')
|
|
995
|
-
.locator('text=View')
|
|
996
|
-
.click();
|
|
997
|
-
const manualNodeRecord = faker.number.float({ min: 0, max: 100, precision: 2 });
|
|
998
|
-
await page.getByRole('spinbutton').fill(manualNodeRecord.toString());
|
|
999
|
-
await page.getByRole('button', { name: 'Continue the process' }).click();
|
|
1000
|
-
|
|
1001
|
-
await page.waitForTimeout(1000);
|
|
1002
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
1003
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
1004
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
1005
|
-
return b.id - a.id;
|
|
1006
|
-
});
|
|
1007
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
1008
|
-
const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
|
|
1009
|
-
const manualNodeJobStatus = manualNodeJob.status;
|
|
1010
|
-
expect(manualNodeJobStatus).toBe(1);
|
|
1011
|
-
|
|
1012
|
-
const manualNodeJobResult = manualNodeJob.result;
|
|
1013
|
-
const hasRegcapital = Object.values(manualNodeJobResult).some(
|
|
1014
|
-
(value) => (value as { insuranceratio: number }).insuranceratio === manualNodeRecord / 100,
|
|
1015
|
-
);
|
|
1016
|
-
expect(hasRegcapital).toBe(true);
|
|
1017
|
-
|
|
1018
|
-
// 4、后置处理:删除工作流
|
|
1019
|
-
await apiDeleteWorkflow(workflowId);
|
|
1020
|
-
});
|
|
1021
|
-
|
|
1022
|
-
test('Collection event to add a data trigger, entering checkbox data', async ({
|
|
1023
|
-
page,
|
|
1024
|
-
mockPage,
|
|
1025
|
-
mockCollections,
|
|
1026
|
-
mockRecords,
|
|
1027
|
-
}) => {
|
|
1028
|
-
//数据表后缀标识
|
|
1029
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
1030
|
-
const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
1031
|
-
|
|
1032
|
-
// 创建触发器节点数据表
|
|
1033
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
1034
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
1035
|
-
const triggerNodeFieldName = 'orgname';
|
|
1036
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
1037
|
-
await mockCollections(
|
|
1038
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
1039
|
-
.collections,
|
|
1040
|
-
);
|
|
1041
|
-
// 创建Manual节点数据表
|
|
1042
|
-
const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
|
|
1043
|
-
const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
|
|
1044
|
-
const manualNodeFieldName = 'isenable';
|
|
1045
|
-
const manualNodeFieldDisplayName = '是否启用(勾选)';
|
|
1046
|
-
await mockCollections(
|
|
1047
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
|
|
1048
|
-
.collections,
|
|
1049
|
-
);
|
|
1050
|
-
//添加工作流
|
|
1051
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
1052
|
-
const workflowData = {
|
|
1053
|
-
current: true,
|
|
1054
|
-
options: { deleteExecutionOnStatus: [] },
|
|
1055
|
-
title: workFlowName,
|
|
1056
|
-
type: 'collection',
|
|
1057
|
-
enabled: true,
|
|
1058
|
-
};
|
|
1059
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
1060
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
1061
|
-
const workflowId = workflowObj.id;
|
|
1062
|
-
//配置工作流触发器
|
|
1063
|
-
const triggerNodeData = {
|
|
1064
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
1065
|
-
};
|
|
1066
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
1067
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
1068
|
-
//配置Manual节点
|
|
1069
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
1070
|
-
await page.waitForLoadState('networkidle');
|
|
1071
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
1072
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
1073
|
-
await page.getByRole('button', { name: 'manual', exact: true }).click();
|
|
1074
|
-
const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1075
|
-
await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
|
|
1076
|
-
const manualNode = new ManualNode(page, manualNodeName);
|
|
1077
|
-
const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
|
|
1078
|
-
await manualNode.nodeConfigure.click();
|
|
1079
|
-
await manualNode.assigneesDropDown.click();
|
|
1080
|
-
await page.getByRole('option', { name: 'Super Admin' }).click();
|
|
1081
|
-
await manualNode.configureUserInterfaceButton.click();
|
|
1082
|
-
await manualNode.addBlockButton.hover();
|
|
1083
|
-
await manualNode.customFormMenu.click();
|
|
1084
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1085
|
-
// 获取自定义表单的随机值
|
|
1086
|
-
const configureFieldsButton = page.locator(
|
|
1087
|
-
'button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-"]',
|
|
1088
|
-
);
|
|
1089
|
-
const ariaLabel = await configureFieldsButton.getAttribute('aria-label');
|
|
1090
|
-
const randomValue = ariaLabel.split('-').pop();
|
|
1091
|
-
|
|
1092
|
-
await page
|
|
1093
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
1094
|
-
.hover();
|
|
1095
|
-
await page.getByLabel(`designer-schema-settings-CardItem-SimpleDesigner-${randomValue}`).hover();
|
|
1096
|
-
await page.getByRole('menuitem', { name: 'Edit block title' }).click();
|
|
1097
|
-
const blockTitle = 'Form' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1098
|
-
await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
|
|
1099
|
-
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
1100
|
-
await page
|
|
1101
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
1102
|
-
.hover();
|
|
1103
|
-
await page.getByRole('menuitem', { name: 'Checkbox', exact: true }).click();
|
|
1104
|
-
await page
|
|
1105
|
-
.getByLabel(`block-item-Input-${randomValue}-Field display name`)
|
|
1106
|
-
.getByRole('textbox')
|
|
1107
|
-
.fill(manualNodeFieldDisplayName);
|
|
1108
|
-
await page.getByLabel(`block-item-Input-${randomValue}-Field name`).getByRole('textbox').fill(manualNodeFieldName);
|
|
1109
|
-
await page.getByLabel(`action-Action-Submit-${randomValue}`).click();
|
|
1110
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1111
|
-
await page.mouse.click(300, 0);
|
|
1112
|
-
await manualNode.submitButton.click();
|
|
1113
|
-
await page.waitForLoadState('networkidle');
|
|
1114
|
-
|
|
1115
|
-
// 2、测试步骤:添加数据触发工作流
|
|
1116
|
-
const triggerNodeCollectionRecordOne =
|
|
1117
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1118
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
1119
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
1120
|
-
]);
|
|
1121
|
-
await page.waitForTimeout(1000);
|
|
1122
|
-
// 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
|
|
1123
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
1124
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
1125
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
1126
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
1127
|
-
|
|
1128
|
-
const newPage = mockPage();
|
|
1129
|
-
await newPage.goto();
|
|
1130
|
-
await page.waitForLoadState('networkidle');
|
|
1131
|
-
await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
|
|
1132
|
-
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
|
1133
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1134
|
-
await page.waitForTimeout(300);
|
|
1135
|
-
await page
|
|
1136
|
-
.locator(`//td[span[text()="${manualNodeName}"]]`)
|
|
1137
|
-
.locator('xpath=preceding-sibling::td[1]')
|
|
1138
|
-
.locator('text=View')
|
|
1139
|
-
.click();
|
|
1140
|
-
// const manualNodeRecord = faker.number.float({ min: 0, max: 100, precision: 2 });
|
|
1141
|
-
await page.getByRole('checkbox').check();
|
|
1142
|
-
await page.getByRole('button', { name: 'Continue the process' }).click();
|
|
1143
|
-
|
|
1144
|
-
await page.waitForTimeout(1000);
|
|
1145
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
1146
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
1147
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
1148
|
-
return b.id - a.id;
|
|
1149
|
-
});
|
|
1150
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
1151
|
-
const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
|
|
1152
|
-
const manualNodeJobStatus = manualNodeJob.status;
|
|
1153
|
-
expect(manualNodeJobStatus).toBe(1);
|
|
1154
|
-
|
|
1155
|
-
const manualNodeJobResult = manualNodeJob.result;
|
|
1156
|
-
const hasIsenable = Object.values(manualNodeJobResult).some(
|
|
1157
|
-
(value) => (value as { isenable: boolean }).isenable === true,
|
|
1158
|
-
);
|
|
1159
|
-
expect(hasIsenable).toBe(true);
|
|
1160
|
-
|
|
1161
|
-
// 4、后置处理:删除工作流
|
|
1162
|
-
await apiDeleteWorkflow(workflowId);
|
|
1163
|
-
});
|
|
1164
|
-
|
|
1165
|
-
test('Collection event to add a data trigger, entering single select data', async ({
|
|
1166
|
-
page,
|
|
1167
|
-
mockPage,
|
|
1168
|
-
mockCollections,
|
|
1169
|
-
mockRecords,
|
|
1170
|
-
}) => {
|
|
1171
|
-
//数据表后缀标识
|
|
1172
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
1173
|
-
const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
1174
|
-
|
|
1175
|
-
// 创建触发器节点数据表
|
|
1176
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
1177
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
1178
|
-
const triggerNodeFieldName = 'orgname';
|
|
1179
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
1180
|
-
await mockCollections(
|
|
1181
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
1182
|
-
.collections,
|
|
1183
|
-
);
|
|
1184
|
-
// 创建Manual节点数据表
|
|
1185
|
-
const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
|
|
1186
|
-
const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
|
|
1187
|
-
const manualNodeFieldName = 'status_singleselect';
|
|
1188
|
-
const manualNodeFieldDisplayName = '公司状态(下拉单选)';
|
|
1189
|
-
await mockCollections(
|
|
1190
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
|
|
1191
|
-
.collections,
|
|
1192
|
-
);
|
|
1193
|
-
//添加工作流
|
|
1194
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
1195
|
-
const workflowData = {
|
|
1196
|
-
current: true,
|
|
1197
|
-
options: { deleteExecutionOnStatus: [] },
|
|
1198
|
-
title: workFlowName,
|
|
1199
|
-
type: 'collection',
|
|
1200
|
-
enabled: true,
|
|
1201
|
-
};
|
|
1202
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
1203
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
1204
|
-
const workflowId = workflowObj.id;
|
|
1205
|
-
//配置工作流触发器
|
|
1206
|
-
const triggerNodeData = {
|
|
1207
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
1208
|
-
};
|
|
1209
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
1210
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
1211
|
-
//配置Manual节点
|
|
1212
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
1213
|
-
await page.waitForLoadState('networkidle');
|
|
1214
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
1215
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
1216
|
-
await page.getByRole('button', { name: 'manual', exact: true }).click();
|
|
1217
|
-
const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1218
|
-
await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
|
|
1219
|
-
const manualNode = new ManualNode(page, manualNodeName);
|
|
1220
|
-
const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
|
|
1221
|
-
await manualNode.nodeConfigure.click();
|
|
1222
|
-
await manualNode.assigneesDropDown.click();
|
|
1223
|
-
await page.getByRole('option', { name: 'Super Admin' }).click();
|
|
1224
|
-
await manualNode.configureUserInterfaceButton.click();
|
|
1225
|
-
await manualNode.addBlockButton.hover();
|
|
1226
|
-
await manualNode.customFormMenu.click();
|
|
1227
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1228
|
-
// 获取自定义表单的随机值
|
|
1229
|
-
const configureFieldsButton = page.locator(
|
|
1230
|
-
'button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-"]',
|
|
1231
|
-
);
|
|
1232
|
-
const ariaLabel = await configureFieldsButton.getAttribute('aria-label');
|
|
1233
|
-
const randomValue = ariaLabel.split('-').pop();
|
|
1234
|
-
|
|
1235
|
-
await page
|
|
1236
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
1237
|
-
.hover();
|
|
1238
|
-
await page.getByLabel(`designer-schema-settings-CardItem-SimpleDesigner-${randomValue}`).hover();
|
|
1239
|
-
await page.getByRole('menuitem', { name: 'Edit block title' }).click();
|
|
1240
|
-
const blockTitle = 'Form' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1241
|
-
await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
|
|
1242
|
-
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
1243
|
-
await page
|
|
1244
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
1245
|
-
.hover();
|
|
1246
|
-
await page.getByRole('menuitem', { name: 'Single select', exact: true }).click();
|
|
1247
|
-
await page
|
|
1248
|
-
.getByLabel(`block-item-Input-${randomValue}-Field display name`)
|
|
1249
|
-
.getByRole('textbox')
|
|
1250
|
-
.fill(manualNodeFieldDisplayName);
|
|
1251
|
-
await page.getByLabel(`block-item-Input-${randomValue}-Field name`).getByRole('textbox').fill(manualNodeFieldName);
|
|
1252
|
-
await page.getByRole('button', { name: 'Add option' }).click();
|
|
1253
|
-
await page.getByRole('button', { name: 'Add option' }).click();
|
|
1254
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').first().fill('1');
|
|
1255
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').nth(1).fill('存续');
|
|
1256
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').nth(2).fill('2');
|
|
1257
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').nth(3).fill('在业');
|
|
1258
|
-
await page.getByLabel(`action-Action-Submit-${randomValue}`).click();
|
|
1259
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1260
|
-
await page.mouse.click(300, 0);
|
|
1261
|
-
await manualNode.submitButton.click();
|
|
1262
|
-
await page.waitForLoadState('networkidle');
|
|
1263
|
-
|
|
1264
|
-
// 2、测试步骤:添加数据触发工作流
|
|
1265
|
-
const triggerNodeCollectionRecordOne =
|
|
1266
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1267
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
1268
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
1269
|
-
]);
|
|
1270
|
-
await page.waitForTimeout(1000);
|
|
1271
|
-
// 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
|
|
1272
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
1273
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
1274
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
1275
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
1276
|
-
|
|
1277
|
-
const newPage = mockPage();
|
|
1278
|
-
await newPage.goto();
|
|
1279
|
-
await page.waitForLoadState('networkidle');
|
|
1280
|
-
await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
|
|
1281
|
-
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
|
1282
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1283
|
-
await page.waitForTimeout(300);
|
|
1284
|
-
await page
|
|
1285
|
-
.locator(`//td[span[text()="${manualNodeName}"]]`)
|
|
1286
|
-
.locator('xpath=preceding-sibling::td[1]')
|
|
1287
|
-
.locator('text=View')
|
|
1288
|
-
.click();
|
|
1289
|
-
// const manualNodeRecord = faker.number.float({ min: 0, max: 100, precision: 2 });
|
|
1290
|
-
await page.getByTestId('select-single').click();
|
|
1291
|
-
await page.getByRole('option', { name: '存续' }).click();
|
|
1292
|
-
await page.getByRole('button', { name: 'Continue the process' }).click();
|
|
1293
|
-
|
|
1294
|
-
await page.waitForTimeout(1000);
|
|
1295
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
1296
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
1297
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
1298
|
-
return b.id - a.id;
|
|
1299
|
-
});
|
|
1300
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
1301
|
-
const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
|
|
1302
|
-
const manualNodeJobStatus = manualNodeJob.status;
|
|
1303
|
-
expect(manualNodeJobStatus).toBe(1);
|
|
1304
|
-
|
|
1305
|
-
const manualNodeJobResult = manualNodeJob.result;
|
|
1306
|
-
const hasIsenable = Object.values(manualNodeJobResult).some(
|
|
1307
|
-
(value) => (value as { status_singleselect: string }).status_singleselect === '1',
|
|
1308
|
-
);
|
|
1309
|
-
expect(hasIsenable).toBe(true);
|
|
1310
|
-
|
|
1311
|
-
// 4、后置处理:删除工作流
|
|
1312
|
-
await apiDeleteWorkflow(workflowId);
|
|
1313
|
-
});
|
|
1314
|
-
|
|
1315
|
-
test('Collection event to add a data trigger, entering multiple select data', async ({
|
|
1316
|
-
page,
|
|
1317
|
-
mockPage,
|
|
1318
|
-
mockCollections,
|
|
1319
|
-
mockRecords,
|
|
1320
|
-
}) => {
|
|
1321
|
-
//数据表后缀标识
|
|
1322
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
1323
|
-
const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
1324
|
-
|
|
1325
|
-
// 创建触发器节点数据表
|
|
1326
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
1327
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
1328
|
-
const triggerNodeFieldName = 'orgname';
|
|
1329
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
1330
|
-
await mockCollections(
|
|
1331
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
1332
|
-
.collections,
|
|
1333
|
-
);
|
|
1334
|
-
// 创建Manual节点数据表
|
|
1335
|
-
const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
|
|
1336
|
-
const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
|
|
1337
|
-
const manualNodeFieldName = 'range_multipleselect';
|
|
1338
|
-
const manualNodeFieldDisplayName = '经营范围(下拉多选)';
|
|
1339
|
-
await mockCollections(
|
|
1340
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
|
|
1341
|
-
.collections,
|
|
1342
|
-
);
|
|
1343
|
-
//添加工作流
|
|
1344
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
1345
|
-
const workflowData = {
|
|
1346
|
-
current: true,
|
|
1347
|
-
options: { deleteExecutionOnStatus: [] },
|
|
1348
|
-
title: workFlowName,
|
|
1349
|
-
type: 'collection',
|
|
1350
|
-
enabled: true,
|
|
1351
|
-
};
|
|
1352
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
1353
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
1354
|
-
const workflowId = workflowObj.id;
|
|
1355
|
-
//配置工作流触发器
|
|
1356
|
-
const triggerNodeData = {
|
|
1357
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
1358
|
-
};
|
|
1359
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
1360
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
1361
|
-
//配置Manual节点
|
|
1362
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
1363
|
-
await page.waitForLoadState('networkidle');
|
|
1364
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
1365
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
1366
|
-
await page.getByRole('button', { name: 'manual', exact: true }).click();
|
|
1367
|
-
const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1368
|
-
await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
|
|
1369
|
-
const manualNode = new ManualNode(page, manualNodeName);
|
|
1370
|
-
const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
|
|
1371
|
-
await manualNode.nodeConfigure.click();
|
|
1372
|
-
await manualNode.assigneesDropDown.click();
|
|
1373
|
-
await page.getByRole('option', { name: 'Super Admin' }).click();
|
|
1374
|
-
await manualNode.configureUserInterfaceButton.click();
|
|
1375
|
-
await manualNode.addBlockButton.hover();
|
|
1376
|
-
await manualNode.customFormMenu.click();
|
|
1377
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1378
|
-
// 获取自定义表单的随机值
|
|
1379
|
-
const configureFieldsButton = page.locator(
|
|
1380
|
-
'button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-"]',
|
|
1381
|
-
);
|
|
1382
|
-
const ariaLabel = await configureFieldsButton.getAttribute('aria-label');
|
|
1383
|
-
const randomValue = ariaLabel.split('-').pop();
|
|
1384
|
-
|
|
1385
|
-
await page
|
|
1386
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
1387
|
-
.hover();
|
|
1388
|
-
await page.getByLabel(`designer-schema-settings-CardItem-SimpleDesigner-${randomValue}`).hover();
|
|
1389
|
-
await page.getByRole('menuitem', { name: 'Edit block title' }).click();
|
|
1390
|
-
const blockTitle = 'Form' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1391
|
-
await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
|
|
1392
|
-
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
1393
|
-
await page
|
|
1394
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
1395
|
-
.hover();
|
|
1396
|
-
await page.getByRole('menuitem', { name: 'Multiple select', exact: true }).click();
|
|
1397
|
-
await page
|
|
1398
|
-
.getByLabel(`block-item-Input-${randomValue}-Field display name`)
|
|
1399
|
-
.getByRole('textbox')
|
|
1400
|
-
.fill(manualNodeFieldDisplayName);
|
|
1401
|
-
await page.getByLabel(`block-item-Input-${randomValue}-Field name`).getByRole('textbox').fill(manualNodeFieldName);
|
|
1402
|
-
await page.getByRole('button', { name: 'Add option' }).click();
|
|
1403
|
-
await page.getByRole('button', { name: 'Add option' }).click();
|
|
1404
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').first().fill('F3134');
|
|
1405
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').nth(1).fill('软件销售');
|
|
1406
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').nth(2).fill('I3006');
|
|
1407
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').nth(3).fill('软件开发');
|
|
1408
|
-
await page.getByLabel(`action-Action-Submit-${randomValue}`).click();
|
|
1409
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1410
|
-
await page.mouse.click(300, 0);
|
|
1411
|
-
await manualNode.submitButton.click();
|
|
1412
|
-
await page.waitForLoadState('networkidle');
|
|
1413
|
-
|
|
1414
|
-
// 2、测试步骤:添加数据触发工作流
|
|
1415
|
-
const triggerNodeCollectionRecordOne =
|
|
1416
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1417
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
1418
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
1419
|
-
]);
|
|
1420
|
-
await page.waitForTimeout(1000);
|
|
1421
|
-
// 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
|
|
1422
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
1423
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
1424
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
1425
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
1426
|
-
|
|
1427
|
-
const newPage = mockPage();
|
|
1428
|
-
await newPage.goto();
|
|
1429
|
-
await page.waitForLoadState('networkidle');
|
|
1430
|
-
await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
|
|
1431
|
-
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
|
1432
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1433
|
-
await page.waitForTimeout(300);
|
|
1434
|
-
await page
|
|
1435
|
-
.locator(`//td[span[text()="${manualNodeName}"]]`)
|
|
1436
|
-
.locator('xpath=preceding-sibling::td[1]')
|
|
1437
|
-
.locator('text=View')
|
|
1438
|
-
.click();
|
|
1439
|
-
await page.getByTestId('select-multiple').click();
|
|
1440
|
-
await page.getByRole('option', { name: '软件销售', exact: true }).click();
|
|
1441
|
-
await page.getByRole('option', { name: '软件开发', exact: true }).click();
|
|
1442
|
-
await page.getByTestId('select-multiple').click();
|
|
1443
|
-
await page.getByRole('button', { name: 'Continue the process' }).click();
|
|
1444
|
-
|
|
1445
|
-
await page.waitForTimeout(1000);
|
|
1446
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
1447
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
1448
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
1449
|
-
return b.id - a.id;
|
|
1450
|
-
});
|
|
1451
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
1452
|
-
const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
|
|
1453
|
-
const manualNodeJobStatus = manualNodeJob.status;
|
|
1454
|
-
expect(manualNodeJobStatus).toBe(1);
|
|
1455
|
-
|
|
1456
|
-
const manualNodeJobResult = manualNodeJob.result;
|
|
1457
|
-
let resultFieldValue = '';
|
|
1458
|
-
const expectFieldValue = ['F3134', 'I3006'];
|
|
1459
|
-
for (const key in manualNodeJobResult) {
|
|
1460
|
-
if (Object.prototype.hasOwnProperty.call(manualNodeJobResult[key], 'range_multipleselect')) {
|
|
1461
|
-
resultFieldValue = manualNodeJobResult[key]['range_multipleselect'];
|
|
1462
|
-
break;
|
|
1463
|
-
}
|
|
1464
|
-
}
|
|
1465
|
-
const isEqual = JSON.stringify(resultFieldValue) === JSON.stringify(expectFieldValue);
|
|
1466
|
-
expect(isEqual).toBe(true);
|
|
1467
|
-
|
|
1468
|
-
// 4、后置处理:删除工作流
|
|
1469
|
-
await apiDeleteWorkflow(workflowId);
|
|
1470
|
-
});
|
|
1471
|
-
|
|
1472
|
-
test('Collection event to add a data trigger, entering radio group data', async ({
|
|
1473
|
-
page,
|
|
1474
|
-
mockPage,
|
|
1475
|
-
mockCollections,
|
|
1476
|
-
mockRecords,
|
|
1477
|
-
}) => {
|
|
1478
|
-
//数据表后缀标识
|
|
1479
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
1480
|
-
const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
1481
|
-
|
|
1482
|
-
// 创建触发器节点数据表
|
|
1483
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
1484
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
1485
|
-
const triggerNodeFieldName = 'orgname';
|
|
1486
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
1487
|
-
await mockCollections(
|
|
1488
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
1489
|
-
.collections,
|
|
1490
|
-
);
|
|
1491
|
-
// 创建Manual节点数据表
|
|
1492
|
-
const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
|
|
1493
|
-
const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
|
|
1494
|
-
const manualNodeFieldName = 'status_radio';
|
|
1495
|
-
const manualNodeFieldDisplayName = '公司状态(单选)';
|
|
1496
|
-
await mockCollections(
|
|
1497
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
|
|
1498
|
-
.collections,
|
|
1499
|
-
);
|
|
1500
|
-
//添加工作流
|
|
1501
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
1502
|
-
const workflowData = {
|
|
1503
|
-
current: true,
|
|
1504
|
-
options: { deleteExecutionOnStatus: [] },
|
|
1505
|
-
title: workFlowName,
|
|
1506
|
-
type: 'collection',
|
|
1507
|
-
enabled: true,
|
|
1508
|
-
};
|
|
1509
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
1510
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
1511
|
-
const workflowId = workflowObj.id;
|
|
1512
|
-
//配置工作流触发器
|
|
1513
|
-
const triggerNodeData = {
|
|
1514
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
1515
|
-
};
|
|
1516
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
1517
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
1518
|
-
//配置Manual节点
|
|
1519
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
1520
|
-
await page.waitForLoadState('networkidle');
|
|
1521
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
1522
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
1523
|
-
await page.getByRole('button', { name: 'manual', exact: true }).click();
|
|
1524
|
-
const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1525
|
-
await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
|
|
1526
|
-
const manualNode = new ManualNode(page, manualNodeName);
|
|
1527
|
-
const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
|
|
1528
|
-
await manualNode.nodeConfigure.click();
|
|
1529
|
-
await manualNode.assigneesDropDown.click();
|
|
1530
|
-
await page.getByRole('option', { name: 'Super Admin' }).click();
|
|
1531
|
-
await manualNode.configureUserInterfaceButton.click();
|
|
1532
|
-
await manualNode.addBlockButton.hover();
|
|
1533
|
-
await manualNode.customFormMenu.click();
|
|
1534
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1535
|
-
// 获取自定义表单的随机值
|
|
1536
|
-
const configureFieldsButton = page.locator(
|
|
1537
|
-
'button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-"]',
|
|
1538
|
-
);
|
|
1539
|
-
const ariaLabel = await configureFieldsButton.getAttribute('aria-label');
|
|
1540
|
-
const randomValue = ariaLabel.split('-').pop();
|
|
1541
|
-
|
|
1542
|
-
await page
|
|
1543
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
1544
|
-
.hover();
|
|
1545
|
-
await page.getByLabel(`designer-schema-settings-CardItem-SimpleDesigner-${randomValue}`).hover();
|
|
1546
|
-
await page.getByRole('menuitem', { name: 'Edit block title' }).click();
|
|
1547
|
-
const blockTitle = 'Form' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1548
|
-
await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
|
|
1549
|
-
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
1550
|
-
await page
|
|
1551
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
1552
|
-
.hover();
|
|
1553
|
-
await page.getByRole('menuitem', { name: 'Radio group', exact: true }).click();
|
|
1554
|
-
await page
|
|
1555
|
-
.getByLabel(`block-item-Input-${randomValue}-Field display name`)
|
|
1556
|
-
.getByRole('textbox')
|
|
1557
|
-
.fill(manualNodeFieldDisplayName);
|
|
1558
|
-
await page.getByLabel(`block-item-Input-${randomValue}-Field name`).getByRole('textbox').fill(manualNodeFieldName);
|
|
1559
|
-
await page.getByRole('button', { name: 'Add option' }).click();
|
|
1560
|
-
await page.getByRole('button', { name: 'Add option' }).click();
|
|
1561
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').first().fill('1');
|
|
1562
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').nth(1).fill('存续');
|
|
1563
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').nth(2).fill('2');
|
|
1564
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').nth(3).fill('在业');
|
|
1565
|
-
await page.getByLabel(`action-Action-Submit-${randomValue}`).click();
|
|
1566
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1567
|
-
await page.mouse.click(300, 0);
|
|
1568
|
-
await manualNode.submitButton.click();
|
|
1569
|
-
await page.waitForLoadState('networkidle');
|
|
1570
|
-
|
|
1571
|
-
// 2、测试步骤:添加数据触发工作流
|
|
1572
|
-
const triggerNodeCollectionRecordOne =
|
|
1573
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1574
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
1575
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
1576
|
-
]);
|
|
1577
|
-
await page.waitForTimeout(1000);
|
|
1578
|
-
// 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
|
|
1579
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
1580
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
1581
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
1582
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
1583
|
-
|
|
1584
|
-
const newPage = mockPage();
|
|
1585
|
-
await newPage.goto();
|
|
1586
|
-
await page.waitForLoadState('networkidle');
|
|
1587
|
-
await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
|
|
1588
|
-
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
|
1589
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1590
|
-
await page.waitForTimeout(300);
|
|
1591
|
-
await page
|
|
1592
|
-
.locator(`//td[span[text()="${manualNodeName}"]]`)
|
|
1593
|
-
.locator('xpath=preceding-sibling::td[1]')
|
|
1594
|
-
.locator('text=View')
|
|
1595
|
-
.click();
|
|
1596
|
-
// const manualNodeRecord = faker.number.float({ min: 0, max: 100, precision: 2 });
|
|
1597
|
-
await page.getByLabel('存续').check();
|
|
1598
|
-
await page.getByRole('button', { name: 'Continue the process' }).click();
|
|
1599
|
-
|
|
1600
|
-
await page.waitForTimeout(1000);
|
|
1601
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
1602
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
1603
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
1604
|
-
return b.id - a.id;
|
|
1605
|
-
});
|
|
1606
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
1607
|
-
const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
|
|
1608
|
-
const manualNodeJobStatus = manualNodeJob.status;
|
|
1609
|
-
expect(manualNodeJobStatus).toBe(1);
|
|
1610
|
-
|
|
1611
|
-
const manualNodeJobResult = manualNodeJob.result;
|
|
1612
|
-
const hasIsenable = Object.values(manualNodeJobResult).some(
|
|
1613
|
-
(value) => (value as { status_radio: string }).status_radio === '1',
|
|
1614
|
-
);
|
|
1615
|
-
expect(hasIsenable).toBe(true);
|
|
1616
|
-
|
|
1617
|
-
// 4、后置处理:删除工作流
|
|
1618
|
-
await apiDeleteWorkflow(workflowId);
|
|
1619
|
-
});
|
|
1620
|
-
|
|
1621
|
-
test('Collection event to add a data trigger, entering checkbox group data', async ({
|
|
1622
|
-
page,
|
|
1623
|
-
mockPage,
|
|
1624
|
-
mockCollections,
|
|
1625
|
-
mockRecords,
|
|
1626
|
-
}) => {
|
|
1627
|
-
//数据表后缀标识
|
|
1628
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
1629
|
-
const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
1630
|
-
|
|
1631
|
-
// 创建触发器节点数据表
|
|
1632
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
1633
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
1634
|
-
const triggerNodeFieldName = 'orgname';
|
|
1635
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
1636
|
-
await mockCollections(
|
|
1637
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
1638
|
-
.collections,
|
|
1639
|
-
);
|
|
1640
|
-
// 创建Manual节点数据表
|
|
1641
|
-
const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
|
|
1642
|
-
const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
|
|
1643
|
-
const manualNodeFieldName = 'range_check';
|
|
1644
|
-
const manualNodeFieldDisplayName = '经营范围(复选)';
|
|
1645
|
-
await mockCollections(
|
|
1646
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
|
|
1647
|
-
.collections,
|
|
1648
|
-
);
|
|
1649
|
-
//添加工作流
|
|
1650
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
1651
|
-
const workflowData = {
|
|
1652
|
-
current: true,
|
|
1653
|
-
options: { deleteExecutionOnStatus: [] },
|
|
1654
|
-
title: workFlowName,
|
|
1655
|
-
type: 'collection',
|
|
1656
|
-
enabled: true,
|
|
1657
|
-
};
|
|
1658
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
1659
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
1660
|
-
const workflowId = workflowObj.id;
|
|
1661
|
-
//配置工作流触发器
|
|
1662
|
-
const triggerNodeData = {
|
|
1663
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
1664
|
-
};
|
|
1665
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
1666
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
1667
|
-
//配置Manual节点
|
|
1668
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
1669
|
-
await page.waitForLoadState('networkidle');
|
|
1670
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
1671
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
1672
|
-
await page.getByRole('button', { name: 'manual', exact: true }).click();
|
|
1673
|
-
const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1674
|
-
await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
|
|
1675
|
-
const manualNode = new ManualNode(page, manualNodeName);
|
|
1676
|
-
const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
|
|
1677
|
-
await manualNode.nodeConfigure.click();
|
|
1678
|
-
await manualNode.assigneesDropDown.click();
|
|
1679
|
-
await page.getByRole('option', { name: 'Super Admin' }).click();
|
|
1680
|
-
await manualNode.configureUserInterfaceButton.click();
|
|
1681
|
-
await manualNode.addBlockButton.hover();
|
|
1682
|
-
await manualNode.customFormMenu.click();
|
|
1683
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1684
|
-
// 获取自定义表单的随机值
|
|
1685
|
-
const configureFieldsButton = page.locator(
|
|
1686
|
-
'button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-"]',
|
|
1687
|
-
);
|
|
1688
|
-
const ariaLabel = await configureFieldsButton.getAttribute('aria-label');
|
|
1689
|
-
const randomValue = ariaLabel.split('-').pop();
|
|
1690
|
-
|
|
1691
|
-
await page
|
|
1692
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
1693
|
-
.hover();
|
|
1694
|
-
await page.getByLabel(`designer-schema-settings-CardItem-SimpleDesigner-${randomValue}`).hover();
|
|
1695
|
-
await page.getByRole('menuitem', { name: 'Edit block title' }).click();
|
|
1696
|
-
const blockTitle = 'Form' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1697
|
-
await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
|
|
1698
|
-
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
1699
|
-
await page
|
|
1700
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
1701
|
-
.hover();
|
|
1702
|
-
await page.getByRole('menuitem', { name: 'Checkbox group', exact: true }).click();
|
|
1703
|
-
await page
|
|
1704
|
-
.getByLabel(`block-item-Input-${randomValue}-Field display name`)
|
|
1705
|
-
.getByRole('textbox')
|
|
1706
|
-
.fill(manualNodeFieldDisplayName);
|
|
1707
|
-
await page.getByLabel(`block-item-Input-${randomValue}-Field name`).getByRole('textbox').fill(manualNodeFieldName);
|
|
1708
|
-
await page.getByRole('button', { name: 'Add option' }).click();
|
|
1709
|
-
await page.getByRole('button', { name: 'Add option' }).click();
|
|
1710
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').first().fill('F3134');
|
|
1711
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').nth(1).fill('软件销售');
|
|
1712
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').nth(2).fill('I3006');
|
|
1713
|
-
await page.getByLabel('block-item-ArrayTable-').getByRole('textbox').nth(3).fill('软件开发');
|
|
1714
|
-
await page.getByLabel(`action-Action-Submit-${randomValue}`).click();
|
|
1715
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1716
|
-
await page.mouse.click(300, 0);
|
|
1717
|
-
await manualNode.submitButton.click();
|
|
1718
|
-
await page.waitForLoadState('networkidle');
|
|
1719
|
-
|
|
1720
|
-
// 2、测试步骤:添加数据触发工作流
|
|
1721
|
-
const triggerNodeCollectionRecordOne =
|
|
1722
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1723
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
1724
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
1725
|
-
]);
|
|
1726
|
-
await page.waitForTimeout(1000);
|
|
1727
|
-
// 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
|
|
1728
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
1729
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
1730
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
1731
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
1732
|
-
|
|
1733
|
-
const newPage = mockPage();
|
|
1734
|
-
await newPage.goto();
|
|
1735
|
-
await page.waitForLoadState('networkidle');
|
|
1736
|
-
await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
|
|
1737
|
-
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
|
1738
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1739
|
-
await page.waitForTimeout(300);
|
|
1740
|
-
await page
|
|
1741
|
-
.locator(`//td[span[text()="${manualNodeName}"]]`)
|
|
1742
|
-
.locator('xpath=preceding-sibling::td[1]')
|
|
1743
|
-
.locator('text=View')
|
|
1744
|
-
.click();
|
|
1745
|
-
await page.getByLabel('软件销售', { exact: true }).check();
|
|
1746
|
-
await page.getByLabel('软件开发', { exact: true }).check();
|
|
1747
|
-
await page.getByRole('button', { name: 'Continue the process' }).click();
|
|
1748
|
-
|
|
1749
|
-
await page.waitForTimeout(1000);
|
|
1750
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
1751
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
1752
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
1753
|
-
return b.id - a.id;
|
|
1754
|
-
});
|
|
1755
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
1756
|
-
const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
|
|
1757
|
-
const manualNodeJobStatus = manualNodeJob.status;
|
|
1758
|
-
expect(manualNodeJobStatus).toBe(1);
|
|
1759
|
-
|
|
1760
|
-
const manualNodeJobResult = manualNodeJob.result;
|
|
1761
|
-
let resultFieldValue = '';
|
|
1762
|
-
const expectFieldValue = ['F3134', 'I3006'];
|
|
1763
|
-
for (const key in manualNodeJobResult) {
|
|
1764
|
-
if (Object.prototype.hasOwnProperty.call(manualNodeJobResult[key], 'range_check')) {
|
|
1765
|
-
resultFieldValue = manualNodeJobResult[key]['range_check'];
|
|
1766
|
-
break;
|
|
1767
|
-
}
|
|
1768
|
-
}
|
|
1769
|
-
const isEqual = JSON.stringify(resultFieldValue) === JSON.stringify(expectFieldValue);
|
|
1770
|
-
expect(isEqual).toBe(true);
|
|
1771
|
-
|
|
1772
|
-
// 4、后置处理:删除工作流
|
|
1773
|
-
await apiDeleteWorkflow(workflowId);
|
|
1774
|
-
});
|
|
1775
|
-
|
|
1776
|
-
test('Collection event to add a data trigger, entering datetime data', async ({
|
|
1777
|
-
page,
|
|
1778
|
-
mockPage,
|
|
1779
|
-
mockCollections,
|
|
1780
|
-
mockRecords,
|
|
1781
|
-
}) => {
|
|
1782
|
-
//数据表后缀标识
|
|
1783
|
-
const triggerNodeAppendText = 'a' + faker.string.alphanumeric(4);
|
|
1784
|
-
const manualNodeAppendText = 'b' + dayjs().format('HHmmss').toString();
|
|
1785
|
-
|
|
1786
|
-
// 创建触发器节点数据表
|
|
1787
|
-
const triggerNodeCollectionDisplayName = `自动>组织[普通表]${triggerNodeAppendText}`;
|
|
1788
|
-
const triggerNodeCollectionName = `tt_amt_org${triggerNodeAppendText}`;
|
|
1789
|
-
const triggerNodeFieldName = 'orgname';
|
|
1790
|
-
const triggerNodeFieldDisplayName = '公司名称(单行文本)';
|
|
1791
|
-
await mockCollections(
|
|
1792
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), triggerNodeAppendText)
|
|
1793
|
-
.collections,
|
|
1794
|
-
);
|
|
1795
|
-
// 创建Manual节点数据表
|
|
1796
|
-
const manualNodeCollectionDisplayName = `自动>组织[普通表]${manualNodeAppendText}`;
|
|
1797
|
-
const manualNodeCollectionName = `tt_amt_org${manualNodeAppendText}`;
|
|
1798
|
-
const manualNodeFieldName = 'establishdate';
|
|
1799
|
-
const manualNodeFieldDisplayName = '成立日期(日期)';
|
|
1800
|
-
await mockCollections(
|
|
1801
|
-
appendJsonCollectionName(JSON.parse(JSON.stringify(generalWithNoRelationalFields)), manualNodeAppendText)
|
|
1802
|
-
.collections,
|
|
1803
|
-
);
|
|
1804
|
-
//添加工作流
|
|
1805
|
-
const workFlowName = faker.string.alphanumeric(5) + triggerNodeAppendText;
|
|
1806
|
-
const workflowData = {
|
|
1807
|
-
current: true,
|
|
1808
|
-
options: { deleteExecutionOnStatus: [] },
|
|
1809
|
-
title: workFlowName,
|
|
1810
|
-
type: 'collection',
|
|
1811
|
-
enabled: true,
|
|
1812
|
-
};
|
|
1813
|
-
const workflow = await apiCreateWorkflow(workflowData);
|
|
1814
|
-
const workflowObj = JSON.parse(JSON.stringify(workflow));
|
|
1815
|
-
const workflowId = workflowObj.id;
|
|
1816
|
-
//配置工作流触发器
|
|
1817
|
-
const triggerNodeData = {
|
|
1818
|
-
config: { appends: [], collection: triggerNodeCollectionName, changed: [], condition: { $and: [] }, mode: 1 },
|
|
1819
|
-
};
|
|
1820
|
-
const triggerNode = await apiUpdateWorkflowTrigger(workflowId, triggerNodeData);
|
|
1821
|
-
const triggerNodeObj = JSON.parse(JSON.stringify(triggerNode));
|
|
1822
|
-
//配置Manual节点
|
|
1823
|
-
await page.goto(`admin/workflow/workflows/${workflowId}`);
|
|
1824
|
-
await page.waitForLoadState('networkidle');
|
|
1825
|
-
const collectionTriggerNode = new CollectionTriggerNode(page, workFlowName, triggerNodeCollectionName);
|
|
1826
|
-
await collectionTriggerNode.addNodeButton.click();
|
|
1827
|
-
await page.getByRole('button', { name: 'manual', exact: true }).click();
|
|
1828
|
-
const manualNodeName = 'Manual' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1829
|
-
await page.getByLabel('Manual-Manual', { exact: true }).getByRole('textbox').fill(manualNodeName);
|
|
1830
|
-
const manualNode = new ManualNode(page, manualNodeName);
|
|
1831
|
-
const manualNodeId = await manualNode.node.locator('.workflow-node-id').innerText();
|
|
1832
|
-
await manualNode.nodeConfigure.click();
|
|
1833
|
-
await manualNode.assigneesDropDown.click();
|
|
1834
|
-
await page.getByRole('option', { name: 'Super Admin' }).click();
|
|
1835
|
-
await manualNode.configureUserInterfaceButton.click();
|
|
1836
|
-
await manualNode.addBlockButton.hover();
|
|
1837
|
-
await manualNode.customFormMenu.click();
|
|
1838
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1839
|
-
// 获取自定义表单的随机值
|
|
1840
|
-
const configureFieldsButton = page.locator(
|
|
1841
|
-
'button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-"]',
|
|
1842
|
-
);
|
|
1843
|
-
const ariaLabel = await configureFieldsButton.getAttribute('aria-label');
|
|
1844
|
-
const randomValue = ariaLabel.split('-').pop();
|
|
1845
|
-
|
|
1846
|
-
await page
|
|
1847
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
1848
|
-
.hover();
|
|
1849
|
-
await page.getByLabel(`designer-schema-settings-CardItem-SimpleDesigner-${randomValue}`).hover();
|
|
1850
|
-
await page.getByRole('menuitem', { name: 'Edit block title' }).click();
|
|
1851
|
-
const blockTitle = 'Form' + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1852
|
-
await page.getByLabel('Edit block title').getByRole('textbox').fill(blockTitle);
|
|
1853
|
-
await page.getByRole('button', { name: 'OK', exact: true }).click();
|
|
1854
|
-
await page
|
|
1855
|
-
.locator(`button[aria-label^="schema-initializer-Grid-workflowManual:customForm:configureFields-${randomValue}"]`)
|
|
1856
|
-
.hover();
|
|
1857
|
-
await page.getByRole('menuitem', { name: 'Datetime', exact: true }).click();
|
|
1858
|
-
await page
|
|
1859
|
-
.getByLabel(`block-item-Input-${randomValue}-Field display name`)
|
|
1860
|
-
.getByRole('textbox')
|
|
1861
|
-
.fill(manualNodeFieldDisplayName);
|
|
1862
|
-
await page.getByLabel(`block-item-Input-${randomValue}-Field name`).getByRole('textbox').fill(manualNodeFieldName);
|
|
1863
|
-
await page.getByLabel(`action-Action-Submit-${randomValue}`).click();
|
|
1864
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1865
|
-
await page.mouse.click(300, 0);
|
|
1866
|
-
await manualNode.submitButton.click();
|
|
1867
|
-
await page.waitForLoadState('networkidle');
|
|
1868
|
-
|
|
1869
|
-
// 2、测试步骤:添加数据触发工作流
|
|
1870
|
-
const triggerNodeCollectionRecordOne =
|
|
1871
|
-
triggerNodeFieldDisplayName + dayjs().format('YYYYMMDDHHmmss.SSS').toString();
|
|
1872
|
-
const triggerNodeCollectionRecords = await mockRecords(triggerNodeCollectionName, [
|
|
1873
|
-
{ orgname: triggerNodeCollectionRecordOne },
|
|
1874
|
-
]);
|
|
1875
|
-
await page.waitForTimeout(1000);
|
|
1876
|
-
// 3、预期结果:工作流成功触发,待办弹窗表单中显示数据
|
|
1877
|
-
const getWorkflow = await apiGetWorkflow(workflowId);
|
|
1878
|
-
const getWorkflowObj = JSON.parse(JSON.stringify(getWorkflow));
|
|
1879
|
-
const getWorkflowExecuted = getWorkflowObj.executed;
|
|
1880
|
-
expect(getWorkflowExecuted).toBe(1);
|
|
1881
|
-
|
|
1882
|
-
const newPage = mockPage();
|
|
1883
|
-
await newPage.goto();
|
|
1884
|
-
await page.waitForLoadState('networkidle');
|
|
1885
|
-
await page.getByLabel('schema-initializer-Grid-page:addBlock').hover();
|
|
1886
|
-
await page.getByRole('menuitem', { name: 'check-square Workflow todos' }).click();
|
|
1887
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1888
|
-
await page.waitForTimeout(300);
|
|
1889
|
-
await page
|
|
1890
|
-
.locator(`//td[span[text()="${manualNodeName}"]]`)
|
|
1891
|
-
.locator('xpath=preceding-sibling::td[1]')
|
|
1892
|
-
.locator('text=View')
|
|
1893
|
-
.click();
|
|
1894
|
-
const manualNodeRecord = dayjs().format('YYYY-MM-DD');
|
|
1895
|
-
await page.getByPlaceholder('Select date').click();
|
|
1896
|
-
await page.getByTitle(manualNodeRecord.toString()).click();
|
|
1897
|
-
await page.mouse.move(300, 0, { steps: 100 });
|
|
1898
|
-
await page.mouse.click(300, 0);
|
|
1899
|
-
await page.getByRole('button', { name: 'Cancel', exact: true }).click();
|
|
1900
|
-
await page.getByRole('button', { name: 'Continue the process' }).click();
|
|
1901
|
-
|
|
1902
|
-
await page.waitForTimeout(1000);
|
|
1903
|
-
const getWorkflowNodeExecutions = await apiGetWorkflowNodeExecutions(workflowId);
|
|
1904
|
-
const getWorkflowNodeExecutionsObj = JSON.parse(JSON.stringify(getWorkflowNodeExecutions));
|
|
1905
|
-
getWorkflowNodeExecutionsObj.sort(function (a: { id: number }, b: { id: number }) {
|
|
1906
|
-
return b.id - a.id;
|
|
1907
|
-
});
|
|
1908
|
-
const jobs = getWorkflowNodeExecutionsObj[0].jobs;
|
|
1909
|
-
const manualNodeJob = jobs.find((job) => job.nodeId.toString() === manualNodeId);
|
|
1910
|
-
const manualNodeJobStatus = manualNodeJob.status;
|
|
1911
|
-
expect(manualNodeJobStatus).toBe(1);
|
|
1912
|
-
|
|
1913
|
-
const manualNodeJobResult = manualNodeJob.result;
|
|
1914
|
-
let resultFieldValue = '';
|
|
1915
|
-
for (const key in manualNodeJobResult) {
|
|
1916
|
-
if (Object.prototype.hasOwnProperty.call(manualNodeJobResult[key], 'establishdate')) {
|
|
1917
|
-
resultFieldValue = manualNodeJobResult[key]['establishdate'];
|
|
1918
|
-
break;
|
|
1919
|
-
}
|
|
1920
|
-
}
|
|
1921
|
-
const now = new Date();
|
|
1922
|
-
now.setHours(0, 0, 0, 0);
|
|
1923
|
-
const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
1924
|
-
const timeWithTimeZone = now.toLocaleString('en-US', { timeZone: timeZone });
|
|
1925
|
-
// 转换为0时区的时间
|
|
1926
|
-
const timeInUTC = new Date(timeWithTimeZone).toISOString();
|
|
1927
|
-
|
|
1928
|
-
expect(resultFieldValue).toBe(timeInUTC);
|
|
1929
|
-
|
|
1930
|
-
// 4、后置处理:删除工作流
|
|
1931
|
-
await apiDeleteWorkflow(workflowId);
|
|
1932
|
-
});
|
|
1933
|
-
});
|