Skip to content

Commit 1bfb9f4

Browse files
committed
add onStay test
1 parent 2a291e0 commit 1bfb9f4

File tree

1 file changed

+70
-0
lines changed

1 file changed

+70
-0
lines changed

packages/router-core/tests/load.test.ts

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
385455
function sleep(ms: number) {
386456
return new Promise((resolve) => setTimeout(resolve, ms))
387457
}

0 commit comments

Comments
 (0)