@@ -382,6 +382,76 @@ describe('loader skip or exec', () => {
382382 } )
383383} )
384384
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+
385455function sleep ( ms : number ) {
386456 return new Promise ( ( resolve ) => setTimeout ( resolve , ms ) )
387457}
0 commit comments