@volontariapp/domain-user 2.3.5 → 2.3.7-snap-41ca1a9

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.
Files changed (120) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/entities/user.entity.d.ts +3 -1
  3. package/dist/entities/user.entity.d.ts.map +1 -1
  4. package/dist/entities/user.entity.js +41 -0
  5. package/dist/entities/user.entity.js.map +1 -1
  6. package/dist/models/mapper.d.ts +2 -0
  7. package/dist/models/mapper.d.ts.map +1 -0
  8. package/dist/models/mapper.js +36 -0
  9. package/dist/models/mapper.js.map +1 -0
  10. package/dist/models/user.model.js +3 -3
  11. package/dist/models/user.model.js.map +1 -1
  12. package/dist/repositories/index.d.ts +4 -0
  13. package/dist/repositories/index.d.ts.map +1 -0
  14. package/dist/repositories/index.js +4 -0
  15. package/dist/repositories/index.js.map +1 -0
  16. package/dist/repositories/interfaces/badge.repository.d.ts +11 -0
  17. package/dist/repositories/interfaces/badge.repository.d.ts.map +1 -0
  18. package/dist/repositories/interfaces/badge.repository.js +2 -0
  19. package/dist/repositories/interfaces/badge.repository.js.map +1 -0
  20. package/dist/repositories/interfaces/index.d.ts +3 -0
  21. package/dist/repositories/interfaces/index.d.ts.map +1 -0
  22. package/dist/repositories/interfaces/index.js +3 -0
  23. package/dist/repositories/interfaces/index.js.map +1 -0
  24. package/dist/repositories/interfaces/user.repository.d.ts +16 -0
  25. package/dist/repositories/interfaces/user.repository.d.ts.map +1 -0
  26. package/dist/repositories/interfaces/user.repository.js +2 -0
  27. package/dist/repositories/interfaces/user.repository.js.map +1 -0
  28. package/dist/repositories/postgres-badge.repository.d.ts +12 -0
  29. package/dist/repositories/postgres-badge.repository.d.ts.map +1 -0
  30. package/dist/repositories/postgres-badge.repository.js +38 -0
  31. package/dist/repositories/postgres-badge.repository.js.map +1 -0
  32. package/dist/repositories/postgres-user.repository.d.ts +23 -0
  33. package/dist/repositories/postgres-user.repository.d.ts.map +1 -0
  34. package/dist/repositories/postgres-user.repository.js +94 -0
  35. package/dist/repositories/postgres-user.repository.js.map +1 -0
  36. package/dist/services/auth.service.d.ts +13 -0
  37. package/dist/services/auth.service.d.ts.map +1 -0
  38. package/dist/services/auth.service.js +95 -0
  39. package/dist/services/auth.service.js.map +1 -0
  40. package/dist/services/badge.service.d.ts +17 -0
  41. package/dist/services/badge.service.d.ts.map +1 -0
  42. package/dist/services/badge.service.js +152 -0
  43. package/dist/services/badge.service.js.map +1 -0
  44. package/dist/services/user.service.d.ts +22 -0
  45. package/dist/services/user.service.d.ts.map +1 -0
  46. package/dist/services/user.service.js +196 -0
  47. package/dist/services/user.service.js.map +1 -0
  48. package/dist/test/__test-utils__/factories/badge.factory.d.ts +19 -0
  49. package/dist/test/__test-utils__/factories/badge.factory.d.ts.map +1 -0
  50. package/dist/test/__test-utils__/factories/badge.factory.js +27 -0
  51. package/dist/test/__test-utils__/factories/badge.factory.js.map +1 -0
  52. package/dist/test/__test-utils__/factories/commands.factory.d.ts +16 -0
  53. package/dist/test/__test-utils__/factories/commands.factory.d.ts.map +1 -0
  54. package/dist/test/__test-utils__/factories/commands.factory.js +12 -0
  55. package/dist/test/__test-utils__/factories/commands.factory.js.map +1 -0
  56. package/dist/test/__test-utils__/factories/user.factory.d.ts +8 -0
  57. package/dist/test/__test-utils__/factories/user.factory.d.ts.map +1 -0
  58. package/dist/test/__test-utils__/factories/user.factory.js +42 -0
  59. package/dist/test/__test-utils__/factories/user.factory.js.map +1 -0
  60. package/dist/test/__test-utils__/mocks/badge.repository.mock.d.ts +4 -0
  61. package/dist/test/__test-utils__/mocks/badge.repository.mock.d.ts.map +1 -0
  62. package/dist/test/__test-utils__/mocks/badge.repository.mock.js +11 -0
  63. package/dist/test/__test-utils__/mocks/badge.repository.mock.js.map +1 -0
  64. package/dist/test/__test-utils__/mocks/user.repository.mock.d.ts +4 -0
  65. package/dist/test/__test-utils__/mocks/user.repository.mock.d.ts.map +1 -0
  66. package/dist/test/__test-utils__/mocks/user.repository.mock.js +16 -0
  67. package/dist/test/__test-utils__/mocks/user.repository.mock.js.map +1 -0
  68. package/dist/test/data-source.d.ts +8 -0
  69. package/dist/test/data-source.d.ts.map +1 -0
  70. package/dist/test/data-source.js +36 -0
  71. package/dist/test/data-source.js.map +1 -0
  72. package/dist/test/integration/postgres-badge.repository.int.spec.d.ts +2 -0
  73. package/dist/test/integration/postgres-badge.repository.int.spec.d.ts.map +1 -0
  74. package/dist/test/integration/postgres-badge.repository.int.spec.js +129 -0
  75. package/dist/test/integration/postgres-badge.repository.int.spec.js.map +1 -0
  76. package/dist/test/integration/postgres-user.repository.int.spec.d.ts +2 -0
  77. package/dist/test/integration/postgres-user.repository.int.spec.d.ts.map +1 -0
  78. package/dist/test/integration/postgres-user.repository.int.spec.js +222 -0
  79. package/dist/test/integration/postgres-user.repository.int.spec.js.map +1 -0
  80. package/dist/test/migrations/1776334421317-InitialUserSchema.d.ts +7 -0
  81. package/dist/test/migrations/1776334421317-InitialUserSchema.d.ts.map +1 -0
  82. package/dist/test/migrations/1776334421317-InitialUserSchema.js +58 -0
  83. package/dist/test/migrations/1776334421317-InitialUserSchema.js.map +1 -0
  84. package/dist/test/setup.d.ts +2 -0
  85. package/dist/test/setup.d.ts.map +1 -0
  86. package/dist/test/setup.js +2 -0
  87. package/dist/test/setup.js.map +1 -0
  88. package/dist/test/unit/auth.service.unit.spec.d.ts +2 -0
  89. package/dist/test/unit/auth.service.unit.spec.d.ts.map +1 -0
  90. package/dist/test/unit/auth.service.unit.spec.js +233 -0
  91. package/dist/test/unit/auth.service.unit.spec.js.map +1 -0
  92. package/dist/test/unit/badge.service.unit.spec.d.ts +2 -0
  93. package/dist/test/unit/badge.service.unit.spec.d.ts.map +1 -0
  94. package/dist/test/unit/badge.service.unit.spec.js +137 -0
  95. package/dist/test/unit/badge.service.unit.spec.js.map +1 -0
  96. package/dist/test/unit/mapper.unit.spec.d.ts +2 -0
  97. package/dist/test/unit/mapper.unit.spec.d.ts.map +1 -0
  98. package/dist/test/unit/mapper.unit.spec.js +358 -0
  99. package/dist/test/unit/mapper.unit.spec.js.map +1 -0
  100. package/dist/test/unit/user.service.unit.spec.d.ts +2 -0
  101. package/dist/test/unit/user.service.unit.spec.d.ts.map +1 -0
  102. package/dist/test/unit/user.service.unit.spec.js +496 -0
  103. package/dist/test/unit/user.service.unit.spec.js.map +1 -0
  104. package/dist/value-objects/auth.vo.d.ts +26 -0
  105. package/dist/value-objects/auth.vo.d.ts.map +1 -0
  106. package/dist/value-objects/auth.vo.js +41 -0
  107. package/dist/value-objects/auth.vo.js.map +1 -0
  108. package/dist/value-objects/badge.vo.d.ts +28 -0
  109. package/dist/value-objects/badge.vo.d.ts.map +1 -0
  110. package/dist/value-objects/badge.vo.js +37 -0
  111. package/dist/value-objects/badge.vo.js.map +1 -0
  112. package/dist/value-objects/index.d.ts +4 -0
  113. package/dist/value-objects/index.d.ts.map +1 -0
  114. package/dist/value-objects/index.js +4 -0
  115. package/dist/value-objects/index.js.map +1 -0
  116. package/dist/value-objects/user.vo.d.ts +40 -0
  117. package/dist/value-objects/user.vo.d.ts.map +1 -0
  118. package/dist/value-objects/user.vo.js +53 -0
  119. package/dist/value-objects/user.vo.js.map +1 -0
  120. package/package.json +13 -3
