From: Eduardo San Martin Morote Date: Thu, 2 Jul 2020 21:19:33 +0000 (+0200) Subject: test(errors): add test for isNavigationFailure X-Git-Tag: v4.0.0-beta.1~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d3591f90cba539336f3f225a52df0a6ba7ba5fcb;p=thirdparty%2Fvuejs%2Frouter.git test(errors): add test for isNavigationFailure --- diff --git a/__tests__/errors.spec.ts b/__tests__/errors.spec.ts index dd868bdd..ba85b09a 100644 --- a/__tests__/errors.spec.ts +++ b/__tests__/errors.spec.ts @@ -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(ErrorTypes.NAVIGATION_ABORTED, { + from, + to, + }) + ) + ).toBe(true) + }) + + it('specific navigation failure', () => { + expect( + isNavigationFailure( + createRouterError(ErrorTypes.NAVIGATION_ABORTED, { + from, + to, + }), + NavigationFailureType.aborted + ) + ).toBe(true) + }) + + it('multiple navigation failure types', () => { + expect( + isNavigationFailure( + createRouterError(ErrorTypes.NAVIGATION_ABORTED, { + from, + to, + }), + NavigationFailureType.aborted | NavigationFailureType.cancelled + ) + ).toBe(true) + expect( + isNavigationFailure( + createRouterError(ErrorTypes.NAVIGATION_CANCELLED, { + from, + to, + }), + NavigationFailureType.aborted | NavigationFailureType.cancelled + ) + ).toBe(true) + expect( + isNavigationFailure( + createRouterError(ErrorTypes.NAVIGATION_DUPLICATED, { + from, + to, + }), + NavigationFailureType.aborted | NavigationFailureType.cancelled + ) + ).toBe(false) + }) +}) + async function testError( nextArgument: any | NavigationGuard, expectedError: Error | void = undefined, diff --git a/src/errors.ts b/src/errors.ts index 1128d599..bca946ab 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -110,19 +110,45 @@ export function createRouterError( } } +/** + * 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)) ) diff --git a/src/index.ts b/src/index.ts index 2941e54a..e6f46617 100644 --- a/src/index.ts +++ b/src/index.ts @@ -49,6 +49,7 @@ export { ScrollBehavior, } from './router' +// waititng for RFC isNavigationFailure export { NavigationFailureType, NavigationFailure } from './errors' export { onBeforeRouteLeave, onBeforeRouteUpdate } from './navigationGuards'