5
5
storageSettings ,
6
6
} from "../../sessionManager" ;
7
7
import * as tokenUtils from "." ;
8
+ import * as refreshTimer from "../refreshTimer" ;
8
9
9
10
describe ( "refreshToken" , ( ) => {
10
11
const mockDomain = "https://example.com" ;
@@ -17,6 +18,8 @@ describe("refreshToken", () => {
17
18
vi . resetAllMocks ( ) ;
18
19
vi . spyOn ( tokenUtils , "getDecodedToken" ) . mockResolvedValue ( null ) ;
19
20
vi . spyOn ( memoryStorage , "setSessionItem" ) ;
21
+ vi . spyOn ( refreshTimer , "setRefreshTimer" ) ;
22
+ vi . spyOn ( tokenUtils , "refreshToken" ) ;
20
23
tokenUtils . setActiveStorage ( memoryStorage ) ;
21
24
global . fetch = vi . fn ( ) ;
22
25
vi . spyOn ( console , "error" ) . mockImplementation ( ( ) => { } ) ;
@@ -192,10 +195,19 @@ describe("refreshToken", () => {
192
195
refresh_token : "new-refresh-token" ,
193
196
} ;
194
197
storageSettings . useInsecureForRefreshToken = true ;
198
+
199
+ const insecureStorage = new MemoryStorage ( ) ;
200
+
201
+ tokenUtils . setInsecureStorage ( insecureStorage ) ;
202
+ await insecureStorage . setSessionItem (
203
+ StorageKeys . refreshToken ,
204
+ mockRefreshTokenValue ,
205
+ ) ;
206
+ vi . spyOn ( insecureStorage , "setSessionItem" ) ;
195
207
memoryStorage . getSessionItem = vi
196
208
. fn ( )
197
209
. mockResolvedValue ( mockRefreshTokenValue ) ;
198
- vi . mocked ( global . fetch ) . mockResolvedValue ( {
210
+ vi . mocked ( global . fetch ) . mockResolvedValueOnce ( {
199
211
ok : true ,
200
212
json : ( ) => Promise . resolve ( mockResponse ) ,
201
213
} as Response ) ;
@@ -219,9 +231,94 @@ describe("refreshToken", () => {
219
231
StorageKeys . idToken ,
220
232
"new-id-token" ,
221
233
) ;
222
- expect ( memoryStorage . setSessionItem ) . toHaveBeenCalledWith (
234
+ expect ( insecureStorage . setSessionItem ) . toHaveBeenCalledWith (
235
+ StorageKeys . refreshToken ,
236
+ "new-refresh-token" ,
237
+ ) ;
238
+ expect ( memoryStorage . setSessionItem ) . not . toHaveBeenCalledWith (
223
239
StorageKeys . refreshToken ,
224
240
"new-refresh-token" ,
225
241
) ;
242
+
243
+ // reset storageSettings to default
244
+ storageSettings . useInsecureForRefreshToken = false ;
245
+ } ) ;
246
+
247
+ it ( "raise error when no session storage is found when useInsecureForRefreshToken" , async ( ) => {
248
+ const mockResponse = {
249
+ access_token : "new-access-token" ,
250
+ id_token : "new-id-token" ,
251
+ refresh_token : "new-refresh-token" ,
252
+ } ;
253
+ storageSettings . useInsecureForRefreshToken = true ;
254
+
255
+ tokenUtils . clearActiveStorage ( ) ;
256
+
257
+ const insecureStorage = new MemoryStorage ( ) ;
258
+ tokenUtils . setInsecureStorage ( insecureStorage ) ;
259
+ await insecureStorage . setSessionItem (
260
+ StorageKeys . refreshToken ,
261
+ mockRefreshTokenValue ,
262
+ ) ;
263
+
264
+ vi . mocked ( global . fetch ) . mockResolvedValueOnce ( {
265
+ ok : true ,
266
+ json : ( ) => Promise . resolve ( mockResponse ) ,
267
+ } as Response ) ;
268
+
269
+ const result = await tokenUtils . refreshToken ( {
270
+ domain : mockDomain ,
271
+ clientId : mockClientId ,
272
+ } ) ;
273
+
274
+ expect ( result ) . toStrictEqual ( {
275
+ error : "No active storage found" ,
276
+ success : false ,
277
+ } ) ;
278
+
279
+ storageSettings . useInsecureForRefreshToken = false ;
280
+ } ) ;
281
+
282
+ it ( "triggers new timer when expires_in supplied and calls refreshToken" , async ( ) => {
283
+ vi . useFakeTimers ( ) ;
284
+ const mockResponse = {
285
+ access_token : "new-access-token" ,
286
+ id_token : "new-id-token" ,
287
+ refresh_token : "new-refresh-token" ,
288
+ expires_in : 1000 ,
289
+ } ;
290
+
291
+ const insecureStorage = new MemoryStorage ( ) ;
292
+ tokenUtils . setInsecureStorage ( insecureStorage ) ;
293
+ await insecureStorage . setSessionItem (
294
+ StorageKeys . refreshToken ,
295
+ mockRefreshTokenValue ,
296
+ ) ;
297
+
298
+ vi . mocked ( global . fetch ) . mockResolvedValueOnce ( {
299
+ ok : true ,
300
+ json : ( ) => Promise . resolve ( mockResponse ) ,
301
+ } as Response ) ;
302
+
303
+ const result = await tokenUtils . refreshToken ( {
304
+ domain : mockKindeDomain ,
305
+ clientId : mockClientId ,
306
+ } ) ;
307
+
308
+ expect ( refreshTimer . setRefreshTimer ) . toHaveBeenCalledWith (
309
+ 1000 ,
310
+ expect . any ( Function ) ,
311
+ ) ;
312
+ vi . runAllTimers ( ) ;
313
+ expect ( tokenUtils . refreshToken ) . toHaveBeenCalledWith ( {
314
+ domain : mockKindeDomain ,
315
+ clientId : mockClientId ,
316
+ } ) ;
317
+ expect ( result ) . toStrictEqual ( {
318
+ accessToken : "new-access-token" ,
319
+ idToken : "new-id-token" ,
320
+ refreshToken : "new-refresh-token" ,
321
+ success : true ,
322
+ } ) ;
226
323
} ) ;
227
324
} ) ;
0 commit comments