@@ -382,6 +382,76 @@ describe('loader skip or exec', () => {
382
382
} )
383
383
} )
384
384
385
+ test ( 'exec on stay (beforeLoad & loader)' , async ( ) => {
386
+ let rootBeforeLoadResolved = false
387
+ const rootBeforeLoad = vi . fn ( async ( ) => {
388
+ await sleep ( 100 )
389
+ rootBeforeLoadResolved = true
390
+ } )
391
+ const rootLoader = vi . fn ( ( ) => sleep ( 10 ) )
392
+ const rootRoute = new BaseRootRoute ( {
393
+ beforeLoad : rootBeforeLoad ,
394
+ loader : rootLoader ,
395
+ } )
396
+
397
+ let layoutBeforeLoadResolved = false
398
+ const layoutBeforeLoad = vi . fn ( async ( ) => {
399
+ await sleep ( 100 )
400
+ layoutBeforeLoadResolved = true
401
+ } )
402
+ const layoutLoader = vi . fn ( ( ) => sleep ( 10 ) )
403
+ const layoutRoute = new BaseRoute ( {
404
+ getParentRoute : ( ) => rootRoute ,
405
+ beforeLoad : layoutBeforeLoad ,
406
+ loader : layoutLoader ,
407
+ id : '/_layout' ,
408
+ } )
409
+
410
+ const fooRoute = new BaseRoute ( {
411
+ getParentRoute : ( ) => layoutRoute ,
412
+ path : '/foo' ,
413
+ } )
414
+ const barRoute = new BaseRoute ( {
415
+ getParentRoute : ( ) => layoutRoute ,
416
+ path : '/bar' ,
417
+ } )
418
+
419
+ const routeTree = rootRoute . addChildren ( [ layoutRoute . addChildren ( [ fooRoute , barRoute ] ) ] )
420
+
421
+ const router = new RouterCore ( {
422
+ routeTree,
423
+ history : createMemoryHistory ( ) ,
424
+ defaultStaleTime : 1000 ,
425
+ defaultGcTime : 1000 ,
426
+ } )
427
+
428
+ await router . navigate ( { to : '/foo' } )
429
+ expect ( router . state . location . pathname ) . toBe ( '/foo' )
430
+
431
+ rootBeforeLoadResolved = false
432
+ layoutBeforeLoadResolved = false
433
+ vi . clearAllMocks ( )
434
+
435
+ /*
436
+ * When navigating between sibling routes,
437
+ * do the parent routes get re-executed?
438
+ */
439
+
440
+ await router . navigate ( { to : '/bar' } )
441
+
442
+ // beforeLoad always re-executes
443
+ expect ( rootBeforeLoad ) . toHaveBeenCalledTimes ( 1 )
444
+ expect ( layoutBeforeLoad ) . toHaveBeenCalledTimes ( 1 )
445
+
446
+ // loader is skipped because of staleTime
447
+ expect ( rootLoader ) . toHaveBeenCalledTimes ( 0 )
448
+ expect ( layoutLoader ) . toHaveBeenCalledTimes ( 0 )
449
+
450
+ // beforeLoad calls were correctly awaited
451
+ expect ( rootBeforeLoadResolved ) . toBe ( true )
452
+ expect ( layoutBeforeLoadResolved ) . toBe ( true )
453
+ } )
454
+
385
455
function sleep ( ms : number ) {
386
456
return new Promise ( ( resolve ) => setTimeout ( resolve , ms ) )
387
457
}
0 commit comments