@@ -217,12 +217,14 @@ describe('Auth service', () => {
217217 expect ( refreshTokensStub ) . toHaveBeenCalledOnce ( ) ;
218218 } ) ;
219219
220- test ( 'when the token refresh fails, then stored credentials are cleared and an error is thrown' , async ( ) => {
220+ test ( 'when the token refresh fails with an auth error , then stored credentials are cleared and an error is thrown' , async ( ) => {
221221 const sut = AuthService . instance ;
222222
223223 const mockTokenStatus = TokenStatus . REFRESH_REQUIRED ;
224224
225- const oldTokenError = new Error ( 'Old token version detected' ) ;
225+ const oldTokenError = Object . assign ( new Error ( 'Old token version detected' ) , {
226+ response : { status : 401 } ,
227+ } ) ;
226228
227229 vi . spyOn ( ConfigService . instance , 'readUser' ) . mockResolvedValue ( UserCredentialsFixture ) ;
228230 vi . spyOn ( ValidationService . instance , 'validateTokenAndCheckExpiration' ) . mockImplementationOnce (
@@ -236,4 +238,26 @@ describe('Auth service', () => {
236238 expect ( refreshTokenStub ) . toHaveBeenCalledOnce ( ) ;
237239 expect ( clearUserStub ) . toHaveBeenCalledOnce ( ) ;
238240 } ) ;
241+
242+ test ( 'when the token refresh fails with a retryable server error, then stored credentials are preserved' , async ( ) => {
243+ const sut = AuthService . instance ;
244+
245+ const mockTokenStatus = TokenStatus . REFRESH_REQUIRED ;
246+
247+ const retryableError = Object . assign ( new Error ( 'Service unavailable' ) , {
248+ response : { status : 503 } ,
249+ } ) ;
250+
251+ vi . spyOn ( ConfigService . instance , 'readUser' ) . mockResolvedValue ( UserCredentialsFixture ) ;
252+ vi . spyOn ( ValidationService . instance , 'validateTokenAndCheckExpiration' ) . mockImplementationOnce (
253+ ( ) => mockTokenStatus ,
254+ ) ;
255+ vi . spyOn ( ValidationService . instance , 'validateMnemonic' ) . mockReturnValue ( true ) ;
256+ const refreshTokenStub = vi . spyOn ( sut , 'refreshUserToken' ) . mockRejectedValue ( retryableError ) ;
257+ const clearUserStub = vi . spyOn ( ConfigService . instance , 'clearUser' ) . mockResolvedValue ( ) ;
258+
259+ await expect ( ( ) => sut . getAuthDetails ( ) ) . rejects . toThrow ( retryableError ) ;
260+ expect ( refreshTokenStub ) . toHaveBeenCalledOnce ( ) ;
261+ expect ( clearUserStub ) . not . toHaveBeenCalled ( ) ;
262+ } ) ;
239263} ) ;
0 commit comments