const beforeEnter = jest.fn()
const beforeEnters = [jest.fn(), jest.fn()]
+const nested = {
+ parent: jest.fn(),
+ nestedEmpty: jest.fn(),
+ nestedA: jest.fn(),
+ nestedAbs: jest.fn(),
+ nestedNested: jest.fn(),
+ nestedNestedFoo: jest.fn(),
+ nestedNestedParam: jest.fn(),
+}
+
/** @type {RouteRecord[]} */
const routes = [
{ path: '/', component: Home },
beforeEnter: beforeEnters,
component: Foo,
},
+ {
+ path: '/nested',
+ component: {
+ ...Home,
+ beforeRouteEnter: nested.parent,
+ },
+ children: [
+ {
+ path: '',
+ name: 'nested-empty-path',
+ component: { ...Home, beforeRouteEnter: nested.nestedEmpty },
+ },
+ {
+ path: 'a',
+ name: 'nested-path',
+ component: { ...Home, beforeRouteEnter: nested.nestedA },
+ },
+ {
+ path: '/abs-nested',
+ name: 'absolute-nested',
+ component: { ...Home, beforeRouteEnter: nested.nestedAbs },
+ },
+ {
+ path: 'nested',
+ name: 'nested-nested',
+ component: { ...Home, beforeRouteEnter: nested.nestedNested },
+ children: [
+ {
+ path: 'foo',
+ name: 'nested-nested-foo',
+ component: { ...Home, beforeRouteEnter: nested.nestedNestedFoo },
+ },
+ {
+ path: 'param/:p',
+ name: 'nested-nested-param',
+ component: { ...Home, beforeRouteEnter: nested.nestedNestedParam },
+ },
+ ],
+ },
+ ],
+ },
]
function resetMocks() {
spy.mockReset()
spy.mockImplementationOnce(noGuard)
})
+ for (const key in nested) {
+ nested[key].mockReset()
+ nested[key].mockImplementation(noGuard)
+ }
}
beforeEach(() => {
)
})
+ it('call beforeEnter in nested views', async () => {
+ const router = createRouter({ routes })
+ await router.push('/nested/a')
+ resetMocks()
+ await router[navigationMethod]('/nested/nested/foo')
+ expect(nested.parent).not.toHaveBeenCalled()
+ expect(nested.nestedA).not.toHaveBeenCalled()
+ expect(nested.nestedNested).toHaveBeenCalledTimes(1)
+ expect(nested.nestedNestedFoo).toHaveBeenCalledTimes(1)
+ expect(nested.nestedNested).toHaveBeenCalledWith(
+ expect.objectContaining({ path: '/nested/nested/foo' }),
+ expect.objectContaining({ path: '/nested/a' }),
+ expect.any(Function)
+ )
+ expect(nested.nestedNestedFoo).toHaveBeenCalledWith(
+ expect.objectContaining({ path: '/nested/nested/foo' }),
+ expect.objectContaining({ path: '/nested/a' }),
+ expect.any(Function)
+ )
+ })
+
it('calls beforeEnter different records, same component', async () => {
const router = createRouter({ routes })
beforeEnter.mockImplementationOnce(noGuard)