@volontariapp/domain-user 2.4.3-snap-a5f02b6 → 2.4.3
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.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-service.int.spec.d.ts","sourceRoot":"","sources":["../../../src/test/integration/user-service.int.spec.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import { describe, it, expect, beforeAll, afterAll, beforeEach } from '@jest/globals';
|
|
3
|
+
import { initializeTestDb, closeTestDb, truncateAll, getTestRepository } from '../data-source.js';
|
|
4
|
+
import { UserModel } from '../../models/user.model.js';
|
|
5
|
+
import { BadgeModel } from '../../models/badge.model.js';
|
|
6
|
+
import { PostgresUserRepository } from '../../repositories/postgres-user.repository.js';
|
|
7
|
+
import { PostgresBadgeRepository } from '../../repositories/postgres-badge.repository.js';
|
|
8
|
+
import { UserService } from '../../services/user.service.js';
|
|
9
|
+
import { BadgeService } from '../../services/badge.service.js';
|
|
10
|
+
import { UserFactory } from '../__test-utils__/factories/user.factory.js';
|
|
11
|
+
import { hashPassword, verifyPassword } from '@volontariapp/crypto';
|
|
12
|
+
import { UserId } from '../../value-objects/user.vo.js';
|
|
13
|
+
import { UpdateUserInput } from '../../value-objects/user.vo.js';
|
|
14
|
+
import { WRONG_PASSWORD } from '@volontariapp/errors-nest';
|
|
15
|
+
describe('UserService (Integration)', () => {
|
|
16
|
+
let userService;
|
|
17
|
+
let userRepository;
|
|
18
|
+
beforeAll(async () => {
|
|
19
|
+
await initializeTestDb();
|
|
20
|
+
userRepository = new PostgresUserRepository(getTestRepository(UserModel), 'test-email-encryption-secret-32ch');
|
|
21
|
+
const badgeRepository = new PostgresBadgeRepository(getTestRepository(BadgeModel));
|
|
22
|
+
const badgeService = new BadgeService(badgeRepository);
|
|
23
|
+
userService = new UserService(userRepository, badgeService);
|
|
24
|
+
});
|
|
25
|
+
afterAll(async () => {
|
|
26
|
+
await closeTestDb();
|
|
27
|
+
});
|
|
28
|
+
beforeEach(async () => {
|
|
29
|
+
await truncateAll();
|
|
30
|
+
});
|
|
31
|
+
describe('update() with password change', () => {
|
|
32
|
+
it('should update password when previous password is correct', async () => {
|
|
33
|
+
const initialPassword = 'OldPassword123!';
|
|
34
|
+
const newPassword = 'NewPassword456!';
|
|
35
|
+
const input = UserFactory.buildInput({ email: 'test@example.com' });
|
|
36
|
+
const user = await userRepository.createWithHashedPassword(input, hashPassword(initialPassword));
|
|
37
|
+
const userId = new UserId(user.id);
|
|
38
|
+
const updateInput = new UpdateUserInput({
|
|
39
|
+
previousPassword: initialPassword,
|
|
40
|
+
newPassword: newPassword,
|
|
41
|
+
});
|
|
42
|
+
await userService.update(userId, updateInput);
|
|
43
|
+
const storedHash = await userRepository.findPasswordHashById(user.id);
|
|
44
|
+
if (storedHash === null)
|
|
45
|
+
throw new Error('Password hash not found');
|
|
46
|
+
expect(verifyPassword(newPassword, storedHash)).toBe(true);
|
|
47
|
+
expect(verifyPassword(initialPassword, storedHash)).toBe(false);
|
|
48
|
+
});
|
|
49
|
+
it('should throw WRONG_PASSWORD when previous password is incorrect', async () => {
|
|
50
|
+
const initialPassword = 'CorrectPassword123!';
|
|
51
|
+
const input = UserFactory.buildInput({ email: 'test2@example.com' });
|
|
52
|
+
const user = await userRepository.createWithHashedPassword(input, hashPassword(initialPassword));
|
|
53
|
+
const userId = new UserId(user.id);
|
|
54
|
+
const updateInput = new UpdateUserInput({
|
|
55
|
+
previousPassword: 'WrongPassword!',
|
|
56
|
+
newPassword: 'SomeNewPassword123!',
|
|
57
|
+
});
|
|
58
|
+
await expect(userService.update(userId, updateInput)).rejects.toThrow(WRONG_PASSWORD().message);
|
|
59
|
+
});
|
|
60
|
+
it('should not update password if newPassword is not provided', async () => {
|
|
61
|
+
const initialPassword = 'StayTheSame123!';
|
|
62
|
+
const input = UserFactory.buildInput({ email: 'test3@example.com', pseudo: 'InitialPseudo' });
|
|
63
|
+
const user = await userRepository.createWithHashedPassword(input, hashPassword(initialPassword));
|
|
64
|
+
const userId = new UserId(user.id);
|
|
65
|
+
const updateInput = new UpdateUserInput({
|
|
66
|
+
pseudo: 'NewPseudo',
|
|
67
|
+
});
|
|
68
|
+
await userService.update(userId, updateInput);
|
|
69
|
+
const storedHash = await userRepository.findPasswordHashById(user.id);
|
|
70
|
+
if (storedHash === null)
|
|
71
|
+
throw new Error('Password hash not found');
|
|
72
|
+
expect(verifyPassword(initialPassword, storedHash)).toBe(true);
|
|
73
|
+
const updatedUser = await userService.findById(userId);
|
|
74
|
+
expect(updatedUser.pseudo).toBe('NewPseudo');
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=user-service.int.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-service.int.spec.js","sourceRoot":"","sources":["../../../src/test/integration/user-service.int.spec.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAClG,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gDAAgD,CAAC;AACxF,OAAO,EAAE,uBAAuB,EAAE,MAAM,iDAAiD,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,6CAA6C,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,IAAI,WAAwB,CAAC;IAC7B,IAAI,cAAsC,CAAC;IAE3C,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,MAAM,gBAAgB,EAAE,CAAC;QAEzB,cAAc,GAAG,IAAI,sBAAsB,CACzC,iBAAiB,CAAC,SAAS,CAAC,EAC5B,mCAAmC,CACpC,CAAC;QACF,MAAM,eAAe,GAAG,IAAI,uBAAuB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;QACnF,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,eAAe,CAAC,CAAC;QAEvD,WAAW,GAAG,IAAI,WAAW,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,WAAW,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,MAAM,WAAW,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;QAC7C,EAAE,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;YAExE,MAAM,eAAe,GAAG,iBAAiB,CAAC;YAC1C,MAAM,WAAW,GAAG,iBAAiB,CAAC;YACtC,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;YACpE,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,wBAAwB,CACxD,KAAK,EACL,YAAY,CAAC,eAAe,CAAC,CAC9B,CAAC;YAEF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAGnC,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;gBACtC,gBAAgB,EAAE,eAAe;gBACjC,WAAW,EAAE,WAAW;aACzB,CAAC,CAAC;YAEH,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAG9C,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtE,IAAI,UAAU,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACpE,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3D,MAAM,CAAC,cAAc,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAE/E,MAAM,eAAe,GAAG,qBAAqB,CAAC;YAC9C,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;YACrE,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,wBAAwB,CACxD,KAAK,EACL,YAAY,CAAC,eAAe,CAAC,CAC9B,CAAC;YAEF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAGnC,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;gBACtC,gBAAgB,EAAE,gBAAgB;gBAClC,WAAW,EAAE,qBAAqB;aACnC,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACnE,cAAc,EAAE,CAAC,OAAO,CACzB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YAEzE,MAAM,eAAe,GAAG,iBAAiB,CAAC;YAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;YAC9F,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,wBAAwB,CACxD,KAAK,EACL,YAAY,CAAC,eAAe,CAAC,CAC9B,CAAC;YAEF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAGnC,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC;gBACtC,MAAM,EAAE,WAAW;aACpB,CAAC,CAAC;YAEH,MAAM,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAG9C,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtE,IAAI,UAAU,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YACpE,MAAM,CAAC,cAAc,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAG/D,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACvD,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@volontariapp/domain-user",
|
|
3
|
-
"version": "2.4.3
|
|
3
|
+
"version": "2.4.3",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"provenance": true
|
|
@@ -39,12 +39,12 @@
|
|
|
39
39
|
"migration:run": "TYPEORM_MIGRATION_RUN=true yarn typeorm migration:run -d src/test/data-source.ts"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@volontariapp/auth": "3.0.2
|
|
42
|
+
"@volontariapp/auth": "3.0.2",
|
|
43
43
|
"@volontariapp/contracts": "4.0.7",
|
|
44
44
|
"@volontariapp/crypto": "0.3.6",
|
|
45
45
|
"@volontariapp/database": "1.12.0",
|
|
46
46
|
"@volontariapp/errors": "0.5.0",
|
|
47
|
-
"@volontariapp/errors-nest": "0.10.2
|
|
47
|
+
"@volontariapp/errors-nest": "0.10.2",
|
|
48
48
|
"@volontariapp/logger": "0.2.3",
|
|
49
49
|
"@volontariapp/shared": "0.2.0"
|
|
50
50
|
},
|