@hedhog/admin 0.11.1 → 0.12.2
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/{hedhog.yaml → bkp.hedhog.yaml} +1012 -814
- package/dist/auth/consts/body.js +23 -23
- package/package.json +43 -43
- package/src/admin.module.ts +37 -37
- package/src/auth/auth.controller.ts +72 -72
- package/src/auth/auth.module.ts +39 -39
- package/src/auth/auth.service.spec.ts +196 -196
- package/src/auth/auth.service.ts +234 -234
- package/src/auth/consts/body.ts +26 -26
- package/src/auth/consts/subject.ts +1 -1
- package/src/auth/dto/forget.dto.ts +6 -6
- package/src/auth/dto/login.dto.ts +15 -15
- package/src/auth/dto/otp.dto.ts +11 -11
- package/src/auth/dto/reset.dto.ts +14 -14
- package/src/auth/enums/multifactor-type.enum.ts +4 -4
- package/src/auth/guards/auth.guard.ts +50 -50
- package/src/auth/types/user.type.ts +8 -8
- package/src/dto/delete.dto.ts +8 -8
- package/src/dto/update-ids.dto.ts +9 -9
- package/src/index.ts +20 -20
- package/src/menu/dto/create.dto.ts +25 -25
- package/src/menu/dto/order.dto.ts +8 -8
- package/src/menu/dto/update.dto.ts +19 -19
- package/src/menu/menu.controller.ts +105 -105
- package/src/menu/menu.module.ts +18 -18
- package/src/menu/menu.service.spec.ts +247 -247
- package/src/menu/menu.service.ts +263 -263
- package/src/role/dto/create.dto.ts +7 -7
- package/src/role/dto/update.dto.ts +4 -4
- package/src/role/guards/role.guard.ts +123 -123
- package/src/role/role.controller.ts +126 -126
- package/src/role/role.module.ts +28 -28
- package/src/role/role.service.spec.ts +417 -417
- package/src/role/role.service.ts +289 -289
- package/src/route/dto/create.dto.ts +13 -13
- package/src/route/dto/update.dto.ts +15 -15
- package/src/route/route.controller.ts +91 -91
- package/src/route/route.module.ts +18 -18
- package/src/route/route.service.spec.ts +300 -300
- package/src/route/route.service.ts +164 -164
- package/src/screen/dto/create.dto.ts +11 -11
- package/src/screen/dto/update.dto.ts +19 -19
- package/src/screen/screen.controller.ts +93 -93
- package/src/screen/screen.module.ts +18 -18
- package/src/screen/screen.service.spec.ts +298 -298
- package/src/screen/screen.service.ts +179 -179
- package/src/types/http-method.ts +8 -8
- package/src/user/constants/user.constants.ts +1 -1
- package/src/user/dto/create.dto.ts +24 -24
- package/src/user/dto/update.dto.ts +41 -41
- package/src/user/user.controller.ts +75 -75
- package/src/user/user.module.ts +18 -18
- package/src/user/user.service.spec.ts +294 -294
- package/src/user/user.service.ts +129 -129
package/src/user/user.module.ts
CHANGED
@@ -1,18 +1,18 @@
|
|
1
|
-
import { PaginationModule } from '@hedhog/pagination';
|
2
|
-
import { PrismaModule } from '@hedhog/prisma';
|
3
|
-
import { Module, forwardRef } from '@nestjs/common';
|
4
|
-
import { UserController } from './user.controller';
|
5
|
-
import { UserService } from './user.service';
|
6
|
-
import { AuthModule } from '../auth/auth.module';
|
7
|
-
|
8
|
-
@Module({
|
9
|
-
providers: [UserService],
|
10
|
-
exports: [UserService],
|
11
|
-
controllers: [UserController],
|
12
|
-
imports: [
|
13
|
-
forwardRef(() => AuthModule),
|
14
|
-
forwardRef(() => PrismaModule),
|
15
|
-
forwardRef(() => PaginationModule),
|
16
|
-
],
|
17
|
-
})
|
18
|
-
export class UserModule {}
|
1
|
+
import { PaginationModule } from '@hedhog/pagination';
|
2
|
+
import { PrismaModule } from '@hedhog/prisma';
|
3
|
+
import { Module, forwardRef } from '@nestjs/common';
|
4
|
+
import { UserController } from './user.controller';
|
5
|
+
import { UserService } from './user.service';
|
6
|
+
import { AuthModule } from '../auth/auth.module';
|
7
|
+
|
8
|
+
@Module({
|
9
|
+
providers: [UserService],
|
10
|
+
exports: [UserService],
|
11
|
+
controllers: [UserController],
|
12
|
+
imports: [
|
13
|
+
forwardRef(() => AuthModule),
|
14
|
+
forwardRef(() => PrismaModule),
|
15
|
+
forwardRef(() => PaginationModule),
|
16
|
+
],
|
17
|
+
})
|
18
|
+
export class UserModule {}
|
@@ -1,294 +1,294 @@
|
|
1
|
-
import {
|
2
|
-
PageOrderDirection,
|
3
|
-
PaginationDTO,
|
4
|
-
PaginationService,
|
5
|
-
} from '@hedhog/pagination';
|
6
|
-
import { PrismaService } from '@hedhog/prisma';
|
7
|
-
import { BadRequestException } from '@nestjs/common';
|
8
|
-
import { Test, TestingModule } from '@nestjs/testing';
|
9
|
-
import { genSalt, hash } from 'bcrypt';
|
10
|
-
import { DeleteDTO } from '../dto/delete.dto';
|
11
|
-
import { UpdateIdsDTO } from '../dto/update-ids.dto';
|
12
|
-
import { SALT_ROUNDS } from './constants/user.constants';
|
13
|
-
import { CreateDTO } from './dto/create.dto';
|
14
|
-
import { UpdateDTO } from './dto/update.dto';
|
15
|
-
import { UserService } from './user.service';
|
16
|
-
|
17
|
-
jest.mock('bcrypt', () => ({
|
18
|
-
genSalt: jest.fn().mockResolvedValue('mockSalt'),
|
19
|
-
hash: jest.fn().mockResolvedValue('mockHashedPassword'),
|
20
|
-
}));
|
21
|
-
|
22
|
-
describe('UserService', () => {
|
23
|
-
let service: UserService;
|
24
|
-
let prismaService: PrismaService;
|
25
|
-
let paginationService: PaginationService;
|
26
|
-
|
27
|
-
beforeEach(async () => {
|
28
|
-
const module: TestingModule = await Test.createTestingModule({
|
29
|
-
providers: [
|
30
|
-
UserService,
|
31
|
-
{
|
32
|
-
provide: PrismaService,
|
33
|
-
useValue: {
|
34
|
-
user: {
|
35
|
-
findUnique: jest.fn(),
|
36
|
-
create: jest.fn(),
|
37
|
-
update: jest.fn(),
|
38
|
-
deleteMany: jest.fn(),
|
39
|
-
},
|
40
|
-
role_user: {
|
41
|
-
deleteMany: jest.fn(),
|
42
|
-
createMany: jest.fn(),
|
43
|
-
},
|
44
|
-
createInsensitiveSearch: jest.fn(),
|
45
|
-
},
|
46
|
-
},
|
47
|
-
{
|
48
|
-
provide: PaginationService,
|
49
|
-
useValue: {
|
50
|
-
paginate: jest.fn(),
|
51
|
-
},
|
52
|
-
},
|
53
|
-
],
|
54
|
-
}).compile();
|
55
|
-
|
56
|
-
service = module.get<UserService>(UserService);
|
57
|
-
prismaService = module.get<PrismaService>(PrismaService);
|
58
|
-
paginationService = module.get<PaginationService>(PaginationService);
|
59
|
-
});
|
60
|
-
|
61
|
-
it('should be defined', () => {
|
62
|
-
expect(service).toBeDefined();
|
63
|
-
});
|
64
|
-
|
65
|
-
describe('listRoles', () => {
|
66
|
-
it('should return paginated role for a specific user', async () => {
|
67
|
-
const paginationParams: PaginationDTO = {
|
68
|
-
page: 1,
|
69
|
-
pageSize: 10,
|
70
|
-
search: '',
|
71
|
-
sortField: '',
|
72
|
-
sortOrder: PageOrderDirection.Asc,
|
73
|
-
fields: '',
|
74
|
-
};
|
75
|
-
|
76
|
-
const mockPaginatedRoles = {
|
77
|
-
data: [],
|
78
|
-
total: 10,
|
79
|
-
lastPage: 1,
|
80
|
-
page: 1,
|
81
|
-
prev: 0,
|
82
|
-
next: 2,
|
83
|
-
pageSize: 10,
|
84
|
-
};
|
85
|
-
|
86
|
-
jest
|
87
|
-
.spyOn(paginationService, 'paginate')
|
88
|
-
.mockResolvedValue(mockPaginatedRoles);
|
89
|
-
|
90
|
-
const result = await service.listRoles(1, paginationParams);
|
91
|
-
|
92
|
-
expect(paginationService.paginate).toHaveBeenCalledWith(
|
93
|
-
prismaService.role,
|
94
|
-
paginationParams,
|
95
|
-
{
|
96
|
-
include: {
|
97
|
-
role_user: {
|
98
|
-
where: { user_id: 1 },
|
99
|
-
select: { user_id: true, role_id: true },
|
100
|
-
},
|
101
|
-
},
|
102
|
-
},
|
103
|
-
);
|
104
|
-
expect(result).toEqual(mockPaginatedRoles);
|
105
|
-
});
|
106
|
-
});
|
107
|
-
|
108
|
-
describe('updateRoles', () => {
|
109
|
-
it('should update user role', async () => {
|
110
|
-
const updateIdsDTO: UpdateIdsDTO = { ids: [1, 2] };
|
111
|
-
|
112
|
-
jest
|
113
|
-
.spyOn(prismaService.role_user, 'deleteMany')
|
114
|
-
.mockResolvedValue({ count: 1 });
|
115
|
-
jest
|
116
|
-
.spyOn(prismaService.role_user, 'createMany')
|
117
|
-
.mockResolvedValue({ count: 2 });
|
118
|
-
|
119
|
-
await service.updateRoles(1, updateIdsDTO);
|
120
|
-
|
121
|
-
expect(prismaService.role_user.deleteMany).toHaveBeenCalledWith({
|
122
|
-
where: { user_id: 1 },
|
123
|
-
});
|
124
|
-
expect(prismaService.role_user.createMany).toHaveBeenCalledWith({
|
125
|
-
data: [
|
126
|
-
{ user_id: 1, role_id: 1 },
|
127
|
-
{ user_id: 1, role_id: 2 },
|
128
|
-
],
|
129
|
-
skipDuplicates: true,
|
130
|
-
});
|
131
|
-
});
|
132
|
-
});
|
133
|
-
/*
|
134
|
-
describe('getUsers', () => {
|
135
|
-
it('should return paginated user', async () => {
|
136
|
-
const paginationParams: PaginationDTO = {
|
137
|
-
page: 1,
|
138
|
-
pageSize: 10,
|
139
|
-
search: '',
|
140
|
-
sortField: '',
|
141
|
-
sortOrder: PageOrderDirection.Asc,
|
142
|
-
fields: '',
|
143
|
-
};
|
144
|
-
|
145
|
-
const mockPaginatedUsers = {
|
146
|
-
data: [],
|
147
|
-
total: 10,
|
148
|
-
lastPage: 1,
|
149
|
-
page: 1,
|
150
|
-
prev: 0,
|
151
|
-
next: 2,
|
152
|
-
pageSize: 10,
|
153
|
-
};
|
154
|
-
|
155
|
-
jest.spyOn(prismaService, 'createInsensitiveSearch').mockReturnValue([]);
|
156
|
-
jest
|
157
|
-
.spyOn(paginationService, 'paginate')
|
158
|
-
.mockResolvedValue(mockPaginatedUsers);
|
159
|
-
|
160
|
-
const result = await service.getUsers(paginationParams);
|
161
|
-
|
162
|
-
expect(prismaService.createInsensitiveSearch).toHaveBeenCalledWith(
|
163
|
-
['name', 'email'],
|
164
|
-
paginationParams,
|
165
|
-
);
|
166
|
-
expect(paginationService.paginate).toHaveBeenCalledWith(
|
167
|
-
prismaService.user,
|
168
|
-
paginationParams,
|
169
|
-
{ where: { OR: [] } },
|
170
|
-
);
|
171
|
-
expect(result).toEqual(mockPaginatedUsers);
|
172
|
-
});
|
173
|
-
});
|
174
|
-
*/
|
175
|
-
describe('get', () => {
|
176
|
-
it('should return a specific user by ID', async () => {
|
177
|
-
const mockUser = {
|
178
|
-
id: 1,
|
179
|
-
name: 'Test User',
|
180
|
-
email: 'user@email.com',
|
181
|
-
password: 'hashedpassword',
|
182
|
-
created_at: new Date(),
|
183
|
-
updated_at: new Date(),
|
184
|
-
multifactor_id: null,
|
185
|
-
code: null,
|
186
|
-
};
|
187
|
-
jest.spyOn(prismaService.user, 'findUnique').mockResolvedValue(mockUser);
|
188
|
-
|
189
|
-
const result = await service.get(1);
|
190
|
-
|
191
|
-
expect(prismaService.user.findUnique).toHaveBeenCalledWith({
|
192
|
-
where: { id: 1 },
|
193
|
-
});
|
194
|
-
expect(result).toEqual(mockUser);
|
195
|
-
});
|
196
|
-
});
|
197
|
-
|
198
|
-
describe('hashPassword', () => {
|
199
|
-
it('should hash the password correctly', async () => {
|
200
|
-
const password = 'plainPassword';
|
201
|
-
const result = await service.hashPassword(password);
|
202
|
-
|
203
|
-
expect(genSalt).toHaveBeenCalledWith(SALT_ROUNDS);
|
204
|
-
expect(hash).toHaveBeenCalledWith(password, 'mockSalt');
|
205
|
-
expect(result).toEqual('mockHashedPassword');
|
206
|
-
});
|
207
|
-
});
|
208
|
-
|
209
|
-
describe('create', () => {
|
210
|
-
it('should create a new user with hashed password', async () => {
|
211
|
-
const createDTO: CreateDTO = {
|
212
|
-
email: 'test@test.com',
|
213
|
-
name: 'Test User',
|
214
|
-
password: 'password123',
|
215
|
-
};
|
216
|
-
const mockUser = {
|
217
|
-
id: 1,
|
218
|
-
name: 'Test User',
|
219
|
-
email: 'user@email.com',
|
220
|
-
password: 'hashedpassword',
|
221
|
-
created_at: new Date(),
|
222
|
-
updated_at: new Date(),
|
223
|
-
multifactor_id: null,
|
224
|
-
code: null,
|
225
|
-
};
|
226
|
-
|
227
|
-
jest.spyOn(prismaService.user, 'create').mockResolvedValue(mockUser);
|
228
|
-
|
229
|
-
const result = await service.create(createDTO);
|
230
|
-
|
231
|
-
expect(prismaService.user.create).toHaveBeenCalledWith({
|
232
|
-
data: {
|
233
|
-
email: createDTO.email,
|
234
|
-
name: createDTO.name,
|
235
|
-
password: 'mockHashedPassword',
|
236
|
-
},
|
237
|
-
});
|
238
|
-
expect(result).toEqual(mockUser);
|
239
|
-
});
|
240
|
-
});
|
241
|
-
|
242
|
-
describe('update', () => {
|
243
|
-
it('should update an existing user', async () => {
|
244
|
-
const updateDTO: UpdateDTO = { name: 'Updated User' };
|
245
|
-
const updateInput = { id: 1, data: updateDTO };
|
246
|
-
const mockUser = {
|
247
|
-
id: 1,
|
248
|
-
name: 'Updated User',
|
249
|
-
email: 'user@email.com',
|
250
|
-
password: 'hashedpassword',
|
251
|
-
created_at: new Date(),
|
252
|
-
updated_at: new Date(),
|
253
|
-
multifactor_id: null,
|
254
|
-
code: null,
|
255
|
-
};
|
256
|
-
jest.spyOn(prismaService.user, 'update').mockResolvedValue(mockUser);
|
257
|
-
|
258
|
-
const result = await service.update(updateInput);
|
259
|
-
|
260
|
-
expect(prismaService.user.update).toHaveBeenCalledWith({
|
261
|
-
where: { id: updateInput.id },
|
262
|
-
data: updateInput.data,
|
263
|
-
});
|
264
|
-
expect(result).toEqual(mockUser);
|
265
|
-
});
|
266
|
-
});
|
267
|
-
|
268
|
-
describe('delete', () => {
|
269
|
-
it('should throw an error if no ids are provided', async () => {
|
270
|
-
const deleteDTO: DeleteDTO = { ids: null };
|
271
|
-
|
272
|
-
await expect(service.delete(deleteDTO)).rejects.toThrow(
|
273
|
-
new BadRequestException('You must select at least one user to delete.'),
|
274
|
-
);
|
275
|
-
});
|
276
|
-
|
277
|
-
it('should delete user by ids', async () => {
|
278
|
-
const deleteDTO: DeleteDTO = { ids: [1, 2] };
|
279
|
-
|
280
|
-
jest
|
281
|
-
.spyOn(prismaService.user, 'deleteMany')
|
282
|
-
.mockResolvedValue({ count: 2 });
|
283
|
-
|
284
|
-
await service.delete(deleteDTO);
|
285
|
-
|
286
|
-
expect(prismaService.user.deleteMany).toHaveBeenCalledWith({
|
287
|
-
where: {
|
288
|
-
id: { in: deleteDTO.ids },
|
289
|
-
email: { not: { startsWith: 'root@' } },
|
290
|
-
},
|
291
|
-
});
|
292
|
-
});
|
293
|
-
});
|
294
|
-
});
|
1
|
+
import {
|
2
|
+
PageOrderDirection,
|
3
|
+
PaginationDTO,
|
4
|
+
PaginationService,
|
5
|
+
} from '@hedhog/pagination';
|
6
|
+
import { PrismaService } from '@hedhog/prisma';
|
7
|
+
import { BadRequestException } from '@nestjs/common';
|
8
|
+
import { Test, TestingModule } from '@nestjs/testing';
|
9
|
+
import { genSalt, hash } from 'bcrypt';
|
10
|
+
import { DeleteDTO } from '../dto/delete.dto';
|
11
|
+
import { UpdateIdsDTO } from '../dto/update-ids.dto';
|
12
|
+
import { SALT_ROUNDS } from './constants/user.constants';
|
13
|
+
import { CreateDTO } from './dto/create.dto';
|
14
|
+
import { UpdateDTO } from './dto/update.dto';
|
15
|
+
import { UserService } from './user.service';
|
16
|
+
|
17
|
+
jest.mock('bcrypt', () => ({
|
18
|
+
genSalt: jest.fn().mockResolvedValue('mockSalt'),
|
19
|
+
hash: jest.fn().mockResolvedValue('mockHashedPassword'),
|
20
|
+
}));
|
21
|
+
|
22
|
+
describe('UserService', () => {
|
23
|
+
let service: UserService;
|
24
|
+
let prismaService: PrismaService;
|
25
|
+
let paginationService: PaginationService;
|
26
|
+
|
27
|
+
beforeEach(async () => {
|
28
|
+
const module: TestingModule = await Test.createTestingModule({
|
29
|
+
providers: [
|
30
|
+
UserService,
|
31
|
+
{
|
32
|
+
provide: PrismaService,
|
33
|
+
useValue: {
|
34
|
+
user: {
|
35
|
+
findUnique: jest.fn(),
|
36
|
+
create: jest.fn(),
|
37
|
+
update: jest.fn(),
|
38
|
+
deleteMany: jest.fn(),
|
39
|
+
},
|
40
|
+
role_user: {
|
41
|
+
deleteMany: jest.fn(),
|
42
|
+
createMany: jest.fn(),
|
43
|
+
},
|
44
|
+
createInsensitiveSearch: jest.fn(),
|
45
|
+
},
|
46
|
+
},
|
47
|
+
{
|
48
|
+
provide: PaginationService,
|
49
|
+
useValue: {
|
50
|
+
paginate: jest.fn(),
|
51
|
+
},
|
52
|
+
},
|
53
|
+
],
|
54
|
+
}).compile();
|
55
|
+
|
56
|
+
service = module.get<UserService>(UserService);
|
57
|
+
prismaService = module.get<PrismaService>(PrismaService);
|
58
|
+
paginationService = module.get<PaginationService>(PaginationService);
|
59
|
+
});
|
60
|
+
|
61
|
+
it('should be defined', () => {
|
62
|
+
expect(service).toBeDefined();
|
63
|
+
});
|
64
|
+
|
65
|
+
describe('listRoles', () => {
|
66
|
+
it('should return paginated role for a specific user', async () => {
|
67
|
+
const paginationParams: PaginationDTO = {
|
68
|
+
page: 1,
|
69
|
+
pageSize: 10,
|
70
|
+
search: '',
|
71
|
+
sortField: '',
|
72
|
+
sortOrder: PageOrderDirection.Asc,
|
73
|
+
fields: '',
|
74
|
+
};
|
75
|
+
|
76
|
+
const mockPaginatedRoles = {
|
77
|
+
data: [],
|
78
|
+
total: 10,
|
79
|
+
lastPage: 1,
|
80
|
+
page: 1,
|
81
|
+
prev: 0,
|
82
|
+
next: 2,
|
83
|
+
pageSize: 10,
|
84
|
+
};
|
85
|
+
|
86
|
+
jest
|
87
|
+
.spyOn(paginationService, 'paginate')
|
88
|
+
.mockResolvedValue(mockPaginatedRoles);
|
89
|
+
|
90
|
+
const result = await service.listRoles(1, paginationParams);
|
91
|
+
|
92
|
+
expect(paginationService.paginate).toHaveBeenCalledWith(
|
93
|
+
prismaService.role,
|
94
|
+
paginationParams,
|
95
|
+
{
|
96
|
+
include: {
|
97
|
+
role_user: {
|
98
|
+
where: { user_id: 1 },
|
99
|
+
select: { user_id: true, role_id: true },
|
100
|
+
},
|
101
|
+
},
|
102
|
+
},
|
103
|
+
);
|
104
|
+
expect(result).toEqual(mockPaginatedRoles);
|
105
|
+
});
|
106
|
+
});
|
107
|
+
|
108
|
+
describe('updateRoles', () => {
|
109
|
+
it('should update user role', async () => {
|
110
|
+
const updateIdsDTO: UpdateIdsDTO = { ids: [1, 2] };
|
111
|
+
|
112
|
+
jest
|
113
|
+
.spyOn(prismaService.role_user, 'deleteMany')
|
114
|
+
.mockResolvedValue({ count: 1 });
|
115
|
+
jest
|
116
|
+
.spyOn(prismaService.role_user, 'createMany')
|
117
|
+
.mockResolvedValue({ count: 2 });
|
118
|
+
|
119
|
+
await service.updateRoles(1, updateIdsDTO);
|
120
|
+
|
121
|
+
expect(prismaService.role_user.deleteMany).toHaveBeenCalledWith({
|
122
|
+
where: { user_id: 1 },
|
123
|
+
});
|
124
|
+
expect(prismaService.role_user.createMany).toHaveBeenCalledWith({
|
125
|
+
data: [
|
126
|
+
{ user_id: 1, role_id: 1 },
|
127
|
+
{ user_id: 1, role_id: 2 },
|
128
|
+
],
|
129
|
+
skipDuplicates: true,
|
130
|
+
});
|
131
|
+
});
|
132
|
+
});
|
133
|
+
/*
|
134
|
+
describe('getUsers', () => {
|
135
|
+
it('should return paginated user', async () => {
|
136
|
+
const paginationParams: PaginationDTO = {
|
137
|
+
page: 1,
|
138
|
+
pageSize: 10,
|
139
|
+
search: '',
|
140
|
+
sortField: '',
|
141
|
+
sortOrder: PageOrderDirection.Asc,
|
142
|
+
fields: '',
|
143
|
+
};
|
144
|
+
|
145
|
+
const mockPaginatedUsers = {
|
146
|
+
data: [],
|
147
|
+
total: 10,
|
148
|
+
lastPage: 1,
|
149
|
+
page: 1,
|
150
|
+
prev: 0,
|
151
|
+
next: 2,
|
152
|
+
pageSize: 10,
|
153
|
+
};
|
154
|
+
|
155
|
+
jest.spyOn(prismaService, 'createInsensitiveSearch').mockReturnValue([]);
|
156
|
+
jest
|
157
|
+
.spyOn(paginationService, 'paginate')
|
158
|
+
.mockResolvedValue(mockPaginatedUsers);
|
159
|
+
|
160
|
+
const result = await service.getUsers(paginationParams);
|
161
|
+
|
162
|
+
expect(prismaService.createInsensitiveSearch).toHaveBeenCalledWith(
|
163
|
+
['name', 'email'],
|
164
|
+
paginationParams,
|
165
|
+
);
|
166
|
+
expect(paginationService.paginate).toHaveBeenCalledWith(
|
167
|
+
prismaService.user,
|
168
|
+
paginationParams,
|
169
|
+
{ where: { OR: [] } },
|
170
|
+
);
|
171
|
+
expect(result).toEqual(mockPaginatedUsers);
|
172
|
+
});
|
173
|
+
});
|
174
|
+
*/
|
175
|
+
describe('get', () => {
|
176
|
+
it('should return a specific user by ID', async () => {
|
177
|
+
const mockUser = {
|
178
|
+
id: 1,
|
179
|
+
name: 'Test User',
|
180
|
+
email: 'user@email.com',
|
181
|
+
password: 'hashedpassword',
|
182
|
+
created_at: new Date(),
|
183
|
+
updated_at: new Date(),
|
184
|
+
multifactor_id: null,
|
185
|
+
code: null,
|
186
|
+
};
|
187
|
+
jest.spyOn(prismaService.user, 'findUnique').mockResolvedValue(mockUser);
|
188
|
+
|
189
|
+
const result = await service.get(1);
|
190
|
+
|
191
|
+
expect(prismaService.user.findUnique).toHaveBeenCalledWith({
|
192
|
+
where: { id: 1 },
|
193
|
+
});
|
194
|
+
expect(result).toEqual(mockUser);
|
195
|
+
});
|
196
|
+
});
|
197
|
+
|
198
|
+
describe('hashPassword', () => {
|
199
|
+
it('should hash the password correctly', async () => {
|
200
|
+
const password = 'plainPassword';
|
201
|
+
const result = await service.hashPassword(password);
|
202
|
+
|
203
|
+
expect(genSalt).toHaveBeenCalledWith(SALT_ROUNDS);
|
204
|
+
expect(hash).toHaveBeenCalledWith(password, 'mockSalt');
|
205
|
+
expect(result).toEqual('mockHashedPassword');
|
206
|
+
});
|
207
|
+
});
|
208
|
+
|
209
|
+
describe('create', () => {
|
210
|
+
it('should create a new user with hashed password', async () => {
|
211
|
+
const createDTO: CreateDTO = {
|
212
|
+
email: 'test@test.com',
|
213
|
+
name: 'Test User',
|
214
|
+
password: 'password123',
|
215
|
+
};
|
216
|
+
const mockUser = {
|
217
|
+
id: 1,
|
218
|
+
name: 'Test User',
|
219
|
+
email: 'user@email.com',
|
220
|
+
password: 'hashedpassword',
|
221
|
+
created_at: new Date(),
|
222
|
+
updated_at: new Date(),
|
223
|
+
multifactor_id: null,
|
224
|
+
code: null,
|
225
|
+
};
|
226
|
+
|
227
|
+
jest.spyOn(prismaService.user, 'create').mockResolvedValue(mockUser);
|
228
|
+
|
229
|
+
const result = await service.create(createDTO);
|
230
|
+
|
231
|
+
expect(prismaService.user.create).toHaveBeenCalledWith({
|
232
|
+
data: {
|
233
|
+
email: createDTO.email,
|
234
|
+
name: createDTO.name,
|
235
|
+
password: 'mockHashedPassword',
|
236
|
+
},
|
237
|
+
});
|
238
|
+
expect(result).toEqual(mockUser);
|
239
|
+
});
|
240
|
+
});
|
241
|
+
|
242
|
+
describe('update', () => {
|
243
|
+
it('should update an existing user', async () => {
|
244
|
+
const updateDTO: UpdateDTO = { name: 'Updated User' };
|
245
|
+
const updateInput = { id: 1, data: updateDTO };
|
246
|
+
const mockUser = {
|
247
|
+
id: 1,
|
248
|
+
name: 'Updated User',
|
249
|
+
email: 'user@email.com',
|
250
|
+
password: 'hashedpassword',
|
251
|
+
created_at: new Date(),
|
252
|
+
updated_at: new Date(),
|
253
|
+
multifactor_id: null,
|
254
|
+
code: null,
|
255
|
+
};
|
256
|
+
jest.spyOn(prismaService.user, 'update').mockResolvedValue(mockUser);
|
257
|
+
|
258
|
+
const result = await service.update(updateInput);
|
259
|
+
|
260
|
+
expect(prismaService.user.update).toHaveBeenCalledWith({
|
261
|
+
where: { id: updateInput.id },
|
262
|
+
data: updateInput.data,
|
263
|
+
});
|
264
|
+
expect(result).toEqual(mockUser);
|
265
|
+
});
|
266
|
+
});
|
267
|
+
|
268
|
+
describe('delete', () => {
|
269
|
+
it('should throw an error if no ids are provided', async () => {
|
270
|
+
const deleteDTO: DeleteDTO = { ids: null };
|
271
|
+
|
272
|
+
await expect(service.delete(deleteDTO)).rejects.toThrow(
|
273
|
+
new BadRequestException('You must select at least one user to delete.'),
|
274
|
+
);
|
275
|
+
});
|
276
|
+
|
277
|
+
it('should delete user by ids', async () => {
|
278
|
+
const deleteDTO: DeleteDTO = { ids: [1, 2] };
|
279
|
+
|
280
|
+
jest
|
281
|
+
.spyOn(prismaService.user, 'deleteMany')
|
282
|
+
.mockResolvedValue({ count: 2 });
|
283
|
+
|
284
|
+
await service.delete(deleteDTO);
|
285
|
+
|
286
|
+
expect(prismaService.user.deleteMany).toHaveBeenCalledWith({
|
287
|
+
where: {
|
288
|
+
id: { in: deleteDTO.ids },
|
289
|
+
email: { not: { startsWith: 'root@' } },
|
290
|
+
},
|
291
|
+
});
|
292
|
+
});
|
293
|
+
});
|
294
|
+
});
|