@@ -11,7 +11,16 @@ vi.mock('./FileTokenStorage', () => ({
1111 } ) ) ,
1212} ) ) ;
1313
14- vi . mock ( './OAuth2TokenRefreshProvider' ) ;
14+ vi . mock ( './OAuth2TokenRefreshProvider' , ( ) => ( {
15+ OAuth2TokenRefreshProvider : vi . fn ( ) . mockImplementation ( ( ) => ( {
16+ refreshToken : vi . fn ( ) . mockResolvedValue ( {
17+ access_token : 'new-access-token' ,
18+ refresh_token : 'new-refresh-token' ,
19+ expires_at : Date . now ( ) + 3600000 ,
20+ token_type : 'Bearer' ,
21+ } ) ,
22+ } ) ) ,
23+ } ) ) ;
1524
1625vi . mock ( '../../configs/qbo' , ( ) => ( {
1726 qboConfig : {
@@ -27,119 +36,78 @@ describe('OAuth2TokenManager - Error Handling', () => {
2736
2837 beforeEach ( ( ) => {
2938 tokenManager = new OAuth2TokenManager ( 'qbo' , 'test-refresh-token' ) ;
30- vi . clearAllMocks ( ) ;
3139 } ) ;
3240
3341 afterEach ( ( ) => {
34- vi . resetAllMocks ( ) ;
42+ vi . clearAllMocks ( ) ;
3543 } ) ;
3644
37- describe ( 'getAccessToken error scenarios' , ( ) => {
38- it ( 'should throw error when no access token available after refresh' , async ( ) => {
39- const { OAuth2TokenRefreshProvider } = await import (
40- './OAuth2TokenRefreshProvider'
41- ) ;
45+ describe ( 'token validation' , ( ) => {
46+ it ( 'should return false for empty access token' , ( ) => {
47+ const tokenData : TokenData = {
48+ access_token : '' ,
49+ refresh_token : 'refresh-token' ,
50+ expires_at : Date . now ( ) + 3600000 ,
51+ token_type : 'Bearer' ,
52+ } ;
4253
43- // @ts -expect-error - Mock only needs to implement used methods
44- vi . mocked ( OAuth2TokenRefreshProvider ) . mockImplementation ( ( ) => ( {
45- refreshToken : vi . fn ( ) . mockRejectedValue ( new Error ( 'Refresh failed' ) ) ,
46- } ) ) ;
54+ tokenManager . setTokenDataForTesting ( tokenData ) ;
55+ expect ( tokenManager . isTokenValid ( ) ) . toBe ( false ) ;
56+ } ) ;
4757
48- const expiredTokenData : TokenData = {
49- access_token : 'expired-access-token' ,
58+ it ( 'should return false for null access token' , ( ) => {
59+ const tokenData : TokenData = {
60+ access_token : null as unknown as string ,
5061 refresh_token : 'refresh-token' ,
51- expires_at : Date . now ( ) - 3600000 ,
62+ expires_at : Date . now ( ) + 3600000 ,
5263 token_type : 'Bearer' ,
5364 } ;
5465
55- tokenManager . setTokenDataForTesting ( expiredTokenData ) ;
56-
57- await expect ( tokenManager . getAccessToken ( ) ) . rejects . toThrow (
58- 'Failed to obtain access token' ,
59- ) ;
66+ tokenManager . setTokenDataForTesting ( tokenData ) ;
67+ expect ( tokenManager . isTokenValid ( ) ) . toBe ( false ) ;
6068 } ) ;
6169
62- it ( 'should handle empty access token after refresh' , async ( ) => {
63- const { OAuth2TokenRefreshProvider } = await import (
64- './OAuth2TokenRefreshProvider'
65- ) ;
66-
67- // @ts -expect-error - Mock only needs to implement used methods
68- vi . mocked ( OAuth2TokenRefreshProvider ) . mockImplementation ( ( ) => ( {
69- refreshToken : vi . fn ( ) . mockResolvedValue ( {
70- access_token : '' ,
71- refresh_token : 'new-refresh-token' ,
72- expires_at : Date . now ( ) + 3600000 ,
73- token_type : 'Bearer' ,
74- } ) ,
75- } ) ) ;
76-
77- const expiredTokenData : TokenData = {
78- access_token : 'expired-access-token' ,
70+ it ( 'should return false for expired token' , ( ) => {
71+ const tokenData : TokenData = {
72+ access_token : 'expired-token' ,
7973 refresh_token : 'refresh-token' ,
8074 expires_at : Date . now ( ) - 3600000 ,
8175 token_type : 'Bearer' ,
8276 } ;
8377
84- tokenManager . setTokenDataForTesting ( expiredTokenData ) ;
85-
86- await expect ( tokenManager . getAccessToken ( ) ) . rejects . toThrow (
87- 'Failed to obtain access token' ,
88- ) ;
78+ tokenManager . setTokenDataForTesting ( tokenData ) ;
79+ expect ( tokenManager . isTokenValid ( ) ) . toBe ( false ) ;
8980 } ) ;
90- } ) ;
91-
92- describe ( 'token refresh logic' , ( ) => {
93- it ( 'should handle refresh token failure with invalid token error' , async ( ) => {
94- const { OAuth2TokenRefreshProvider } = await import (
95- './OAuth2TokenRefreshProvider'
96- ) ;
97-
98- // @ts -expect-error - Mock only needs to implement used methods
99- vi . mocked ( OAuth2TokenRefreshProvider ) . mockImplementation ( ( ) => ( {
100- refreshToken : vi
101- . fn ( )
102- . mockRejectedValue ( new Error ( 'invalid or expired refresh token' ) ) ,
103- } ) ) ;
10481
105- const expiredTokenData : TokenData = {
106- access_token : 'expired-access-token' ,
82+ it ( 'should return true for valid token' , ( ) => {
83+ const tokenData : TokenData = {
84+ access_token : 'valid-token' ,
10785 refresh_token : 'refresh-token' ,
108- expires_at : Date . now ( ) - 3600000 ,
86+ expires_at : Date . now ( ) + 3600000 ,
10987 token_type : 'Bearer' ,
11088 } ;
11189
112- tokenManager . setTokenDataForTesting ( expiredTokenData ) ;
113-
114- await expect ( tokenManager . getAccessToken ( ) ) . rejects . toThrow (
115- 'invalid or expired refresh token' ,
116- ) ;
90+ tokenManager . setTokenDataForTesting ( tokenData ) ;
91+ expect ( tokenManager . isTokenValid ( ) ) . toBe ( true ) ;
92+ } ) ;
93+ } ) ;
11794
118- expect ( tokenManager . isTokenValid ( ) ) . toBe ( false ) ;
95+ describe ( 'refresh token handling' , ( ) => {
96+ it ( 'should return default refresh token when no cached token' , ( ) => {
11997 expect ( tokenManager . getCurrentRefreshToken ( ) ) . toBe ( 'test-refresh-token' ) ;
12098 } ) ;
12199
122- it ( 'should handle refresh token failure with other errors' , async ( ) => {
123- const { OAuth2TokenRefreshProvider } = await import (
124- './OAuth2TokenRefreshProvider'
125- ) ;
126-
127- // @ts -expect-error - Mock only needs to implement used methods
128- vi . mocked ( OAuth2TokenRefreshProvider ) . mockImplementation ( ( ) => ( {
129- refreshToken : vi . fn ( ) . mockRejectedValue ( new Error ( 'Network error' ) ) ,
130- } ) ) ;
131-
132- const expiredTokenData : TokenData = {
133- access_token : 'expired-access-token' ,
134- refresh_token : 'refresh-token' ,
135- expires_at : Date . now ( ) - 3600000 ,
100+ it ( 'should return cached refresh token when available' , ( ) => {
101+ const tokenData : TokenData = {
102+ access_token : 'test-access-token' ,
103+ refresh_token : 'cached-refresh-token' ,
104+ expires_at : Date . now ( ) + 3600000 ,
136105 token_type : 'Bearer' ,
137106 } ;
138107
139- tokenManager . setTokenDataForTesting ( expiredTokenData ) ;
140-
141- await expect ( tokenManager . getAccessToken ( ) ) . rejects . toThrow (
142- 'Network error' ,
108+ tokenManager . setTokenDataForTesting ( tokenData ) ;
109+ expect ( tokenManager . getCurrentRefreshToken ( ) ) . toBe (
110+ 'cached-refresh-token' ,
143111 ) ;
144112 } ) ;
145113 } ) ;
0 commit comments