From 4afda1d60daad77e26bf081c680c3d1340a74db7 Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Mon, 1 Mar 2021 21:29:58 +1100 Subject: [PATCH] feat(console): export helper to manually suppress error output Fixes #564 --- src/core/console.ts | 38 ++++++++++--------- src/core/index.ts | 3 +- .../errorSuppression.disabled.test.ts | 2 +- src/dom/pure.ts | 2 +- src/native/pure.ts | 2 +- src/pure.ts | 4 +- src/server/pure.ts | 2 +- src/types/react.ts | 1 + 8 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/core/console.ts b/src/core/console.ts index 1482cf2b..579dcf54 100644 --- a/src/core/console.ts +++ b/src/core/console.ts @@ -1,28 +1,32 @@ import filterConsole from 'filter-console' +function suppressErrorOutput() { + if (process.env.RHTL_DISABLE_ERROR_FILTERING) { + return () => {} + } + + return filterConsole( + [ + /^The above error occurred in the component:/, // error boundary output + /^Error: Uncaught .+/ // jsdom output + ], + { + methods: ['error'] + } + ) +} + function enableErrorOutputSuppression() { // Automatically registers console error suppression and restoration in supported testing frameworks - if ( - typeof beforeEach === 'function' && - typeof afterEach === 'function' && - !process.env.RHTL_DISABLE_ERROR_FILTERING - ) { - let restoreConsole: () => void + if (typeof beforeEach === 'function' && typeof afterEach === 'function') { + let restoreConsole!: () => void beforeEach(() => { - restoreConsole = filterConsole( - [ - /^The above error occurred in the component:/, // error boundary output - /^Error: Uncaught .+/ // jsdom output - ], - { - methods: ['error'] - } - ) + restoreConsole = suppressErrorOutput() }) - afterEach(() => restoreConsole?.()) + afterEach(() => restoreConsole()) } } -export { enableErrorOutputSuppression } +export { enableErrorOutputSuppression, suppressErrorOutput } diff --git a/src/core/index.ts b/src/core/index.ts index 95d34a4b..ccd81b94 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -2,6 +2,7 @@ import { CreateRenderer, Renderer, RenderResult, RenderHookOptions } from '../ty import { asyncUtils } from './asyncUtils' import { cleanup, addCleanup, removeCleanup } from './cleanup' +import { suppressErrorOutput } from './console' function resultContainer() { const results: Array<{ value?: TValue; error?: Error }> = [] @@ -81,4 +82,4 @@ function createRenderHook< return renderHook } -export { createRenderHook, cleanup, addCleanup, removeCleanup } +export { createRenderHook, cleanup, addCleanup, removeCleanup, suppressErrorOutput } diff --git a/src/dom/__tests__/errorSuppression.disabled.test.ts b/src/dom/__tests__/errorSuppression.disabled.test.ts index 843a405e..e1921f09 100644 --- a/src/dom/__tests__/errorSuppression.disabled.test.ts +++ b/src/dom/__tests__/errorSuppression.disabled.test.ts @@ -5,10 +5,10 @@ describe('error output suppression (disabled) tests', () => { beforeAll(() => { process.env.RHTL_DISABLE_ERROR_FILTERING = 'true' + require('..') }) test('should not patch console.error', () => { - require('..') expect(console.error).toBe(originalConsoleError) }) }) diff --git a/src/dom/pure.ts b/src/dom/pure.ts index 3958dd93..89b13c65 100644 --- a/src/dom/pure.ts +++ b/src/dom/pure.ts @@ -37,6 +37,6 @@ const renderHook = createRenderHook(createDomRenderer) export { renderHook, act } -export { cleanup, addCleanup, removeCleanup } from '../core' +export { cleanup, addCleanup, removeCleanup, suppressErrorOutput } from '../core' export * from '../types/react' diff --git a/src/native/pure.ts b/src/native/pure.ts index 2ce742aa..d033a312 100644 --- a/src/native/pure.ts +++ b/src/native/pure.ts @@ -36,6 +36,6 @@ const renderHook = createRenderHook(createNativeRenderer) export { renderHook, act } -export { cleanup, addCleanup, removeCleanup } from '../core' +export { cleanup, addCleanup, removeCleanup, suppressErrorOutput } from '../core' export * from '../types/react' diff --git a/src/pure.ts b/src/pure.ts index 2113e9ed..ec72c6fe 100644 --- a/src/pure.ts +++ b/src/pure.ts @@ -32,8 +32,8 @@ function getRenderer() { } } -const { renderHook, act, cleanup, addCleanup, removeCleanup } = getRenderer() +const { renderHook, act, cleanup, addCleanup, removeCleanup, suppressErrorOutput } = getRenderer() -export { renderHook, act, cleanup, addCleanup, removeCleanup } +export { renderHook, act, cleanup, addCleanup, removeCleanup, suppressErrorOutput } export * from './types/react' diff --git a/src/server/pure.ts b/src/server/pure.ts index 3cd25a9d..1bacd008 100644 --- a/src/server/pure.ts +++ b/src/server/pure.ts @@ -61,6 +61,6 @@ const renderHook = createRenderHook(createServerRenderer) export { renderHook, act } -export { cleanup, addCleanup, removeCleanup } from '../core' +export { cleanup, addCleanup, removeCleanup, suppressErrorOutput } from '../core' export * from '../types/react' diff --git a/src/types/react.ts b/src/types/react.ts index 56e2798a..c2795461 100644 --- a/src/types/react.ts +++ b/src/types/react.ts @@ -26,6 +26,7 @@ export type ReactHooksRenderer = { cleanup: () => void addCleanup: (callback: CleanupCallback) => () => void removeCleanup: (callback: CleanupCallback) => void + suppressErrorOutput: () => void } export * from '.'