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