@@ -68,6 +68,7 @@ describe('UserService', () => {
6868 confirmUserRegistration : jest . fn ( ) ,
6969 resendConfirmationCode : jest . fn ( ) ,
7070 authenticateUser : jest . fn ( ) ,
71+ refreshUserToken : jest . fn ( ) ,
7172 } as unknown as jest . Mocked < AuthenticationService > ;
7273
7374 // Mocked PasswordService
@@ -262,7 +263,11 @@ describe('UserService', () => {
262263 describe ( 'authenticate' , ( ) => {
263264 it ( 'should authenticate a user successfully (cache miss, DB hit)' , async ( ) => {
264265 // Arrange
265- mockAuthService . authenticateUser . mockResolvedValue ( 'fake-jwt-token' ) ;
266+ mockAuthService . authenticateUser . mockResolvedValue ( {
267+ idToken : 'fake-jwt-token' ,
268+ refreshToken : 'fake-refresh-token' ,
269+ } ) ;
270+
266271 // user not in cache
267272 mockCache . get . mockResolvedValue ( null ) ;
268273 // user found in DB
@@ -275,7 +280,11 @@ describe('UserService', () => {
275280 ) ;
276281
277282 // Assert
278- expect ( result ) . toEqual ( { token : 'fake-jwt-token' } ) ;
283+ expect ( result ) . toEqual ( {
284+ token : 'fake-jwt-token' ,
285+ refreshToken : 'fake-refresh-token' ,
286+ } ) ;
287+
279288 expect ( mockAuthService . authenticateUser ) . toHaveBeenCalledWith (
280289 testUser . username ,
281290 'some-password' ,
@@ -295,7 +304,11 @@ describe('UserService', () => {
295304 } ) ;
296305
297306 it ( 'should authenticate a user successfully (cache hit)' , async ( ) => {
298- mockAuthService . authenticateUser . mockResolvedValue ( 'fake-jwt-token' ) ;
307+ mockAuthService . authenticateUser . mockResolvedValue ( {
308+ idToken : 'fake-jwt-token' ,
309+ refreshToken : 'fake-refresh-token' ,
310+ } ) ;
311+
299312 // user found in cache
300313 mockCache . get . mockResolvedValue ( JSON . stringify ( testUser ) ) ;
301314
@@ -304,7 +317,11 @@ describe('UserService', () => {
304317 'some-password' ,
305318 ) ;
306319
307- expect ( result ) . toEqual ( { token : 'fake-jwt-token' } ) ;
320+ expect ( result ) . toEqual ( {
321+ token : 'fake-jwt-token' ,
322+ refreshToken : 'fake-refresh-token' ,
323+ } ) ;
324+
308325 expect ( mockAuthService . authenticateUser ) . toHaveBeenCalledWith (
309326 testUser . username ,
310327 'some-password' ,
@@ -316,7 +333,11 @@ describe('UserService', () => {
316333 } ) ;
317334
318335 it ( 'should throw NotFoundError if user not found in DB' , async ( ) => {
319- mockAuthService . authenticateUser . mockResolvedValue ( 'fake-jwt-token' ) ;
336+ mockAuthService . authenticateUser . mockResolvedValue ( {
337+ idToken : 'fake-jwt-token' ,
338+ refreshToken : 'fake-refresh-token' ,
339+ } ) ;
340+
320341 mockCache . get . mockResolvedValue ( null ) ;
321342 mockUserRepository . findUserByUsername . mockResolvedValue ( null ) ;
322343
@@ -484,4 +505,28 @@ describe('UserService', () => {
484505 ) ;
485506 } ) ;
486507 } ) ;
508+ describe ( 'refreshUserToken' , ( ) => {
509+ it ( 'should refresh the token successfully' , async ( ) => {
510+ mockAuthService . refreshUserToken . mockResolvedValue ( 'new-id-token' ) ;
511+
512+ const result = await userService . refreshUserToken ( 'valid-refresh-token' ) ;
513+
514+ expect ( result ) . toBe ( 'new-id-token' ) ;
515+ expect ( mockAuthService . refreshUserToken ) . toHaveBeenCalledWith (
516+ 'valid-refresh-token' ,
517+ ) ;
518+ expect ( logger . info ) . toHaveBeenCalledWith (
519+ expect . stringContaining ( 'Token refreshed successfully' ) ,
520+ ) ;
521+ } ) ;
522+
523+ it ( 'should propagate errors from authService' , async ( ) => {
524+ const error = new Error ( 'Refresh failed' ) ;
525+ mockAuthService . refreshUserToken . mockRejectedValue ( error ) ;
526+
527+ await expect (
528+ userService . refreshUserToken ( 'invalid-token' ) ,
529+ ) . rejects . toThrow ( error ) ;
530+ } ) ;
531+ } ) ;
487532} ) ;
0 commit comments