From: Eduardo San Martin Morote Date: Tue, 18 Jul 2023 05:42:26 +0000 (+0200) Subject: test: improve for vuejs/router#1929 X-Git-Tag: v4.2.5~25 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a1611b6099403cfe9539ee8d4e9308b3a6a0175c;p=thirdparty%2Fvuejs%2Frouter.git test: improve for vuejs/router#1929 --- diff --git a/packages/router/__tests__/errors.spec.ts b/packages/router/__tests__/errors.spec.ts index 8fd0e046..c7219dc4 100644 --- a/packages/router/__tests__/errors.spec.ts +++ b/packages/router/__tests__/errors.spec.ts @@ -15,6 +15,7 @@ import { START_LOCATION_NORMALIZED, RouteLocationNormalized, } from '../src/types' +import { mockWarn } from 'jest-mock-warn' const routes: Readonly[] = [ { 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) diff --git a/packages/router/__tests__/lazyLoading.spec.ts b/packages/router/__tests__/lazyLoading.spec.ts index e50d8fb5..09e97b17 100644 --- a/packages/router/__tests__/lazyLoading.spec.ts +++ b/packages/router/__tests__/lazyLoading.spec.ts @@ -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({ diff --git a/packages/router/src/router.ts b/packages/router/src/router.ts index 43eaecfd..e3d2ed3e 100644 --- a/packages/router/src/router.ts +++ b/packages/router/src/router.ts @@ -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() - 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 { 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 { + ): // the return is not meant to be used + Promise { 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) {