resetMocks()
})
-describe.skip('beforeRouteEnter', () => {
+describe('beforeRouteEnter', () => {
beforeAll(() => {
createDom()
})
expect(router.currentRoute.value.fullPath).not.toBe('/named')
})
- // TODO: async components
- it.skip('resolves async components before guarding', async () => {
- const spy = jest.fn(noGuard)
- const component = {
- template: `<div></div>`,
- beforeRouteEnter: spy,
- }
- const [promise, resolve] = fakePromise<typeof component>()
- const router = createRouter({
- routes: [...routes, { path: '/async', component: () => promise }],
- })
- const pushPromise = router[navigationMethod]('/async')
- expect(spy).not.toHaveBeenCalled()
- resolve(component)
- await pushPromise
-
- expect(spy).toHaveBeenCalledTimes(1)
- })
-
it('does not call beforeRouteEnter if we were already on the page', async () => {
const router = createRouter({ routes })
beforeRouteEnter.mockImplementation(noGuard)
resetMocks()
})
-describe.skip('beforeRouteLeave', () => {
+describe('beforeRouteLeave', () => {
beforeAll(() => {
createDom()
})
expect(nested.nestedNestedFoo).toHaveBeenCalledTimes(1)
})
- // TODO: implem async components
- it.skip('works when a lazy loaded component', async () => {
- const router = createRouter({
- routes: [
- ...routes,
- {
- path: '/lazy',
- component: () => Promise.resolve({ ...Foo, beforeRouteLeave }),
- },
- ],
- })
- beforeRouteLeave.mockImplementationOnce((to, from, next) => {
- next()
- })
- await router.push('/lazy')
- expect(beforeRouteLeave).not.toHaveBeenCalled()
- await router[navigationMethod]('/foo')
- expect(beforeRouteLeave).toHaveBeenCalledTimes(1)
- })
-
it('can cancel navigation', async () => {
const router = createRouter({ routes })
beforeRouteLeave.mockImplementationOnce(async (to, from, next) => {
beforeRouteUpdate.mockReset()
})
-describe.skip('beforeRouteUpdate', () => {
+describe('beforeRouteUpdate', () => {
beforeAll(() => {
createDom()
})
expect(beforeRouteUpdate).toHaveBeenCalledTimes(1)
})
- // TODO: add async component
- it.skip('resolves async components before guarding', async () => {
- const spy = jest.fn((to, from, next) => next())
- const component = {
- template: `<div></div>`,
- beforeRouteUpdate: spy,
- }
- const router = createRouter({
- routes: [
- ...routes,
- { path: '/async/:a', component: () => Promise.resolve(component) },
- ],
- })
- await router[navigationMethod]('/async/a')
- expect(spy).not.toHaveBeenCalled()
- await router[navigationMethod]('/async/b')
- expect(spy).toHaveBeenCalledTimes(1)
- })
-
it('waits before navigating', async () => {
const [promise, resolve] = fakePromise()
const router = createRouter({ routes })
expect(spy).toHaveBeenCalledTimes(1)
})
+ it('beforeRouteLeave works on a lazy loaded component', async () => {
+ const { promise, resolve } = createLazyComponent()
+ const spy = jest.fn((to, from, next) => next())
+ const component = jest.fn(() =>
+ promise.then(() => ({ beforeRouteLeave: spy }))
+ )
+ const { router } = newRouter({
+ routes: [
+ { path: '/foo', component },
+ { path: '/', component: {} },
+ ],
+ })
+
+ resolve()
+ await router.push('/foo')
+ expect(component).toHaveBeenCalledTimes(1)
+ expect(spy).toHaveBeenCalledTimes(0)
+
+ await router.push('/')
+ expect(spy).toHaveBeenCalledTimes(1)
+ })
+
+ it('beforeRouteUpdate works on a lazy loaded component', async () => {
+ const { promise, resolve } = createLazyComponent()
+ const spy = jest.fn((to, from, next) => next())
+ const component = jest.fn(() =>
+ promise.then(() => ({ beforeRouteUpdate: spy }))
+ )
+ const { router } = newRouter({
+ routes: [{ path: '/:id', component }],
+ })
+
+ resolve()
+ await router.push('/foo')
+ expect(component).toHaveBeenCalledTimes(1)
+ expect(spy).toHaveBeenCalledTimes(0)
+
+ await router.push('/bar')
+ expect(spy).toHaveBeenCalledTimes(1)
+ })
+
it('aborts the navigation if async fails', async () => {
const { component, reject } = createLazyComponent()
const { router } = newRouter({