@@ -0,0 +1,496 @@
1
+ import 'reflect-metadata';
2
+ import { jest, describe, it, expect, beforeEach, afterEach } from '@jest/globals';
3
+ import { UserService } from '../../services/user.service.js';
4
+ import { Logger } from '@volontariapp/logger';
5
+ import { NotFoundError } from '@volontariapp/errors';
6
+ import { UserFactory } from '../__test-utils__/factories/user.factory.js';
7
+ import { createUserRepositoryMock } from '../__test-utils__/mocks/user.repository.mock.js';
8
+ import { BadgeFactory } from '../__test-utils__/factories/badge.factory.js';
9
+ import { UserId, UserEmail, UserRna, UpdateUserInput, PaginationInput, ImpactScore, } from '../../value-objects/index.js';
10
+ import { BadgeId } from '../../value-objects/index.js';
11
+ describe('UserService (Unit)', () => {
12
+ let service;
13
+ let mockRepository;
14
+ let mockBadgeService;
15
+ let loggerWarnSpy;
16
+ let loggerErrorSpy;
17
+ beforeEach(() => {
18
+ mockRepository = createUserRepositoryMock();
19
+ mockBadgeService = { findById: jest.fn() };
20
+ service = new UserService(mockRepository, mockBadgeService);
21
+ loggerWarnSpy = jest.spyOn(Logger.prototype, 'warn').mockImplementation(() => undefined);
22
+ loggerErrorSpy = jest.spyOn(Logger.prototype, 'error').mockImplementation(() => undefined);
23
+ });
24
+ afterEach(() => {
25
+ jest.clearAllMocks();
26
+ });
27
+ describe('findById()', () => {
28
+ describe('HAPPY PATH: User exists', () => {
29
+ it('should return the user entity with all properties', async () => {
30
+ const user = UserFactory.build({
31
+ id: 'user-123',
32
+ email: 'john@example.com',
33
+ pseudo: 'johndoe',
34
+ totalImpactScore: 42,
35
+ });
36
+ mockRepository.findById.mockResolvedValue(user);
37
+ const result = await service.findById(new UserId('user-123'));
38
+ expect(result).toEqual(user);
39
+ expect(result.id).toBe('user-123');
40
+ expect(result.totalImpactScore).toBe(42);
41
+ expect(mockRepository.findById.mock.calls[mockRepository.findById.mock.calls.length - 1]).toEqual(['user-123']);
42
+ expect(mockRepository.findById.mock.calls).toHaveLength(1);
43
+ });
44
+ });
45
+ describe('SAD PATH: User not found', () => {
46
+ it('should throw NOT_FOUND error with correct message when user does not exist', async () => {
47
+ mockRepository.findById.mockResolvedValue(null);
48
+ const error = await service.findById(new UserId('missing-user')).catch((e) => e);
49
+ expect(error.code).toBe('NOT_FOUND');
50
+ expect(error.message).toContain('User with id missing-user not found');
51
+ expect(loggerWarnSpy).toHaveBeenCalledWith('User with id missing-user not found');
52
+ });
53
+ it('should log warning when user not found', async () => {
54
+ mockRepository.findById.mockResolvedValue(null);
55
+ try {
56
+ await service.findById(new UserId('nonexistent'));
57
+ }
58
+ catch {
59
+ }
60
+ expect(loggerWarnSpy).toHaveBeenCalled();
61
+ });
62
+ });
63
+ describe('ERROR HANDLING: Repository failure', () => {
64
+ it('should throw DATABASE_ERROR when repository throws', async () => {
65
+ const dbError = new Error('Connection timeout');
66
+ mockRepository.findById.mockRejectedValue(dbError);
67
+ const error = await service.findById(new UserId('user-1')).catch((e) => e);
68
+ expect(error.code).toBe('DATABASE_ERROR');
69
+ expect(error.message).toContain('finding user by id');
70
+ expect(loggerErrorSpy).toHaveBeenCalled();
71
+ });
72
+ it('should not wrap BaseError - re-throw directly', async () => {
73
+ const customError = new Error('Already handled error');
74
+ customError.name = 'BaseError';
75
+ customError.code = 'CUSTOM_ERROR';
76
+ mockRepository.findById.mockRejectedValue(customError);
77
+ await expect(service.findById(new UserId('user-1'))).rejects.toThrow();
78
+ });
79
+ });
80
+ });
81
+ describe('findByEmail()', () => {
82
+ describe('HAPPY PATH: User found', () => {
83
+ it('should return user entity when email matches', async () => {
84
+ const user = UserFactory.build({ email: 'alice@example.com' });
85
+ mockRepository.findByEmail.mockResolvedValue(user);
86
+ const result = await service.findByEmail(new UserEmail('alice@example.com'));
87
+ expect(result).toEqual(user);
88
+ expect(result.email).toBe('alice@example.com');
89
+ expect(mockRepository.findByEmail.mock.calls[mockRepository.findByEmail.mock.calls.length - 1]).toEqual(['alice@example.com']);
90
+ });
91
+ });
92
+ describe('SAD PATH: User not found by email', () => {
93
+ it('should throw NOT_FOUND error with "email" variant message', async () => {
94
+ mockRepository.findByEmail.mockResolvedValue(null);
95
+ const error = await service
96
+ .findByEmail(new UserEmail('notfound@example.com'))
97
+ .catch((e) => e);
98
+ expect(error.code).toBe('NOT_FOUND');
99
+ expect(error.message).toContain('notfound@example.com');
100
+ expect(loggerWarnSpy).toHaveBeenCalled();
101
+ });
102
+ it('should handle empty email string', async () => {
103
+ mockRepository.findByEmail.mockResolvedValue(null);
104
+ const error = await service.findByEmail(new UserEmail('')).catch((e) => e);
105
+ expect(error.code).toBe('NOT_FOUND');
106
+ });
107
+ });
108
+ describe('ERROR HANDLING: Repository fails', () => {
109
+ it('should throw DATABASE_ERROR when repository throws', async () => {
110
+ mockRepository.findByEmail.mockRejectedValue(new Error('DB connection lost'));
111
+ const error = await service
112
+ .findByEmail(new UserEmail('test@example.com'))
113
+ .catch((e) => e);
114
+ expect(error.code).toBe('DATABASE_ERROR');
115
+ expect(loggerErrorSpy).toHaveBeenCalled();
116
+ });
117
+ });
118
+ });
119
+ describe('findByRna()', () => {
120
+ describe('HAPPY PATH: User found by RNA', () => {
121
+ it('should return user when valid RNA matches', async () => {
122
+ const user = UserFactory.build({ rna: 'W123456789' });
123
+ mockRepository.findByRna.mockResolvedValue(user);
124
+ const result = await service.findByRna(new UserRna('W123456789'));
125
+ expect(result).toEqual(user);
126
+ expect(result.rna).toBe('W123456789');
127
+ expect(mockRepository.findByRna.mock.calls).toHaveLength(1);
128
+ });
129
+ });
130
+ describe('SAD PATH: User not found by RNA', () => {
131
+ it('should throw NOT_FOUND with "rna" variant message', async () => {
132
+ mockRepository.findByRna.mockResolvedValue(null);
133
+ const error = await service.findByRna(new UserRna('W000000000')).catch((e) => e);
134
+ expect(error.code).toBe('NOT_FOUND');
135
+ expect(error.message).toContain('rna');
136
+ expect(loggerWarnSpy).toHaveBeenCalled();
137
+ });
138
+ });
139
+ describe('ERROR HANDLING: Repository fails', () => {
140
+ it('should throw DATABASE_ERROR when repository fails', async () => {
141
+ mockRepository.findByRna.mockRejectedValue(new Error('Query error'));
142
+ const error = await service.findByRna(new UserRna('W123456789')).catch((e) => e);
143
+ expect(error.code).toBe('DATABASE_ERROR');
144
+ expect(loggerErrorSpy).toHaveBeenCalled();
145
+ });
146
+ });
147
+ });
148
+ describe('findAll()', () => {
149
+ describe('HAPPY PATH: Pagination works', () => {
150
+ it('should return users array with total count', async () => {
151
+ const users = UserFactory.buildMany(3);
152
+ mockRepository.findAll.mockResolvedValue([users, 10]);
153
+ const result = await service.findAll(new PaginationInput(10, 0));
154
+ expect(result.users).toHaveLength(3);
155
+ expect(result.users).toEqual(users);
156
+ expect(result.total).toBe(10);
157
+ expect(mockRepository.findAll.mock.calls[mockRepository.findAll.mock.calls.length - 1]).toEqual([10, 0]);
158
+ });
159
+ it('should handle pagination with custom offset', async () => {
160
+ const users = UserFactory.buildMany(5);
161
+ mockRepository.findAll.mockResolvedValue([users, 25]);
162
+ const result = await service.findAll(new PaginationInput(5, 20));
163
+ expect(result.users).toHaveLength(5);
164
+ expect(result.total).toBe(25);
165
+ expect(mockRepository.findAll.mock.calls[mockRepository.findAll.mock.calls.length - 1]).toEqual([5, 20]);
166
+ });
167
+ it('should use default params when not provided', async () => {
168
+ const users = UserFactory.buildMany(1);
169
+ mockRepository.findAll.mockResolvedValue([users, 1]);
170
+ const result = await service.findAll();
171
+ expect(result.users).toHaveLength(1);
172
+ expect(mockRepository.findAll.mock.calls[mockRepository.findAll.mock.calls.length - 1]).toEqual([undefined, undefined]);
173
+ });
174
+ it('should return empty array when no users exist', async () => {
175
+ mockRepository.findAll.mockResolvedValue([[], 0]);
176
+ const result = await service.findAll(new PaginationInput(10, 0));
177
+ expect(result.users).toEqual([]);
178
+ expect(result.total).toBe(0);
179
+ });
180
+ });
181
+ describe('ERROR HANDLING: Repository fails', () => {
182
+ it('should throw DATABASE_ERROR when repository throws', async () => {
183
+ mockRepository.findAll.mockRejectedValue(new Error('Query failed'));
184
+ const error = await service.findAll().catch((e) => e);
185
+ expect(error.code).toBe('DATABASE_ERROR');
186
+ expect(loggerErrorSpy).toHaveBeenCalled();
187
+ });
188
+ });
189
+ });
190
+ describe('update()', () => {
191
+ describe('HAPPY PATH: Update succeeds', () => {
192
+ it('should update user pseudo and return updated entity', async () => {
193
+ const updated = UserFactory.build({ id: 'user-123', pseudo: 'new-pseudo' });
194
+ mockRepository.update.mockResolvedValue(updated);
195
+ const result = await service.update(new UserId('user-123'), new UpdateUserInput({ pseudo: 'new-pseudo' }));
196
+ expect(result).toEqual(updated);
197
+ expect(result.pseudo).toBe('new-pseudo');
198
+ expect(mockRepository.update.mock.calls[mockRepository.update.mock.calls.length - 1]).toEqual(['user-123', { pseudo: 'new-pseudo' }]);
199
+ });
200
+ it('should update RNA with valid format', async () => {
201
+ const updated = UserFactory.build({ rna: 'W111111111' });
202
+ mockRepository.update.mockResolvedValue(updated);
203
+ const result = await service.update(new UserId('user-1'), new UpdateUserInput({ rna: 'W111111111' }));
204
+ expect(result).toEqual(updated);
205
+ expect(mockRepository.update.mock.calls[mockRepository.update.mock.calls.length - 1]).toEqual(['user-1', { rna: 'W111111111' }]);
206
+ });
207
+ it('should allow partial update with only logoPath', async () => {
208
+ const updated = UserFactory.build({ logoPath: '/new/logo.png' });
209
+ mockRepository.update.mockResolvedValue(updated);
210
+ const result = await service.update(new UserId('user-1'), new UpdateUserInput({ logoPath: '/new/logo.png' }));
211
+ expect(result.logoPath).toBe('/new/logo.png');
212
+ });
213
+ it('should not validate when no RNA change provided', async () => {
214
+ const updated = UserFactory.build({ bio: 'New bio' });
215
+ mockRepository.update.mockResolvedValue(updated);
216
+ await service.update(new UserId('user-1'), new UpdateUserInput({ bio: 'New bio' }));
217
+ expect(mockRepository.update.mock.calls[mockRepository.update.mock.calls.length - 1]).toEqual(['user-1', { bio: 'New bio' }]);
218
+ });
219
+ });
220
+ describe('SAD PATH: User not found', () => {
221
+ it('should throw NOT_FOUND when update returns null', async () => {
222
+ mockRepository.update.mockResolvedValue(null);
223
+ const error = await service
224
+ .update(new UserId('missing'), new UpdateUserInput({ pseudo: 'test' }))
225
+ .catch((e) => e);
226
+ expect(error.code).toBe('NOT_FOUND');
227
+ expect(error.message).toContain('missing');
228
+ expect(loggerWarnSpy).toHaveBeenCalled();
229
+ });
230
+ });
231
+ describe('SAD PATH: Validation fails', () => {
232
+ it('should throw BAD_REQUEST for invalid RNA on update', async () => {
233
+ const invalidRna = 'BAD-RNA-123';
234
+ const error = await service
235
+ .update(new UserId('user-1'), new UpdateUserInput({ rna: invalidRna }))
236
+ .catch((e) => e);
237
+ expect(error.code).toBe('BAD_REQUEST');
238
+ expect(error.message).toContain(invalidRna);
239
+ expect(loggerWarnSpy).toHaveBeenCalled();
240
+ expect(mockRepository.update.mock.calls).toHaveLength(0);
241
+ });
242
+ it('should not update if only null/undefined RNA provided', async () => {
243
+ const updated = UserFactory.build({ rna: undefined });
244
+ mockRepository.update.mockResolvedValue(updated);
245
+ await service.update(new UserId('user-1'), new UpdateUserInput({ rna: undefined }));
246
+ expect(mockRepository.update.mock.calls.length).toBeGreaterThan(0);
247
+ });
248
+ });
249
+ describe('ERROR HANDLING: Database failures', () => {
250
+ it('should throw DATABASE_ERROR when repository fails', async () => {
251
+ mockRepository.update.mockRejectedValue(new Error('Update failed'));
252
+ const error = await service
253
+ .update(new UserId('user-1'), new UpdateUserInput({ pseudo: 'new' }))
254
+ .catch((e) => e);
255
+ expect(error.code).toBe('DATABASE_ERROR');
256
+ expect(loggerErrorSpy).toHaveBeenCalled();
257
+ });
258
+ });
259
+ });
260
+ describe('delete()', () => {
261
+ describe('HAPPY PATH: User deleted', () => {
262
+ it('should delete user when found', async () => {
263
+ mockRepository.delete.mockResolvedValue(true);
264
+ await service.delete(new UserId('user-123'));
265
+ expect(mockRepository.delete.mock.calls[mockRepository.delete.mock.calls.length - 1]).toEqual(['user-123']);
266
+ expect(mockRepository.delete.mock.calls).toHaveLength(1);
267
+ });
268
+ });
269
+ describe('SAD PATH: User not found', () => {
270
+ it('should throw NOT_FOUND when user does not exist', async () => {
271
+ mockRepository.delete.mockResolvedValue(false);
272
+ const error = await service.delete(new UserId('missing')).catch((e) => e);
273
+ expect(error.code).toBe('NOT_FOUND');
274
+ expect(error.message).toContain('missing');
275
+ expect(loggerWarnSpy).toHaveBeenCalled();
276
+ });
277
+ });
278
+ describe('ERROR HANDLING: Database failures', () => {
279
+ it('should throw DATABASE_ERROR when repository fails', async () => {
280
+ mockRepository.delete.mockRejectedValue(new Error('Delete constraint violation'));
281
+ const error = await service.delete(new UserId('user-1')).catch((e) => e);
282
+ expect(error.code).toBe('DATABASE_ERROR');
283
+ expect(loggerErrorSpy).toHaveBeenCalled();
284
+ });
285
+ });
286
+ });
287
+ describe('addBadgeToUser()', () => {
288
+ describe('HAPPY PATH: Badge added successfully', () => {
289
+ it('should add badge to user when badge not already present', async () => {
290
+ const user = UserFactory.build({ id: 'user-123', badges: [] });
291
+ const badge = BadgeFactory.build({ id: 'badge-456' });
292
+ mockRepository.findById.mockResolvedValue(user);
293
+ mockBadgeService.findById.mockResolvedValue(badge);
294
+ mockRepository.addBadgeToUser.mockResolvedValue();
295
+ await service.addBadgeToUser(new UserId('user-123'), new BadgeId('badge-456'));
296
+ expect(mockRepository.findById.mock.calls[mockRepository.findById.mock.calls.length - 1]).toEqual(['user-123']);
297
+ expect(mockBadgeService.findById.mock.calls[mockBadgeService.findById.mock.calls.length - 1]).toEqual([new BadgeId('badge-456')]);
298
+ expect(mockRepository.addBadgeToUser.mock.calls[mockRepository.addBadgeToUser.mock.calls.length - 1]).toEqual(['user-123', 'badge-456']);
299
+ });
300
+ it('should add badge to user with existing badges', async () => {
301
+ const existingBadge = BadgeFactory.build({ id: 'badge-111' });
302
+ const newBadge = BadgeFactory.build({ id: 'badge-222' });
303
+ const user = UserFactory.build({ id: 'user-1', badges: [existingBadge] });
304
+ mockRepository.findById.mockResolvedValue(user);
305
+ mockBadgeService.findById.mockResolvedValue(newBadge);
306
+ mockRepository.addBadgeToUser.mockResolvedValue();
307
+ await service.addBadgeToUser(new UserId('user-1'), new BadgeId('badge-222'));
308
+ expect(mockRepository.addBadgeToUser.mock.calls[mockRepository.addBadgeToUser.mock.calls.length - 1]).toEqual(['user-1', 'badge-222']);
309
+ });
310
+ });
311
+ describe('SAD PATH: Badge already exists', () => {
312
+ it('should throw CONFLICT when user already has badge', async () => {
313
+ const badge = BadgeFactory.build({ id: 'badge-1' });
314
+ const user = UserFactory.build({ id: 'user-123', badges: [badge] });
315
+ mockRepository.findById.mockResolvedValue(user);
316
+ mockBadgeService.findById.mockResolvedValue(badge);
317
+ const error = await service
318
+ .addBadgeToUser(new UserId('user-123'), new BadgeId('badge-1'))
319
+ .catch((e) => e);
320
+ expect(error.code).toBe('CONFLICT');
321
+ expect(error.message).toContain('user-123');
322
+ expect(error.message).toContain('badge-1');
323
+ expect(loggerWarnSpy).toHaveBeenCalled();
324
+ expect(mockRepository.addBadgeToUser.mock.calls).toHaveLength(0);
325
+ });
326
+ });
327
+ describe('ERROR HANDLING: User or badge not found', () => {
328
+ it('should throw NOT_FOUND when user does not exist', async () => {
329
+ mockRepository.findById.mockResolvedValue(null);
330
+ const error = await service
331
+ .addBadgeToUser(new UserId('missing-user'), new BadgeId('badge-1'))
332
+ .catch((e) => e);
333
+ expect(error.code).toBe('NOT_FOUND');
334
+ expect(mockRepository.addBadgeToUser.mock.calls).toHaveLength(0);
335
+ });
336
+ it('should throw NOT_FOUND when badge does not exist', async () => {
337
+ const user = UserFactory.build({ id: 'user-1', badges: [] });
338
+ mockRepository.findById.mockResolvedValue(user);
339
+ const badgeNotFoundError = new NotFoundError('Badge with id missing-badge not found');
340
+ mockBadgeService.findById.mockRejectedValue(badgeNotFoundError);
341
+ const error = await service
342
+ .addBadgeToUser(new UserId('user-1'), new BadgeId('missing-badge'))
343
+ .catch((e) => e);
344
+ expect(error.code).toBe('NOT_FOUND');
345
+ });
346
+ it('should throw DATABASE_ERROR when repository fails', async () => {
347
+ const user = UserFactory.build({ id: 'user-1', badges: [] });
348
+ const badge = BadgeFactory.build({ id: 'badge-1' });
349
+ mockRepository.findById.mockResolvedValue(user);
350
+ mockBadgeService.findById.mockResolvedValue(badge);
351
+ mockRepository.addBadgeToUser.mockRejectedValue(new Error('DB error'));
352
+ const error = await service
353
+ .addBadgeToUser(new UserId('user-1'), new BadgeId('badge-1'))
354
+ .catch((e) => e);
355
+ expect(error.code).toBe('DATABASE_ERROR');
356
+ expect(loggerErrorSpy).toHaveBeenCalled();
357
+ });
358
+ });
359
+ });
360
+ describe('removeBadgeFromUser()', () => {
361
+ describe('HAPPY PATH: Badge removed successfully', () => {
362
+ it('should remove badge when user has it', async () => {
363
+ const badge = BadgeFactory.build({ id: 'badge-1' });
364
+ const user = UserFactory.build({ id: 'user-1', badges: [badge] });
365
+ mockRepository.findById.mockResolvedValue(user);
366
+ mockRepository.removeBadgeFromUser.mockResolvedValue();
367
+ await service.removeBadgeFromUser(new UserId('user-1'), new BadgeId('badge-1'));
368
+ expect(mockRepository.removeBadgeFromUser.mock.calls[mockRepository.removeBadgeFromUser.mock.calls.length - 1]).toEqual(['user-1', 'badge-1']);
369
+ expect(mockRepository.findById.mock.calls[mockRepository.findById.mock.calls.length - 1]).toEqual(['user-1']);
370
+ });
371
+ it('should remove badge from user with multiple badges', async () => {
372
+ const badge1 = BadgeFactory.build({ id: 'badge-1' });
373
+ const badge2 = BadgeFactory.build({ id: 'badge-2' });
374
+ const badge3 = BadgeFactory.build({ id: 'badge-3' });
375
+ const user = UserFactory.build({ id: 'user-1', badges: [badge1, badge2, badge3] });
376
+ mockRepository.findById.mockResolvedValue(user);
377
+ mockRepository.removeBadgeFromUser.mockResolvedValue();
378
+ await service.removeBadgeFromUser(new UserId('user-1'), new BadgeId('badge-2'));
379
+ expect(mockRepository.removeBadgeFromUser.mock.calls[mockRepository.removeBadgeFromUser.mock.calls.length - 1]).toEqual(['user-1', 'badge-2']);
380
+ });
381
+ });
382
+ describe('SAD PATH: Badge not found on user', () => {
383
+ it('should throw NOT_FOUND when user does not have badge', async () => {
384
+ const user = UserFactory.build({ id: 'user-1', badges: [] });
385
+ mockRepository.findById.mockResolvedValue(user);
386
+ const error = await service
387
+ .removeBadgeFromUser(new UserId('user-1'), new BadgeId('badge-1'))
388
+ .catch((e) => e);
389
+ expect(error.code).toBe('NOT_FOUND');
390
+ expect(error.message).toContain('user-1');
391
+ expect(error.message).toContain('badge-1');
392
+ expect(loggerWarnSpy).toHaveBeenCalled();
393
+ expect(mockRepository.removeBadgeFromUser.mock.calls).toHaveLength(0);
394
+ });
395
+ it('should throw NOT_FOUND when user has different badges', async () => {
396
+ const otherBadge = BadgeFactory.build({ id: 'other-badge' });
397
+ const user = UserFactory.build({ id: 'user-1', badges: [otherBadge] });
398
+ mockRepository.findById.mockResolvedValue(user);
399
+ const error = await service
400
+ .removeBadgeFromUser(new UserId('user-1'), new BadgeId('badge-to-remove'))
401
+ .catch((e) => e);
402
+ expect(error.code).toBe('NOT_FOUND');
403
+ });
404
+ });
405
+ describe('ERROR HANDLING: User not found', () => {
406
+ it('should throw NOT_FOUND when user does not exist', async () => {
407
+ mockRepository.findById.mockResolvedValue(null);
408
+ const error = await service
409
+ .removeBadgeFromUser(new UserId('missing-user'), new BadgeId('badge-1'))
410
+ .catch((e) => e);
411
+ expect(error.code).toBe('NOT_FOUND');
412
+ expect(mockRepository.removeBadgeFromUser.mock.calls).toHaveLength(0);
413
+ });
414
+ it('should throw DATABASE_ERROR when repository fails', async () => {
415
+ const badge = BadgeFactory.build({ id: 'badge-1' });
416
+ const user = UserFactory.build({ id: 'user-1', badges: [badge] });
417
+ mockRepository.findById.mockResolvedValue(user);
418
+ mockRepository.removeBadgeFromUser.mockRejectedValue(new Error('Delete failed'));
419
+ const error = await service
420
+ .removeBadgeFromUser(new UserId('user-1'), new BadgeId('badge-1'))
421
+ .catch((e) => e);
422
+ expect(error.code).toBe('DATABASE_ERROR');
423
+ expect(loggerErrorSpy).toHaveBeenCalled();
424
+ });
425
+ });
426
+ });
427
+ describe('incrementImpactScore()', () => {
428
+ describe('HAPPY PATH: Score incremented successfully', () => {
429
+ it('should increment score by positive amount', async () => {
430
+ mockRepository.incrementImpactScore.mockResolvedValue();
431
+ await service.incrementImpactScore(new UserId('user-1'), new ImpactScore(10));
432
+ expect(mockRepository.incrementImpactScore.mock.calls[mockRepository.incrementImpactScore.mock.calls.length - 1]).toEqual(['user-1', 10]);
433
+ expect(mockRepository.incrementImpactScore.mock.calls).toHaveLength(1);
434
+ });
435
+ it('should increment by minimum positive value (1)', async () => {
436
+ mockRepository.incrementImpactScore.mockResolvedValue();
437
+ await service.incrementImpactScore(new UserId('user-1'), new ImpactScore(1));
438
+ expect(mockRepository.incrementImpactScore.mock.calls[mockRepository.incrementImpactScore.mock.calls.length - 1]).toEqual(['user-1', 1]);
439
+ });
440
+ it('should increment by large positive value', async () => {
441
+ mockRepository.incrementImpactScore.mockResolvedValue();
442
+ await service.incrementImpactScore(new UserId('user-1'), new ImpactScore(9999));
443
+ expect(mockRepository.incrementImpactScore.mock.calls[mockRepository.incrementImpactScore.mock.calls.length - 1]).toEqual(['user-1', 9999]);
444
+ });
445
+ });
446
+ describe('SAD PATH: Invalid score increment', () => {
447
+ it('should throw BAD_REQUEST when score is zero', async () => {
448
+ const error = await service
449
+ .incrementImpactScore(new UserId('user-1'), new ImpactScore(0))
450
+ .catch((e) => e);
451
+ expect(error.code).toBe('BAD_REQUEST');
452
+ expect(error.message).toContain('0');
453
+ expect(loggerWarnSpy).toHaveBeenCalled();
454
+ expect(mockRepository.incrementImpactScore.mock.calls).toHaveLength(0);
455
+ });
456
+ it('should throw BAD_REQUEST when score is negative', async () => {
457
+ const error = await service
458
+ .incrementImpactScore(new UserId('user-1'), new ImpactScore(-5))
459
+ .catch((e) => e);
460
+ expect(error.code).toBe('BAD_REQUEST');
461
+ expect(error.message).toContain('-5');
462
+ expect(loggerWarnSpy).toHaveBeenCalled();
463
+ expect(mockRepository.incrementImpactScore.mock.calls).toHaveLength(0);
464
+ });
465
+ it('should throw BAD_REQUEST for very large negative', async () => {
466
+ const error = await service
467
+ .incrementImpactScore(new UserId('user-1'), new ImpactScore(-9999))
468
+ .catch((e) => e);
469
+ expect(error.code).toBe('BAD_REQUEST');
470
+ expect(mockRepository.incrementImpactScore.mock.calls).toHaveLength(0);
471
+ });
472
+ });
473
+ describe('ERROR HANDLING: Repository failure', () => {
474
+ it('should throw DATABASE_ERROR when repository fails', async () => {
475
+ mockRepository.incrementImpactScore.mockRejectedValue(new Error('Update failed'));
476
+ const error = await service
477
+ .incrementImpactScore(new UserId('user-1'), new ImpactScore(5))
478
+ .catch((e) => e);
479
+ expect(error.code).toBe('DATABASE_ERROR');
480
+ expect(error.message).toContain('incrementing impact score');
481
+ expect(loggerErrorSpy).toHaveBeenCalled();
482
+ });
483
+ it('should log error details when repository fails', async () => {
484
+ const dbError = new Error('Connection pool exhausted');
485
+ mockRepository.incrementImpactScore.mockRejectedValue(dbError);
486
+ try {
487
+ await service.incrementImpactScore(new UserId('user-1'), new ImpactScore(3));
488
+ }
489
+ catch {
490
+ }
491
+ expect(loggerErrorSpy).toHaveBeenCalled();
492
+ });
493
+ });
494
+ });
495
+ });
496
+ //# sourceMappingURL=user.service.unit.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.service.unit.spec.js","sourceRoot":"","sources":["../../../src/test/unit/user.service.unit.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { UserEntity } from '../entities/user.entity.js';
2
+ export declare class SignUpInput {
3
+ readonly email: string;
4
+ readonly password: string;
5
+ readonly pseudo?: string | undefined;
6
+ readonly bio?: string | undefined;
7
+ readonly logoPath?: string | undefined;
8
+ readonly rna?: string | undefined;
9
+ constructor(email: string, password: string, pseudo?: string | undefined, bio?: string | undefined, logoPath?: string | undefined, rna?: string | undefined);
10
+ }
11
+ export declare class LoginInput {
12
+ readonly email: string;
13
+ readonly password: string;
14
+ constructor(email: string, password: string);
15
+ }
16
+ export declare class AuthTokens {
17
+ readonly accessToken: string;
18
+ readonly refreshToken: string;
19
+ constructor(accessToken: string, refreshToken: string);
20
+ }
21
+ export declare class SignUpOutput {
22
+ readonly user: UserEntity;
23
+ readonly auth: AuthTokens;
24
+ constructor(user: UserEntity, auth: AuthTokens);
25
+ }
26
+ //# sourceMappingURL=auth.vo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.vo.d.ts","sourceRoot":"","sources":["../../src/value-objects/auth.vo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAE7D,qBAAa,WAAW;aAEJ,KAAK,EAAE,MAAM;aACb,QAAQ,EAAE,MAAM;aAChB,MAAM,CAAC,EAAE,MAAM;aACf,GAAG,CAAC,EAAE,MAAM;aACZ,QAAQ,CAAC,EAAE,MAAM;aACjB,GAAG,CAAC,EAAE,MAAM;gBALZ,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,YAAA,EACf,GAAG,CAAC,EAAE,MAAM,YAAA,EACZ,QAAQ,CAAC,EAAE,MAAM,YAAA,EACjB,GAAG,CAAC,EAAE,MAAM,YAAA;CAE/B;AAED,qBAAa,UAAU;aAEH,KAAK,EAAE,MAAM;aACb,QAAQ,EAAE,MAAM;gBADhB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM;CAEnC;AAED,qBAAa,UAAU;aAEH,WAAW,EAAE,MAAM;aACnB,YAAY,EAAE,MAAM;gBADpB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM;CAEvC;AAED,qBAAa,YAAY;aAEL,IAAI,EAAE,UAAU;aAChB,IAAI,EAAE,UAAU;gBADhB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU;CAEnC"}
@@ -0,0 +1,41 @@
1
+ export class SignUpInput {
2
+ email;
3
+ password;
4
+ pseudo;
5
+ bio;
6
+ logoPath;
7
+ rna;
8
+ constructor(email, password, pseudo, bio, logoPath, rna) {
9
+ this.email = email;
10
+ this.password = password;
11
+ this.pseudo = pseudo;
12
+ this.bio = bio;
13
+ this.logoPath = logoPath;
14
+ this.rna = rna;
15
+ }
16
+ }
17
+ export class LoginInput {
18
+ email;
19
+ password;
20
+ constructor(email, password) {
21
+ this.email = email;
22
+ this.password = password;
23
+ }
24
+ }
25
+ export class AuthTokens {
26
+ accessToken;
27
+ refreshToken;
28
+ constructor(accessToken, refreshToken) {
29
+ this.accessToken = accessToken;
30
+ this.refreshToken = refreshToken;
31
+ }
32
+ }
33
+ export class SignUpOutput {
34
+ user;
35
+ auth;
36
+ constructor(user, auth) {
37
+ this.user = user;
38
+ this.auth = auth;
39
+ }
40
+ }
41
+ //# sourceMappingURL=auth.vo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.vo.js","sourceRoot":"","sources":["../../src/value-objects/auth.vo.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,WAAW;IAEJ;IACA;IACA;IACA;IACA;IACA;IANlB,YACkB,KAAa,EACb,QAAgB,EAChB,MAAe,EACf,GAAY,EACZ,QAAiB,EACjB,GAAY;QALZ,UAAK,GAAL,KAAK,CAAQ;QACb,aAAQ,GAAR,QAAQ,CAAQ;QAChB,WAAM,GAAN,MAAM,CAAS;QACf,QAAG,GAAH,GAAG,CAAS;QACZ,aAAQ,GAAR,QAAQ,CAAS;QACjB,QAAG,GAAH,GAAG,CAAS;IAC3B,CAAC;CACL;AAED,MAAM,OAAO,UAAU;IAEH;IACA;IAFlB,YACkB,KAAa,EACb,QAAgB;QADhB,UAAK,GAAL,KAAK,CAAQ;QACb,aAAQ,GAAR,QAAQ,CAAQ;IAC/B,CAAC;CACL;AAED,MAAM,OAAO,UAAU;IAEH;IACA;IAFlB,YACkB,WAAmB,EACnB,YAAoB;QADpB,gBAAW,GAAX,WAAW,CAAQ;QACnB,iBAAY,GAAZ,YAAY,CAAQ;IACnC,CAAC;CACL;AAED,MAAM,OAAO,YAAY;IAEL;IACA;IAFlB,YACkB,IAAgB,EAChB,IAAgB;QADhB,SAAI,GAAJ,IAAI,CAAY;QAChB,SAAI,GAAJ,IAAI,CAAY;IAC/B,CAAC;CACL"}