@@ -198,7 +198,7 @@ describe('UserService', () => {
198
198
describe ( 'getSelfUserData' , ( ) => {
199
199
it ( 'should return self user data' , async ( ) => {
200
200
const user = { _id : 'test-id' } as UserDocument ;
201
- const userData = { ...user } as UserDocument ;
201
+ const userData = { ...user , lastSeen : new Date ( ) } as UserDocument ;
202
202
203
203
jest . spyOn ( service , 'findByID' ) . mockResolvedValue ( userData ) ;
204
204
@@ -217,6 +217,161 @@ describe('UserService', () => {
217
217
new HttpException ( 'user not found' , HttpStatus . NOT_FOUND ) ,
218
218
) ;
219
219
} ) ;
220
+
221
+ it ( 'should update lastSeen and increment loginStreak if lastSeen is before today' , async ( ) => {
222
+ const user = { _id : 'test-id' } as UserDocument ;
223
+ const yesterday = new Date ( ) ;
224
+ yesterday . setDate ( yesterday . getDate ( ) - 1 ) ;
225
+ yesterday . setHours ( 0 , 0 , 0 , 0 ) ;
226
+
227
+ const userData = {
228
+ ...user ,
229
+ lastSeen : yesterday ,
230
+ loginStreak : 1 ,
231
+ save : jest . fn ( ) . mockResolvedValue ( true ) ,
232
+ } as unknown as UserDocument ;
233
+
234
+ jest . spyOn ( service , 'findByID' ) . mockResolvedValue ( userData ) ;
235
+
236
+ const result = await service . getSelfUserData ( user ) ;
237
+
238
+ expect ( result . lastSeen ) . toBeInstanceOf ( Date ) ;
239
+ expect ( result . loginStreak ) . toBe ( 2 ) ;
240
+ expect ( userData . save ) . toHaveBeenCalled ( ) ;
241
+ } ) ;
242
+
243
+ it ( 'should not update lastSeen or increment loginStreak if lastSeen is today' , async ( ) => {
244
+ const user = { _id : 'test-id' } as UserDocument ;
245
+ const today = new Date ( ) ;
246
+ today . setHours ( 0 , 0 , 0 , 0 ) ;
247
+
248
+ const userData = {
249
+ ...user ,
250
+ lastSeen : today ,
251
+ loginStreak : 1 ,
252
+ save : jest . fn ( ) . mockResolvedValue ( true ) ,
253
+ } as unknown as UserDocument ;
254
+
255
+ jest . spyOn ( service , 'findByID' ) . mockResolvedValue ( userData ) ;
256
+
257
+ const result = await service . getSelfUserData ( user ) ;
258
+
259
+ expect ( result . lastSeen ) . toEqual ( today ) ;
260
+ expect ( result . loginStreak ) . toBe ( 1 ) ;
261
+ expect ( userData . save ) . not . toHaveBeenCalled ( ) ;
262
+ } ) ;
263
+
264
+ it ( 'should reset loginStreak if lastSeen is not yesterday' , async ( ) => {
265
+ const user = { _id : 'test-id' } as UserDocument ;
266
+ const twoDaysAgo = new Date ( ) ;
267
+ twoDaysAgo . setDate ( twoDaysAgo . getDate ( ) - 2 ) ;
268
+ twoDaysAgo . setHours ( 0 , 0 , 0 , 0 ) ;
269
+
270
+ const userData = {
271
+ ...user ,
272
+ lastSeen : twoDaysAgo ,
273
+ loginStreak : 5 ,
274
+ save : jest . fn ( ) . mockResolvedValue ( true ) ,
275
+ } as unknown as UserDocument ;
276
+
277
+ jest . spyOn ( service , 'findByID' ) . mockResolvedValue ( userData ) ;
278
+
279
+ const result = await service . getSelfUserData ( user ) ;
280
+
281
+ expect ( result . lastSeen ) . toBeInstanceOf ( Date ) ;
282
+ expect ( result . loginStreak ) . toBe ( 1 ) ;
283
+ expect ( userData . save ) . toHaveBeenCalled ( ) ;
284
+ } ) ;
285
+
286
+ it ( 'should increment loginCount if lastSeen is not today' , async ( ) => {
287
+ const user = { _id : 'test-id' } as UserDocument ;
288
+ const yesterday = new Date ( ) ;
289
+ yesterday . setDate ( yesterday . getDate ( ) - 1 ) ;
290
+ yesterday . setHours ( 0 , 0 , 0 , 0 ) ;
291
+
292
+ const userData = {
293
+ ...user ,
294
+ lastSeen : yesterday ,
295
+ loginCount : 5 ,
296
+ save : jest . fn ( ) . mockResolvedValue ( true ) ,
297
+ } as unknown as UserDocument ;
298
+
299
+ jest . spyOn ( service , 'findByID' ) . mockResolvedValue ( userData ) ;
300
+
301
+ const result = await service . getSelfUserData ( user ) ;
302
+
303
+ expect ( result . lastSeen ) . toBeInstanceOf ( Date ) ;
304
+ expect ( result . loginCount ) . toBe ( 6 ) ;
305
+ expect ( userData . save ) . toHaveBeenCalled ( ) ;
306
+ } ) ;
307
+
308
+ it ( 'should not increment loginCount if lastSeen is today' , async ( ) => {
309
+ const user = { _id : 'test-id' } as UserDocument ;
310
+
311
+ const today = new Date ( ) ;
312
+ today . setHours ( 0 , 0 , 0 , 0 ) ;
313
+
314
+ const userData = {
315
+ ...user ,
316
+ lastSeen : today ,
317
+ loginCount : 5 ,
318
+ save : jest . fn ( ) . mockResolvedValue ( true ) ,
319
+ } as unknown as UserDocument ;
320
+
321
+ jest . spyOn ( service , 'findByID' ) . mockResolvedValue ( userData ) ;
322
+
323
+ const result = await service . getSelfUserData ( user ) ;
324
+
325
+ expect ( result . lastSeen ) . toEqual ( today ) ;
326
+ expect ( result . loginCount ) . toBe ( 5 ) ;
327
+ expect ( userData . save ) . not . toHaveBeenCalled ( ) ;
328
+ } ) ;
329
+
330
+ it ( 'should increment maxLoginStreak if login streak exceeds max' , async ( ) => {
331
+ const user = { _id : 'test-id' } as UserDocument ;
332
+
333
+ const yesterday = new Date ( ) ;
334
+ yesterday . setDate ( yesterday . getDate ( ) - 1 ) ;
335
+ yesterday . setHours ( 0 , 0 , 0 , 0 ) ;
336
+
337
+ const userData = {
338
+ ...user ,
339
+ lastSeen : yesterday ,
340
+ loginStreak : 8 ,
341
+ maxLoginStreak : 8 ,
342
+ save : jest . fn ( ) . mockResolvedValue ( true ) ,
343
+ } as unknown as UserDocument ;
344
+
345
+ jest . spyOn ( service , 'findByID' ) . mockResolvedValue ( userData ) ;
346
+
347
+ const result = await service . getSelfUserData ( user ) ;
348
+
349
+ expect ( result . maxLoginStreak ) . toBe ( 9 ) ;
350
+ expect ( userData . save ) . toHaveBeenCalled ( ) ;
351
+ } ) ;
352
+
353
+ it ( 'should not increment maxLoginStreak if login streak is less than the max' , async ( ) => {
354
+ const user = { _id : 'test-id' } as UserDocument ;
355
+
356
+ const yesterday = new Date ( ) ;
357
+ yesterday . setDate ( yesterday . getDate ( ) - 1 ) ;
358
+ yesterday . setHours ( 0 , 0 , 0 , 0 ) ;
359
+
360
+ const userData = {
361
+ ...user ,
362
+ lastSeen : yesterday ,
363
+ loginStreak : 4 ,
364
+ maxLoginStreak : 8 ,
365
+ save : jest . fn ( ) . mockResolvedValue ( true ) ,
366
+ } as unknown as UserDocument ;
367
+
368
+ jest . spyOn ( service , 'findByID' ) . mockResolvedValue ( userData ) ;
369
+
370
+ const result = await service . getSelfUserData ( user ) ;
371
+
372
+ expect ( result . maxLoginStreak ) . toBe ( 8 ) ;
373
+ expect ( userData . save ) . toHaveBeenCalled ( ) ;
374
+ } ) ;
220
375
} ) ;
221
376
222
377
describe ( 'usernameExists' , ( ) => {
@@ -339,7 +494,12 @@ describe('UserService', () => {
339
494
340
495
const result = await service . updateUsername ( user , body ) ;
341
496
342
- expect ( result ) . toEqual ( user ) ;
497
+ expect ( result ) . toEqual ( {
498
+ username : 'newuser' ,
499
+ publicName : undefined ,
500
+ email : undefined ,
501
+ } ) ;
502
+
343
503
expect ( user . username ) . toBe ( body . username ) ;
344
504
expect ( service . usernameExists ) . toHaveBeenCalledWith ( body . username ) ;
345
505
} ) ;
0 commit comments