@gadmin2n/schematics 0.0.87 → 0.0.89
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/lib/application/files/gadmin2-game-angle-demo/.dockerignore +16 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile.codegen +40 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile.server +76 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile.web +53 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/Jenkinsfile +219 -33
- package/dist/lib/application/files/gadmin2-game-angle-demo/compose-ctl.sh +250 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +4 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/dev/postgres/init.sql +12 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/docker-compose.md +170 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/docker-compose.yml +254 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +8 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/lib/page-helpers.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/prismaModels.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/agenda.seed.ts +39 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/audit.seed.ts +40 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/bootstrap.ts +56 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/canvas.seed.ts +39 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/{scripts/sync-data-mngt-pages.ts → seed/data-mngt.seed.ts} +36 -20
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/game.seed.ts +44 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +30 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permission.seed.ts +130 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-event-trigger.ts +60 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +11 -25
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +108 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.controller.spec.ts +31 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.spec.ts +31 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.service.spec.ts +41 -57
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.spec.ts +31 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.service.spec.ts +309 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.controller.spec.ts +31 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.spec.ts +315 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.spec.ts +31 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.service.spec.ts +312 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.spec.ts +31 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.service.spec.ts +317 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.controller.spec.ts +31 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.spec.ts +309 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.spec.ts +31 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.service.spec.ts +299 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.spec.ts +31 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.service.spec.ts +307 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.spec.ts +31 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.spec.ts +309 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +205 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.ts +116 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.spec.ts +158 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +110 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/webhook-signature.util.spec.ts +79 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/webhook-signature.util.ts +54 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +34 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +457 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +241 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.spec.ts +34 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.spec.ts +24 -30
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.spec.ts +34 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +36 -36
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.controller.spec.ts +34 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.service.spec.ts +48 -24
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/README.md +312 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/TODO.md +152 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/.dockerignore +12 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/Dockerfile +79 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/GRACEFUL-DEPLOYMENT.md +270 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/index.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/reporting.ts +23 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/index.ts +70 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/outbox-poller.ts +246 -90
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/tests/cron-trigger-workflow.test.ts +20 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/workflows/dsl-workflow.ts +96 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/nginx.conf +74 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/ElementInspector.tsx +18 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/promptGenerator.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +3 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +3 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +4 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasEditPage.tsx +9 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +156 -139
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +14 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +62 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/PublishModal.tsx +4 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasApi.ts +18 -27
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +32 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/demos.ts +48 -61
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas-page/index.tsx +3 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +16 -16
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +28 -35
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +34 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +6 -0
- package/package.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile +0 -63
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/sync-resources.ts +0 -100
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +0 -302
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/canvas/canvas.controller.spec.ts +0 -20
- package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/sql/create-event-trigger.sql +0 -87
- /package/dist/lib/application/files/gadmin2-game-angle-demo/{GRACEFUL-DEPLOYMENT.md → server/GRACEFUL-DEPLOYMENT.md} +0 -0
|
@@ -74,13 +74,13 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
74
74
|
const createArgs = {
|
|
75
75
|
data: {
|
|
76
76
|
name: 'test_name',
|
|
77
|
-
description: 'test_description',
|
|
78
77
|
config: {},
|
|
79
|
-
isEnabled: true,
|
|
80
78
|
creator: 'test_creator',
|
|
79
|
+
code: 'test_code',
|
|
80
|
+
description: 'test_description',
|
|
81
81
|
},
|
|
82
|
-
};
|
|
83
|
-
const expectedResult = { id:
|
|
82
|
+
} as any;
|
|
83
|
+
const expectedResult = { id: 1, ...createArgs.data };
|
|
84
84
|
|
|
85
85
|
prisma.workflowNodeInstance.create.mockResolvedValue(expectedResult);
|
|
86
86
|
|
|
@@ -97,12 +97,12 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
97
97
|
const createArgs = {
|
|
98
98
|
data: {
|
|
99
99
|
name: 'test_name',
|
|
100
|
-
description: 'test_description',
|
|
101
100
|
config: {},
|
|
102
|
-
isEnabled: true,
|
|
103
101
|
creator: 'test_creator',
|
|
102
|
+
code: 'test_code',
|
|
103
|
+
description: 'test_description',
|
|
104
104
|
},
|
|
105
|
-
};
|
|
105
|
+
} as any;
|
|
106
106
|
const error = new Error('Database connection failed');
|
|
107
107
|
|
|
108
108
|
prisma.workflowNodeInstance.create.mockRejectedValue(error);
|
|
@@ -118,19 +118,19 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
118
118
|
const data = [
|
|
119
119
|
{
|
|
120
120
|
name: 'test_name',
|
|
121
|
-
description: 'test_description',
|
|
122
121
|
config: {},
|
|
123
|
-
isEnabled: true,
|
|
124
122
|
creator: 'test_creator',
|
|
123
|
+
code: 'test_code',
|
|
124
|
+
description: 'test_description',
|
|
125
125
|
},
|
|
126
126
|
{
|
|
127
127
|
name: 'test_name',
|
|
128
|
-
description: 'test_description',
|
|
129
128
|
config: {},
|
|
130
|
-
isEnabled: true,
|
|
131
129
|
creator: 'test_creator',
|
|
130
|
+
code: 'test_code',
|
|
131
|
+
description: 'test_description',
|
|
132
132
|
},
|
|
133
|
-
];
|
|
133
|
+
] as any;
|
|
134
134
|
const expectedResult = { count: 2 };
|
|
135
135
|
|
|
136
136
|
prisma.workflowNodeInstance.createMany.mockResolvedValue(expectedResult);
|
|
@@ -151,8 +151,8 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
151
151
|
where: {},
|
|
152
152
|
take: 10,
|
|
153
153
|
skip: 0,
|
|
154
|
-
};
|
|
155
|
-
const mockEntities = [{ id:
|
|
154
|
+
} as any;
|
|
155
|
+
const mockEntities = [{ id: 1 }, { id: 2 }];
|
|
156
156
|
|
|
157
157
|
prisma.workflowNodeInstance.count.mockResolvedValue(2);
|
|
158
158
|
prisma.workflowNodeInstance.findMany.mockResolvedValue(mockEntities);
|
|
@@ -172,7 +172,7 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
172
172
|
});
|
|
173
173
|
|
|
174
174
|
it('should return empty result when no records found', async () => {
|
|
175
|
-
const findArgs = { where: {} };
|
|
175
|
+
const findArgs = { where: {} } as any;
|
|
176
176
|
|
|
177
177
|
prisma.workflowNodeInstance.count.mockResolvedValue(0);
|
|
178
178
|
prisma.workflowNodeInstance.findMany.mockResolvedValue([]);
|
|
@@ -185,9 +185,9 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
185
185
|
|
|
186
186
|
describe('findUnique', () => {
|
|
187
187
|
it('should find a single workflowNodeInstance record by id', async () => {
|
|
188
|
-
const id =
|
|
188
|
+
const id = 1;
|
|
189
189
|
const select = { id: true };
|
|
190
|
-
const expectedResult = { id:
|
|
190
|
+
const expectedResult = { id: 1 };
|
|
191
191
|
|
|
192
192
|
prisma.workflowNodeInstance.findUnique.mockResolvedValue(expectedResult);
|
|
193
193
|
|
|
@@ -203,7 +203,7 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
203
203
|
it('should return null when record not found', async () => {
|
|
204
204
|
prisma.workflowNodeInstance.findUnique.mockResolvedValue(null);
|
|
205
205
|
|
|
206
|
-
const result = await service.findUnique(
|
|
206
|
+
const result = await service.findUnique(1, { id: true });
|
|
207
207
|
|
|
208
208
|
expect(result).toBeNull();
|
|
209
209
|
});
|
|
@@ -211,15 +211,15 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
211
211
|
|
|
212
212
|
describe('updateUnique', () => {
|
|
213
213
|
it('should update a single workflowNodeInstance record', async () => {
|
|
214
|
-
const id =
|
|
214
|
+
const id = 1;
|
|
215
215
|
const data = {
|
|
216
216
|
name: 'test_name',
|
|
217
|
-
description: 'test_description',
|
|
218
217
|
config: {},
|
|
219
|
-
isEnabled: true,
|
|
220
218
|
creator: 'test_creator',
|
|
221
|
-
|
|
222
|
-
|
|
219
|
+
code: 'test_code',
|
|
220
|
+
description: 'test_description',
|
|
221
|
+
} as any;
|
|
222
|
+
const expectedResult = { id: 1, ...data };
|
|
223
223
|
|
|
224
224
|
prisma.workflowNodeInstance.update.mockResolvedValue(expectedResult);
|
|
225
225
|
|
|
@@ -239,12 +239,12 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
239
239
|
where: {},
|
|
240
240
|
data: {
|
|
241
241
|
name: 'test_name',
|
|
242
|
-
description: 'test_description',
|
|
243
242
|
config: {},
|
|
244
|
-
isEnabled: true,
|
|
245
243
|
creator: 'test_creator',
|
|
244
|
+
code: 'test_code',
|
|
245
|
+
description: 'test_description',
|
|
246
246
|
},
|
|
247
|
-
};
|
|
247
|
+
} as any;
|
|
248
248
|
const expectedResult = { count: 5 };
|
|
249
249
|
|
|
250
250
|
prisma.workflowNodeInstance.updateMany.mockResolvedValue(expectedResult);
|
|
@@ -260,9 +260,9 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
260
260
|
|
|
261
261
|
describe('deleteUnique', () => {
|
|
262
262
|
it('should delete a single workflowNodeInstance record and return count', async () => {
|
|
263
|
-
const id =
|
|
263
|
+
const id = 1;
|
|
264
264
|
|
|
265
|
-
prisma.workflowNodeInstance.delete.mockResolvedValue({ id:
|
|
265
|
+
prisma.workflowNodeInstance.delete.mockResolvedValue({ id: 1 });
|
|
266
266
|
|
|
267
267
|
const result = await service.deleteUnique(id);
|
|
268
268
|
|
|
@@ -275,7 +275,7 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
275
275
|
|
|
276
276
|
describe('deleteMany', () => {
|
|
277
277
|
it('should delete multiple workflowNodeInstance records', async () => {
|
|
278
|
-
const deleteArgs = { where: {} };
|
|
278
|
+
const deleteArgs = { where: {} } as any;
|
|
279
279
|
const expectedResult = { count: 3 };
|
|
280
280
|
|
|
281
281
|
prisma.workflowNodeInstance.deleteMany.mockResolvedValue(expectedResult);
|
|
@@ -291,7 +291,7 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
291
291
|
|
|
292
292
|
describe('count', () => {
|
|
293
293
|
it('should count workflowNodeInstance records with filter', async () => {
|
|
294
|
-
const countArgs = { where: {} };
|
|
294
|
+
const countArgs = { where: {} } as any;
|
|
295
295
|
|
|
296
296
|
prisma.workflowNodeInstance.count.mockResolvedValue(10);
|
|
297
297
|
|
|
@@ -316,12 +316,12 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
316
316
|
const groupByArgs = {
|
|
317
317
|
by: ['id'],
|
|
318
318
|
_count: { id: true },
|
|
319
|
-
};
|
|
320
|
-
const expectedResult = [{ id:
|
|
319
|
+
} as any;
|
|
320
|
+
const expectedResult = [{ id: 1, _count: { id: 50 } }];
|
|
321
321
|
|
|
322
322
|
prisma.workflowNodeInstance.groupBy.mockResolvedValue(expectedResult);
|
|
323
323
|
|
|
324
|
-
const result = await service.groupBy(groupByArgs
|
|
324
|
+
const result = await service.groupBy(groupByArgs);
|
|
325
325
|
|
|
326
326
|
expect(prisma.workflowNodeInstance.groupBy).toHaveBeenCalledWith(
|
|
327
327
|
groupByArgs,
|
|
@@ -336,11 +336,11 @@ describe('WorkflowNodeInstanceService', () => {
|
|
|
336
336
|
_count: true,
|
|
337
337
|
_max: { id: true },
|
|
338
338
|
_min: { id: true },
|
|
339
|
-
} as
|
|
339
|
+
} as any;
|
|
340
340
|
const expectedResult = {
|
|
341
341
|
_count: 100,
|
|
342
|
-
_max: { id:
|
|
343
|
-
_min: { id:
|
|
342
|
+
_max: { id: 1 },
|
|
343
|
+
_min: { id: 1 },
|
|
344
344
|
};
|
|
345
345
|
|
|
346
346
|
prisma.workflowNodeInstance.aggregate.mockResolvedValue(expectedResult);
|
|
@@ -1,15 +1,47 @@
|
|
|
1
|
+
/// <reference types="jest" />
|
|
2
|
+
import { ConfigService } from '@nestjs/config';
|
|
1
3
|
import { Test, TestingModule } from '@nestjs/testing';
|
|
4
|
+
import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
|
|
2
5
|
import { WorkflowNodeTypeController } from './workflowNodeType.controller';
|
|
3
6
|
import { WorkflowNodeTypeService } from './workflowNodeType.service';
|
|
4
7
|
|
|
8
|
+
// Mock WorkflowNodeTypeService:用空对象屏蔽真实 Service 的依赖(PrismaService 等),
|
|
9
|
+
// 避免 NestJS 在测试模块编译时去解析 Service 的构造参数。
|
|
10
|
+
const mockWorkflowNodeTypeService = {};
|
|
11
|
+
|
|
12
|
+
// Mock ConfigService
|
|
13
|
+
const mockConfigService = {
|
|
14
|
+
get: jest.fn(),
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
// Mock Logger
|
|
18
|
+
const mockLogger = {
|
|
19
|
+
child: jest.fn().mockReturnThis(),
|
|
20
|
+
info: jest.fn(),
|
|
21
|
+
error: jest.fn(),
|
|
22
|
+
warn: jest.fn(),
|
|
23
|
+
debug: jest.fn(),
|
|
24
|
+
};
|
|
25
|
+
|
|
5
26
|
describe('WorkflowNodeTypeController', () => {
|
|
6
27
|
let controller: WorkflowNodeTypeController;
|
|
7
28
|
|
|
8
29
|
beforeEach(async () => {
|
|
9
30
|
const module: TestingModule = await Test.createTestingModule({
|
|
10
31
|
controllers: [WorkflowNodeTypeController],
|
|
11
|
-
providers: [
|
|
12
|
-
|
|
32
|
+
providers: [
|
|
33
|
+
{
|
|
34
|
+
provide: WorkflowNodeTypeService,
|
|
35
|
+
useValue: mockWorkflowNodeTypeService,
|
|
36
|
+
},
|
|
37
|
+
{ provide: ConfigService, useValue: mockConfigService },
|
|
38
|
+
{ provide: WINSTON_MODULE_PROVIDER, useValue: mockLogger },
|
|
39
|
+
],
|
|
40
|
+
})
|
|
41
|
+
// 兜底:自动 mock 任何未显式提供的依赖
|
|
42
|
+
// (例如 ACGuard 内部的 __roles_builder__ token)
|
|
43
|
+
.useMocker(() => ({}))
|
|
44
|
+
.compile();
|
|
13
45
|
|
|
14
46
|
controller = module.get<WorkflowNodeTypeController>(
|
|
15
47
|
WorkflowNodeTypeController,
|
|
@@ -75,10 +75,14 @@ describe('WorkflowNodeTypeService', () => {
|
|
|
75
75
|
category: 'ENUM_VALUE',
|
|
76
76
|
label: 'test_label',
|
|
77
77
|
icon: 'test_icon',
|
|
78
|
+
configSchema: {},
|
|
79
|
+
inputSchema: {},
|
|
80
|
+
outputSchema: {},
|
|
78
81
|
description: 'test_description',
|
|
82
|
+
isBuiltin: true,
|
|
79
83
|
},
|
|
80
|
-
};
|
|
81
|
-
const expectedResult = { id:
|
|
84
|
+
} as any;
|
|
85
|
+
const expectedResult = { id: 1, ...createArgs.data };
|
|
82
86
|
|
|
83
87
|
prisma.workflowNodeType.create.mockResolvedValue(expectedResult);
|
|
84
88
|
|
|
@@ -96,9 +100,13 @@ describe('WorkflowNodeTypeService', () => {
|
|
|
96
100
|
category: 'ENUM_VALUE',
|
|
97
101
|
label: 'test_label',
|
|
98
102
|
icon: 'test_icon',
|
|
103
|
+
configSchema: {},
|
|
104
|
+
inputSchema: {},
|
|
105
|
+
outputSchema: {},
|
|
99
106
|
description: 'test_description',
|
|
107
|
+
isBuiltin: true,
|
|
100
108
|
},
|
|
101
|
-
};
|
|
109
|
+
} as any;
|
|
102
110
|
const error = new Error('Database connection failed');
|
|
103
111
|
|
|
104
112
|
prisma.workflowNodeType.create.mockRejectedValue(error);
|
|
@@ -117,16 +125,24 @@ describe('WorkflowNodeTypeService', () => {
|
|
|
117
125
|
category: 'ENUM_VALUE',
|
|
118
126
|
label: 'test_label',
|
|
119
127
|
icon: 'test_icon',
|
|
128
|
+
configSchema: {},
|
|
129
|
+
inputSchema: {},
|
|
130
|
+
outputSchema: {},
|
|
120
131
|
description: 'test_description',
|
|
132
|
+
isBuiltin: true,
|
|
121
133
|
},
|
|
122
134
|
{
|
|
123
135
|
type: 'test_type',
|
|
124
136
|
category: 'ENUM_VALUE',
|
|
125
137
|
label: 'test_label',
|
|
126
138
|
icon: 'test_icon',
|
|
139
|
+
configSchema: {},
|
|
140
|
+
inputSchema: {},
|
|
141
|
+
outputSchema: {},
|
|
127
142
|
description: 'test_description',
|
|
143
|
+
isBuiltin: true,
|
|
128
144
|
},
|
|
129
|
-
];
|
|
145
|
+
] as any;
|
|
130
146
|
const expectedResult = { count: 2 };
|
|
131
147
|
|
|
132
148
|
prisma.workflowNodeType.createMany.mockResolvedValue(expectedResult);
|
|
@@ -147,8 +163,8 @@ describe('WorkflowNodeTypeService', () => {
|
|
|
147
163
|
where: {},
|
|
148
164
|
take: 10,
|
|
149
165
|
skip: 0,
|
|
150
|
-
};
|
|
151
|
-
const mockEntities = [{ id:
|
|
166
|
+
} as any;
|
|
167
|
+
const mockEntities = [{ id: 1 }, { id: 2 }];
|
|
152
168
|
|
|
153
169
|
prisma.workflowNodeType.count.mockResolvedValue(2);
|
|
154
170
|
prisma.workflowNodeType.findMany.mockResolvedValue(mockEntities);
|
|
@@ -166,7 +182,7 @@ describe('WorkflowNodeTypeService', () => {
|
|
|
166
182
|
});
|
|
167
183
|
|
|
168
184
|
it('should return empty result when no records found', async () => {
|
|
169
|
-
const findArgs = { where: {} };
|
|
185
|
+
const findArgs = { where: {} } as any;
|
|
170
186
|
|
|
171
187
|
prisma.workflowNodeType.count.mockResolvedValue(0);
|
|
172
188
|
prisma.workflowNodeType.findMany.mockResolvedValue([]);
|
|
@@ -179,9 +195,9 @@ describe('WorkflowNodeTypeService', () => {
|
|
|
179
195
|
|
|
180
196
|
describe('findUnique', () => {
|
|
181
197
|
it('should find a single workflowNodeType record by id', async () => {
|
|
182
|
-
const id =
|
|
198
|
+
const id = 1;
|
|
183
199
|
const select = { id: true };
|
|
184
|
-
const expectedResult = { id:
|
|
200
|
+
const expectedResult = { id: 1 };
|
|
185
201
|
|
|
186
202
|
prisma.workflowNodeType.findUnique.mockResolvedValue(expectedResult);
|
|
187
203
|
|
|
@@ -197,7 +213,7 @@ describe('WorkflowNodeTypeService', () => {
|
|
|
197
213
|
it('should return null when record not found', async () => {
|
|
198
214
|
prisma.workflowNodeType.findUnique.mockResolvedValue(null);
|
|
199
215
|
|
|
200
|
-
const result = await service.findUnique(
|
|
216
|
+
const result = await service.findUnique(1, { id: true });
|
|
201
217
|
|
|
202
218
|
expect(result).toBeNull();
|
|
203
219
|
});
|
|
@@ -205,15 +221,19 @@ describe('WorkflowNodeTypeService', () => {
|
|
|
205
221
|
|
|
206
222
|
describe('updateUnique', () => {
|
|
207
223
|
it('should update a single workflowNodeType record', async () => {
|
|
208
|
-
const id =
|
|
224
|
+
const id = 1;
|
|
209
225
|
const data = {
|
|
210
226
|
type: 'test_type',
|
|
211
227
|
category: 'ENUM_VALUE',
|
|
212
228
|
label: 'test_label',
|
|
213
229
|
icon: 'test_icon',
|
|
230
|
+
configSchema: {},
|
|
231
|
+
inputSchema: {},
|
|
232
|
+
outputSchema: {},
|
|
214
233
|
description: 'test_description',
|
|
215
|
-
|
|
216
|
-
|
|
234
|
+
isBuiltin: true,
|
|
235
|
+
} as any;
|
|
236
|
+
const expectedResult = { id: 1, ...data };
|
|
217
237
|
|
|
218
238
|
prisma.workflowNodeType.update.mockResolvedValue(expectedResult);
|
|
219
239
|
|
|
@@ -236,9 +256,13 @@ describe('WorkflowNodeTypeService', () => {
|
|
|
236
256
|
category: 'ENUM_VALUE',
|
|
237
257
|
label: 'test_label',
|
|
238
258
|
icon: 'test_icon',
|
|
259
|
+
configSchema: {},
|
|
260
|
+
inputSchema: {},
|
|
261
|
+
outputSchema: {},
|
|
239
262
|
description: 'test_description',
|
|
263
|
+
isBuiltin: true,
|
|
240
264
|
},
|
|
241
|
-
};
|
|
265
|
+
} as any;
|
|
242
266
|
const expectedResult = { count: 5 };
|
|
243
267
|
|
|
244
268
|
prisma.workflowNodeType.updateMany.mockResolvedValue(expectedResult);
|
|
@@ -254,9 +278,9 @@ describe('WorkflowNodeTypeService', () => {
|
|
|
254
278
|
|
|
255
279
|
describe('deleteUnique', () => {
|
|
256
280
|
it('should delete a single workflowNodeType record and return count', async () => {
|
|
257
|
-
const id =
|
|
281
|
+
const id = 1;
|
|
258
282
|
|
|
259
|
-
prisma.workflowNodeType.delete.mockResolvedValue({ id:
|
|
283
|
+
prisma.workflowNodeType.delete.mockResolvedValue({ id: 1 });
|
|
260
284
|
|
|
261
285
|
const result = await service.deleteUnique(id);
|
|
262
286
|
|
|
@@ -269,7 +293,7 @@ describe('WorkflowNodeTypeService', () => {
|
|
|
269
293
|
|
|
270
294
|
describe('deleteMany', () => {
|
|
271
295
|
it('should delete multiple workflowNodeType records', async () => {
|
|
272
|
-
const deleteArgs = { where: {} };
|
|
296
|
+
const deleteArgs = { where: {} } as any;
|
|
273
297
|
const expectedResult = { count: 3 };
|
|
274
298
|
|
|
275
299
|
prisma.workflowNodeType.deleteMany.mockResolvedValue(expectedResult);
|
|
@@ -285,7 +309,7 @@ describe('WorkflowNodeTypeService', () => {
|
|
|
285
309
|
|
|
286
310
|
describe('count', () => {
|
|
287
311
|
it('should count workflowNodeType records with filter', async () => {
|
|
288
|
-
const countArgs = { where: {} };
|
|
312
|
+
const countArgs = { where: {} } as any;
|
|
289
313
|
|
|
290
314
|
prisma.workflowNodeType.count.mockResolvedValue(10);
|
|
291
315
|
|
|
@@ -310,12 +334,12 @@ describe('WorkflowNodeTypeService', () => {
|
|
|
310
334
|
const groupByArgs = {
|
|
311
335
|
by: ['id'],
|
|
312
336
|
_count: { id: true },
|
|
313
|
-
};
|
|
314
|
-
const expectedResult = [{ id:
|
|
337
|
+
} as any;
|
|
338
|
+
const expectedResult = [{ id: 1, _count: { id: 50 } }];
|
|
315
339
|
|
|
316
340
|
prisma.workflowNodeType.groupBy.mockResolvedValue(expectedResult);
|
|
317
341
|
|
|
318
|
-
const result = await service.groupBy(groupByArgs
|
|
342
|
+
const result = await service.groupBy(groupByArgs);
|
|
319
343
|
|
|
320
344
|
expect(prisma.workflowNodeType.groupBy).toHaveBeenCalledWith(groupByArgs);
|
|
321
345
|
expect(result).toEqual(expectedResult);
|
|
@@ -328,11 +352,11 @@ describe('WorkflowNodeTypeService', () => {
|
|
|
328
352
|
_count: true,
|
|
329
353
|
_max: { id: true },
|
|
330
354
|
_min: { id: true },
|
|
331
|
-
} as
|
|
355
|
+
} as any;
|
|
332
356
|
const expectedResult = {
|
|
333
357
|
_count: 100,
|
|
334
|
-
_max: { id:
|
|
335
|
-
_min: { id:
|
|
358
|
+
_max: { id: 1 },
|
|
359
|
+
_min: { id: 1 },
|
|
336
360
|
};
|
|
337
361
|
|
|
338
362
|
prisma.workflowNodeType.aggregate.mockResolvedValue(expectedResult);
|