]> git.ipfire.org Git - thirdparty/vuejs/router.git/commitdiff
test: improve for vuejs/router#1929
authorEduardo San Martin Morote <posva13@gmail.com>
Tue, 18 Jul 2023 05:42:26 +0000 (07:42 +0200)
committerEduardo San Martin Morote <posva13@gmail.com>
Tue, 18 Jul 2023 05:42:26 +0000 (07:42 +0200)
packages/router/__tests__/errors.spec.ts
packages/router/__tests__/lazyLoading.spec.ts
packages/router/src/router.ts

index 8fd0e046ba9e77444fb11b8460a7de35fc6dc972..c7219dc4442f7f2c32f4494418cfcff2d2516037 100644 (file)
@@ -15,6 +15,7 @@ import {
   START_LOCATION_NORMALIZED,
   RouteLocationNormalized,
 } from '../src/types'
+import { mockWarn } from 'jest-mock-warn'
 
 const routes: Readonly<RouteRecordRaw>[] = [
   { path: '/', component: components.Home },
@@ -40,6 +41,7 @@ function createRouter() {
 }
 
 describe('Errors & Navigation failures', () => {
+  mockWarn()
   beforeEach(() => {
     onError.mockReset()
     afterEach.mockReset()
@@ -158,7 +160,7 @@ describe('Errors & Navigation failures', () => {
       throw error
     })
 
-    await expect(router.push('/foo')).rejects.toEqual(error)
+    await router.push('/foo').catch(() => {})
 
     expect(afterEach).toHaveBeenCalledTimes(0)
     expect(onError).toHaveBeenCalledTimes(1)
@@ -352,7 +354,11 @@ async function testError(
         }
   )
 
-  await expect(router.push(to)).rejects.toEqual(expectedError)
+  if (expectedError !== undefined) {
+    await expect(router.push(to)).rejects.toEqual(expectedError)
+  } else {
+    await router.push(to).catch(() => {})
+  }
 
   expect(afterEach).toHaveBeenCalledTimes(0)
   expect(onError).toHaveBeenCalledTimes(1)
index e50d8fb52b9e3c6c4fb56558a4a0afbfaf430f71..09e97b178553e2a25009510e6c6f4da60bcdeb89 100644 (file)
@@ -284,7 +284,7 @@ describe('Lazy Loading', () => {
     reject()
     await router.push('/foo').catch(spy)
 
-    expect(spy).toHaveBeenCalled()
+    expect(spy).toHaveBeenCalledTimes(1)
     expect('uncaught error').toHaveBeenWarned()
 
     expect(router.currentRoute.value).toMatchObject({
index 43eaecfddf458216df787ddd626c17a9178fe0e4..e3d2ed3e7f46693df5729402562a7939aa19a6cc 100644 (file)
@@ -68,11 +68,13 @@ import { addDevtools } from './devtools'
  * @param from - location we were navigating from when the error happened
  * @internal
  */
-export type _ErrorHandler = (
-  error: any,
-  to: RouteLocationNormalized,
-  from: RouteLocationNormalizedLoaded
-) => any
+export interface _ErrorListener {
+  (
+    error: any,
+    to: RouteLocationNormalized,
+    from: RouteLocationNormalizedLoaded
+  ): any
+}
 // resolve, reject arguments of Promise constructor
 type OnReadyCallback = [() => void, (reason?: any) => void]
 
@@ -321,7 +323,7 @@ export interface Router {
    *
    * @param handler - error handler to register
    */
-  onError(handler: _ErrorHandler): () => void
+  onError(handler: _ErrorListener): () => void
   /**
    * Returns a Promise that resolves when the router has completed the initial
    * navigation, which means it has resolved all async enter hooks and async
@@ -1082,6 +1084,7 @@ export function createRouter(options: RouterOptions): Router {
             failure
           )
         })
+        // avoid warnings in the console about uncaught rejections, they are logged by triggerErrors
         .catch(noop)
     })
   }
@@ -1089,11 +1092,11 @@ export function createRouter(options: RouterOptions): Router {
   // Initialization and Errors
 
   let readyHandlers = useCallbacks<OnReadyCallback>()
-  let errorHandlers = useCallbacks<_ErrorHandler>()
+  let errorListeners = useCallbacks<_ErrorListener>()
   let ready: boolean
 
   /**
-   * Trigger errorHandlers added via onError and throws the error as well
+   * Trigger errorListeners added via onError and throws the error as well
    *
    * @param error - error to throw
    * @param to - location we were navigating to when the error happened
@@ -1106,7 +1109,7 @@ export function createRouter(options: RouterOptions): Router {
     from: RouteLocationNormalizedLoaded
   ): Promise<unknown> {
     markAsReady(error)
-    const list = errorHandlers.list()
+    const list = errorListeners.list()
     if (list.length) {
       list.forEach(handler => handler(error, to, from))
     } else {
@@ -1115,6 +1118,7 @@ export function createRouter(options: RouterOptions): Router {
       }
       console.error(error)
     }
+    // reject the error no matter there were error listeners or not
     return Promise.reject(error)
   }
 
@@ -1152,7 +1156,8 @@ export function createRouter(options: RouterOptions): Router {
     from: RouteLocationNormalizedLoaded,
     isPush: boolean,
     isFirstNavigation: boolean
-  ): Promise<any> {
+  ): // the return is not meant to be used
+  Promise<unknown> {
     const { scrollBehavior } = options
     if (!isBrowser || !scrollBehavior) return Promise.resolve()
 
@@ -1195,7 +1200,7 @@ export function createRouter(options: RouterOptions): Router {
     beforeResolve: beforeResolveGuards.add,
     afterEach: afterGuards.add,
 
-    onError: errorHandlers.add,
+    onError: errorListeners.add,
     isReady,
 
     install(app: App) {