]> git.ipfire.org Git - thirdparty/vuejs/router.git/commitdiff
test(errors): add test for isNavigationFailure
authorEduardo San Martin Morote <posva13@gmail.com>
Thu, 2 Jul 2020 21:19:33 +0000 (23:19 +0200)
committerEduardo San Martin Morote <posva13@gmail.com>
Thu, 2 Jul 2020 21:19:33 +0000 (23:19 +0200)
__tests__/errors.spec.ts
src/errors.ts
src/index.ts

index dd868bdd38c949b68d62ba7e561a424319546aa2..ba85b09aefb2109e2e14778de5cccf16107abf4a 100644 (file)
@@ -1,8 +1,19 @@
 import fakePromise from 'faked-promise'
 import { createRouter as newRouter, createMemoryHistory } from '../src'
-import { NavigationFailure, NavigationFailureType } from '../src/errors'
+import {
+  NavigationFailure,
+  NavigationFailureType,
+  isNavigationFailure,
+  createRouterError,
+  ErrorTypes,
+} from '../src/errors'
 import { components, tick } from './utils'
-import { RouteRecordRaw, NavigationGuard, RouteLocationRaw } from '../src/types'
+import {
+  RouteRecordRaw,
+  NavigationGuard,
+  RouteLocationRaw,
+  START_LOCATION_NORMALIZED,
+} from '../src/types'
 
 const routes: RouteRecordRaw[] = [
   { path: '/', component: components.Home },
@@ -235,6 +246,73 @@ describe('Errors & Navigation failures', () => {
   })
 })
 
+describe('isNavigationFailure', () => {
+  const from = START_LOCATION_NORMALIZED
+  const to = from
+  it('non objects', () => {
+    expect(isNavigationFailure(null)).toBe(false)
+    expect(isNavigationFailure(true)).toBe(false)
+    expect(isNavigationFailure(false)).toBe(false)
+  })
+
+  it('errors', () => {
+    expect(isNavigationFailure(new Error())).toBe(false)
+  })
+
+  it('any navigation failure', () => {
+    expect(
+      isNavigationFailure(
+        createRouterError<NavigationFailure>(ErrorTypes.NAVIGATION_ABORTED, {
+          from,
+          to,
+        })
+      )
+    ).toBe(true)
+  })
+
+  it('specific navigation failure', () => {
+    expect(
+      isNavigationFailure(
+        createRouterError<NavigationFailure>(ErrorTypes.NAVIGATION_ABORTED, {
+          from,
+          to,
+        }),
+        NavigationFailureType.aborted
+      )
+    ).toBe(true)
+  })
+
+  it('multiple navigation failure types', () => {
+    expect(
+      isNavigationFailure(
+        createRouterError<NavigationFailure>(ErrorTypes.NAVIGATION_ABORTED, {
+          from,
+          to,
+        }),
+        NavigationFailureType.aborted | NavigationFailureType.cancelled
+      )
+    ).toBe(true)
+    expect(
+      isNavigationFailure(
+        createRouterError<NavigationFailure>(ErrorTypes.NAVIGATION_CANCELLED, {
+          from,
+          to,
+        }),
+        NavigationFailureType.aborted | NavigationFailureType.cancelled
+      )
+    ).toBe(true)
+    expect(
+      isNavigationFailure(
+        createRouterError<NavigationFailure>(ErrorTypes.NAVIGATION_DUPLICATED, {
+          from,
+          to,
+        }),
+        NavigationFailureType.aborted | NavigationFailureType.cancelled
+      )
+    ).toBe(false)
+  })
+})
+
 async function testError(
   nextArgument: any | NavigationGuard,
   expectedError: Error | void = undefined,
index 1128d5999d7c32541aec1a857b1187acf98db24d..bca946abf7ebc20deafda1786894ec9a56ec42e5 100644 (file)
@@ -110,19 +110,45 @@ export function createRouterError<E extends RouterError>(
   }
 }
 
+/**
+ * Check if an object is a {@link NavigationFailure}.
+ *
+ * @example
+ * ```js
+ * import { isNavigationFailure, NavigationFailureType } from 'vue-router'
+ *
+ * router.afterEach((to, from, failure) => {
+ *   // Any kind of navigation failure
+ *   if (isNavigationFailure(failure)) {
+ *     // ...
+ *   }
+ *   // Only duplicated navigations
+ *   if (isNavigationFailure(failure, NavigationFailureType.duplicated)) {
+ *     // ...
+ *   }
+ *   // Aborted or canceled navigations
+ *   if (isNavigationFailure(failure, NavigationFailureType.aborted | NavigationFailureType.canceled)) {
+ *     // ...
+ *   }
+ * })
+ * ```
+ * @param error - possible {@link NavigationFailure}
+ * @param type - optional types to check for
+ */
 export function isNavigationFailure(
   error: any,
-  type: ErrorTypes.NAVIGATION_GUARD_REDIRECT
+  type?: ErrorTypes.NAVIGATION_GUARD_REDIRECT
 ): error is NavigationRedirectError
 export function isNavigationFailure(
   error: any,
-  type: ErrorTypes
+  type?: ErrorTypes | NavigationFailureType
 ): error is NavigationFailure
 export function isNavigationFailure(
   error: any,
   type?: number
 ): error is NavigationFailure {
   return (
+    error instanceof Error &&
     NavigationFailureSymbol in error &&
     (type == null || !!((error as NavigationFailure).type & type))
   )
index 2941e54ae1b15284a8ec4904e43502492df2875b..e6f46617104667da47aa44c7109612908d1413b8 100644 (file)
@@ -49,6 +49,7 @@ export {
   ScrollBehavior,
 } from './router'
 
+// waititng for RFC isNavigationFailure
 export { NavigationFailureType, NavigationFailure } from './errors'
 
 export { onBeforeRouteLeave, onBeforeRouteUpdate } from './navigationGuards'