@flusys/nestjs-task-manager 7.1.0 → 8.0.0-beta.1
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/config/index.d.ts +3 -3
- package/controllers/index.d.ts +5 -5
- package/controllers/task-board.controller.d.ts +3 -3
- package/controllers/task-comment.controller.d.ts +2 -2
- package/controllers/task-label.controller.d.ts +2 -2
- package/controllers/task-list.controller.d.ts +3 -3
- package/controllers/task.controller.d.ts +4 -4
- package/docs/index.d.ts +1 -1
- package/docs/task-manager-swagger.config.d.ts +1 -1
- package/dtos/index.d.ts +5 -5
- package/dtos/task-board.dto.d.ts +1 -1
- package/dtos/task.dto.d.ts +2 -2
- package/entities/index.d.ts +19 -19
- package/entities/task-board-with-company.entity.d.ts +1 -1
- package/fesm/234.js +1393 -0
- package/fesm/431.js +981 -0
- package/fesm/827.js +1054 -0
- package/fesm/988.js +881 -0
- package/fesm/config/index.js +156 -3
- package/fesm/controllers/index.js +21 -5
- package/fesm/docs/index.js +58 -1
- package/fesm/dtos/index.js +280 -5
- package/fesm/entities/index.js +26 -46
- package/fesm/gateways/index.js +288 -1
- package/fesm/index.js +440 -9
- package/fesm/interfaces/index.js +16 -2
- package/fesm/modules/index.js +210 -1
- package/fesm/runtime.js +85 -0
- package/fesm/services/index.js +53 -8
- package/gateways/index.d.ts +1 -1
- package/gateways/task-board.gateway.d.ts +3 -3
- package/index.d.ts +9 -9
- package/interfaces/index.d.ts +2 -2
- package/interfaces/task-manager-module.interface.d.ts +3 -3
- package/interfaces/task.interface.d.ts +2 -2
- package/modules/index.d.ts +1 -1
- package/modules/task-manager.module.d.ts +2 -2
- package/package.json +26 -36
- package/services/index.d.ts +8 -8
- package/services/task-activity.service.d.ts +1 -1
- package/services/task-board.service.d.ts +5 -5
- package/services/task-comment.service.d.ts +4 -4
- package/services/task-label.service.d.ts +4 -4
- package/services/task-list.service.d.ts +4 -4
- package/services/task-manager-config.service.d.ts +3 -3
- package/services/task-manager-datasource.provider.d.ts +3 -3
- package/services/task.service.d.ts +7 -7
- package/cjs/config/event-actions.js +0 -37
- package/cjs/config/index.js +0 -20
- package/cjs/config/message-keys.js +0 -92
- package/cjs/config/task-manager.constants.js +0 -11
- package/cjs/controllers/index.js +0 -22
- package/cjs/controllers/task-board.controller.js +0 -219
- package/cjs/controllers/task-board.controller.spec.js +0 -132
- package/cjs/controllers/task-comment.controller.js +0 -103
- package/cjs/controllers/task-comment.controller.spec.js +0 -86
- package/cjs/controllers/task-label.controller.js +0 -112
- package/cjs/controllers/task-label.controller.spec.js +0 -88
- package/cjs/controllers/task-list.controller.js +0 -158
- package/cjs/controllers/task-list.controller.spec.js +0 -112
- package/cjs/controllers/task.controller.js +0 -199
- package/cjs/controllers/task.controller.spec.js +0 -131
- package/cjs/docs/index.js +0 -18
- package/cjs/docs/task-manager-swagger.config.js +0 -43
- package/cjs/docs/task-manager-swagger.config.spec.js +0 -28
- package/cjs/dtos/index.js +0 -22
- package/cjs/dtos/task-board.dto.js +0 -310
- package/cjs/dtos/task-comment.dto.js +0 -131
- package/cjs/dtos/task-label.dto.js +0 -120
- package/cjs/dtos/task-list.dto.js +0 -198
- package/cjs/dtos/task.dto.js +0 -367
- package/cjs/entities/index.js +0 -72
- package/cjs/entities/index.spec.js +0 -30
- package/cjs/entities/task-activity.entity.js +0 -98
- package/cjs/entities/task-assignee.entity.js +0 -67
- package/cjs/entities/task-board-member.entity.js +0 -94
- package/cjs/entities/task-board-with-company.entity.js +0 -57
- package/cjs/entities/task-board.entity.js +0 -88
- package/cjs/entities/task-comment.entity.js +0 -80
- package/cjs/entities/task-label.entity.js +0 -72
- package/cjs/entities/task-list.entity.js +0 -104
- package/cjs/entities/task-task-label.entity.js +0 -67
- package/cjs/entities/task.entity.js +0 -151
- package/cjs/gateways/index.js +0 -18
- package/cjs/gateways/task-board.gateway.js +0 -167
- package/cjs/gateways/task-board.gateway.spec.js +0 -243
- package/cjs/index.js +0 -26
- package/cjs/interfaces/index.js +0 -19
- package/cjs/interfaces/task-manager-module.interface.js +0 -4
- package/cjs/interfaces/task.interface.js +0 -4
- package/cjs/modules/index.js +0 -18
- package/cjs/modules/task-manager.module.js +0 -135
- package/cjs/modules/task-manager.module.spec.js +0 -144
- package/cjs/services/index.js +0 -25
- package/cjs/services/task-activity.service.js +0 -76
- package/cjs/services/task-activity.service.spec.js +0 -125
- package/cjs/services/task-board.service.js +0 -247
- package/cjs/services/task-board.service.spec.js +0 -465
- package/cjs/services/task-comment.service.js +0 -103
- package/cjs/services/task-comment.service.spec.js +0 -160
- package/cjs/services/task-label.service.js +0 -97
- package/cjs/services/task-label.service.spec.js +0 -138
- package/cjs/services/task-list.service.js +0 -130
- package/cjs/services/task-list.service.spec.js +0 -284
- package/cjs/services/task-manager-config.service.js +0 -69
- package/cjs/services/task-manager-config.service.spec.js +0 -98
- package/cjs/services/task-manager-datasource.provider.js +0 -84
- package/cjs/services/task-manager-datasource.provider.spec.js +0 -131
- package/cjs/services/task.service.js +0 -398
- package/cjs/services/task.service.spec.js +0 -700
- package/fesm/config/event-actions.js +0 -16
- package/fesm/config/message-keys.js +0 -65
- package/fesm/config/task-manager.constants.js +0 -1
- package/fesm/controllers/task-board.controller.js +0 -209
- package/fesm/controllers/task-board.controller.spec.js +0 -128
- package/fesm/controllers/task-comment.controller.js +0 -93
- package/fesm/controllers/task-comment.controller.spec.js +0 -82
- package/fesm/controllers/task-label.controller.js +0 -102
- package/fesm/controllers/task-label.controller.spec.js +0 -84
- package/fesm/controllers/task-list.controller.js +0 -148
- package/fesm/controllers/task-list.controller.spec.js +0 -108
- package/fesm/controllers/task.controller.js +0 -189
- package/fesm/controllers/task.controller.spec.js +0 -127
- package/fesm/docs/task-manager-swagger.config.js +0 -33
- package/fesm/docs/task-manager-swagger.config.spec.js +0 -24
- package/fesm/dtos/task-board.dto.js +0 -277
- package/fesm/dtos/task-comment.dto.js +0 -110
- package/fesm/dtos/task-label.dto.js +0 -99
- package/fesm/dtos/task-list.dto.js +0 -174
- package/fesm/dtos/task.dto.js +0 -337
- package/fesm/entities/index.spec.js +0 -26
- package/fesm/entities/task-activity.entity.js +0 -88
- package/fesm/entities/task-assignee.entity.js +0 -57
- package/fesm/entities/task-board-member.entity.js +0 -76
- package/fesm/entities/task-board-with-company.entity.js +0 -47
- package/fesm/entities/task-board.entity.js +0 -78
- package/fesm/entities/task-comment.entity.js +0 -70
- package/fesm/entities/task-label.entity.js +0 -62
- package/fesm/entities/task-list.entity.js +0 -94
- package/fesm/entities/task-task-label.entity.js +0 -57
- package/fesm/entities/task.entity.js +0 -133
- package/fesm/gateways/task-board.gateway.js +0 -157
- package/fesm/gateways/task-board.gateway.spec.js +0 -239
- package/fesm/interfaces/task-manager-module.interface.js +0 -1
- package/fesm/interfaces/task.interface.js +0 -1
- package/fesm/modules/task-manager.module.js +0 -125
- package/fesm/modules/task-manager.module.spec.js +0 -140
- package/fesm/services/task-activity.service.js +0 -66
- package/fesm/services/task-activity.service.spec.js +0 -121
- package/fesm/services/task-board.service.js +0 -237
- package/fesm/services/task-board.service.spec.js +0 -461
- package/fesm/services/task-comment.service.js +0 -93
- package/fesm/services/task-comment.service.spec.js +0 -156
- package/fesm/services/task-label.service.js +0 -87
- package/fesm/services/task-label.service.spec.js +0 -134
- package/fesm/services/task-list.service.js +0 -120
- package/fesm/services/task-list.service.spec.js +0 -280
- package/fesm/services/task-manager-config.service.js +0 -59
- package/fesm/services/task-manager-config.service.spec.js +0 -94
- package/fesm/services/task-manager-datasource.provider.js +0 -74
- package/fesm/services/task-manager-datasource.provider.spec.js +0 -127
- package/fesm/services/task.service.js +0 -388
- package/fesm/services/task.service.spec.js +0 -696
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
const _testing = require("@nestjs/testing");
|
|
6
|
-
const _classes = require("@flusys/nestjs-shared/classes");
|
|
7
|
-
const _modules = require("@flusys/nestjs-shared/modules");
|
|
8
|
-
const _repositorymock = require("@test-utils/mocks/repository.mock");
|
|
9
|
-
const _loggedusermock = require("@test-utils/mocks/logged-user.mock");
|
|
10
|
-
const _tasklistservice = require("./task-list.service");
|
|
11
|
-
const _taskmanagerdatasourceprovider = require("./task-manager-datasource.provider");
|
|
12
|
-
function buildTaskList(overrides = {}) {
|
|
13
|
-
return {
|
|
14
|
-
id: 'list-uuid-1',
|
|
15
|
-
boardId: 'board-uuid-1',
|
|
16
|
-
name: 'To Do',
|
|
17
|
-
color: '#6B7280',
|
|
18
|
-
position: 0,
|
|
19
|
-
isActive: true,
|
|
20
|
-
isDoneList: false,
|
|
21
|
-
createdAt: new Date(),
|
|
22
|
-
updatedAt: new Date(),
|
|
23
|
-
deletedAt: null,
|
|
24
|
-
createdById: null,
|
|
25
|
-
updatedById: null,
|
|
26
|
-
deletedById: null,
|
|
27
|
-
...overrides
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
function mockQueryRunner(repo) {
|
|
31
|
-
const qr = {
|
|
32
|
-
connect: jest.fn().mockResolvedValue(undefined),
|
|
33
|
-
startTransaction: jest.fn().mockResolvedValue(undefined),
|
|
34
|
-
commitTransaction: jest.fn().mockResolvedValue(undefined),
|
|
35
|
-
rollbackTransaction: jest.fn().mockResolvedValue(undefined),
|
|
36
|
-
release: jest.fn().mockResolvedValue(undefined),
|
|
37
|
-
manager: {
|
|
38
|
-
save: jest.fn((_target, entities)=>Promise.resolve(entities))
|
|
39
|
-
}
|
|
40
|
-
};
|
|
41
|
-
repo.manager.connection.createQueryRunner.mockReturnValue(qr);
|
|
42
|
-
return qr;
|
|
43
|
-
}
|
|
44
|
-
describe('TaskListService', ()=>{
|
|
45
|
-
const mockUtilsService = {
|
|
46
|
-
clearCache: jest.fn(),
|
|
47
|
-
getCacheKey: jest.fn().mockReturnValue('cache-key'),
|
|
48
|
-
trackCacheKey: jest.fn()
|
|
49
|
-
};
|
|
50
|
-
// Call history is shared across tests in this file; reset it so each cache assertion is exact.
|
|
51
|
-
beforeEach(()=>{
|
|
52
|
-
mockUtilsService.clearCache.mockClear();
|
|
53
|
-
});
|
|
54
|
-
let service;
|
|
55
|
-
let mockRepo;
|
|
56
|
-
beforeEach(async ()=>{
|
|
57
|
-
mockRepo = (0, _repositorymock.createMockRepository)();
|
|
58
|
-
const mockDataSourceProvider = (0, _repositorymock.createMockDataSourceProvider)(mockRepo);
|
|
59
|
-
const module = await _testing.Test.createTestingModule({
|
|
60
|
-
providers: [
|
|
61
|
-
_tasklistservice.TaskListService,
|
|
62
|
-
{
|
|
63
|
-
provide: 'CACHE_INSTANCE',
|
|
64
|
-
useValue: {}
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
provide: _modules.UtilsService,
|
|
68
|
-
useValue: mockUtilsService
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
provide: _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider,
|
|
72
|
-
useValue: mockDataSourceProvider
|
|
73
|
-
}
|
|
74
|
-
]
|
|
75
|
-
}).compile();
|
|
76
|
-
service = await module.resolve(_tasklistservice.TaskListService);
|
|
77
|
-
});
|
|
78
|
-
describe('convertSingleDtoToEntity (via insert)', ()=>{
|
|
79
|
-
it('creates a list applying default color, position and flags', async ()=>{
|
|
80
|
-
mockQueryRunner(mockRepo);
|
|
81
|
-
const result = await service.insert({
|
|
82
|
-
boardId: 'board-1',
|
|
83
|
-
name: 'Backlog'
|
|
84
|
-
}, (0, _loggedusermock.buildMockUser)());
|
|
85
|
-
expect(result).toEqual(expect.objectContaining({
|
|
86
|
-
boardId: 'board-1',
|
|
87
|
-
name: 'Backlog',
|
|
88
|
-
color: '#6B7280',
|
|
89
|
-
position: 0,
|
|
90
|
-
isDoneList: false,
|
|
91
|
-
isActive: true
|
|
92
|
-
}));
|
|
93
|
-
});
|
|
94
|
-
it('respects explicit color, position and isDoneList on create', async ()=>{
|
|
95
|
-
mockQueryRunner(mockRepo);
|
|
96
|
-
const result = await service.insert({
|
|
97
|
-
boardId: 'board-1',
|
|
98
|
-
name: 'Done',
|
|
99
|
-
color: '#22C55E',
|
|
100
|
-
position: 3,
|
|
101
|
-
isDoneList: true
|
|
102
|
-
}, (0, _loggedusermock.buildMockUser)());
|
|
103
|
-
expect(result).toEqual(expect.objectContaining({
|
|
104
|
-
color: '#22C55E',
|
|
105
|
-
position: 3,
|
|
106
|
-
isDoneList: true
|
|
107
|
-
}));
|
|
108
|
-
});
|
|
109
|
-
it('throws NotFoundException on update when the list does not exist', async ()=>{
|
|
110
|
-
mockQueryRunner(mockRepo);
|
|
111
|
-
mockRepo.findOne.mockResolvedValue(null);
|
|
112
|
-
await expect(service.update({
|
|
113
|
-
id: 'missing-id',
|
|
114
|
-
name: 'Renamed'
|
|
115
|
-
}, (0, _loggedusermock.buildMockUser)())).rejects.toThrow();
|
|
116
|
-
});
|
|
117
|
-
it('merges update fields onto the existing entity, preserving unspecified fields', async ()=>{
|
|
118
|
-
mockQueryRunner(mockRepo);
|
|
119
|
-
const existing = buildTaskList({
|
|
120
|
-
id: 'list-1',
|
|
121
|
-
name: 'Old Name',
|
|
122
|
-
color: '#111111',
|
|
123
|
-
position: 5
|
|
124
|
-
});
|
|
125
|
-
mockRepo.findOne.mockResolvedValue(existing);
|
|
126
|
-
const result = await service.update({
|
|
127
|
-
id: 'list-1',
|
|
128
|
-
name: 'New Name'
|
|
129
|
-
}, (0, _loggedusermock.buildMockUser)());
|
|
130
|
-
expect(result).toEqual(expect.objectContaining({
|
|
131
|
-
id: 'list-1',
|
|
132
|
-
name: 'New Name',
|
|
133
|
-
color: '#111111',
|
|
134
|
-
position: 5
|
|
135
|
-
}));
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
describe('getFilterQuery', ()=>{
|
|
139
|
-
it('filters by boardId, filters by isActive and always orders by position ascending', async ()=>{
|
|
140
|
-
const qb = (0, _repositorymock.createMockQueryBuilder)();
|
|
141
|
-
const { query, isRaw } = await service.getFilterQuery(qb, {
|
|
142
|
-
boardId: 'board-1',
|
|
143
|
-
isActive: true
|
|
144
|
-
}, (0, _loggedusermock.buildMockUser)());
|
|
145
|
-
expect(qb.andWhere).toHaveBeenCalledWith('task_list.boardId = :boardId', {
|
|
146
|
-
boardId: 'board-1'
|
|
147
|
-
});
|
|
148
|
-
expect(qb.andWhere).toHaveBeenCalledWith('task_list.isActive = :isActive', {
|
|
149
|
-
isActive: true
|
|
150
|
-
});
|
|
151
|
-
expect(qb.orderBy).toHaveBeenCalledWith('task_list.position', 'ASC');
|
|
152
|
-
expect(isRaw).toBe(false);
|
|
153
|
-
expect(query).toBe(qb);
|
|
154
|
-
});
|
|
155
|
-
it('ignores a non-boolean isActive filter value', async ()=>{
|
|
156
|
-
const qb = (0, _repositorymock.createMockQueryBuilder)();
|
|
157
|
-
await service.getFilterQuery(qb, {
|
|
158
|
-
isActive: 'not-a-boolean'
|
|
159
|
-
}, (0, _loggedusermock.buildMockUser)());
|
|
160
|
-
expect(qb.andWhere).not.toHaveBeenCalledWith(expect.stringContaining('isActive'), expect.anything());
|
|
161
|
-
});
|
|
162
|
-
it('orders by position even without any filters supplied', async ()=>{
|
|
163
|
-
const qb = (0, _repositorymock.createMockQueryBuilder)();
|
|
164
|
-
await service.getFilterQuery(qb, {}, (0, _loggedusermock.buildMockUser)());
|
|
165
|
-
expect(qb.orderBy).toHaveBeenCalledWith('task_list.position', 'ASC');
|
|
166
|
-
});
|
|
167
|
-
});
|
|
168
|
-
describe('reorderLists', ()=>{
|
|
169
|
-
it('assigns positions in steps of 100 following the given order', async ()=>{
|
|
170
|
-
await service.reorderLists({
|
|
171
|
-
boardId: 'board-1',
|
|
172
|
-
orderedIds: [
|
|
173
|
-
'list-a',
|
|
174
|
-
'list-b',
|
|
175
|
-
'list-c'
|
|
176
|
-
]
|
|
177
|
-
});
|
|
178
|
-
expect(mockRepo.update).toHaveBeenNthCalledWith(1, {
|
|
179
|
-
id: 'list-a',
|
|
180
|
-
boardId: 'board-1'
|
|
181
|
-
}, {
|
|
182
|
-
position: 0
|
|
183
|
-
});
|
|
184
|
-
expect(mockRepo.update).toHaveBeenNthCalledWith(2, {
|
|
185
|
-
id: 'list-b',
|
|
186
|
-
boardId: 'board-1'
|
|
187
|
-
}, {
|
|
188
|
-
position: 100
|
|
189
|
-
});
|
|
190
|
-
expect(mockRepo.update).toHaveBeenNthCalledWith(3, {
|
|
191
|
-
id: 'list-c',
|
|
192
|
-
boardId: 'board-1'
|
|
193
|
-
}, {
|
|
194
|
-
position: 200
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
it('invalidates the list cache, each reordered entry, and the parent board cache', async ()=>{
|
|
198
|
-
await service.reorderLists({
|
|
199
|
-
boardId: 'board-1',
|
|
200
|
-
orderedIds: [
|
|
201
|
-
'list-a',
|
|
202
|
-
'list-b'
|
|
203
|
-
]
|
|
204
|
-
});
|
|
205
|
-
expect(mockUtilsService.clearCache).toHaveBeenCalledWith('task_list', expect.anything());
|
|
206
|
-
expect(mockUtilsService.clearCache).toHaveBeenCalledWith('task_list', expect.anything(), 'list-a');
|
|
207
|
-
expect(mockUtilsService.clearCache).toHaveBeenCalledWith('task_list', expect.anything(), 'list-b');
|
|
208
|
-
expect(mockUtilsService.clearCache).toHaveBeenCalledWith('task_board', expect.anything());
|
|
209
|
-
});
|
|
210
|
-
it('handles reordering a single-item list (position 0)', async ()=>{
|
|
211
|
-
await service.reorderLists({
|
|
212
|
-
boardId: 'board-1',
|
|
213
|
-
orderedIds: [
|
|
214
|
-
'only-list'
|
|
215
|
-
]
|
|
216
|
-
});
|
|
217
|
-
expect(mockRepo.update).toHaveBeenCalledWith({
|
|
218
|
-
id: 'only-list',
|
|
219
|
-
boardId: 'board-1'
|
|
220
|
-
}, {
|
|
221
|
-
position: 0
|
|
222
|
-
});
|
|
223
|
-
expect(mockRepo.update).toHaveBeenCalledTimes(1);
|
|
224
|
-
});
|
|
225
|
-
it('does nothing (no updates) for an empty ordered list', async ()=>{
|
|
226
|
-
await service.reorderLists({
|
|
227
|
-
boardId: 'board-1',
|
|
228
|
-
orderedIds: []
|
|
229
|
-
});
|
|
230
|
-
expect(mockRepo.update).not.toHaveBeenCalled();
|
|
231
|
-
});
|
|
232
|
-
});
|
|
233
|
-
describe('domain events', ()=>{
|
|
234
|
-
let publish;
|
|
235
|
-
beforeEach(()=>{
|
|
236
|
-
publish = jest.fn().mockResolvedValue(undefined);
|
|
237
|
-
_classes.EventBusRegistry.reset();
|
|
238
|
-
_classes.EventBusRegistry.setBus({
|
|
239
|
-
publish,
|
|
240
|
-
subscribe: jest.fn(),
|
|
241
|
-
close: jest.fn()
|
|
242
|
-
});
|
|
243
|
-
_classes.EventBusRegistry.configureModule('task-manager', {
|
|
244
|
-
enabled: true
|
|
245
|
-
});
|
|
246
|
-
});
|
|
247
|
-
afterEach(()=>{
|
|
248
|
-
_classes.EventBusRegistry.reset();
|
|
249
|
-
});
|
|
250
|
-
it('publishes task-manager.task_list.reordered with every list id', async ()=>{
|
|
251
|
-
await service.reorderLists({
|
|
252
|
-
boardId: 'board-1',
|
|
253
|
-
orderedIds: [
|
|
254
|
-
'list-a',
|
|
255
|
-
'list-b'
|
|
256
|
-
]
|
|
257
|
-
});
|
|
258
|
-
expect(publish).toHaveBeenCalledWith(expect.objectContaining({
|
|
259
|
-
name: 'task-manager.task_list.reordered',
|
|
260
|
-
payload: expect.objectContaining({
|
|
261
|
-
ids: [
|
|
262
|
-
'list-a',
|
|
263
|
-
'list-b'
|
|
264
|
-
],
|
|
265
|
-
metadata: {
|
|
266
|
-
boardId: 'board-1'
|
|
267
|
-
}
|
|
268
|
-
})
|
|
269
|
-
}));
|
|
270
|
-
});
|
|
271
|
-
it('does not publish when the task manager module has events disabled', async ()=>{
|
|
272
|
-
_classes.EventBusRegistry.configureModule('task-manager', {
|
|
273
|
-
enabled: false
|
|
274
|
-
});
|
|
275
|
-
await service.reorderLists({
|
|
276
|
-
boardId: 'board-1',
|
|
277
|
-
orderedIds: [
|
|
278
|
-
'list-a'
|
|
279
|
-
]
|
|
280
|
-
});
|
|
281
|
-
expect(publish).not.toHaveBeenCalled();
|
|
282
|
-
});
|
|
283
|
-
});
|
|
284
|
-
});
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "TaskManagerConfigService", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return TaskManagerConfigService;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _common = require("@nestjs/common");
|
|
12
|
-
const _taskmanagerconstants = require("../config/task-manager.constants");
|
|
13
|
-
const _interfaces = require("../interfaces");
|
|
14
|
-
function _define_property(obj, key, value) {
|
|
15
|
-
if (key in obj) {
|
|
16
|
-
Object.defineProperty(obj, key, {
|
|
17
|
-
value: value,
|
|
18
|
-
enumerable: true,
|
|
19
|
-
configurable: true,
|
|
20
|
-
writable: true
|
|
21
|
-
});
|
|
22
|
-
} else {
|
|
23
|
-
obj[key] = value;
|
|
24
|
-
}
|
|
25
|
-
return obj;
|
|
26
|
-
}
|
|
27
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
28
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
29
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
30
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
31
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
32
|
-
}
|
|
33
|
-
function _ts_metadata(k, v) {
|
|
34
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
35
|
-
}
|
|
36
|
-
function _ts_param(paramIndex, decorator) {
|
|
37
|
-
return function(target, key) {
|
|
38
|
-
decorator(target, key, paramIndex);
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
let TaskManagerConfigService = class TaskManagerConfigService {
|
|
42
|
-
isCompanyFeatureEnabled() {
|
|
43
|
-
return this.options.bootstrapAppConfig?.enableCompanyFeature ?? false;
|
|
44
|
-
}
|
|
45
|
-
getDatabaseMode() {
|
|
46
|
-
return this.options.bootstrapAppConfig?.databaseMode ?? 'single';
|
|
47
|
-
}
|
|
48
|
-
isMultiTenant() {
|
|
49
|
-
return this.getDatabaseMode() === 'multi-tenant';
|
|
50
|
-
}
|
|
51
|
-
getJwtSecret() {
|
|
52
|
-
return this.options.config?.jwtSecret;
|
|
53
|
-
}
|
|
54
|
-
getOptions() {
|
|
55
|
-
return this.options;
|
|
56
|
-
}
|
|
57
|
-
constructor(options){
|
|
58
|
-
_define_property(this, "options", void 0);
|
|
59
|
-
this.options = options;
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
TaskManagerConfigService = _ts_decorate([
|
|
63
|
-
(0, _common.Injectable)(),
|
|
64
|
-
_ts_param(0, (0, _common.Inject)(_taskmanagerconstants.TASK_MANAGER_MODULE_OPTIONS)),
|
|
65
|
-
_ts_metadata("design:type", Function),
|
|
66
|
-
_ts_metadata("design:paramtypes", [
|
|
67
|
-
typeof _interfaces.TaskManagerModuleOptions === "undefined" ? Object : _interfaces.TaskManagerModuleOptions
|
|
68
|
-
])
|
|
69
|
-
], TaskManagerConfigService);
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
const _taskmanagerconfigservice = require("./task-manager-config.service");
|
|
6
|
-
function buildOptions(overrides = {}) {
|
|
7
|
-
return {
|
|
8
|
-
bootstrapAppConfig: undefined,
|
|
9
|
-
config: undefined,
|
|
10
|
-
...overrides
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
describe('TaskManagerConfigService', ()=>{
|
|
14
|
-
describe('isCompanyFeatureEnabled', ()=>{
|
|
15
|
-
it('returns true when bootstrapAppConfig enables the company feature', ()=>{
|
|
16
|
-
const service = new _taskmanagerconfigservice.TaskManagerConfigService(buildOptions({
|
|
17
|
-
bootstrapAppConfig: {
|
|
18
|
-
databaseMode: 'single',
|
|
19
|
-
enableCompanyFeature: true
|
|
20
|
-
}
|
|
21
|
-
}));
|
|
22
|
-
expect(service.isCompanyFeatureEnabled()).toBe(true);
|
|
23
|
-
});
|
|
24
|
-
it('defaults to false when bootstrapAppConfig is missing', ()=>{
|
|
25
|
-
const service = new _taskmanagerconfigservice.TaskManagerConfigService(buildOptions({
|
|
26
|
-
bootstrapAppConfig: undefined
|
|
27
|
-
}));
|
|
28
|
-
expect(service.isCompanyFeatureEnabled()).toBe(false);
|
|
29
|
-
});
|
|
30
|
-
it('defaults to false when enableCompanyFeature is not set on bootstrapAppConfig', ()=>{
|
|
31
|
-
const service = new _taskmanagerconfigservice.TaskManagerConfigService(buildOptions({
|
|
32
|
-
bootstrapAppConfig: {}
|
|
33
|
-
}));
|
|
34
|
-
expect(service.isCompanyFeatureEnabled()).toBe(false);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
describe('getDatabaseMode', ()=>{
|
|
38
|
-
it('returns the configured database mode', ()=>{
|
|
39
|
-
const service = new _taskmanagerconfigservice.TaskManagerConfigService(buildOptions({
|
|
40
|
-
bootstrapAppConfig: {
|
|
41
|
-
databaseMode: 'multi-tenant'
|
|
42
|
-
}
|
|
43
|
-
}));
|
|
44
|
-
expect(service.getDatabaseMode()).toBe('multi-tenant');
|
|
45
|
-
});
|
|
46
|
-
it('defaults to "single" when bootstrapAppConfig is missing', ()=>{
|
|
47
|
-
const service = new _taskmanagerconfigservice.TaskManagerConfigService(buildOptions({
|
|
48
|
-
bootstrapAppConfig: undefined
|
|
49
|
-
}));
|
|
50
|
-
expect(service.getDatabaseMode()).toBe('single');
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
describe('isMultiTenant', ()=>{
|
|
54
|
-
it('returns true when database mode is multi-tenant', ()=>{
|
|
55
|
-
const service = new _taskmanagerconfigservice.TaskManagerConfigService(buildOptions({
|
|
56
|
-
bootstrapAppConfig: {
|
|
57
|
-
databaseMode: 'multi-tenant'
|
|
58
|
-
}
|
|
59
|
-
}));
|
|
60
|
-
expect(service.isMultiTenant()).toBe(true);
|
|
61
|
-
});
|
|
62
|
-
it('returns false when database mode is single', ()=>{
|
|
63
|
-
const service = new _taskmanagerconfigservice.TaskManagerConfigService(buildOptions({
|
|
64
|
-
bootstrapAppConfig: {
|
|
65
|
-
databaseMode: 'single'
|
|
66
|
-
}
|
|
67
|
-
}));
|
|
68
|
-
expect(service.isMultiTenant()).toBe(false);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
describe('getJwtSecret', ()=>{
|
|
72
|
-
it('returns the configured jwt secret', ()=>{
|
|
73
|
-
const service = new _taskmanagerconfigservice.TaskManagerConfigService(buildOptions({
|
|
74
|
-
config: {
|
|
75
|
-
jwtSecret: 'super-secret'
|
|
76
|
-
}
|
|
77
|
-
}));
|
|
78
|
-
expect(service.getJwtSecret()).toBe('super-secret');
|
|
79
|
-
});
|
|
80
|
-
it('returns undefined when config is missing', ()=>{
|
|
81
|
-
const service = new _taskmanagerconfigservice.TaskManagerConfigService(buildOptions({
|
|
82
|
-
config: undefined
|
|
83
|
-
}));
|
|
84
|
-
expect(service.getJwtSecret()).toBeUndefined();
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
describe('getOptions', ()=>{
|
|
88
|
-
it('returns the exact options object it was constructed with', ()=>{
|
|
89
|
-
const options = buildOptions({
|
|
90
|
-
config: {
|
|
91
|
-
jwtSecret: 'secret'
|
|
92
|
-
}
|
|
93
|
-
});
|
|
94
|
-
const service = new _taskmanagerconfigservice.TaskManagerConfigService(options);
|
|
95
|
-
expect(service.getOptions()).toBe(options);
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
});
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "TaskManagerDataSourceProvider", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return TaskManagerDataSourceProvider;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _modules = require("@flusys/nestjs-shared/modules");
|
|
12
|
-
const _common = require("@nestjs/common");
|
|
13
|
-
const _core = require("@nestjs/core");
|
|
14
|
-
const _express = require("express");
|
|
15
|
-
const _entities = require("../entities");
|
|
16
|
-
const _taskmanagerconfigservice = require("./task-manager-config.service");
|
|
17
|
-
function _define_property(obj, key, value) {
|
|
18
|
-
if (key in obj) {
|
|
19
|
-
Object.defineProperty(obj, key, {
|
|
20
|
-
value: value,
|
|
21
|
-
enumerable: true,
|
|
22
|
-
configurable: true,
|
|
23
|
-
writable: true
|
|
24
|
-
});
|
|
25
|
-
} else {
|
|
26
|
-
obj[key] = value;
|
|
27
|
-
}
|
|
28
|
-
return obj;
|
|
29
|
-
}
|
|
30
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
31
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
32
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
33
|
-
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
34
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
35
|
-
}
|
|
36
|
-
function _ts_metadata(k, v) {
|
|
37
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
38
|
-
}
|
|
39
|
-
function _ts_param(paramIndex, decorator) {
|
|
40
|
-
return function(target, key) {
|
|
41
|
-
decorator(target, key, paramIndex);
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
let TaskManagerDataSourceProvider = class TaskManagerDataSourceProvider extends _modules.MultiTenantDataSourceService {
|
|
45
|
-
static buildParentOptions(options) {
|
|
46
|
-
return {
|
|
47
|
-
bootstrapAppConfig: options.bootstrapAppConfig,
|
|
48
|
-
defaultDatabaseConfig: options.config?.defaultDatabaseConfig,
|
|
49
|
-
tenantDefaultDatabaseConfig: options.config?.tenantDefaultDatabaseConfig,
|
|
50
|
-
tenants: options.config?.tenants
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
getEnableCompanyFeatureForTenant(tenant) {
|
|
54
|
-
return tenant?.enableCompanyFeature ?? this.configService.isCompanyFeatureEnabled();
|
|
55
|
-
}
|
|
56
|
-
async createDataSourceFromConfig(config) {
|
|
57
|
-
const currentTenant = this.getCurrentTenant();
|
|
58
|
-
const enableCompanyFeature = this.getEnableCompanyFeatureForTenant(currentTenant ?? undefined);
|
|
59
|
-
const entities = (0, _entities.getTaskManagerEntitiesByConfig)(enableCompanyFeature);
|
|
60
|
-
return super.createDataSourceFromConfig(config, entities);
|
|
61
|
-
}
|
|
62
|
-
constructor(configService, request){
|
|
63
|
-
super(TaskManagerDataSourceProvider.buildParentOptions(configService.getOptions()), request), _define_property(this, "configService", void 0), this.configService = configService;
|
|
64
|
-
}
|
|
65
|
-
};
|
|
66
|
-
_define_property(TaskManagerDataSourceProvider, "tenantConnections", new Map());
|
|
67
|
-
_define_property(TaskManagerDataSourceProvider, "singleDataSource", null);
|
|
68
|
-
_define_property(TaskManagerDataSourceProvider, "tenantsRegistry", new Map());
|
|
69
|
-
_define_property(TaskManagerDataSourceProvider, "initialized", false);
|
|
70
|
-
_define_property(TaskManagerDataSourceProvider, "connectionLocks", new Map());
|
|
71
|
-
_define_property(TaskManagerDataSourceProvider, "singleConnectionLock", null);
|
|
72
|
-
TaskManagerDataSourceProvider = _ts_decorate([
|
|
73
|
-
(0, _common.Injectable)({
|
|
74
|
-
scope: _common.Scope.REQUEST
|
|
75
|
-
}),
|
|
76
|
-
_ts_param(0, (0, _common.Inject)(_taskmanagerconfigservice.TaskManagerConfigService)),
|
|
77
|
-
_ts_param(1, (0, _common.Optional)()),
|
|
78
|
-
_ts_param(1, (0, _common.Inject)(_core.REQUEST)),
|
|
79
|
-
_ts_metadata("design:type", Function),
|
|
80
|
-
_ts_metadata("design:paramtypes", [
|
|
81
|
-
typeof _taskmanagerconfigservice.TaskManagerConfigService === "undefined" ? Object : _taskmanagerconfigservice.TaskManagerConfigService,
|
|
82
|
-
typeof _express.Request === "undefined" ? Object : _express.Request
|
|
83
|
-
])
|
|
84
|
-
], TaskManagerDataSourceProvider);
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
const _taskmanagerdatasourceprovider = require("./task-manager-datasource.provider");
|
|
6
|
-
const _entities = require("../entities");
|
|
7
|
-
function buildConfigService(overrides = {}) {
|
|
8
|
-
const options = {
|
|
9
|
-
bootstrapAppConfig: {
|
|
10
|
-
databaseMode: 'single',
|
|
11
|
-
enableCompanyFeature: false
|
|
12
|
-
},
|
|
13
|
-
config: {
|
|
14
|
-
defaultDatabaseConfig: {
|
|
15
|
-
type: 'mysql',
|
|
16
|
-
host: 'localhost',
|
|
17
|
-
port: 3306,
|
|
18
|
-
username: 'root',
|
|
19
|
-
password: 'password',
|
|
20
|
-
database: 'flusys_test'
|
|
21
|
-
},
|
|
22
|
-
tenantDefaultDatabaseConfig: undefined,
|
|
23
|
-
tenants: []
|
|
24
|
-
},
|
|
25
|
-
...overrides
|
|
26
|
-
};
|
|
27
|
-
return {
|
|
28
|
-
getOptions: jest.fn().mockReturnValue(options),
|
|
29
|
-
isCompanyFeatureEnabled: jest.fn().mockReturnValue(options.bootstrapAppConfig?.enableCompanyFeature ?? false)
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
describe('TaskManagerDataSourceProvider', ()=>{
|
|
33
|
-
afterEach(()=>{
|
|
34
|
-
// Reset the isolated static caches this provider owns so tests don't leak state between runs.
|
|
35
|
-
_taskmanagerdatasourceprovider.TaskManagerDataSourceProvider.tenantConnections = new Map();
|
|
36
|
-
_taskmanagerdatasourceprovider.TaskManagerDataSourceProvider.singleDataSource = null;
|
|
37
|
-
_taskmanagerdatasourceprovider.TaskManagerDataSourceProvider.tenantsRegistry = new Map();
|
|
38
|
-
_taskmanagerdatasourceprovider.TaskManagerDataSourceProvider.initialized = false;
|
|
39
|
-
_taskmanagerdatasourceprovider.TaskManagerDataSourceProvider.connectionLocks = new Map();
|
|
40
|
-
_taskmanagerdatasourceprovider.TaskManagerDataSourceProvider.singleConnectionLock = null;
|
|
41
|
-
});
|
|
42
|
-
it('constructs and forwards bootstrap/database config to the base class', ()=>{
|
|
43
|
-
const configService = buildConfigService();
|
|
44
|
-
const provider = new _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider(configService, undefined);
|
|
45
|
-
expect(configService.getOptions).toHaveBeenCalled();
|
|
46
|
-
expect(provider.getDatabaseMode()).toBe('single');
|
|
47
|
-
expect(provider.isMultiTenant()).toBe(false);
|
|
48
|
-
});
|
|
49
|
-
it('reflects multi-tenant mode from bootstrapAppConfig', ()=>{
|
|
50
|
-
const configService = buildConfigService({
|
|
51
|
-
bootstrapAppConfig: {
|
|
52
|
-
databaseMode: 'multi-tenant'
|
|
53
|
-
}
|
|
54
|
-
});
|
|
55
|
-
const provider = new _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider(configService, undefined);
|
|
56
|
-
expect(provider.isMultiTenant()).toBe(true);
|
|
57
|
-
});
|
|
58
|
-
it('owns isolated static caches, separate from the base MultiTenantDataSourceService', ()=>{
|
|
59
|
-
// Each DataSource Provider must override BOTH static cache properties and the
|
|
60
|
-
// methods that read them — otherwise modules would share connections (see FLUSYS_NEST/CLAUDE.md).
|
|
61
|
-
expect(_taskmanagerdatasourceprovider.TaskManagerDataSourceProvider.tenantConnections).not.toBe(Object.getPrototypeOf(_taskmanagerdatasourceprovider.TaskManagerDataSourceProvider).tenantConnections);
|
|
62
|
-
});
|
|
63
|
-
describe('getEnableCompanyFeatureForTenant', ()=>{
|
|
64
|
-
it('uses the tenant override when the tenant explicitly sets enableCompanyFeature', ()=>{
|
|
65
|
-
const configService = buildConfigService();
|
|
66
|
-
configService.isCompanyFeatureEnabled.mockReturnValue(false);
|
|
67
|
-
const provider = new _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider(configService, undefined);
|
|
68
|
-
const result = provider.getEnableCompanyFeatureForTenant({
|
|
69
|
-
enableCompanyFeature: true
|
|
70
|
-
});
|
|
71
|
-
expect(result).toBe(true);
|
|
72
|
-
});
|
|
73
|
-
it('falls back to the module-level config when tenant does not override', ()=>{
|
|
74
|
-
const configService = buildConfigService();
|
|
75
|
-
configService.isCompanyFeatureEnabled.mockReturnValue(true);
|
|
76
|
-
const provider = new _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider(configService, undefined);
|
|
77
|
-
const result = provider.getEnableCompanyFeatureForTenant(undefined);
|
|
78
|
-
expect(result).toBe(true);
|
|
79
|
-
expect(configService.isCompanyFeatureEnabled).toHaveBeenCalled();
|
|
80
|
-
});
|
|
81
|
-
it('falls back to module-level config when tenant is provided without the flag set', ()=>{
|
|
82
|
-
const configService = buildConfigService();
|
|
83
|
-
configService.isCompanyFeatureEnabled.mockReturnValue(false);
|
|
84
|
-
const provider = new _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider(configService, undefined);
|
|
85
|
-
const result = provider.getEnableCompanyFeatureForTenant({});
|
|
86
|
-
expect(result).toBe(false);
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
describe('createDataSourceFromConfig', ()=>{
|
|
90
|
-
it('builds a DataSource using core entities when company feature is disabled', async ()=>{
|
|
91
|
-
const configService = buildConfigService();
|
|
92
|
-
configService.isCompanyFeatureEnabled.mockReturnValue(false);
|
|
93
|
-
const provider = new _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider(configService, undefined);
|
|
94
|
-
const fakeDataSource = {
|
|
95
|
-
isInitialized: true
|
|
96
|
-
};
|
|
97
|
-
const superSpy = jest.spyOn(Object.getPrototypeOf(Object.getPrototypeOf(provider)), 'createDataSourceFromConfig').mockResolvedValue(fakeDataSource);
|
|
98
|
-
const config = {
|
|
99
|
-
type: 'mysql',
|
|
100
|
-
host: 'localhost',
|
|
101
|
-
port: 3306,
|
|
102
|
-
username: 'root',
|
|
103
|
-
password: 'password',
|
|
104
|
-
database: 'flusys_test'
|
|
105
|
-
};
|
|
106
|
-
const result = await provider.createDataSourceFromConfig(config);
|
|
107
|
-
expect(superSpy).toHaveBeenCalledWith(config, (0, _entities.getTaskManagerEntitiesByConfig)(false));
|
|
108
|
-
expect(result).toBe(fakeDataSource);
|
|
109
|
-
superSpy.mockRestore();
|
|
110
|
-
});
|
|
111
|
-
it('builds a DataSource using company entities when the tenant enables the company feature', async ()=>{
|
|
112
|
-
const configService = buildConfigService();
|
|
113
|
-
configService.isCompanyFeatureEnabled.mockReturnValue(false);
|
|
114
|
-
const provider = new _taskmanagerdatasourceprovider.TaskManagerDataSourceProvider(configService, undefined);
|
|
115
|
-
jest.spyOn(provider, 'getCurrentTenant').mockReturnValue({
|
|
116
|
-
enableCompanyFeature: true
|
|
117
|
-
});
|
|
118
|
-
const fakeDataSource = {
|
|
119
|
-
isInitialized: true
|
|
120
|
-
};
|
|
121
|
-
const superSpy = jest.spyOn(Object.getPrototypeOf(Object.getPrototypeOf(provider)), 'createDataSourceFromConfig').mockResolvedValue(fakeDataSource);
|
|
122
|
-
const config = {
|
|
123
|
-
type: 'mysql',
|
|
124
|
-
database: 'flusys_test'
|
|
125
|
-
};
|
|
126
|
-
await provider.createDataSourceFromConfig(config);
|
|
127
|
-
expect(superSpy).toHaveBeenCalledWith(config, (0, _entities.getTaskManagerEntitiesByConfig)(true));
|
|
128
|
-
superSpy.mockRestore();
|
|
129
|
-
});
|
|
130
|
-
});
|
|
131
|
-
});
|