From 40fd39450de57c67dcb583912ddbda9c5ad749f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 17 Jun 2021 12:40:19 +1000 Subject: [PATCH 01/95] chore(deps-dev): bump typescript from 4.3.2 to 4.3.3 (#636) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.3.2 to 4.3.3. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.3.2...v4.3.3) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7d5c3eb0..030161c4 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "react-dom": "^17.0.1", "react-test-renderer": "17.0.2", "ts-node": "^10.0.0", - "typescript": "4.3.2" + "typescript": "4.3.3" }, "peerDependencies": { "react": ">=16.9.0", From 3bf9e5cbdea1bcb5e943860f68c9439941381634 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Jun 2021 13:30:03 +1000 Subject: [PATCH 02/95] chore(deps-dev): bump typescript from 4.3.3 to 4.3.4 (#638) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.3.3 to 4.3.4. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.3.3...v4.3.4) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 030161c4..9d62f0fa 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "react-dom": "^17.0.1", "react-test-renderer": "17.0.2", "ts-node": "^10.0.0", - "typescript": "4.3.3" + "typescript": "4.3.4" }, "peerDependencies": { "react": ">=16.9.0", From 79b55590b8168a1b1bacfccfdfe77a9a43b48b40 Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Mon, 21 Jun 2021 08:55:16 +1000 Subject: [PATCH 03/95] test: Update tests to be compatible with Jest 27 (#639) * chore(deps-dev): bump kcd-scripts from 10.0.0 to 11.1.0 Bumps [kcd-scripts](https://github.com/kentcdodds/kcd-scripts) from 10.0.0 to 11.1.0. - [Release notes](https://github.com/kentcdodds/kcd-scripts/releases) - [Changelog](https://github.com/kentcdodds/kcd-scripts/blob/main/CHANGELOG.md) - [Commits](https://github.com/kentcdodds/kcd-scripts/compare/v10.0.0...v11.1.0) --- updated-dependencies: - dependency-name: kcd-scripts dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] * test: Update tests to be compatible with Jest 27 Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- src/__tests__/defaultRenderer.pure.test.ts | 41 +++++++++++++++++++ src/__tests__/defaultRenderer.test.ts | 37 +---------------- .../__tests__/autoCleanup.disabled.test.ts | 8 +--- .../__tests__/autoCleanup.noAfterEach.test.ts | 10 ++--- .../autoCleanup.noProcessEnv.test.ts | 23 ++++------- src/dom/__tests__/autoCleanup.pure.test.ts | 8 +--- src/dom/__tests__/errorHook.test.ts | 2 +- .../errorSuppression.disabled.test.ts | 7 +--- .../errorSuppression.noAfterEach.test.ts | 9 ++-- .../errorSuppression.noBeforeEach.test.ts | 9 ++-- .../errorSuppression.noProcessEnv.test.ts | 20 +++------ .../__tests__/errorSuppression.pure.test.ts | 8 +--- src/dom/__tests__/errorSuppression.test.ts | 11 ++--- .../__tests__/autoCleanup.disabled.test.ts | 8 +--- .../__tests__/autoCleanup.noAfterEach.test.ts | 10 ++--- .../autoCleanup.noProcessEnv.test.ts | 23 ++++------- src/native/__tests__/autoCleanup.pure.test.ts | 8 +--- src/native/__tests__/errorHook.test.ts | 6 +-- .../errorSuppression.disabled.test.ts | 7 +--- .../errorSuppression.noAfterEach.test.ts | 9 ++-- .../errorSuppression.noBeforeEach.test.ts | 9 ++-- .../errorSuppression.noProcessEnv.test.ts | 20 +++------ .../__tests__/errorSuppression.pure.test.ts | 8 +--- src/native/__tests__/errorSuppression.test.ts | 11 ++--- .../__tests__/autoCleanup.disabled.test.ts | 8 +--- .../__tests__/autoCleanup.noAfterEach.test.ts | 10 ++--- .../autoCleanup.noProcessEnv.test.ts | 21 +++------- src/server/__tests__/autoCleanup.pure.test.ts | 8 +--- src/server/__tests__/errorHook.test.ts | 2 +- .../errorSuppression.disabled.test.ts | 7 +--- .../errorSuppression.noAfterEach.test.ts | 9 ++-- .../errorSuppression.noBeforeEach.test.ts | 9 ++-- .../errorSuppression.noProcessEnv.test.ts | 20 +++------ .../__tests__/errorSuppression.pure.test.ts | 8 +--- src/server/__tests__/errorSuppression.test.ts | 11 ++--- 36 files changed, 141 insertions(+), 286 deletions(-) create mode 100644 src/__tests__/defaultRenderer.pure.test.ts diff --git a/package.json b/package.json index 9d62f0fa..abac2f09 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "docz-theme-default": "1.2.0", "docz-utils": "2.3.0", "eslint": "7.28.0", - "kcd-scripts": "10.0.0", + "kcd-scripts": "11.1.0", "prettier": "^2.2.1", "react": "17.0.2", "react-dom": "^17.0.1", diff --git a/src/__tests__/defaultRenderer.pure.test.ts b/src/__tests__/defaultRenderer.pure.test.ts new file mode 100644 index 00000000..d0fe14ff --- /dev/null +++ b/src/__tests__/defaultRenderer.pure.test.ts @@ -0,0 +1,41 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +import { ReactHooksRenderer } from '../types/react' + +describe('default renderer', () => { + beforeEach(() => { + jest.resetModules() + }) + + test('should resolve native renderer as default renderer', () => { + const expectedRenderer = require('../native/pure') as ReactHooksRenderer + const actualRenderer = require('../pure') as ReactHooksRenderer + + expect(actualRenderer).toEqual(expectedRenderer) + }) + + test('should resolve dom renderer as default renderer', () => { + jest.doMock('react-test-renderer', () => { + throw new Error('missing dependency') + }) + + const expectedRenderer = require('../dom/pure') as ReactHooksRenderer + const actualRenderer = require('../pure') as ReactHooksRenderer + + expect(actualRenderer).toEqual(expectedRenderer) + }) + + test('should throw error if a default renderer cannot be resolved', () => { + jest.doMock('react-test-renderer', () => { + throw new Error('missing dependency') + }) + + jest.doMock('react-dom', () => { + throw new Error('missing dependency') + }) + + const expectedMessage = + "Could not auto-detect a React renderer. Are you sure you've installed one of the following\n - react-dom\n - react-test-renderer\nIf you are using a bundler, please update your imports to use a specific renderer.\nFor instructions see: https://react-hooks-testing-library.com/installation#being-specific" + + expect(() => require('../pure')).toThrowError(new Error(expectedMessage)) + }) +}) diff --git a/src/__tests__/defaultRenderer.test.ts b/src/__tests__/defaultRenderer.test.ts index 45d2e7ce..de38354a 100644 --- a/src/__tests__/defaultRenderer.test.ts +++ b/src/__tests__/defaultRenderer.test.ts @@ -1,41 +1,8 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -import { ReactHooksRenderer } from '../types/react' +import * as actualRenderer from '..' +import * as expectedRenderer from '../native' describe('default renderer', () => { - beforeEach(() => { - jest.resetModules() - }) - test('should resolve native renderer as default renderer', () => { - const expectedRenderer = require('../native/pure') as ReactHooksRenderer - const actualRenderer = require('..') as ReactHooksRenderer - expect(actualRenderer).toEqual(expectedRenderer) }) - - test('should resolve dom renderer as default renderer', () => { - jest.doMock('react-test-renderer', () => { - throw new Error('missing dependency') - }) - - const expectedRenderer = require('../dom/pure') as ReactHooksRenderer - const actualRenderer = require('..') as ReactHooksRenderer - - expect(actualRenderer).toEqual(expectedRenderer) - }) - - test('should throw error if a default renderer cannot be resolved', () => { - jest.doMock('react-test-renderer', () => { - throw new Error('missing dependency') - }) - - jest.doMock('react-dom', () => { - throw new Error('missing dependency') - }) - - const expectedMessage = - "Could not auto-detect a React renderer. Are you sure you've installed one of the following\n - react-dom\n - react-test-renderer\nIf you are using a bundler, please update your imports to use a specific renderer.\nFor instructions see: https://react-hooks-testing-library.com/installation#being-specific" - - expect(() => require('..')).toThrowError(new Error(expectedMessage)) - }) }) diff --git a/src/dom/__tests__/autoCleanup.disabled.test.ts b/src/dom/__tests__/autoCleanup.disabled.test.ts index 2c574b83..cd32a7ee 100644 --- a/src/dom/__tests__/autoCleanup.disabled.test.ts +++ b/src/dom/__tests__/autoCleanup.disabled.test.ts @@ -6,12 +6,8 @@ import { ReactHooksRenderer } from '../../types/react' // then we DON'T auto-wire up the afterEach for folks describe('skip auto cleanup (disabled) tests', () => { let cleanupCalled = false - let renderHook: ReactHooksRenderer['renderHook'] - - beforeAll(() => { - process.env.RHTL_SKIP_AUTO_CLEANUP = 'true' - renderHook = (require('..') as ReactHooksRenderer).renderHook - }) + process.env.RHTL_SKIP_AUTO_CLEANUP = 'true' + const renderHook = (require('..') as ReactHooksRenderer).renderHook test('first', () => { const hookWithCleanup = () => { diff --git a/src/dom/__tests__/autoCleanup.noAfterEach.test.ts b/src/dom/__tests__/autoCleanup.noAfterEach.test.ts index 40b33f16..5f773d93 100644 --- a/src/dom/__tests__/autoCleanup.noAfterEach.test.ts +++ b/src/dom/__tests__/autoCleanup.noAfterEach.test.ts @@ -6,13 +6,9 @@ import { ReactHooksRenderer } from '../../types/react' // then we DON'T auto-wire up the afterEach for folks describe('skip auto cleanup (no afterEach) tests', () => { let cleanupCalled = false - let renderHook: ReactHooksRenderer['renderHook'] - - beforeAll(() => { - // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type - afterEach = false - renderHook = (require('..') as ReactHooksRenderer).renderHook - }) + // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type + afterEach = false + const renderHook = (require('..') as ReactHooksRenderer).renderHook test('first', () => { const hookWithCleanup = () => { diff --git a/src/dom/__tests__/autoCleanup.noProcessEnv.test.ts b/src/dom/__tests__/autoCleanup.noProcessEnv.test.ts index f6adc8ad..35febc66 100644 --- a/src/dom/__tests__/autoCleanup.noProcessEnv.test.ts +++ b/src/dom/__tests__/autoCleanup.noProcessEnv.test.ts @@ -4,24 +4,15 @@ import { ReactHooksRenderer } from '../../types/react' // This verifies that if process.env is unavailable // then we still auto-wire up the afterEach for folks -describe('skip auto cleanup (no process.env) tests', () => { - const originalEnv = process.env +describe('auto cleanup (no process.env) tests', () => { let cleanupCalled = false - let renderHook: ReactHooksRenderer['renderHook'] - - beforeAll(() => { - process.env = { - ...process.env, - get RHTL_SKIP_AUTO_CLEANUP(): string | undefined { - throw new Error('expected') - } + process.env = { + ...process.env, + get RHTL_SKIP_AUTO_CLEANUP(): string | undefined { + throw new Error('expected') } - renderHook = (require('..') as ReactHooksRenderer).renderHook - }) - - afterAll(() => { - process.env = originalEnv - }) + } + const renderHook = (require('..') as ReactHooksRenderer).renderHook test('first', () => { const hookWithCleanup = () => { diff --git a/src/dom/__tests__/autoCleanup.pure.test.ts b/src/dom/__tests__/autoCleanup.pure.test.ts index 1f84b87c..66c27a07 100644 --- a/src/dom/__tests__/autoCleanup.pure.test.ts +++ b/src/dom/__tests__/autoCleanup.pure.test.ts @@ -1,16 +1,10 @@ import { useEffect } from 'react' - -import { ReactHooksRenderer } from '../../types/react' +import { renderHook } from '../pure' // This verifies that if pure imports are used // then we DON'T auto-wire up the afterEach for folks describe('skip auto cleanup (pure) tests', () => { let cleanupCalled = false - let renderHook: ReactHooksRenderer['renderHook'] - - beforeAll(() => { - renderHook = (require('../pure') as ReactHooksRenderer).renderHook - }) test('first', () => { const hookWithCleanup = () => { diff --git a/src/dom/__tests__/errorHook.test.ts b/src/dom/__tests__/errorHook.test.ts index 6e6c0a38..8e97e5de 100644 --- a/src/dom/__tests__/errorHook.test.ts +++ b/src/dom/__tests__/errorHook.test.ts @@ -1,5 +1,5 @@ import { useState, useEffect } from 'react' -import { renderHook, act } from '..' +import { renderHook } from '..' describe('error hook tests', () => { function useError(throwError?: boolean) { diff --git a/src/dom/__tests__/errorSuppression.disabled.test.ts b/src/dom/__tests__/errorSuppression.disabled.test.ts index e1921f09..8cf200ab 100644 --- a/src/dom/__tests__/errorSuppression.disabled.test.ts +++ b/src/dom/__tests__/errorSuppression.disabled.test.ts @@ -2,11 +2,8 @@ // then we DON'T auto-wire up the afterEach for folks describe('error output suppression (disabled) tests', () => { const originalConsoleError = console.error - - beforeAll(() => { - process.env.RHTL_DISABLE_ERROR_FILTERING = 'true' - require('..') - }) + process.env.RHTL_DISABLE_ERROR_FILTERING = 'true' + require('..') test('should not patch console.error', () => { expect(console.error).toBe(originalConsoleError) diff --git a/src/dom/__tests__/errorSuppression.noAfterEach.test.ts b/src/dom/__tests__/errorSuppression.noAfterEach.test.ts index c736020e..f83d068f 100644 --- a/src/dom/__tests__/errorSuppression.noAfterEach.test.ts +++ b/src/dom/__tests__/errorSuppression.noAfterEach.test.ts @@ -2,12 +2,9 @@ // then we DON'T auto-wire up the afterEach for folks describe('error output suppression (noAfterEach) tests', () => { const originalConsoleError = console.error - - beforeAll(() => { - // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type - afterEach = false - require('..') - }) + // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type + afterEach = false + require('..') test('should not patch console.error', () => { expect(console.error).toBe(originalConsoleError) diff --git a/src/dom/__tests__/errorSuppression.noBeforeEach.test.ts b/src/dom/__tests__/errorSuppression.noBeforeEach.test.ts index c3f2496f..609cab95 100644 --- a/src/dom/__tests__/errorSuppression.noBeforeEach.test.ts +++ b/src/dom/__tests__/errorSuppression.noBeforeEach.test.ts @@ -2,12 +2,9 @@ // then we DON'T auto-wire up the afterEach for folks describe('error output suppression (noBeforeEach) tests', () => { const originalConsoleError = console.error - - beforeAll(() => { - // @ts-expect-error Turning off BeforeEach -- ignore Jest LifeCycle Type - beforeEach = false - require('..') - }) + // @ts-expect-error Turning off BeforeEach -- ignore Jest LifeCycle Type + beforeEach = false + require('..') test('should not patch console.error', () => { expect(console.error).toBe(originalConsoleError) diff --git a/src/dom/__tests__/errorSuppression.noProcessEnv.test.ts b/src/dom/__tests__/errorSuppression.noProcessEnv.test.ts index 24a50f21..414aea26 100644 --- a/src/dom/__tests__/errorSuppression.noProcessEnv.test.ts +++ b/src/dom/__tests__/errorSuppression.noProcessEnv.test.ts @@ -1,22 +1,14 @@ // This verifies that if process.env is unavailable // then we still auto-wire up the afterEach for folks describe('error output suppression (no process.env) tests', () => { - const originalEnv = process.env const originalConsoleError = console.error - - beforeAll(() => { - process.env = { - ...process.env, - get RHTL_DISABLE_ERROR_FILTERING(): string | undefined { - throw new Error('expected') - } + process.env = { + ...process.env, + get RHTL_DISABLE_ERROR_FILTERING(): string | undefined { + throw new Error('expected') } - require('..') - }) - - afterAll(() => { - process.env = originalEnv - }) + } + require('..') test('should not patch console.error', () => { expect(console.error).not.toBe(originalConsoleError) diff --git a/src/dom/__tests__/errorSuppression.pure.test.ts b/src/dom/__tests__/errorSuppression.pure.test.ts index e60ec710..6e356cb6 100644 --- a/src/dom/__tests__/errorSuppression.pure.test.ts +++ b/src/dom/__tests__/errorSuppression.pure.test.ts @@ -1,16 +1,10 @@ -import { ReactHooksRenderer } from '../../types/react' +import { suppressErrorOutput } from '../pure' // This verifies that if pure imports are used // then we DON'T auto-wire up the afterEach for folks describe('error output suppression (pure) tests', () => { const originalConsoleError = console.error - let suppressErrorOutput!: ReactHooksRenderer['suppressErrorOutput'] - - beforeAll(() => { - suppressErrorOutput = (require('../pure') as ReactHooksRenderer).suppressErrorOutput - }) - test('should not patch console.error', () => { expect(console.error).toBe(originalConsoleError) }) diff --git a/src/dom/__tests__/errorSuppression.test.ts b/src/dom/__tests__/errorSuppression.test.ts index 69250f47..8a4b72ad 100644 --- a/src/dom/__tests__/errorSuppression.test.ts +++ b/src/dom/__tests__/errorSuppression.test.ts @@ -1,14 +1,11 @@ import { useEffect } from 'react' - -import { ReactHooksRenderer } from '../../types/react' +import { renderHook, act, suppressErrorOutput } from '..' describe('error output suppression tests', () => { + const consoleError = console.error + test('should not suppress relevant errors', () => { - const consoleError = console.error console.error = jest.fn() - - const { suppressErrorOutput } = require('..') as ReactHooksRenderer - try { const restoreConsole = suppressErrorOutput() @@ -28,8 +25,6 @@ describe('error output suppression tests', () => { }) test('should allow console.error to be mocked', async () => { - const { renderHook, act } = require('..') as ReactHooksRenderer - const consoleError = console.error console.error = jest.fn() try { diff --git a/src/native/__tests__/autoCleanup.disabled.test.ts b/src/native/__tests__/autoCleanup.disabled.test.ts index 2c574b83..cd32a7ee 100644 --- a/src/native/__tests__/autoCleanup.disabled.test.ts +++ b/src/native/__tests__/autoCleanup.disabled.test.ts @@ -6,12 +6,8 @@ import { ReactHooksRenderer } from '../../types/react' // then we DON'T auto-wire up the afterEach for folks describe('skip auto cleanup (disabled) tests', () => { let cleanupCalled = false - let renderHook: ReactHooksRenderer['renderHook'] - - beforeAll(() => { - process.env.RHTL_SKIP_AUTO_CLEANUP = 'true' - renderHook = (require('..') as ReactHooksRenderer).renderHook - }) + process.env.RHTL_SKIP_AUTO_CLEANUP = 'true' + const renderHook = (require('..') as ReactHooksRenderer).renderHook test('first', () => { const hookWithCleanup = () => { diff --git a/src/native/__tests__/autoCleanup.noAfterEach.test.ts b/src/native/__tests__/autoCleanup.noAfterEach.test.ts index 40b33f16..5f773d93 100644 --- a/src/native/__tests__/autoCleanup.noAfterEach.test.ts +++ b/src/native/__tests__/autoCleanup.noAfterEach.test.ts @@ -6,13 +6,9 @@ import { ReactHooksRenderer } from '../../types/react' // then we DON'T auto-wire up the afterEach for folks describe('skip auto cleanup (no afterEach) tests', () => { let cleanupCalled = false - let renderHook: ReactHooksRenderer['renderHook'] - - beforeAll(() => { - // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type - afterEach = false - renderHook = (require('..') as ReactHooksRenderer).renderHook - }) + // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type + afterEach = false + const renderHook = (require('..') as ReactHooksRenderer).renderHook test('first', () => { const hookWithCleanup = () => { diff --git a/src/native/__tests__/autoCleanup.noProcessEnv.test.ts b/src/native/__tests__/autoCleanup.noProcessEnv.test.ts index f6adc8ad..35febc66 100644 --- a/src/native/__tests__/autoCleanup.noProcessEnv.test.ts +++ b/src/native/__tests__/autoCleanup.noProcessEnv.test.ts @@ -4,24 +4,15 @@ import { ReactHooksRenderer } from '../../types/react' // This verifies that if process.env is unavailable // then we still auto-wire up the afterEach for folks -describe('skip auto cleanup (no process.env) tests', () => { - const originalEnv = process.env +describe('auto cleanup (no process.env) tests', () => { let cleanupCalled = false - let renderHook: ReactHooksRenderer['renderHook'] - - beforeAll(() => { - process.env = { - ...process.env, - get RHTL_SKIP_AUTO_CLEANUP(): string | undefined { - throw new Error('expected') - } + process.env = { + ...process.env, + get RHTL_SKIP_AUTO_CLEANUP(): string | undefined { + throw new Error('expected') } - renderHook = (require('..') as ReactHooksRenderer).renderHook - }) - - afterAll(() => { - process.env = originalEnv - }) + } + const renderHook = (require('..') as ReactHooksRenderer).renderHook test('first', () => { const hookWithCleanup = () => { diff --git a/src/native/__tests__/autoCleanup.pure.test.ts b/src/native/__tests__/autoCleanup.pure.test.ts index 1f84b87c..66c27a07 100644 --- a/src/native/__tests__/autoCleanup.pure.test.ts +++ b/src/native/__tests__/autoCleanup.pure.test.ts @@ -1,16 +1,10 @@ import { useEffect } from 'react' - -import { ReactHooksRenderer } from '../../types/react' +import { renderHook } from '../pure' // This verifies that if pure imports are used // then we DON'T auto-wire up the afterEach for folks describe('skip auto cleanup (pure) tests', () => { let cleanupCalled = false - let renderHook: ReactHooksRenderer['renderHook'] - - beforeAll(() => { - renderHook = (require('../pure') as ReactHooksRenderer).renderHook - }) test('first', () => { const hookWithCleanup = () => { diff --git a/src/native/__tests__/errorHook.test.ts b/src/native/__tests__/errorHook.test.ts index 8399a50b..8e97e5de 100644 --- a/src/native/__tests__/errorHook.test.ts +++ b/src/native/__tests__/errorHook.test.ts @@ -1,5 +1,5 @@ import { useState, useEffect } from 'react' -import { renderHook, act } from '..' +import { renderHook } from '..' describe('error hook tests', () => { function useError(throwError?: boolean) { @@ -109,7 +109,7 @@ describe('error hook tests', () => { }) describe('effect', () => { - test('should raise effect error', () => { + test('this one - should raise effect error', () => { const { result } = renderHook(() => useEffectError(true)) expect(() => { @@ -117,7 +117,7 @@ describe('error hook tests', () => { }).toThrow(Error('expected')) }) - test('should capture effect error', () => { + test('this one - should capture effect error', () => { const { result } = renderHook(() => useEffectError(true)) expect(result.error).toEqual(Error('expected')) }) diff --git a/src/native/__tests__/errorSuppression.disabled.test.ts b/src/native/__tests__/errorSuppression.disabled.test.ts index e1921f09..8cf200ab 100644 --- a/src/native/__tests__/errorSuppression.disabled.test.ts +++ b/src/native/__tests__/errorSuppression.disabled.test.ts @@ -2,11 +2,8 @@ // then we DON'T auto-wire up the afterEach for folks describe('error output suppression (disabled) tests', () => { const originalConsoleError = console.error - - beforeAll(() => { - process.env.RHTL_DISABLE_ERROR_FILTERING = 'true' - require('..') - }) + process.env.RHTL_DISABLE_ERROR_FILTERING = 'true' + require('..') test('should not patch console.error', () => { expect(console.error).toBe(originalConsoleError) diff --git a/src/native/__tests__/errorSuppression.noAfterEach.test.ts b/src/native/__tests__/errorSuppression.noAfterEach.test.ts index c736020e..f83d068f 100644 --- a/src/native/__tests__/errorSuppression.noAfterEach.test.ts +++ b/src/native/__tests__/errorSuppression.noAfterEach.test.ts @@ -2,12 +2,9 @@ // then we DON'T auto-wire up the afterEach for folks describe('error output suppression (noAfterEach) tests', () => { const originalConsoleError = console.error - - beforeAll(() => { - // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type - afterEach = false - require('..') - }) + // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type + afterEach = false + require('..') test('should not patch console.error', () => { expect(console.error).toBe(originalConsoleError) diff --git a/src/native/__tests__/errorSuppression.noBeforeEach.test.ts b/src/native/__tests__/errorSuppression.noBeforeEach.test.ts index c3f2496f..609cab95 100644 --- a/src/native/__tests__/errorSuppression.noBeforeEach.test.ts +++ b/src/native/__tests__/errorSuppression.noBeforeEach.test.ts @@ -2,12 +2,9 @@ // then we DON'T auto-wire up the afterEach for folks describe('error output suppression (noBeforeEach) tests', () => { const originalConsoleError = console.error - - beforeAll(() => { - // @ts-expect-error Turning off BeforeEach -- ignore Jest LifeCycle Type - beforeEach = false - require('..') - }) + // @ts-expect-error Turning off BeforeEach -- ignore Jest LifeCycle Type + beforeEach = false + require('..') test('should not patch console.error', () => { expect(console.error).toBe(originalConsoleError) diff --git a/src/native/__tests__/errorSuppression.noProcessEnv.test.ts b/src/native/__tests__/errorSuppression.noProcessEnv.test.ts index 24a50f21..414aea26 100644 --- a/src/native/__tests__/errorSuppression.noProcessEnv.test.ts +++ b/src/native/__tests__/errorSuppression.noProcessEnv.test.ts @@ -1,22 +1,14 @@ // This verifies that if process.env is unavailable // then we still auto-wire up the afterEach for folks describe('error output suppression (no process.env) tests', () => { - const originalEnv = process.env const originalConsoleError = console.error - - beforeAll(() => { - process.env = { - ...process.env, - get RHTL_DISABLE_ERROR_FILTERING(): string | undefined { - throw new Error('expected') - } + process.env = { + ...process.env, + get RHTL_DISABLE_ERROR_FILTERING(): string | undefined { + throw new Error('expected') } - require('..') - }) - - afterAll(() => { - process.env = originalEnv - }) + } + require('..') test('should not patch console.error', () => { expect(console.error).not.toBe(originalConsoleError) diff --git a/src/native/__tests__/errorSuppression.pure.test.ts b/src/native/__tests__/errorSuppression.pure.test.ts index e60ec710..6e356cb6 100644 --- a/src/native/__tests__/errorSuppression.pure.test.ts +++ b/src/native/__tests__/errorSuppression.pure.test.ts @@ -1,16 +1,10 @@ -import { ReactHooksRenderer } from '../../types/react' +import { suppressErrorOutput } from '../pure' // This verifies that if pure imports are used // then we DON'T auto-wire up the afterEach for folks describe('error output suppression (pure) tests', () => { const originalConsoleError = console.error - let suppressErrorOutput!: ReactHooksRenderer['suppressErrorOutput'] - - beforeAll(() => { - suppressErrorOutput = (require('../pure') as ReactHooksRenderer).suppressErrorOutput - }) - test('should not patch console.error', () => { expect(console.error).toBe(originalConsoleError) }) diff --git a/src/native/__tests__/errorSuppression.test.ts b/src/native/__tests__/errorSuppression.test.ts index 69250f47..a5cb4b79 100644 --- a/src/native/__tests__/errorSuppression.test.ts +++ b/src/native/__tests__/errorSuppression.test.ts @@ -1,14 +1,12 @@ import { useEffect } from 'react' - -import { ReactHooksRenderer } from '../../types/react' +import { renderHook, act, suppressErrorOutput } from '..' describe('error output suppression tests', () => { + const consoleError = console.error + test('should not suppress relevant errors', () => { - const consoleError = console.error console.error = jest.fn() - const { suppressErrorOutput } = require('..') as ReactHooksRenderer - try { const restoreConsole = suppressErrorOutput() @@ -28,10 +26,7 @@ describe('error output suppression tests', () => { }) test('should allow console.error to be mocked', async () => { - const { renderHook, act } = require('..') as ReactHooksRenderer - const consoleError = console.error console.error = jest.fn() - try { const { rerender, unmount } = renderHook( (stage) => { diff --git a/src/server/__tests__/autoCleanup.disabled.test.ts b/src/server/__tests__/autoCleanup.disabled.test.ts index a39e4e72..fd597168 100644 --- a/src/server/__tests__/autoCleanup.disabled.test.ts +++ b/src/server/__tests__/autoCleanup.disabled.test.ts @@ -9,12 +9,8 @@ describe('skip auto cleanup (disabled) tests', () => { ssr: false, hydrated: false } - let renderHook: ReactHooksServerRenderer['renderHook'] - - beforeAll(() => { - process.env.RHTL_SKIP_AUTO_CLEANUP = 'true' - renderHook = (require('..') as ReactHooksServerRenderer).renderHook - }) + process.env.RHTL_SKIP_AUTO_CLEANUP = 'true' + const renderHook = (require('..') as ReactHooksServerRenderer).renderHook test('first', () => { const hookWithCleanup = (name: string) => { diff --git a/src/server/__tests__/autoCleanup.noAfterEach.test.ts b/src/server/__tests__/autoCleanup.noAfterEach.test.ts index 6468296b..d7ea75ac 100644 --- a/src/server/__tests__/autoCleanup.noAfterEach.test.ts +++ b/src/server/__tests__/autoCleanup.noAfterEach.test.ts @@ -9,13 +9,9 @@ describe('skip auto cleanup (no afterEach) tests', () => { ssr: false, hydrated: false } - let renderHook: ReactHooksServerRenderer['renderHook'] - - beforeAll(() => { - // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type - afterEach = false - renderHook = (require('..') as ReactHooksServerRenderer).renderHook - }) + // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type + afterEach = false + const renderHook = (require('..') as ReactHooksServerRenderer).renderHook test('first', () => { const hookWithCleanup = (name: string) => { diff --git a/src/server/__tests__/autoCleanup.noProcessEnv.test.ts b/src/server/__tests__/autoCleanup.noProcessEnv.test.ts index f734d73e..de8bf795 100644 --- a/src/server/__tests__/autoCleanup.noProcessEnv.test.ts +++ b/src/server/__tests__/autoCleanup.noProcessEnv.test.ts @@ -5,26 +5,17 @@ import { ReactHooksServerRenderer } from '../../types/react' // This verifies that if process.env is unavailable // then we still auto-wire up the afterEach for folks describe('skip auto cleanup (no process.env) tests', () => { - const originalEnv = process.env const cleanups: Record = { ssr: false, hydrated: false } - let renderHook: ReactHooksServerRenderer['renderHook'] - - beforeAll(() => { - process.env = { - ...process.env, - get RHTL_SKIP_AUTO_CLEANUP(): string | undefined { - throw new Error('expected') - } + process.env = { + ...process.env, + get RHTL_SKIP_AUTO_CLEANUP(): string | undefined { + throw new Error('expected') } - renderHook = (require('..') as ReactHooksServerRenderer).renderHook - }) - - afterAll(() => { - process.env = originalEnv - }) + } + const renderHook = (require('..') as ReactHooksServerRenderer).renderHook test('first', () => { const hookWithCleanup = (name: string) => { diff --git a/src/server/__tests__/autoCleanup.pure.test.ts b/src/server/__tests__/autoCleanup.pure.test.ts index 0044e17f..ecf8a72d 100644 --- a/src/server/__tests__/autoCleanup.pure.test.ts +++ b/src/server/__tests__/autoCleanup.pure.test.ts @@ -1,6 +1,5 @@ import { useEffect } from 'react' - -import { ReactHooksServerRenderer } from '../../types/react' +import { renderHook } from '../pure' // This verifies that if pure imports are used // then we DON'T auto-wire up the afterEach for folks @@ -9,11 +8,6 @@ describe('skip auto cleanup (pure) tests', () => { ssr: false, hydrated: false } - let renderHook: ReactHooksServerRenderer['renderHook'] - - beforeAll(() => { - renderHook = (require('../pure') as ReactHooksServerRenderer).renderHook - }) test('first', () => { const hookWithCleanup = (name: string) => { diff --git a/src/server/__tests__/errorHook.test.ts b/src/server/__tests__/errorHook.test.ts index 75925a98..f7977465 100644 --- a/src/server/__tests__/errorHook.test.ts +++ b/src/server/__tests__/errorHook.test.ts @@ -1,6 +1,6 @@ import { useState, useEffect } from 'react' -import { renderHook, act } from '..' +import { renderHook } from '..' describe('error hook tests', () => { function useError(throwError?: boolean) { diff --git a/src/server/__tests__/errorSuppression.disabled.test.ts b/src/server/__tests__/errorSuppression.disabled.test.ts index e1921f09..8cf200ab 100644 --- a/src/server/__tests__/errorSuppression.disabled.test.ts +++ b/src/server/__tests__/errorSuppression.disabled.test.ts @@ -2,11 +2,8 @@ // then we DON'T auto-wire up the afterEach for folks describe('error output suppression (disabled) tests', () => { const originalConsoleError = console.error - - beforeAll(() => { - process.env.RHTL_DISABLE_ERROR_FILTERING = 'true' - require('..') - }) + process.env.RHTL_DISABLE_ERROR_FILTERING = 'true' + require('..') test('should not patch console.error', () => { expect(console.error).toBe(originalConsoleError) diff --git a/src/server/__tests__/errorSuppression.noAfterEach.test.ts b/src/server/__tests__/errorSuppression.noAfterEach.test.ts index c736020e..f83d068f 100644 --- a/src/server/__tests__/errorSuppression.noAfterEach.test.ts +++ b/src/server/__tests__/errorSuppression.noAfterEach.test.ts @@ -2,12 +2,9 @@ // then we DON'T auto-wire up the afterEach for folks describe('error output suppression (noAfterEach) tests', () => { const originalConsoleError = console.error - - beforeAll(() => { - // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type - afterEach = false - require('..') - }) + // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type + afterEach = false + require('..') test('should not patch console.error', () => { expect(console.error).toBe(originalConsoleError) diff --git a/src/server/__tests__/errorSuppression.noBeforeEach.test.ts b/src/server/__tests__/errorSuppression.noBeforeEach.test.ts index c3f2496f..609cab95 100644 --- a/src/server/__tests__/errorSuppression.noBeforeEach.test.ts +++ b/src/server/__tests__/errorSuppression.noBeforeEach.test.ts @@ -2,12 +2,9 @@ // then we DON'T auto-wire up the afterEach for folks describe('error output suppression (noBeforeEach) tests', () => { const originalConsoleError = console.error - - beforeAll(() => { - // @ts-expect-error Turning off BeforeEach -- ignore Jest LifeCycle Type - beforeEach = false - require('..') - }) + // @ts-expect-error Turning off BeforeEach -- ignore Jest LifeCycle Type + beforeEach = false + require('..') test('should not patch console.error', () => { expect(console.error).toBe(originalConsoleError) diff --git a/src/server/__tests__/errorSuppression.noProcessEnv.test.ts b/src/server/__tests__/errorSuppression.noProcessEnv.test.ts index 24a50f21..414aea26 100644 --- a/src/server/__tests__/errorSuppression.noProcessEnv.test.ts +++ b/src/server/__tests__/errorSuppression.noProcessEnv.test.ts @@ -1,22 +1,14 @@ // This verifies that if process.env is unavailable // then we still auto-wire up the afterEach for folks describe('error output suppression (no process.env) tests', () => { - const originalEnv = process.env const originalConsoleError = console.error - - beforeAll(() => { - process.env = { - ...process.env, - get RHTL_DISABLE_ERROR_FILTERING(): string | undefined { - throw new Error('expected') - } + process.env = { + ...process.env, + get RHTL_DISABLE_ERROR_FILTERING(): string | undefined { + throw new Error('expected') } - require('..') - }) - - afterAll(() => { - process.env = originalEnv - }) + } + require('..') test('should not patch console.error', () => { expect(console.error).not.toBe(originalConsoleError) diff --git a/src/server/__tests__/errorSuppression.pure.test.ts b/src/server/__tests__/errorSuppression.pure.test.ts index e60ec710..6e356cb6 100644 --- a/src/server/__tests__/errorSuppression.pure.test.ts +++ b/src/server/__tests__/errorSuppression.pure.test.ts @@ -1,16 +1,10 @@ -import { ReactHooksRenderer } from '../../types/react' +import { suppressErrorOutput } from '../pure' // This verifies that if pure imports are used // then we DON'T auto-wire up the afterEach for folks describe('error output suppression (pure) tests', () => { const originalConsoleError = console.error - let suppressErrorOutput!: ReactHooksRenderer['suppressErrorOutput'] - - beforeAll(() => { - suppressErrorOutput = (require('../pure') as ReactHooksRenderer).suppressErrorOutput - }) - test('should not patch console.error', () => { expect(console.error).toBe(originalConsoleError) }) diff --git a/src/server/__tests__/errorSuppression.test.ts b/src/server/__tests__/errorSuppression.test.ts index e4492756..d97f9735 100644 --- a/src/server/__tests__/errorSuppression.test.ts +++ b/src/server/__tests__/errorSuppression.test.ts @@ -1,14 +1,12 @@ import { useEffect } from 'react' - -import { ReactHooksServerRenderer } from '../../types/react' +import { renderHook, act, suppressErrorOutput } from '..' describe('error output suppression tests', () => { + const consoleError = console.error + test('should not suppress relevant errors', () => { - const consoleError = console.error console.error = jest.fn() - const { suppressErrorOutput } = require('..') as ReactHooksServerRenderer - try { const restoreConsole = suppressErrorOutput() @@ -28,10 +26,7 @@ describe('error output suppression tests', () => { }) test('should allow console.error to be mocked', async () => { - const { renderHook, act } = require('..') as ReactHooksServerRenderer - const consoleError = console.error console.error = jest.fn() - try { const { hydrate, rerender, unmount } = renderHook( (stage) => { From eff2ca6ea7fb558ed0111fa2a1054ccb7ca566e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 21 Jun 2021 12:17:04 +1000 Subject: [PATCH 04/95] chore(deps-dev): bump eslint from 7.28.0 to 7.29.0 (#640) Bumps [eslint](https://github.com/eslint/eslint) from 7.28.0 to 7.29.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v7.28.0...v7.29.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index abac2f09..56daa2b7 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "docz": "2.3.1", "docz-theme-default": "1.2.0", "docz-utils": "2.3.0", - "eslint": "7.28.0", + "eslint": "7.29.0", "kcd-scripts": "11.1.0", "prettier": "^2.2.1", "react": "17.0.2", From c7a2e979fb8a51271d0d3032c7a03b6fb6ebd3e6 Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Thu, 1 Jul 2021 07:07:07 +1000 Subject: [PATCH 05/95] fix(types): fix `cleanup` return type to match `async` implementation * fix(types): fix `cleanup` return type to match `async` implementation * test: refactor tests to reduce duplication for different renderers * test: refactor `hydratedServerRenderer` and added comment for clarity about it --- jest.config.js | 4 + src/__tests__/asyncHook.test.ts | 258 ++++++++++++++ src/__tests__/autoCleanup.disabled.test.ts | 26 ++ src/__tests__/autoCleanup.noAfterEach.test.ts | 28 ++ .../autoCleanup.noProcessEnv.test.ts | 31 ++ src/__tests__/autoCleanup.pure.test.ts | 27 ++ src/__tests__/autoCleanup.test.ts | 52 +++ src/__tests__/autoDetectRenderer.test.ts | 70 ++++ src/__tests__/cleanup.test.ts | 166 +++++++++ src/__tests__/customHook.test.ts | 30 ++ src/__tests__/defaultRenderer.pure.test.ts | 41 --- src/__tests__/defaultRenderer.test.ts | 8 - src/__tests__/errorHook.test.ts | 151 ++++++++ .../errorSuppression.disabled.test.ts | 8 +- .../errorSuppression.noAfterEach.test.ts | 9 +- .../errorSuppression.noBeforeEach.test.ts | 9 +- .../errorSuppression.noProcessEnv.test.ts | 8 +- src/__tests__/errorSuppression.pure.test.ts | 29 ++ src/__tests__/errorSuppression.test.ts | 74 ++++ src/__tests__/hydrationErrors.test.ts | 30 ++ src/__tests__/resultHistory.test.ts | 78 +++++ src/__tests__/suspenseHook.test.ts | 64 ++++ src/__tests__/useContext.test.tsx | 64 ++++ src/__tests__/useEffect.test.ts | 99 ++++++ src/__tests__/useMemo.test.ts | 65 ++++ src/__tests__/useReducer.test.ts | 21 ++ src/__tests__/useRef.test.ts | 23 ++ src/__tests__/useState.test.ts | 25 ++ src/__tests__/utils/runForRenderers.ts | 87 +++++ src/dom/__tests__/asyncHook.test.ts | 259 -------------- .../__tests__/autoCleanup.disabled.test.ts | 26 -- .../__tests__/autoCleanup.noAfterEach.test.ts | 27 -- .../autoCleanup.noProcessEnv.test.ts | 31 -- src/dom/__tests__/autoCleanup.pure.test.ts | 23 -- src/dom/__tests__/autoCleanup.test.ts | 24 -- src/dom/__tests__/cleanup.test.ts | 135 -------- src/dom/__tests__/customHook.test.ts | 29 -- src/dom/__tests__/errorHook.test.ts | 145 -------- .../errorSuppression.disabled.test.ts | 13 - .../errorSuppression.noAfterEach.test.ts | 14 - .../errorSuppression.noBeforeEach.test.ts | 14 - .../__tests__/errorSuppression.pure.test.ts | 23 -- src/dom/__tests__/errorSuppression.test.ts | 70 ---- src/dom/__tests__/resultHistory.test.ts | 39 --- src/dom/__tests__/suspenseHook.test.ts | 61 ---- src/dom/__tests__/useContext.test.tsx | 63 ---- src/dom/__tests__/useEffect.test.ts | 62 ---- src/dom/__tests__/useMemo.test.ts | 64 ---- src/dom/__tests__/useReducer.test.ts | 20 -- src/dom/__tests__/useRef.test.ts | 27 -- src/dom/__tests__/useState.test.ts | 24 -- src/native/__tests__/asyncHook.test.ts | 259 -------------- .../__tests__/autoCleanup.disabled.test.ts | 26 -- .../__tests__/autoCleanup.noAfterEach.test.ts | 27 -- .../autoCleanup.noProcessEnv.test.ts | 31 -- src/native/__tests__/autoCleanup.pure.test.ts | 23 -- src/native/__tests__/autoCleanup.test.ts | 24 -- src/native/__tests__/cleanup.test.ts | 135 -------- src/native/__tests__/customHook.test.ts | 29 -- src/native/__tests__/errorHook.test.ts | 145 -------- .../errorSuppression.disabled.test.ts | 13 - .../errorSuppression.noAfterEach.test.ts | 14 - .../errorSuppression.noBeforeEach.test.ts | 14 - .../errorSuppression.noProcessEnv.test.ts | 18 - .../__tests__/errorSuppression.pure.test.ts | 23 -- src/native/__tests__/errorSuppression.test.ts | 70 ---- src/native/__tests__/resultHistory.test.ts | 39 --- src/native/__tests__/suspenseHook.test.ts | 61 ---- src/native/__tests__/useContext.test.tsx | 63 ---- src/native/__tests__/useEffect.test.ts | 62 ---- src/native/__tests__/useMemo.test.ts | 64 ---- src/native/__tests__/useReducer.test.ts | 20 -- src/native/__tests__/useRef.test.ts | 27 -- src/native/__tests__/useState.test.ts | 24 -- src/server/__tests__/asyncHook.test.ts | 325 ------------------ .../__tests__/autoCleanup.disabled.test.ts | 34 -- .../__tests__/autoCleanup.noAfterEach.test.ts | 35 -- .../autoCleanup.noProcessEnv.test.ts | 39 --- src/server/__tests__/autoCleanup.pure.test.ts | 31 -- src/server/__tests__/autoCleanup.test.ts | 32 -- src/server/__tests__/cleanup.test.ts | 67 ---- src/server/__tests__/customHook.test.ts | 33 -- src/server/__tests__/errorHook.test.ts | 166 --------- .../errorSuppression.noProcessEnv.test.ts | 18 - .../__tests__/errorSuppression.pure.test.ts | 23 -- src/server/__tests__/errorSuppression.test.ts | 72 ---- src/server/__tests__/hydrationErrors.test.ts | 29 -- src/server/__tests__/resultHistory.test.ts | 44 --- src/server/__tests__/useContext.test.tsx | 45 --- src/server/__tests__/useEffect.test.ts | 38 -- src/server/__tests__/useMemo.test.ts | 87 ----- src/server/__tests__/useReducer.test.ts | 22 -- src/server/__tests__/useRef.test.ts | 29 -- src/server/__tests__/useState.test.ts | 39 --- src/types/react.ts | 2 +- 95 files changed, 1525 insertions(+), 3674 deletions(-) create mode 100644 jest.config.js create mode 100644 src/__tests__/asyncHook.test.ts create mode 100644 src/__tests__/autoCleanup.disabled.test.ts create mode 100644 src/__tests__/autoCleanup.noAfterEach.test.ts create mode 100644 src/__tests__/autoCleanup.noProcessEnv.test.ts create mode 100644 src/__tests__/autoCleanup.pure.test.ts create mode 100644 src/__tests__/autoCleanup.test.ts create mode 100644 src/__tests__/autoDetectRenderer.test.ts create mode 100644 src/__tests__/cleanup.test.ts create mode 100644 src/__tests__/customHook.test.ts delete mode 100644 src/__tests__/defaultRenderer.pure.test.ts delete mode 100644 src/__tests__/defaultRenderer.test.ts create mode 100644 src/__tests__/errorHook.test.ts rename src/{server => }/__tests__/errorSuppression.disabled.test.ts (56%) rename src/{server => }/__tests__/errorSuppression.noAfterEach.test.ts (54%) rename src/{server => }/__tests__/errorSuppression.noBeforeEach.test.ts (55%) rename src/{dom => }/__tests__/errorSuppression.noProcessEnv.test.ts (63%) create mode 100644 src/__tests__/errorSuppression.pure.test.ts create mode 100644 src/__tests__/errorSuppression.test.ts create mode 100644 src/__tests__/hydrationErrors.test.ts create mode 100644 src/__tests__/resultHistory.test.ts create mode 100644 src/__tests__/suspenseHook.test.ts create mode 100644 src/__tests__/useContext.test.tsx create mode 100644 src/__tests__/useEffect.test.ts create mode 100644 src/__tests__/useMemo.test.ts create mode 100644 src/__tests__/useReducer.test.ts create mode 100644 src/__tests__/useRef.test.ts create mode 100644 src/__tests__/useState.test.ts create mode 100644 src/__tests__/utils/runForRenderers.ts delete mode 100644 src/dom/__tests__/asyncHook.test.ts delete mode 100644 src/dom/__tests__/autoCleanup.disabled.test.ts delete mode 100644 src/dom/__tests__/autoCleanup.noAfterEach.test.ts delete mode 100644 src/dom/__tests__/autoCleanup.noProcessEnv.test.ts delete mode 100644 src/dom/__tests__/autoCleanup.pure.test.ts delete mode 100644 src/dom/__tests__/autoCleanup.test.ts delete mode 100644 src/dom/__tests__/cleanup.test.ts delete mode 100644 src/dom/__tests__/customHook.test.ts delete mode 100644 src/dom/__tests__/errorHook.test.ts delete mode 100644 src/dom/__tests__/errorSuppression.disabled.test.ts delete mode 100644 src/dom/__tests__/errorSuppression.noAfterEach.test.ts delete mode 100644 src/dom/__tests__/errorSuppression.noBeforeEach.test.ts delete mode 100644 src/dom/__tests__/errorSuppression.pure.test.ts delete mode 100644 src/dom/__tests__/errorSuppression.test.ts delete mode 100644 src/dom/__tests__/resultHistory.test.ts delete mode 100644 src/dom/__tests__/suspenseHook.test.ts delete mode 100644 src/dom/__tests__/useContext.test.tsx delete mode 100644 src/dom/__tests__/useEffect.test.ts delete mode 100644 src/dom/__tests__/useMemo.test.ts delete mode 100644 src/dom/__tests__/useReducer.test.ts delete mode 100644 src/dom/__tests__/useRef.test.ts delete mode 100644 src/dom/__tests__/useState.test.ts delete mode 100644 src/native/__tests__/asyncHook.test.ts delete mode 100644 src/native/__tests__/autoCleanup.disabled.test.ts delete mode 100644 src/native/__tests__/autoCleanup.noAfterEach.test.ts delete mode 100644 src/native/__tests__/autoCleanup.noProcessEnv.test.ts delete mode 100644 src/native/__tests__/autoCleanup.pure.test.ts delete mode 100644 src/native/__tests__/autoCleanup.test.ts delete mode 100644 src/native/__tests__/cleanup.test.ts delete mode 100644 src/native/__tests__/customHook.test.ts delete mode 100644 src/native/__tests__/errorHook.test.ts delete mode 100644 src/native/__tests__/errorSuppression.disabled.test.ts delete mode 100644 src/native/__tests__/errorSuppression.noAfterEach.test.ts delete mode 100644 src/native/__tests__/errorSuppression.noBeforeEach.test.ts delete mode 100644 src/native/__tests__/errorSuppression.noProcessEnv.test.ts delete mode 100644 src/native/__tests__/errorSuppression.pure.test.ts delete mode 100644 src/native/__tests__/errorSuppression.test.ts delete mode 100644 src/native/__tests__/resultHistory.test.ts delete mode 100644 src/native/__tests__/suspenseHook.test.ts delete mode 100644 src/native/__tests__/useContext.test.tsx delete mode 100644 src/native/__tests__/useEffect.test.ts delete mode 100644 src/native/__tests__/useMemo.test.ts delete mode 100644 src/native/__tests__/useReducer.test.ts delete mode 100644 src/native/__tests__/useRef.test.ts delete mode 100644 src/native/__tests__/useState.test.ts delete mode 100644 src/server/__tests__/asyncHook.test.ts delete mode 100644 src/server/__tests__/autoCleanup.disabled.test.ts delete mode 100644 src/server/__tests__/autoCleanup.noAfterEach.test.ts delete mode 100644 src/server/__tests__/autoCleanup.noProcessEnv.test.ts delete mode 100644 src/server/__tests__/autoCleanup.pure.test.ts delete mode 100644 src/server/__tests__/autoCleanup.test.ts delete mode 100644 src/server/__tests__/cleanup.test.ts delete mode 100644 src/server/__tests__/customHook.test.ts delete mode 100644 src/server/__tests__/errorHook.test.ts delete mode 100644 src/server/__tests__/errorSuppression.noProcessEnv.test.ts delete mode 100644 src/server/__tests__/errorSuppression.pure.test.ts delete mode 100644 src/server/__tests__/errorSuppression.test.ts delete mode 100644 src/server/__tests__/hydrationErrors.test.ts delete mode 100644 src/server/__tests__/resultHistory.test.ts delete mode 100644 src/server/__tests__/useContext.test.tsx delete mode 100644 src/server/__tests__/useEffect.test.ts delete mode 100644 src/server/__tests__/useMemo.test.ts delete mode 100644 src/server/__tests__/useReducer.test.ts delete mode 100644 src/server/__tests__/useRef.test.ts delete mode 100644 src/server/__tests__/useState.test.ts diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000..66b8064e --- /dev/null +++ b/jest.config.js @@ -0,0 +1,4 @@ +const { jest: jestConfig } = require('kcd-scripts/config') +module.exports = Object.assign(jestConfig, { + setupFiles: ['/src/__tests__/utils/runForRenderers.ts'] +}) diff --git a/src/__tests__/asyncHook.test.ts b/src/__tests__/asyncHook.test.ts new file mode 100644 index 00000000..17979ae2 --- /dev/null +++ b/src/__tests__/asyncHook.test.ts @@ -0,0 +1,258 @@ +import { useState, useRef, useEffect } from 'react' + +describe('async hook tests', () => { + const useSequence = (values: string[], intervalMs = 50) => { + const [first, ...otherValues] = values + const [value, setValue] = useState(() => first) + const index = useRef(0) + + useEffect(() => { + const interval = setInterval(() => { + setValue(otherValues[index.current++]) + if (index.current >= otherValues.length) { + clearInterval(interval) + } + }, intervalMs) + return () => { + clearInterval(interval) + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, otherValues) + + return value + } + + runForRenderers(['default', 'dom', 'native', 'server/hydrated'], ({ renderHook }) => { + test('should wait for next update', async () => { + const { result, waitForNextUpdate } = renderHook(() => useSequence(['first', 'second'])) + + expect(result.current).toBe('first') + + await waitForNextUpdate() + + expect(result.current).toBe('second') + }) + + test('should wait for multiple updates', async () => { + const { result, waitForNextUpdate } = renderHook(() => + useSequence(['first', 'second', 'third']) + ) + + expect(result.current).toBe('first') + + await waitForNextUpdate() + + expect(result.current).toBe('second') + + await waitForNextUpdate() + + expect(result.current).toBe('third') + }) + + test('should reject if timeout exceeded when waiting for next update', async () => { + const { result, waitForNextUpdate } = renderHook(() => useSequence(['first', 'second'])) + + expect(result.current).toBe('first') + + await expect(waitForNextUpdate({ timeout: 10 })).rejects.toThrow( + Error('Timed out in waitForNextUpdate after 10ms.') + ) + }) + + test('should not reject when waiting for next update if timeout has been disabled', async () => { + const { result, waitForNextUpdate } = renderHook(() => useSequence(['first', 'second'], 1100)) + + expect(result.current).toBe('first') + + await waitForNextUpdate({ timeout: false }) + + expect(result.current).toBe('second') + }) + + test('should wait for expectation to pass', async () => { + const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) + + expect(result.current).toBe('first') + + let complete = false + await waitFor(() => { + expect(result.current).toBe('third') + complete = true + }) + expect(complete).toBe(true) + }) + + test('should wait for arbitrary expectation to pass', async () => { + const { waitFor } = renderHook(() => null) + + let actual = 0 + const expected = 1 + + setTimeout(() => { + actual = expected + }, 200) + + let complete = false + await waitFor(() => { + expect(actual).toBe(expected) + complete = true + }) + + expect(complete).toBe(true) + }) + + test('should not hang if expectation is already passing', async () => { + const { result, waitFor } = renderHook(() => useSequence(['first', 'second'])) + + expect(result.current).toBe('first') + + let complete = false + await waitFor(() => { + expect(result.current).toBe('first') + complete = true + }) + expect(complete).toBe(true) + }) + + test('should wait for truthy value', async () => { + const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) + + expect(result.current).toBe('first') + + await waitFor(() => result.current === 'third') + + expect(result.current).toBe('third') + }) + + test('should wait for arbitrary truthy value', async () => { + const { waitFor } = renderHook(() => null) + + let actual = 0 + const expected = 1 + + setTimeout(() => { + actual = expected + }, 200) + + await waitFor(() => actual === 1) + + expect(actual).toBe(expected) + }) + + test('should reject if timeout exceeded when waiting for expectation to pass', async () => { + const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) + + expect(result.current).toBe('first') + + await expect( + waitFor( + () => { + expect(result.current).toBe('third') + }, + { timeout: 75 } + ) + ).rejects.toThrow(Error('Timed out in waitFor after 75ms.')) + }) + + test('should not reject when waiting for expectation to pass if timeout has been disabled', async () => { + const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'], 550)) + + expect(result.current).toBe('first') + + await waitFor( + () => { + expect(result.current).toBe('third') + }, + { timeout: false } + ) + + expect(result.current).toBe('third') + }) + + test('should check on interval when waiting for expectation to pass', async () => { + const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) + + let checks = 0 + + await waitFor( + () => { + checks++ + return result.current === 'third' + }, + { interval: 100 } + ) + + expect(checks).toBe(3) + }) + + test('should wait for value to change', async () => { + const { result, waitForValueToChange } = renderHook(() => + useSequence(['first', 'second', 'third']) + ) + + expect(result.current).toBe('first') + + await waitForValueToChange(() => result.current === 'third') + + expect(result.current).toBe('third') + }) + + test('should wait for arbitrary value to change', async () => { + const { waitForValueToChange } = renderHook(() => null) + + let actual = 0 + const expected = 1 + + setTimeout(() => { + actual = expected + }, 200) + + await waitForValueToChange(() => actual) + + expect(actual).toBe(expected) + }) + + test('should reject if timeout exceeded when waiting for value to change', async () => { + const { result, waitForValueToChange } = renderHook(() => + useSequence(['first', 'second', 'third']) + ) + + expect(result.current).toBe('first') + + await expect( + waitForValueToChange(() => result.current === 'third', { + timeout: 75 + }) + ).rejects.toThrow(Error('Timed out in waitForValueToChange after 75ms.')) + }) + + test('should not reject when waiting for value to change if timeout is disabled', async () => { + const { result, waitForValueToChange } = renderHook(() => + useSequence(['first', 'second', 'third'], 550) + ) + + expect(result.current).toBe('first') + + await waitForValueToChange(() => result.current === 'third', { + timeout: false + }) + + expect(result.current).toBe('third') + }) + + test('should reject if selector throws error', async () => { + const { result, waitForValueToChange } = renderHook(() => useSequence(['first', 'second'])) + + expect(result.current).toBe('first') + + await expect( + waitForValueToChange(() => { + if (result.current === 'second') { + throw new Error('Something Unexpected') + } + return result.current + }) + ).rejects.toThrow(Error('Something Unexpected')) + }) + }) +}) diff --git a/src/__tests__/autoCleanup.disabled.test.ts b/src/__tests__/autoCleanup.disabled.test.ts new file mode 100644 index 00000000..d3b1f31b --- /dev/null +++ b/src/__tests__/autoCleanup.disabled.test.ts @@ -0,0 +1,26 @@ +import { useEffect } from 'react' + +// This verifies that if RHTL_SKIP_AUTO_CLEANUP is set +// then we DON'T auto-wire up the afterEach for folks +describe('skip auto cleanup (disabled) tests', () => { + process.env.RHTL_SKIP_AUTO_CLEANUP = 'true' + + runForRenderers(['default', 'dom', 'native', 'server/hydrated'], ({ renderHook }) => { + let cleanupCalled = false + + test('first', () => { + const useHookWithCleanup = () => { + useEffect(() => { + return () => { + cleanupCalled = true + } + }) + } + renderHook(() => useHookWithCleanup()) + }) + + test('second', () => { + expect(cleanupCalled).toBe(false) + }) + }) +}) diff --git a/src/__tests__/autoCleanup.noAfterEach.test.ts b/src/__tests__/autoCleanup.noAfterEach.test.ts new file mode 100644 index 00000000..dad26492 --- /dev/null +++ b/src/__tests__/autoCleanup.noAfterEach.test.ts @@ -0,0 +1,28 @@ +import { useEffect } from 'react' + +// This verifies that if afterEach is unavailable +// then we DON'T auto-wire up the afterEach for folks +describe('skip auto cleanup (no afterEach) tests', () => { + // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type + // eslint-disable-next-line no-global-assign + afterEach = false + + runForRenderers(['default', 'dom', 'native', 'server/hydrated'], ({ renderHook }) => { + let cleanupCalled = false + + test('first', () => { + const useHookWithCleanup = () => { + useEffect(() => { + return () => { + cleanupCalled = true + } + }) + } + renderHook(() => useHookWithCleanup()) + }) + + test('second', () => { + expect(cleanupCalled).toBe(false) + }) + }) +}) diff --git a/src/__tests__/autoCleanup.noProcessEnv.test.ts b/src/__tests__/autoCleanup.noProcessEnv.test.ts new file mode 100644 index 00000000..18a72827 --- /dev/null +++ b/src/__tests__/autoCleanup.noProcessEnv.test.ts @@ -0,0 +1,31 @@ +import { useEffect } from 'react' + +// This verifies that if process.env is unavailable +// then we still auto-wire up the afterEach for folks +describe('auto cleanup (no process.env) tests', () => { + process.env = { + ...process.env, + get RHTL_SKIP_AUTO_CLEANUP(): string | undefined { + throw new Error('expected') + } + } + + runForRenderers(['default', 'dom', 'native', 'server/hydrated'], ({ renderHook }) => { + let cleanupCalled = false + + test('first', () => { + const useHookWithCleanup = () => { + useEffect(() => { + return () => { + cleanupCalled = true + } + }) + } + renderHook(() => useHookWithCleanup()) + }) + + test('second', () => { + expect(cleanupCalled).toBe(true) + }) + }) +}) diff --git a/src/__tests__/autoCleanup.pure.test.ts b/src/__tests__/autoCleanup.pure.test.ts new file mode 100644 index 00000000..1ad8c317 --- /dev/null +++ b/src/__tests__/autoCleanup.pure.test.ts @@ -0,0 +1,27 @@ +import { useEffect } from 'react' + +// This verifies that if pure imports are used +// then we DON'T auto-wire up the afterEach for folks +describe('skip auto cleanup (pure) tests', () => { + runForRenderers( + ['default/pure', 'dom/pure', 'native/pure', 'server/hydrated/pure'], + ({ renderHook }) => { + let cleanupCalled = false + + test('first', () => { + const useHookWithCleanup = () => { + useEffect(() => { + return () => { + cleanupCalled = true + } + }) + } + renderHook(() => useHookWithCleanup()) + }) + + test('second', () => { + expect(cleanupCalled).toBe(false) + }) + } + ) +}) diff --git a/src/__tests__/autoCleanup.test.ts b/src/__tests__/autoCleanup.test.ts new file mode 100644 index 00000000..250ef5ee --- /dev/null +++ b/src/__tests__/autoCleanup.test.ts @@ -0,0 +1,52 @@ +import { useEffect } from 'react' + +// This verifies that by importing RHTL in an +// environment which supports afterEach (like Jest) +// we'll get automatic cleanup between tests. +describe('auto cleanup tests', () => { + runForRenderers(['default', 'dom', 'native'], ({ renderHook }) => { + let cleanupCalled = false + + test('first', () => { + const useHookWithCleanup = () => { + useEffect(() => { + return () => { + cleanupCalled = true + } + }) + } + renderHook(() => useHookWithCleanup()) + }) + + test('second', () => { + expect(cleanupCalled).toBe(true) + }) + }) + + runForRenderers(['server'], ({ renderHook }) => { + const cleanups: Record = { + ssr: false, + hydrated: false + } + + test('first (with hydration)', () => { + const useHookWithCleanup = (name: string) => { + useEffect(() => { + return () => { + cleanups[name] = true + } + }) + } + + renderHook(() => useHookWithCleanup('ssr')) + const { hydrate } = renderHook(() => useHookWithCleanup('hydrated')) + + hydrate() + }) + + test('second (with hydration)', () => { + expect(cleanups.ssr).toBe(false) + expect(cleanups.hydrated).toBe(true) + }) + }) +}) diff --git a/src/__tests__/autoDetectRenderer.test.ts b/src/__tests__/autoDetectRenderer.test.ts new file mode 100644 index 00000000..2e87d47e --- /dev/null +++ b/src/__tests__/autoDetectRenderer.test.ts @@ -0,0 +1,70 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +import { ReactHooksRenderer } from '../types/react' + +describe('auto-detect renderer', () => { + function setUpDependencies({ + reactTestRenderer, + reactDom + }: { + reactTestRenderer?: boolean + reactDom?: boolean + }) { + jest.resetModules() + jest.unmock('react-test-renderer') + jest.unmock('react-dom') + + if (!reactTestRenderer) { + jest.doMock('react-test-renderer', () => require('missing-dependency')) + } + + if (!reactDom) { + jest.doMock('react-dom', () => require('missing-dependency')) + } + } + + runForLazyRenderers(['default', 'default/pure'], (getRenderer, rendererName) => { + describe('react-test-renderer available', () => { + setUpDependencies({ reactTestRenderer: true, reactDom: true }) + + const actualRenderer = getRenderer() + const expectedRenderer = require(rendererName.includes('pure') + ? '../native/pure' + : '../native') as ReactHooksRenderer + + test('should resolve native renderer as default renderer', () => { + expect(actualRenderer).toEqual(expectedRenderer) + }) + }) + + describe('react-dom available', () => { + setUpDependencies({ reactTestRenderer: false, reactDom: true }) + + const actualRenderer = getRenderer() + const expectedRenderer = require(rendererName.includes('pure') + ? '../dom/pure' + : '../dom') as ReactHooksRenderer + + test('should resolve dom renderer as default renderer', () => { + expect(actualRenderer).toEqual(expectedRenderer) + }) + }) + + describe('no renderers available', () => { + setUpDependencies({ reactTestRenderer: false, reactDom: false }) + + test('should throw error if a default renderer cannot be resolved', () => { + jest.doMock('react-test-renderer', () => { + throw new Error('missing dependency') + }) + jest.doMock('react-dom', () => { + throw new Error('missing dependency') + }) + + const expectedMessage = + "Could not auto-detect a React renderer. Are you sure you've installed one of the following\n - react-dom\n - react-test-renderer\nIf you are using a bundler, please update your imports to use a specific renderer.\nFor instructions see: https://react-hooks-testing-library.com/installation#being-specific" + + expect(() => getRenderer()).toThrowError(new Error(expectedMessage)) + }) + }) + }) +}) diff --git a/src/__tests__/cleanup.test.ts b/src/__tests__/cleanup.test.ts new file mode 100644 index 00000000..8cadddab --- /dev/null +++ b/src/__tests__/cleanup.test.ts @@ -0,0 +1,166 @@ +import { useEffect } from 'react' + +describe('cleanup tests', () => { + runForRenderers( + ['default/pure', 'dom/pure', 'native/pure', 'server/hydrated/pure'], + ({ renderHook, cleanup, addCleanup, removeCleanup }) => { + test('should flush effects on cleanup', async () => { + let cleanupCalled = false + + const useHookWithCleanup = () => { + useEffect(() => { + return () => { + cleanupCalled = true + } + }) + } + + renderHook(() => useHookWithCleanup()) + + await cleanup() + + expect(cleanupCalled).toBe(true) + }) + + test('should cleanup all rendered hooks', async () => { + const cleanupCalled: boolean[] = [] + const useHookWithCleanup = (id: number) => { + useEffect(() => { + return () => { + cleanupCalled[id] = true + } + }) + } + + renderHook(() => useHookWithCleanup(1)) + renderHook(() => useHookWithCleanup(2)) + + await cleanup() + + expect(cleanupCalled[1]).toBe(true) + expect(cleanupCalled[2]).toBe(true) + }) + + test('should call cleanups in reverse order', async () => { + const callSequence: string[] = [] + addCleanup(() => { + callSequence.push('cleanup') + }) + addCleanup(() => { + callSequence.push('another cleanup') + }) + const useHookWithCleanup = () => { + useEffect(() => { + return () => { + callSequence.push('unmount') + } + }) + } + renderHook(() => useHookWithCleanup()) + + await cleanup() + + expect(callSequence).toEqual(['unmount', 'another cleanup', 'cleanup']) + }) + + test('should wait for async cleanup', async () => { + const callSequence: string[] = [] + addCleanup(() => { + callSequence.push('cleanup') + }) + addCleanup(async () => { + await new Promise((resolve) => setTimeout(resolve, 10)) + callSequence.push('another cleanup') + }) + const useHookWithCleanup = () => { + useEffect(() => { + return () => { + callSequence.push('unmount') + } + }) + } + renderHook(() => useHookWithCleanup()) + + await cleanup() + + expect(callSequence).toEqual(['unmount', 'another cleanup', 'cleanup']) + }) + + test('should remove cleanup using removeCleanup', async () => { + const callSequence: string[] = [] + addCleanup(() => { + callSequence.push('cleanup') + }) + const anotherCleanup = () => { + callSequence.push('another cleanup') + } + addCleanup(anotherCleanup) + const useHookWithCleanup = () => { + useEffect(() => { + return () => { + callSequence.push('unmount') + } + }) + } + renderHook(() => useHookWithCleanup()) + + removeCleanup(anotherCleanup) + + await cleanup() + + expect(callSequence).toEqual(['unmount', 'cleanup']) + }) + + test('should remove cleanup using returned handler', async () => { + const callSequence: string[] = [] + addCleanup(() => { + callSequence.push('cleanup') + }) + const remove = addCleanup(() => { + callSequence.push('another cleanup') + }) + const useHookWithCleanup = () => { + useEffect(() => { + return () => { + callSequence.push('unmount') + } + }) + } + renderHook(() => useHookWithCleanup()) + + remove() + + await cleanup() + + expect(callSequence).toEqual(['unmount', 'cleanup']) + }) + } + ) + + runForRenderers(['server/pure'], ({ renderHook, cleanup }) => { + test('should only cleanup hydrated hooks', async () => { + const cleanups: Record = { + ssr: false, + hydrated: false + } + + const useHookWithCleanup = (name: string) => { + useEffect(() => { + return () => { + cleanups[name] = true + } + }) + } + + renderHook(() => useHookWithCleanup('ssr')) + const { hydrate } = renderHook(() => useHookWithCleanup('hydrated')) + + hydrate() + + await cleanup() + + expect(cleanups.ssr).toBe(false) + expect(cleanups.hydrated).toBe(true) + }) + }) +}) diff --git a/src/__tests__/customHook.test.ts b/src/__tests__/customHook.test.ts new file mode 100644 index 00000000..a9eb0dff --- /dev/null +++ b/src/__tests__/customHook.test.ts @@ -0,0 +1,30 @@ +import { useState, useCallback } from 'react' + +describe('custom hook tests', () => { + function useCounter() { + const [count, setCount] = useState(0) + + const increment = useCallback(() => setCount(count + 1), [count]) + const decrement = useCallback(() => setCount(count - 1), [count]) + + return { count, increment, decrement } + } + + runForRenderers(['default', 'dom', 'native', 'server/hydrated'], ({ renderHook, act }) => { + test('should increment counter', () => { + const { result } = renderHook(() => useCounter()) + + act(() => result.current.increment()) + + expect(result.current.count).toBe(1) + }) + + test('should decrement counter', () => { + const { result } = renderHook(() => useCounter()) + + act(() => result.current.decrement()) + + expect(result.current.count).toBe(-1) + }) + }) +}) diff --git a/src/__tests__/defaultRenderer.pure.test.ts b/src/__tests__/defaultRenderer.pure.test.ts deleted file mode 100644 index d0fe14ff..00000000 --- a/src/__tests__/defaultRenderer.pure.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -import { ReactHooksRenderer } from '../types/react' - -describe('default renderer', () => { - beforeEach(() => { - jest.resetModules() - }) - - test('should resolve native renderer as default renderer', () => { - const expectedRenderer = require('../native/pure') as ReactHooksRenderer - const actualRenderer = require('../pure') as ReactHooksRenderer - - expect(actualRenderer).toEqual(expectedRenderer) - }) - - test('should resolve dom renderer as default renderer', () => { - jest.doMock('react-test-renderer', () => { - throw new Error('missing dependency') - }) - - const expectedRenderer = require('../dom/pure') as ReactHooksRenderer - const actualRenderer = require('../pure') as ReactHooksRenderer - - expect(actualRenderer).toEqual(expectedRenderer) - }) - - test('should throw error if a default renderer cannot be resolved', () => { - jest.doMock('react-test-renderer', () => { - throw new Error('missing dependency') - }) - - jest.doMock('react-dom', () => { - throw new Error('missing dependency') - }) - - const expectedMessage = - "Could not auto-detect a React renderer. Are you sure you've installed one of the following\n - react-dom\n - react-test-renderer\nIf you are using a bundler, please update your imports to use a specific renderer.\nFor instructions see: https://react-hooks-testing-library.com/installation#being-specific" - - expect(() => require('../pure')).toThrowError(new Error(expectedMessage)) - }) -}) diff --git a/src/__tests__/defaultRenderer.test.ts b/src/__tests__/defaultRenderer.test.ts deleted file mode 100644 index de38354a..00000000 --- a/src/__tests__/defaultRenderer.test.ts +++ /dev/null @@ -1,8 +0,0 @@ -import * as actualRenderer from '..' -import * as expectedRenderer from '../native' - -describe('default renderer', () => { - test('should resolve native renderer as default renderer', () => { - expect(actualRenderer).toEqual(expectedRenderer) - }) -}) diff --git a/src/__tests__/errorHook.test.ts b/src/__tests__/errorHook.test.ts new file mode 100644 index 00000000..d93971ba --- /dev/null +++ b/src/__tests__/errorHook.test.ts @@ -0,0 +1,151 @@ +import { useState, useEffect } from 'react' + +describe('error hook tests', () => { + function throwError(shouldThrow?: boolean) { + if (shouldThrow) { + throw new Error('expected') + } + } + + runForRenderers(['default', 'dom', 'native', 'server/hydrated'], ({ renderHook }) => { + describe('synchronous', () => { + function useError(shouldThrow?: boolean) { + throwError(shouldThrow) + return true + } + + test('should raise error', () => { + const { result } = renderHook(() => useError(true)) + + expect(() => { + expect(result.current).not.toBe(undefined) + }).toThrow(Error('expected')) + }) + + test('should capture error', () => { + const { result } = renderHook(() => useError(true)) + + expect(result.error).toEqual(Error('expected')) + }) + + test('should not capture error', () => { + const { result } = renderHook(() => useError(false)) + + expect(result.current).not.toBe(undefined) + expect(result.error).toBe(undefined) + }) + + test('should reset error', () => { + const { result, rerender } = renderHook(({ shouldThrow }) => useError(shouldThrow), { + initialProps: { shouldThrow: true } + }) + + expect(result.error).not.toBe(undefined) + + rerender({ shouldThrow: false }) + + expect(result.current).not.toBe(undefined) + expect(result.error).toBe(undefined) + }) + }) + + describe('asynchronous', () => { + function useAsyncError(shouldThrow: boolean) { + const [value, setValue] = useState() + useEffect(() => { + const timeout = setTimeout(() => setValue(shouldThrow), 100) + return () => clearTimeout(timeout) + }, [shouldThrow]) + throwError(value) + return true + } + + test('should raise async error', async () => { + const { result, waitForNextUpdate } = renderHook(() => useAsyncError(true)) + + await waitForNextUpdate() + + expect(() => { + expect(result.current).not.toBe(undefined) + }).toThrow(Error('expected')) + }) + + test('should capture async error', async () => { + const { result, waitForNextUpdate } = renderHook(() => useAsyncError(true)) + + await waitForNextUpdate() + + expect(result.error).toEqual(Error('expected')) + }) + + test('should not capture async error', async () => { + const { result, waitForNextUpdate } = renderHook(() => useAsyncError(false)) + + await waitForNextUpdate() + + expect(result.current).not.toBe(undefined) + expect(result.error).toBe(undefined) + }) + + test('should reset async error', async () => { + const { result, waitForNextUpdate, rerender } = renderHook( + ({ shouldThrow }) => useAsyncError(shouldThrow), + { initialProps: { shouldThrow: true } } + ) + + await waitForNextUpdate() + + expect(result.error).not.toBe(undefined) + + rerender({ shouldThrow: false }) + + await waitForNextUpdate() + + expect(result.current).not.toBe(undefined) + expect(result.error).toBe(undefined) + }) + }) + + describe('effect', () => { + function useEffectError(shouldThrow: boolean) { + useEffect(() => { + throwError(shouldThrow) + }, [shouldThrow]) + return true + } + + test('this one - should raise effect error', () => { + const { result } = renderHook(() => useEffectError(true)) + + expect(() => { + expect(result.current).not.toBe(undefined) + }).toThrow(Error('expected')) + }) + + test('this one - should capture effect error', () => { + const { result } = renderHook(() => useEffectError(true)) + expect(result.error).toEqual(Error('expected')) + }) + + test('should not capture effect error', () => { + const { result } = renderHook(() => useEffectError(false)) + + expect(result.current).not.toBe(undefined) + expect(result.error).toBe(undefined) + }) + + test('should reset effect error', () => { + const { result, rerender } = renderHook(({ shouldThrow }) => useEffectError(shouldThrow), { + initialProps: { shouldThrow: true } + }) + + expect(result.error).not.toBe(undefined) + + rerender({ shouldThrow: false }) + + expect(result.current).not.toBe(undefined) + expect(result.error).toBe(undefined) + }) + }) + }) +}) diff --git a/src/server/__tests__/errorSuppression.disabled.test.ts b/src/__tests__/errorSuppression.disabled.test.ts similarity index 56% rename from src/server/__tests__/errorSuppression.disabled.test.ts rename to src/__tests__/errorSuppression.disabled.test.ts index 8cf200ab..8d496ed0 100644 --- a/src/server/__tests__/errorSuppression.disabled.test.ts +++ b/src/__tests__/errorSuppression.disabled.test.ts @@ -3,11 +3,13 @@ describe('error output suppression (disabled) tests', () => { const originalConsoleError = console.error process.env.RHTL_DISABLE_ERROR_FILTERING = 'true' - require('..') - test('should not patch console.error', () => { - expect(console.error).toBe(originalConsoleError) + runForRenderers(['default', 'dom', 'native', 'server'], () => { + test('should not patch console.error', () => { + expect(console.error).toBe(originalConsoleError) + }) }) }) +// eslint-disable-next-line jest/no-export export {} diff --git a/src/server/__tests__/errorSuppression.noAfterEach.test.ts b/src/__tests__/errorSuppression.noAfterEach.test.ts similarity index 54% rename from src/server/__tests__/errorSuppression.noAfterEach.test.ts rename to src/__tests__/errorSuppression.noAfterEach.test.ts index f83d068f..952fe043 100644 --- a/src/server/__tests__/errorSuppression.noAfterEach.test.ts +++ b/src/__tests__/errorSuppression.noAfterEach.test.ts @@ -3,12 +3,15 @@ describe('error output suppression (noAfterEach) tests', () => { const originalConsoleError = console.error // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type + // eslint-disable-next-line no-global-assign afterEach = false - require('..') - test('should not patch console.error', () => { - expect(console.error).toBe(originalConsoleError) + runForRenderers(['default', 'dom', 'native', 'server'], () => { + test('should not patch console.error', () => { + expect(console.error).toBe(originalConsoleError) + }) }) }) +// eslint-disable-next-line jest/no-export export {} diff --git a/src/server/__tests__/errorSuppression.noBeforeEach.test.ts b/src/__tests__/errorSuppression.noBeforeEach.test.ts similarity index 55% rename from src/server/__tests__/errorSuppression.noBeforeEach.test.ts rename to src/__tests__/errorSuppression.noBeforeEach.test.ts index 609cab95..f0bc5023 100644 --- a/src/server/__tests__/errorSuppression.noBeforeEach.test.ts +++ b/src/__tests__/errorSuppression.noBeforeEach.test.ts @@ -3,12 +3,15 @@ describe('error output suppression (noBeforeEach) tests', () => { const originalConsoleError = console.error // @ts-expect-error Turning off BeforeEach -- ignore Jest LifeCycle Type + // eslint-disable-next-line no-global-assign beforeEach = false - require('..') - test('should not patch console.error', () => { - expect(console.error).toBe(originalConsoleError) + runForRenderers(['default', 'dom', 'native', 'server'], () => { + test('should not patch console.error', () => { + expect(console.error).toBe(originalConsoleError) + }) }) }) +// eslint-disable-next-line jest/no-export export {} diff --git a/src/dom/__tests__/errorSuppression.noProcessEnv.test.ts b/src/__tests__/errorSuppression.noProcessEnv.test.ts similarity index 63% rename from src/dom/__tests__/errorSuppression.noProcessEnv.test.ts rename to src/__tests__/errorSuppression.noProcessEnv.test.ts index 414aea26..995d0346 100644 --- a/src/dom/__tests__/errorSuppression.noProcessEnv.test.ts +++ b/src/__tests__/errorSuppression.noProcessEnv.test.ts @@ -8,11 +8,13 @@ describe('error output suppression (no process.env) tests', () => { throw new Error('expected') } } - require('..') - test('should not patch console.error', () => { - expect(console.error).not.toBe(originalConsoleError) + runForRenderers(['default', 'dom', 'native', 'server'], () => { + test('should patch console.error', () => { + expect(console.error).not.toBe(originalConsoleError) + }) }) }) +// eslint-disable-next-line jest/no-export export {} diff --git a/src/__tests__/errorSuppression.pure.test.ts b/src/__tests__/errorSuppression.pure.test.ts new file mode 100644 index 00000000..22b31ac7 --- /dev/null +++ b/src/__tests__/errorSuppression.pure.test.ts @@ -0,0 +1,29 @@ +// This verifies that if pure imports are used +// then we DON'T auto-wire up the afterEach for folks +describe('error output suppression (pure) tests', () => { + const originalConsoleError = console.error + + runForRenderers( + ['default/pure', 'dom/pure', 'native/pure', 'server/pure'], + ({ suppressErrorOutput }) => { + test('should not patch console.error', () => { + expect(console.error).toBe(originalConsoleError) + }) + + test('should manually patch console.error', () => { + const restore = suppressErrorOutput() + + try { + expect(console.error).not.toBe(originalConsoleError) + } finally { + restore() + } + + expect(console.error).toBe(originalConsoleError) + }) + } + ) +}) + +// eslint-disable-next-line jest/no-export +export {} diff --git a/src/__tests__/errorSuppression.test.ts b/src/__tests__/errorSuppression.test.ts new file mode 100644 index 00000000..848d5e97 --- /dev/null +++ b/src/__tests__/errorSuppression.test.ts @@ -0,0 +1,74 @@ +import { useEffect } from 'react' + +describe('error output suppression tests', () => { + const consoleError = console.error + + runForRenderers( + ['default', 'dom', 'native', 'server/hydrated'], + ({ renderHook, act, suppressErrorOutput }, rendererName) => { + test('should not suppress relevant errors', () => { + console.error = jest.fn() + try { + const restoreConsole = suppressErrorOutput() + + console.error('expected') + console.error(new Error('expected')) + console.error('expected with args', new Error('expected')) + + restoreConsole() + + expect(console.error).toBeCalledWith('expected') + expect(console.error).toBeCalledWith(new Error('expected')) + expect(console.error).toBeCalledWith('expected with args', new Error('expected')) + expect(console.error).toBeCalledTimes(3) + } finally { + console.error = consoleError + } + }) + + test('should allow console.error to be mocked', async () => { + console.error = jest.fn() + + try { + const { rerender, unmount } = renderHook( + (stage) => { + useEffect(() => { + console.error(`expected in effect`) + return () => { + console.error(`expected in unmount`) + } + }, []) + console.error(`expected in ${stage}`) + }, + { + initialProps: 'render' + } + ) + + act(() => { + console.error('expected in act') + }) + + await act(async () => { + await new Promise((resolve) => setTimeout(resolve, 100)) + console.error('expected in async act') + }) + + rerender('rerender') + + unmount() + + expect(console.error).toBeCalledWith('expected in render') + expect(console.error).toBeCalledWith('expected in effect') + expect(console.error).toBeCalledWith('expected in act') + expect(console.error).toBeCalledWith('expected in async act') + expect(console.error).toBeCalledWith('expected in rerender') + expect(console.error).toBeCalledWith('expected in unmount') + expect(console.error).toBeCalledTimes(rendererName.includes('hydrated') ? 7 : 6) + } finally { + console.error = consoleError + } + }) + } + ) +}) diff --git a/src/__tests__/hydrationErrors.test.ts b/src/__tests__/hydrationErrors.test.ts new file mode 100644 index 00000000..b82ba96e --- /dev/null +++ b/src/__tests__/hydrationErrors.test.ts @@ -0,0 +1,30 @@ +import { useState, useCallback } from 'react' + +describe('hydration errors tests', () => { + function useCounter() { + const [count, setCount] = useState(0) + + const increment = useCallback(() => setCount(count + 1), [count]) + const decrement = useCallback(() => setCount(count - 1), [count]) + + return { count, increment, decrement } + } + + runForRenderers(['server', 'server/pure'], ({ renderHook }) => { + test('should throw error if component is rehydrated twice in a row', () => { + const { hydrate } = renderHook(() => useCounter()) + + hydrate() + + expect(() => hydrate()).toThrow(Error('The component can only be hydrated once')) + }) + + test('should throw error if component tries to rerender without hydrating', () => { + const { rerender } = renderHook(() => useCounter()) + + expect(() => rerender()).toThrow( + Error('You must hydrate the component before you can rerender') + ) + }) + }) +}) diff --git a/src/__tests__/resultHistory.test.ts b/src/__tests__/resultHistory.test.ts new file mode 100644 index 00000000..edb8837f --- /dev/null +++ b/src/__tests__/resultHistory.test.ts @@ -0,0 +1,78 @@ +describe('result history tests', () => { + function useValue(value: number) { + if (value === 2) { + throw Error('expected') + } + return value + } + + runForRenderers(['default', 'dom', 'native'], ({ renderHook }) => { + test('should capture all renders states of hook', () => { + const { result, rerender } = renderHook((value) => useValue(value), { + initialProps: 0 + }) + + expect(result.current).toEqual(0) + expect(result.all).toEqual([0]) + + rerender(1) + + expect(result.current).toBe(1) + expect(result.all).toEqual([0, 1]) + + rerender(2) + + expect(result.error).toEqual(Error('expected')) + expect(result.all).toEqual([0, 1, Error('expected')]) + + rerender(3) + + expect(result.current).toBe(3) + expect(result.all).toEqual([0, 1, Error('expected'), 3]) + + rerender() + + expect(result.current).toBe(3) + expect(result.all).toEqual([0, 1, Error('expected'), 3, 3]) + }) + }) + + runForRenderers(['server'], ({ renderHook }) => { + test('should capture all renders states of hook with hydration', () => { + const { result, hydrate, rerender } = renderHook((value) => useValue(value), { + initialProps: 0 + }) + + expect(result.current).toEqual(0) + expect(result.all).toEqual([0]) + + hydrate() + + expect(result.current).toEqual(0) + expect(result.all).toEqual([0, 0]) + + rerender(1) + + expect(result.current).toBe(1) + expect(result.all).toEqual([0, 0, 1]) + + rerender(2) + + expect(result.error).toEqual(Error('expected')) + expect(result.all).toEqual([0, 0, 1, Error('expected')]) + + rerender(3) + + expect(result.current).toBe(3) + expect(result.all).toEqual([0, 0, 1, Error('expected'), 3]) + + rerender() + + expect(result.current).toBe(3) + expect(result.all).toEqual([0, 0, 1, Error('expected'), 3, 3]) + }) + }) +}) + +// eslint-disable-next-line jest/no-export +export {} diff --git a/src/__tests__/suspenseHook.test.ts b/src/__tests__/suspenseHook.test.ts new file mode 100644 index 00000000..864c81e7 --- /dev/null +++ b/src/__tests__/suspenseHook.test.ts @@ -0,0 +1,64 @@ +describe('suspense hook tests', () => { + const cache: { value?: Promise | string | Error } = {} + const fetchName = (isSuccessful: boolean) => { + if (!cache.value) { + cache.value = new Promise((resolve, reject) => { + setTimeout(() => { + if (isSuccessful) { + resolve('Bob') + } else { + reject(new Error('Failed to fetch name')) + } + }, 50) + }) + .then((value) => (cache.value = value)) + .catch((e: Error) => (cache.value = e)) + } + return cache.value + } + + const useFetchName = (isSuccessful = true) => { + const name = fetchName(isSuccessful) + if (name instanceof Promise || name instanceof Error) { + throw name as unknown + } + return name + } + + beforeEach(() => { + delete cache.value + }) + + runForRenderers(['default', 'dom', 'native'], ({ renderHook }) => { + test('should allow rendering to be suspended', async () => { + const { result, waitForNextUpdate } = renderHook(() => useFetchName(true)) + + await waitForNextUpdate() + + expect(result.current).toBe('Bob') + }) + + test('should set error if suspense promise rejects', async () => { + const { result, waitForNextUpdate } = renderHook(() => useFetchName(false)) + + await waitForNextUpdate() + + expect(result.error).toEqual(new Error('Failed to fetch name')) + }) + + test('should return undefined if current value is requested before suspension has resolved', async () => { + const { result } = renderHook(() => useFetchName(true)) + + expect(result.current).toBe(undefined) + }) + + test('should return undefined if error is requested before suspension has resolved', async () => { + const { result } = renderHook(() => useFetchName(true)) + + expect(result.error).toBe(undefined) + }) + }) +}) + +// eslint-disable-next-line jest/no-export +export {} diff --git a/src/__tests__/useContext.test.tsx b/src/__tests__/useContext.test.tsx new file mode 100644 index 00000000..841cbde7 --- /dev/null +++ b/src/__tests__/useContext.test.tsx @@ -0,0 +1,64 @@ +import React, { createContext, useContext } from 'react' + +describe('useContext tests', () => { + runForRenderers(['default', 'dom', 'native', 'server/hydrated'], ({ renderHook }) => { + test('should get default value from context', () => { + const TestContext = createContext('foo') + + const { result } = renderHook(() => useContext(TestContext)) + + const value = result.current + + expect(value).toBe('foo') + }) + + test('should get value from context provider', () => { + const TestContext = createContext('foo') + + const wrapper: React.FC = ({ children }) => ( + {children} + ) + + const { result } = renderHook(() => useContext(TestContext), { wrapper }) + + expect(result.current).toBe('bar') + }) + + test('should update mutated value in context', () => { + const TestContext = createContext('foo') + + const value = { current: 'bar' } + + const wrapper: React.FC = ({ children }) => ( + {children} + ) + + const { result, rerender } = renderHook(() => useContext(TestContext), { wrapper }) + + value.current = 'baz' + + rerender() + + expect(result.current).toBe('baz') + }) + + test('should update value in context when props are updated', () => { + const TestContext = createContext('foo') + + const wrapper: React.FC<{ current: string }> = ({ current, children }) => ( + {children} + ) + + const { result, rerender } = renderHook(() => useContext(TestContext), { + wrapper, + initialProps: { + current: 'bar' + } + }) + + rerender({ current: 'baz' }) + + expect(result.current).toBe('baz') + }) + }) +}) diff --git a/src/__tests__/useEffect.test.ts b/src/__tests__/useEffect.test.ts new file mode 100644 index 00000000..cc2cdd6a --- /dev/null +++ b/src/__tests__/useEffect.test.ts @@ -0,0 +1,99 @@ +import { useEffect, useLayoutEffect } from 'react' + +describe('useEffect tests', () => { + runForRenderers(['default', 'dom', 'native'], ({ renderHook }) => { + test('should handle useEffect hook', () => { + const sideEffect: { [key: number]: boolean } = { 1: false, 2: false } + + const { rerender, unmount } = renderHook( + ({ id }) => { + useEffect(() => { + sideEffect[id] = true + return () => { + sideEffect[id] = false + } + }, [id]) + }, + { initialProps: { id: 1 } } + ) + + expect(sideEffect[1]).toBe(true) + expect(sideEffect[2]).toBe(false) + + rerender({ id: 2 }) + + expect(sideEffect[1]).toBe(false) + expect(sideEffect[2]).toBe(true) + + unmount() + + expect(sideEffect[1]).toBe(false) + expect(sideEffect[2]).toBe(false) + }) + + test('should handle useLayoutEffect hook', () => { + const sideEffect: { [key: number]: boolean } = { 1: false, 2: false } + + const { rerender, unmount } = renderHook( + ({ id }) => { + useLayoutEffect(() => { + sideEffect[id] = true + return () => { + sideEffect[id] = false + } + }, [id]) + }, + { initialProps: { id: 1 } } + ) + + expect(sideEffect[1]).toBe(true) + expect(sideEffect[2]).toBe(false) + + rerender({ id: 2 }) + + expect(sideEffect[1]).toBe(false) + expect(sideEffect[2]).toBe(true) + + unmount() + + expect(sideEffect[1]).toBe(false) + expect(sideEffect[2]).toBe(false) + }) + }) + + runForRenderers(['server'], ({ renderHook }) => { + test('should handle useEffect hook when hydrated', () => { + const sideEffect: { [key: number]: boolean } = { 1: false, 2: false } + + const { hydrate, rerender, unmount } = renderHook( + ({ id }) => { + useEffect(() => { + sideEffect[id] = true + return () => { + sideEffect[id] = false + } + }, [id]) + }, + { initialProps: { id: 1 } } + ) + + expect(sideEffect[1]).toBe(false) + expect(sideEffect[2]).toBe(false) + + hydrate() + + expect(sideEffect[1]).toBe(true) + expect(sideEffect[2]).toBe(false) + + rerender({ id: 2 }) + + expect(sideEffect[1]).toBe(false) + expect(sideEffect[2]).toBe(true) + + unmount() + + expect(sideEffect[1]).toBe(false) + expect(sideEffect[2]).toBe(false) + }) + }) +}) diff --git a/src/__tests__/useMemo.test.ts b/src/__tests__/useMemo.test.ts new file mode 100644 index 00000000..466546fe --- /dev/null +++ b/src/__tests__/useMemo.test.ts @@ -0,0 +1,65 @@ +import { useMemo, useCallback } from 'react' + +describe('useCallback tests', () => { + runForRenderers(['default', 'dom', 'native', 'server/hydrated'], ({ renderHook }) => { + test('should handle useMemo hook', () => { + const { result, rerender } = renderHook(({ value }) => useMemo(() => ({ value }), [value]), { + initialProps: { value: 1 } + }) + + const value1 = result.current + + expect(value1).toEqual({ value: 1 }) + + rerender() + + const value2 = result.current + + expect(value2).toEqual({ value: 1 }) + + expect(value2).toBe(value1) + + rerender({ value: 2 }) + + const value3 = result.current + + expect(value3).toEqual({ value: 2 }) + + expect(value3).not.toBe(value1) + }) + + test('should handle useCallback hook', () => { + const { result, rerender } = renderHook( + ({ value }) => { + const callback = () => ({ value }) + return useCallback(callback, [value]) + }, + { initialProps: { value: 1 } } + ) + + const callback1 = result.current + + const callbackValue1 = callback1() + + expect(callbackValue1).toEqual({ value: 1 }) + + const callback2 = result.current + + const callbackValue2 = callback2() + + expect(callbackValue2).toEqual({ value: 1 }) + + expect(callback2).toBe(callback1) + + rerender({ value: 2 }) + + const callback3 = result.current + + const callbackValue3 = callback3() + + expect(callbackValue3).toEqual({ value: 2 }) + + expect(callback3).not.toBe(callback1) + }) + }) +}) diff --git a/src/__tests__/useReducer.test.ts b/src/__tests__/useReducer.test.ts new file mode 100644 index 00000000..097831e4 --- /dev/null +++ b/src/__tests__/useReducer.test.ts @@ -0,0 +1,21 @@ +import { useReducer } from 'react' + +describe('useReducer tests', () => { + runForRenderers(['default', 'dom', 'native', 'server/hydrated'], ({ renderHook, act }) => { + test('should handle useReducer hook', () => { + const reducer = (state: number, action: { type: string }) => + action.type === 'inc' ? state + 1 : state + const { result } = renderHook(() => useReducer(reducer, 0)) + + const [initialState, dispatch] = result.current + + expect(initialState).toBe(0) + + act(() => dispatch({ type: 'inc' })) + + const [state] = result.current + + expect(state).toBe(1) + }) + }) +}) diff --git a/src/__tests__/useRef.test.ts b/src/__tests__/useRef.test.ts new file mode 100644 index 00000000..06cbc563 --- /dev/null +++ b/src/__tests__/useRef.test.ts @@ -0,0 +1,23 @@ +import { useRef, useImperativeHandle } from 'react' + +describe('useHook tests', () => { + runForRenderers(['default', 'dom', 'native', 'server/hydrated'], ({ renderHook }) => { + test('should handle useRef hook', () => { + const { result } = renderHook(() => useRef('value')) + + expect(result.current.current).toBe('value') + }) + + test('should handle useImperativeHandle hook', () => { + const { result } = renderHook(() => { + const ref = useRef boolean>>({}) + useImperativeHandle(ref, () => ({ + fakeImperativeMethod: () => true + })) + return ref + }) + + expect(result.current.current.fakeImperativeMethod()).toBe(true) + }) + }) +}) diff --git a/src/__tests__/useState.test.ts b/src/__tests__/useState.test.ts new file mode 100644 index 00000000..aff33ff4 --- /dev/null +++ b/src/__tests__/useState.test.ts @@ -0,0 +1,25 @@ +import { useState } from 'react' + +describe('useState tests', () => { + runForRenderers(['default', 'dom', 'native', 'server/hydrated'], ({ renderHook, act }) => { + test('should use setState value', () => { + const { result } = renderHook(() => { + const [value, setValue] = useState('foo') + return { value, setValue } + }) + + expect(result.current.value).toBe('foo') + }) + + test('should update setState value using setter', () => { + const { result } = renderHook(() => { + const [value, setValue] = useState('foo') + return { value, setValue } + }) + + act(() => result.current.setValue('bar')) + + expect(result.current.value).toBe('bar') + }) + }) +}) diff --git a/src/__tests__/utils/runForRenderers.ts b/src/__tests__/utils/runForRenderers.ts new file mode 100644 index 00000000..c0375f4d --- /dev/null +++ b/src/__tests__/utils/runForRenderers.ts @@ -0,0 +1,87 @@ +import { + ReactHooksRenderer, + ReactHooksServerRenderer, + RenderHookOptions, + RenderHookResult +} from '../../types/react' + +type RendererResolvers = typeof rendererResolvers +type Renderer = keyof RendererResolvers +type InferredRenderer = ReturnType + +declare global { + function runForRenderers( + renderers: TRenderers[], + fn: (renderer: InferredRenderer, rendererName: Renderer) => void + ): void + + function runForLazyRenderers( + renderers: TRenderer[], + fn: (getRenderer: () => InferredRenderer, rendererName: Renderer) => void + ): void +} + +function requireRenderer( + rendererName: Renderer +) { + let requirePath = `../../${rendererName}` + if (rendererName.startsWith('default')) { + requirePath = requirePath.replace('/default', '') + } + /* eslint-disable @typescript-eslint/no-var-requires */ + return require(requirePath) as TRendererType +} + +// This render turns the `server` renderer into a client renderer as many of the tests only +// require hydration after the hook is renderer to be able to be reused for all the renderers +function hydratedServerRenderer(baseRenderer: 'server' | 'server/pure'): ReactHooksRenderer { + const { renderHook, ...otherImports } = requireRenderer(baseRenderer) + + return { + renderHook( + callback: (props: TProps) => TResult, + options?: RenderHookOptions + ): RenderHookResult { + const { hydrate, ...otherUtils } = renderHook(callback, options) + hydrate() + return { + ...otherUtils + } + }, + ...otherImports + } +} + +const rendererResolvers = { + default: () => requireRenderer('default'), + dom: () => requireRenderer('dom'), + native: () => requireRenderer('native'), + server: () => requireRenderer('server'), + 'default/pure': () => requireRenderer('default/pure'), + 'dom/pure': () => requireRenderer('default/pure'), + 'native/pure': () => requireRenderer('default/pure'), + 'server/pure': () => requireRenderer('server/pure'), + 'server/hydrated': () => hydratedServerRenderer('server'), + 'server/hydrated/pure': () => hydratedServerRenderer('server/pure') +} + +global.runForRenderers = function runForRenderers( + renderers: TRenderer[], + fn: (renderer: InferredRenderer, rendererName: Renderer) => void +): void { + runForLazyRenderers(renderers, (getRenderer, rendererName) => fn(getRenderer(), rendererName)) +} + +global.runForLazyRenderers = function runForLazyRenderers( + renderers: TRenderer[], + fn: (getRenderer: () => InferredRenderer, rendererName: Renderer) => void +): void { + renderers.forEach((renderer) => { + // eslint-disable-next-line jest/valid-title + describe(renderer, () => { + fn(() => rendererResolvers[renderer]() as InferredRenderer, renderer) + }) + }) +} + +export {} diff --git a/src/dom/__tests__/asyncHook.test.ts b/src/dom/__tests__/asyncHook.test.ts deleted file mode 100644 index d460d35f..00000000 --- a/src/dom/__tests__/asyncHook.test.ts +++ /dev/null @@ -1,259 +0,0 @@ -import { useState, useRef, useEffect } from 'react' -import { renderHook } from '..' - -describe('async hook tests', () => { - const useSequence = (values: string[], intervalMs = 50) => { - const [first, ...otherValues] = values - const [value, setValue] = useState(() => first) - const index = useRef(0) - - useEffect(() => { - const interval = setInterval(() => { - setValue(otherValues[index.current++]) - if (index.current >= otherValues.length) { - clearInterval(interval) - } - }, intervalMs) - return () => { - clearInterval(interval) - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, otherValues) - - return value - } - - test('should wait for next update', async () => { - const { result, waitForNextUpdate } = renderHook(() => useSequence(['first', 'second'])) - - expect(result.current).toBe('first') - - await waitForNextUpdate() - - expect(result.current).toBe('second') - }) - - test('should wait for multiple updates', async () => { - const { result, waitForNextUpdate } = renderHook(() => - useSequence(['first', 'second', 'third']) - ) - - expect(result.current).toBe('first') - - await waitForNextUpdate() - - expect(result.current).toBe('second') - - await waitForNextUpdate() - - expect(result.current).toBe('third') - }) - - test('should reject if timeout exceeded when waiting for next update', async () => { - const { result, waitForNextUpdate } = renderHook(() => useSequence(['first', 'second'])) - - expect(result.current).toBe('first') - - await expect(waitForNextUpdate({ timeout: 10 })).rejects.toThrow( - Error('Timed out in waitForNextUpdate after 10ms.') - ) - }) - - test('should not reject when waiting for next update if timeout has been disabled', async () => { - const { result, waitForNextUpdate } = renderHook(() => useSequence(['first', 'second'], 1100)) - - expect(result.current).toBe('first') - - await waitForNextUpdate({ timeout: false }) - - expect(result.current).toBe('second') - }) - - test('should wait for expectation to pass', async () => { - const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) - - expect(result.current).toBe('first') - - let complete = false - await waitFor(() => { - expect(result.current).toBe('third') - complete = true - }) - expect(complete).toBe(true) - }) - - test('should wait for arbitrary expectation to pass', async () => { - const { waitFor } = renderHook(() => null) - - let actual = 0 - const expected = 1 - - setTimeout(() => { - actual = expected - }, 200) - - let complete = false - await waitFor(() => { - expect(actual).toBe(expected) - complete = true - }) - - expect(complete).toBe(true) - }) - - test('should not hang if expectation is already passing', async () => { - const { result, waitFor } = renderHook(() => useSequence(['first', 'second'])) - - expect(result.current).toBe('first') - - let complete = false - await waitFor(() => { - expect(result.current).toBe('first') - complete = true - }) - expect(complete).toBe(true) - }) - - test('should wait for truthy value', async () => { - const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) - - expect(result.current).toBe('first') - - await waitFor(() => result.current === 'third') - - expect(result.current).toBe('third') - }) - - test('should wait for arbitrary truthy value', async () => { - const { waitFor } = renderHook(() => null) - - let actual = 0 - const expected = 1 - - setTimeout(() => { - actual = expected - }, 200) - - await waitFor(() => actual === 1) - - expect(actual).toBe(expected) - }) - - test('should reject if timeout exceeded when waiting for expectation to pass', async () => { - const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) - - expect(result.current).toBe('first') - - await expect( - waitFor( - () => { - expect(result.current).toBe('third') - }, - { timeout: 75 } - ) - ).rejects.toThrow(Error('Timed out in waitFor after 75ms.')) - }) - - test('should not reject when waiting for expectation to pass if timeout has been disabled', async () => { - const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'], 550)) - - expect(result.current).toBe('first') - - await waitFor( - () => { - expect(result.current).toBe('third') - }, - { timeout: false } - ) - - expect(result.current).toBe('third') - }) - - test('should check on interval when waiting for expectation to pass', async () => { - const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) - - let checks = 0 - - try { - await waitFor( - () => { - checks++ - return result.current === 'third' - }, - { interval: 100 } - ) - } catch {} - - expect(checks).toBe(3) - }) - - test('should wait for value to change', async () => { - const { result, waitForValueToChange } = renderHook(() => - useSequence(['first', 'second', 'third']) - ) - - expect(result.current).toBe('first') - - await waitForValueToChange(() => result.current === 'third') - - expect(result.current).toBe('third') - }) - - test('should wait for arbitrary value to change', async () => { - const { waitForValueToChange } = renderHook(() => null) - - let actual = 0 - const expected = 1 - - setTimeout(() => { - actual = expected - }, 200) - - await waitForValueToChange(() => actual) - - expect(actual).toBe(expected) - }) - - test('should reject if timeout exceeded when waiting for value to change', async () => { - const { result, waitForValueToChange } = renderHook(() => - useSequence(['first', 'second', 'third']) - ) - - expect(result.current).toBe('first') - - await expect( - waitForValueToChange(() => result.current === 'third', { - timeout: 75 - }) - ).rejects.toThrow(Error('Timed out in waitForValueToChange after 75ms.')) - }) - - test('should not reject when waiting for value to change if timeout is disabled', async () => { - const { result, waitForValueToChange } = renderHook(() => - useSequence(['first', 'second', 'third'], 550) - ) - - expect(result.current).toBe('first') - - await waitForValueToChange(() => result.current === 'third', { - timeout: false - }) - - expect(result.current).toBe('third') - }) - - test('should reject if selector throws error', async () => { - const { result, waitForValueToChange } = renderHook(() => useSequence(['first', 'second'])) - - expect(result.current).toBe('first') - - await expect( - waitForValueToChange(() => { - if (result.current === 'second') { - throw new Error('Something Unexpected') - } - return result.current - }) - ).rejects.toThrow(Error('Something Unexpected')) - }) -}) diff --git a/src/dom/__tests__/autoCleanup.disabled.test.ts b/src/dom/__tests__/autoCleanup.disabled.test.ts deleted file mode 100644 index cd32a7ee..00000000 --- a/src/dom/__tests__/autoCleanup.disabled.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { useEffect } from 'react' - -import { ReactHooksRenderer } from '../../types/react' - -// This verifies that if RHTL_SKIP_AUTO_CLEANUP is set -// then we DON'T auto-wire up the afterEach for folks -describe('skip auto cleanup (disabled) tests', () => { - let cleanupCalled = false - process.env.RHTL_SKIP_AUTO_CLEANUP = 'true' - const renderHook = (require('..') as ReactHooksRenderer).renderHook - - test('first', () => { - const hookWithCleanup = () => { - useEffect(() => { - return () => { - cleanupCalled = true - } - }) - } - renderHook(() => hookWithCleanup()) - }) - - test('second', () => { - expect(cleanupCalled).toBe(false) - }) -}) diff --git a/src/dom/__tests__/autoCleanup.noAfterEach.test.ts b/src/dom/__tests__/autoCleanup.noAfterEach.test.ts deleted file mode 100644 index 5f773d93..00000000 --- a/src/dom/__tests__/autoCleanup.noAfterEach.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { useEffect } from 'react' - -import { ReactHooksRenderer } from '../../types/react' - -// This verifies that if afterEach is unavailable -// then we DON'T auto-wire up the afterEach for folks -describe('skip auto cleanup (no afterEach) tests', () => { - let cleanupCalled = false - // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type - afterEach = false - const renderHook = (require('..') as ReactHooksRenderer).renderHook - - test('first', () => { - const hookWithCleanup = () => { - useEffect(() => { - return () => { - cleanupCalled = true - } - }) - } - renderHook(() => hookWithCleanup()) - }) - - test('second', () => { - expect(cleanupCalled).toBe(false) - }) -}) diff --git a/src/dom/__tests__/autoCleanup.noProcessEnv.test.ts b/src/dom/__tests__/autoCleanup.noProcessEnv.test.ts deleted file mode 100644 index 35febc66..00000000 --- a/src/dom/__tests__/autoCleanup.noProcessEnv.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { useEffect } from 'react' - -import { ReactHooksRenderer } from '../../types/react' - -// This verifies that if process.env is unavailable -// then we still auto-wire up the afterEach for folks -describe('auto cleanup (no process.env) tests', () => { - let cleanupCalled = false - process.env = { - ...process.env, - get RHTL_SKIP_AUTO_CLEANUP(): string | undefined { - throw new Error('expected') - } - } - const renderHook = (require('..') as ReactHooksRenderer).renderHook - - test('first', () => { - const hookWithCleanup = () => { - useEffect(() => { - return () => { - cleanupCalled = true - } - }) - } - renderHook(() => hookWithCleanup()) - }) - - test('second', () => { - expect(cleanupCalled).toBe(true) - }) -}) diff --git a/src/dom/__tests__/autoCleanup.pure.test.ts b/src/dom/__tests__/autoCleanup.pure.test.ts deleted file mode 100644 index 66c27a07..00000000 --- a/src/dom/__tests__/autoCleanup.pure.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { useEffect } from 'react' -import { renderHook } from '../pure' - -// This verifies that if pure imports are used -// then we DON'T auto-wire up the afterEach for folks -describe('skip auto cleanup (pure) tests', () => { - let cleanupCalled = false - - test('first', () => { - const hookWithCleanup = () => { - useEffect(() => { - return () => { - cleanupCalled = true - } - }) - } - renderHook(() => hookWithCleanup()) - }) - - test('second', () => { - expect(cleanupCalled).toBe(false) - }) -}) diff --git a/src/dom/__tests__/autoCleanup.test.ts b/src/dom/__tests__/autoCleanup.test.ts deleted file mode 100644 index f783f1c2..00000000 --- a/src/dom/__tests__/autoCleanup.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { useEffect } from 'react' -import { renderHook } from '..' - -// This verifies that by importing RHTL in an -// environment which supports afterEach (like Jest) -// we'll get automatic cleanup between tests. -describe('auto cleanup tests', () => { - let cleanupCalled = false - - test('first', () => { - const hookWithCleanup = () => { - useEffect(() => { - return () => { - cleanupCalled = true - } - }) - } - renderHook(() => hookWithCleanup()) - }) - - test('second', () => { - expect(cleanupCalled).toBe(true) - }) -}) diff --git a/src/dom/__tests__/cleanup.test.ts b/src/dom/__tests__/cleanup.test.ts deleted file mode 100644 index 20a0f267..00000000 --- a/src/dom/__tests__/cleanup.test.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { useEffect } from 'react' -import { renderHook, cleanup, addCleanup, removeCleanup } from '../pure' - -describe('cleanup tests', () => { - test('should flush effects on cleanup', async () => { - let cleanupCalled = false - - const hookWithCleanup = () => { - useEffect(() => { - return () => { - cleanupCalled = true - } - }) - } - - renderHook(() => hookWithCleanup()) - - await cleanup() - - expect(cleanupCalled).toBe(true) - }) - - test('should cleanup all rendered hooks', async () => { - const cleanupCalled: boolean[] = [] - const hookWithCleanup = (id: number) => { - useEffect(() => { - return () => { - cleanupCalled[id] = true - } - }) - } - - renderHook(() => hookWithCleanup(1)) - renderHook(() => hookWithCleanup(2)) - - await cleanup() - - expect(cleanupCalled[1]).toBe(true) - expect(cleanupCalled[2]).toBe(true) - }) - - test('should call cleanups in reverse order', async () => { - const callSequence: string[] = [] - addCleanup(() => { - callSequence.push('cleanup') - }) - addCleanup(() => { - callSequence.push('another cleanup') - }) - const hookWithCleanup = () => { - useEffect(() => { - return () => { - callSequence.push('unmount') - } - }) - } - renderHook(() => hookWithCleanup()) - - await cleanup() - - expect(callSequence).toEqual(['unmount', 'another cleanup', 'cleanup']) - }) - - test('should wait for async cleanup', async () => { - const callSequence: string[] = [] - addCleanup(() => { - callSequence.push('cleanup') - }) - addCleanup(async () => { - await new Promise((resolve) => setTimeout(resolve, 10)) - callSequence.push('another cleanup') - }) - const hookWithCleanup = () => { - useEffect(() => { - return () => { - callSequence.push('unmount') - } - }) - } - renderHook(() => hookWithCleanup()) - - await cleanup() - - expect(callSequence).toEqual(['unmount', 'another cleanup', 'cleanup']) - }) - - test('should remove cleanup using removeCleanup', async () => { - const callSequence: string[] = [] - addCleanup(() => { - callSequence.push('cleanup') - }) - const anotherCleanup = () => { - callSequence.push('another cleanup') - } - addCleanup(anotherCleanup) - const hookWithCleanup = () => { - useEffect(() => { - return () => { - callSequence.push('unmount') - } - }) - } - renderHook(() => hookWithCleanup()) - - removeCleanup(anotherCleanup) - - await cleanup() - - expect(callSequence).toEqual(['unmount', 'cleanup']) - }) - - test('should remove cleanup using returned handler', async () => { - const callSequence: string[] = [] - addCleanup(() => { - callSequence.push('cleanup') - }) - const remove = addCleanup(() => { - callSequence.push('another cleanup') - }) - const hookWithCleanup = () => { - useEffect(() => { - return () => { - callSequence.push('unmount') - } - }) - } - renderHook(() => hookWithCleanup()) - - remove() - - await cleanup() - - expect(callSequence).toEqual(['unmount', 'cleanup']) - }) -}) diff --git a/src/dom/__tests__/customHook.test.ts b/src/dom/__tests__/customHook.test.ts deleted file mode 100644 index 5a1e83ab..00000000 --- a/src/dom/__tests__/customHook.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { useState, useCallback } from 'react' -import { renderHook, act } from '..' - -describe('custom hook tests', () => { - function useCounter() { - const [count, setCount] = useState(0) - - const increment = useCallback(() => setCount(count + 1), [count]) - const decrement = useCallback(() => setCount(count - 1), [count]) - - return { count, increment, decrement } - } - - test('should increment counter', () => { - const { result } = renderHook(() => useCounter()) - - act(() => result.current.increment()) - - expect(result.current.count).toBe(1) - }) - - test('should decrement counter', () => { - const { result } = renderHook(() => useCounter()) - - act(() => result.current.decrement()) - - expect(result.current.count).toBe(-1) - }) -}) diff --git a/src/dom/__tests__/errorHook.test.ts b/src/dom/__tests__/errorHook.test.ts deleted file mode 100644 index 8e97e5de..00000000 --- a/src/dom/__tests__/errorHook.test.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { useState, useEffect } from 'react' -import { renderHook } from '..' - -describe('error hook tests', () => { - function useError(throwError?: boolean) { - if (throwError) { - throw new Error('expected') - } - return true - } - - function useAsyncError(throwError: boolean) { - const [value, setValue] = useState() - useEffect(() => { - const timeout = setTimeout(() => setValue(throwError), 100) - return () => clearTimeout(timeout) - }, [throwError]) - return useError(value) - } - - function useEffectError(throwError: boolean) { - useEffect(() => { - useError(throwError) - }, [throwError]) - return true - } - - describe('synchronous', () => { - test('should raise error', () => { - const { result } = renderHook(() => useError(true)) - - expect(() => { - expect(result.current).not.toBe(undefined) - }).toThrow(Error('expected')) - }) - - test('should capture error', () => { - const { result } = renderHook(() => useError(true)) - - expect(result.error).toEqual(Error('expected')) - }) - - test('should not capture error', () => { - const { result } = renderHook(() => useError(false)) - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - - test('should reset error', () => { - const { result, rerender } = renderHook(({ throwError }) => useError(throwError), { - initialProps: { throwError: true } - }) - - expect(result.error).not.toBe(undefined) - - rerender({ throwError: false }) - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - }) - - describe('asynchronous', () => { - test('should raise async error', async () => { - const { result, waitForNextUpdate } = renderHook(() => useAsyncError(true)) - - await waitForNextUpdate() - - expect(() => { - expect(result.current).not.toBe(undefined) - }).toThrow(Error('expected')) - }) - - test('should capture async error', async () => { - const { result, waitForNextUpdate } = renderHook(() => useAsyncError(true)) - - await waitForNextUpdate() - - expect(result.error).toEqual(Error('expected')) - }) - - test('should not capture async error', async () => { - const { result, waitForNextUpdate } = renderHook(() => useAsyncError(false)) - - await waitForNextUpdate() - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - - test('should reset async error', async () => { - const { result, waitForNextUpdate, rerender } = renderHook( - ({ throwError }) => useAsyncError(throwError), - { initialProps: { throwError: true } } - ) - - await waitForNextUpdate() - - expect(result.error).not.toBe(undefined) - - rerender({ throwError: false }) - - await waitForNextUpdate() - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - }) - - describe('effect', () => { - test('this one - should raise effect error', () => { - const { result } = renderHook(() => useEffectError(true)) - - expect(() => { - expect(result.current).not.toBe(undefined) - }).toThrow(Error('expected')) - }) - - test('this one - should capture effect error', () => { - const { result } = renderHook(() => useEffectError(true)) - expect(result.error).toEqual(Error('expected')) - }) - - test('should not capture effect error', () => { - const { result } = renderHook(() => useEffectError(false)) - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - - test('should reset effect error', () => { - const { result, rerender } = renderHook(({ throwError }) => useEffectError(throwError), { - initialProps: { throwError: true } - }) - - expect(result.error).not.toBe(undefined) - - rerender({ throwError: false }) - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - }) -}) diff --git a/src/dom/__tests__/errorSuppression.disabled.test.ts b/src/dom/__tests__/errorSuppression.disabled.test.ts deleted file mode 100644 index 8cf200ab..00000000 --- a/src/dom/__tests__/errorSuppression.disabled.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This verifies that if RHTL_DISABLE_ERROR_FILTERING is set -// then we DON'T auto-wire up the afterEach for folks -describe('error output suppression (disabled) tests', () => { - const originalConsoleError = console.error - process.env.RHTL_DISABLE_ERROR_FILTERING = 'true' - require('..') - - test('should not patch console.error', () => { - expect(console.error).toBe(originalConsoleError) - }) -}) - -export {} diff --git a/src/dom/__tests__/errorSuppression.noAfterEach.test.ts b/src/dom/__tests__/errorSuppression.noAfterEach.test.ts deleted file mode 100644 index f83d068f..00000000 --- a/src/dom/__tests__/errorSuppression.noAfterEach.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This verifies that if afterEach is unavailable -// then we DON'T auto-wire up the afterEach for folks -describe('error output suppression (noAfterEach) tests', () => { - const originalConsoleError = console.error - // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type - afterEach = false - require('..') - - test('should not patch console.error', () => { - expect(console.error).toBe(originalConsoleError) - }) -}) - -export {} diff --git a/src/dom/__tests__/errorSuppression.noBeforeEach.test.ts b/src/dom/__tests__/errorSuppression.noBeforeEach.test.ts deleted file mode 100644 index 609cab95..00000000 --- a/src/dom/__tests__/errorSuppression.noBeforeEach.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This verifies that if afterEach is unavailable -// then we DON'T auto-wire up the afterEach for folks -describe('error output suppression (noBeforeEach) tests', () => { - const originalConsoleError = console.error - // @ts-expect-error Turning off BeforeEach -- ignore Jest LifeCycle Type - beforeEach = false - require('..') - - test('should not patch console.error', () => { - expect(console.error).toBe(originalConsoleError) - }) -}) - -export {} diff --git a/src/dom/__tests__/errorSuppression.pure.test.ts b/src/dom/__tests__/errorSuppression.pure.test.ts deleted file mode 100644 index 6e356cb6..00000000 --- a/src/dom/__tests__/errorSuppression.pure.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { suppressErrorOutput } from '../pure' - -// This verifies that if pure imports are used -// then we DON'T auto-wire up the afterEach for folks -describe('error output suppression (pure) tests', () => { - const originalConsoleError = console.error - - test('should not patch console.error', () => { - expect(console.error).toBe(originalConsoleError) - }) - - test('should manually patch console.error', () => { - const restore = suppressErrorOutput() - - try { - expect(console.error).not.toBe(originalConsoleError) - } finally { - restore() - } - - expect(console.error).toBe(originalConsoleError) - }) -}) diff --git a/src/dom/__tests__/errorSuppression.test.ts b/src/dom/__tests__/errorSuppression.test.ts deleted file mode 100644 index 8a4b72ad..00000000 --- a/src/dom/__tests__/errorSuppression.test.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { useEffect } from 'react' -import { renderHook, act, suppressErrorOutput } from '..' - -describe('error output suppression tests', () => { - const consoleError = console.error - - test('should not suppress relevant errors', () => { - console.error = jest.fn() - try { - const restoreConsole = suppressErrorOutput() - - console.error('expected') - console.error(new Error('expected')) - console.error('expected with args', new Error('expected')) - - restoreConsole() - - expect(console.error).toBeCalledWith('expected') - expect(console.error).toBeCalledWith(new Error('expected')) - expect(console.error).toBeCalledWith('expected with args', new Error('expected')) - expect(console.error).toBeCalledTimes(3) - } finally { - console.error = consoleError - } - }) - - test('should allow console.error to be mocked', async () => { - console.error = jest.fn() - - try { - const { rerender, unmount } = renderHook( - (stage) => { - useEffect(() => { - console.error(`expected in effect`) - return () => { - console.error(`expected in unmount`) - } - }, []) - console.error(`expected in ${stage}`) - }, - { - initialProps: 'render' - } - ) - - act(() => { - console.error('expected in act') - }) - - await act(async () => { - await new Promise((resolve) => setTimeout(resolve, 100)) - console.error('expected in async act') - }) - - rerender('rerender') - - unmount() - - expect(console.error).toBeCalledWith('expected in render') - expect(console.error).toBeCalledWith('expected in effect') - expect(console.error).toBeCalledWith('expected in act') - expect(console.error).toBeCalledWith('expected in async act') - expect(console.error).toBeCalledWith('expected in rerender') - expect(console.error).toBeCalledWith('expected in unmount') - expect(console.error).toBeCalledTimes(6) - } finally { - console.error = consoleError - } - }) -}) diff --git a/src/dom/__tests__/resultHistory.test.ts b/src/dom/__tests__/resultHistory.test.ts deleted file mode 100644 index 69ce2408..00000000 --- a/src/dom/__tests__/resultHistory.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { renderHook } from '..' - -describe('result history tests', () => { - function useValue(value: number) { - if (value === 2) { - throw Error('expected') - } - return value - } - - test('should capture all renders states of hook', () => { - const { result, rerender } = renderHook((value) => useValue(value), { - initialProps: 0 - }) - - expect(result.current).toEqual(0) - expect(result.all).toEqual([0]) - - rerender(1) - - expect(result.current).toBe(1) - expect(result.all).toEqual([0, 1]) - - rerender(2) - - expect(result.error).toEqual(Error('expected')) - expect(result.all).toEqual([0, 1, Error('expected')]) - - rerender(3) - - expect(result.current).toBe(3) - expect(result.all).toEqual([0, 1, Error('expected'), 3]) - - rerender() - - expect(result.current).toBe(3) - expect(result.all).toEqual([0, 1, Error('expected'), 3, 3]) - }) -}) diff --git a/src/dom/__tests__/suspenseHook.test.ts b/src/dom/__tests__/suspenseHook.test.ts deleted file mode 100644 index 41e9f99a..00000000 --- a/src/dom/__tests__/suspenseHook.test.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { renderHook } from '..' - -describe('suspense hook tests', () => { - const cache: { value?: Promise | string | Error } = {} - const fetchName = (isSuccessful: boolean) => { - if (!cache.value) { - cache.value = new Promise((resolve, reject) => { - setTimeout(() => { - if (isSuccessful) { - resolve('Bob') - } else { - reject(new Error('Failed to fetch name')) - } - }, 50) - }) - .then((value) => (cache.value = value)) - .catch((e: Error) => (cache.value = e)) - } - return cache.value - } - - const useFetchName = (isSuccessful = true) => { - const name = fetchName(isSuccessful) - if (name instanceof Promise || name instanceof Error) { - throw name as unknown - } - return name - } - - beforeEach(() => { - delete cache.value - }) - - test('should allow rendering to be suspended', async () => { - const { result, waitForNextUpdate } = renderHook(() => useFetchName(true)) - - await waitForNextUpdate() - - expect(result.current).toBe('Bob') - }) - - test('should set error if suspense promise rejects', async () => { - const { result, waitForNextUpdate } = renderHook(() => useFetchName(false)) - - await waitForNextUpdate() - - expect(result.error).toEqual(new Error('Failed to fetch name')) - }) - - test('should return undefined if current value is requested before suspension has resolved', async () => { - const { result } = renderHook(() => useFetchName(true)) - - expect(result.current).toBe(undefined) - }) - - test('should return undefined if error is requested before suspension has resolved', async () => { - const { result } = renderHook(() => useFetchName(true)) - - expect(result.error).toBe(undefined) - }) -}) diff --git a/src/dom/__tests__/useContext.test.tsx b/src/dom/__tests__/useContext.test.tsx deleted file mode 100644 index 84046e30..00000000 --- a/src/dom/__tests__/useContext.test.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import React, { createContext, useContext } from 'react' -import { renderHook } from '..' - -describe('useContext tests', () => { - test('should get default value from context', () => { - const TestContext = createContext('foo') - - const { result } = renderHook(() => useContext(TestContext)) - - const value = result.current - - expect(value).toBe('foo') - }) - - test('should get value from context provider', () => { - const TestContext = createContext('foo') - - const wrapper: React.FC = ({ children }) => ( - {children} - ) - - const { result } = renderHook(() => useContext(TestContext), { wrapper }) - - expect(result.current).toBe('bar') - }) - - test('should update mutated value in context', () => { - const TestContext = createContext('foo') - - const value = { current: 'bar' } - - const wrapper: React.FC = ({ children }) => ( - {children} - ) - - const { result, rerender } = renderHook(() => useContext(TestContext), { wrapper }) - - value.current = 'baz' - - rerender() - - expect(result.current).toBe('baz') - }) - - test('should update value in context when props are updated', () => { - const TestContext = createContext('foo') - - const wrapper: React.FC<{ current: string }> = ({ current, children }) => ( - {children} - ) - - const { result, rerender } = renderHook(() => useContext(TestContext), { - wrapper, - initialProps: { - current: 'bar' - } - }) - - rerender({ current: 'baz' }) - - expect(result.current).toBe('baz') - }) -}) diff --git a/src/dom/__tests__/useEffect.test.ts b/src/dom/__tests__/useEffect.test.ts deleted file mode 100644 index 0091b7a8..00000000 --- a/src/dom/__tests__/useEffect.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { useEffect, useLayoutEffect } from 'react' -import { renderHook } from '..' - -describe('useEffect tests', () => { - test('should handle useEffect hook', () => { - const sideEffect: { [key: number]: boolean } = { 1: false, 2: false } - - const { rerender, unmount } = renderHook( - ({ id }) => { - useEffect(() => { - sideEffect[id] = true - return () => { - sideEffect[id] = false - } - }, [id]) - }, - { initialProps: { id: 1 } } - ) - - expect(sideEffect[1]).toBe(true) - expect(sideEffect[2]).toBe(false) - - rerender({ id: 2 }) - - expect(sideEffect[1]).toBe(false) - expect(sideEffect[2]).toBe(true) - - unmount() - - expect(sideEffect[1]).toBe(false) - expect(sideEffect[2]).toBe(false) - }) - - test('should handle useLayoutEffect hook', () => { - const sideEffect: { [key: number]: boolean } = { 1: false, 2: false } - - const { rerender, unmount } = renderHook( - ({ id }) => { - useLayoutEffect(() => { - sideEffect[id] = true - return () => { - sideEffect[id] = false - } - }, [id]) - }, - { initialProps: { id: 1 } } - ) - - expect(sideEffect[1]).toBe(true) - expect(sideEffect[2]).toBe(false) - - rerender({ id: 2 }) - - expect(sideEffect[1]).toBe(false) - expect(sideEffect[2]).toBe(true) - - unmount() - - expect(sideEffect[1]).toBe(false) - expect(sideEffect[2]).toBe(false) - }) -}) diff --git a/src/dom/__tests__/useMemo.test.ts b/src/dom/__tests__/useMemo.test.ts deleted file mode 100644 index dcf0de7d..00000000 --- a/src/dom/__tests__/useMemo.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { useMemo, useCallback } from 'react' -import { renderHook } from '..' - -describe('useCallback tests', () => { - test('should handle useMemo hook', () => { - const { result, rerender } = renderHook(({ value }) => useMemo(() => ({ value }), [value]), { - initialProps: { value: 1 } - }) - - const value1 = result.current - - expect(value1).toEqual({ value: 1 }) - - rerender() - - const value2 = result.current - - expect(value2).toEqual({ value: 1 }) - - expect(value2).toBe(value1) - - rerender({ value: 2 }) - - const value3 = result.current - - expect(value3).toEqual({ value: 2 }) - - expect(value3).not.toBe(value1) - }) - - test('should handle useCallback hook', () => { - const { result, rerender } = renderHook( - ({ value }) => { - const callback = () => ({ value }) - return useCallback(callback, [value]) - }, - { initialProps: { value: 1 } } - ) - - const callback1 = result.current - - const callbackValue1 = callback1() - - expect(callbackValue1).toEqual({ value: 1 }) - - const callback2 = result.current - - const callbackValue2 = callback2() - - expect(callbackValue2).toEqual({ value: 1 }) - - expect(callback2).toBe(callback1) - - rerender({ value: 2 }) - - const callback3 = result.current - - const callbackValue3 = callback3() - - expect(callbackValue3).toEqual({ value: 2 }) - - expect(callback3).not.toBe(callback1) - }) -}) diff --git a/src/dom/__tests__/useReducer.test.ts b/src/dom/__tests__/useReducer.test.ts deleted file mode 100644 index fab39201..00000000 --- a/src/dom/__tests__/useReducer.test.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { useReducer } from 'react' -import { renderHook, act } from '..' - -describe('useReducer tests', () => { - test('should handle useReducer hook', () => { - const reducer = (state: number, action: { type: string }) => - action.type === 'inc' ? state + 1 : state - const { result } = renderHook(() => useReducer(reducer, 0)) - - const [initialState, dispatch] = result.current - - expect(initialState).toBe(0) - - act(() => dispatch({ type: 'inc' })) - - const [state] = result.current - - expect(state).toBe(1) - }) -}) diff --git a/src/dom/__tests__/useRef.test.ts b/src/dom/__tests__/useRef.test.ts deleted file mode 100644 index a8663e16..00000000 --- a/src/dom/__tests__/useRef.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { useRef, useImperativeHandle } from 'react' -import { renderHook } from '..' - -describe('useHook tests', () => { - test('should handle useRef hook', () => { - const { result } = renderHook(() => useRef()) - - const refContainer = result.current - - expect(Object.keys(refContainer)).toEqual(['current']) - expect(refContainer.current).toBeUndefined() - }) - - test('should handle useImperativeHandle hook', () => { - const { result } = renderHook(() => { - const ref = useRef boolean>>({}) - useImperativeHandle(ref, () => ({ - fakeImperativeMethod: () => true - })) - return ref - }) - - const refContainer = result.current - - expect(refContainer.current.fakeImperativeMethod()).toBe(true) - }) -}) diff --git a/src/dom/__tests__/useState.test.ts b/src/dom/__tests__/useState.test.ts deleted file mode 100644 index 78cbaa6f..00000000 --- a/src/dom/__tests__/useState.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { useState } from 'react' -import { renderHook, act } from '..' - -describe('useState tests', () => { - test('should use setState value', () => { - const { result } = renderHook(() => useState('foo')) - - const [value] = result.current - - expect(value).toBe('foo') - }) - - test('should update setState value using setter', () => { - const { result } = renderHook(() => useState('foo')) - - const [ignoredValue, setValue] = result.current - - act(() => setValue('bar')) - - const [value] = result.current - - expect(value).toBe('bar') - }) -}) diff --git a/src/native/__tests__/asyncHook.test.ts b/src/native/__tests__/asyncHook.test.ts deleted file mode 100644 index d460d35f..00000000 --- a/src/native/__tests__/asyncHook.test.ts +++ /dev/null @@ -1,259 +0,0 @@ -import { useState, useRef, useEffect } from 'react' -import { renderHook } from '..' - -describe('async hook tests', () => { - const useSequence = (values: string[], intervalMs = 50) => { - const [first, ...otherValues] = values - const [value, setValue] = useState(() => first) - const index = useRef(0) - - useEffect(() => { - const interval = setInterval(() => { - setValue(otherValues[index.current++]) - if (index.current >= otherValues.length) { - clearInterval(interval) - } - }, intervalMs) - return () => { - clearInterval(interval) - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, otherValues) - - return value - } - - test('should wait for next update', async () => { - const { result, waitForNextUpdate } = renderHook(() => useSequence(['first', 'second'])) - - expect(result.current).toBe('first') - - await waitForNextUpdate() - - expect(result.current).toBe('second') - }) - - test('should wait for multiple updates', async () => { - const { result, waitForNextUpdate } = renderHook(() => - useSequence(['first', 'second', 'third']) - ) - - expect(result.current).toBe('first') - - await waitForNextUpdate() - - expect(result.current).toBe('second') - - await waitForNextUpdate() - - expect(result.current).toBe('third') - }) - - test('should reject if timeout exceeded when waiting for next update', async () => { - const { result, waitForNextUpdate } = renderHook(() => useSequence(['first', 'second'])) - - expect(result.current).toBe('first') - - await expect(waitForNextUpdate({ timeout: 10 })).rejects.toThrow( - Error('Timed out in waitForNextUpdate after 10ms.') - ) - }) - - test('should not reject when waiting for next update if timeout has been disabled', async () => { - const { result, waitForNextUpdate } = renderHook(() => useSequence(['first', 'second'], 1100)) - - expect(result.current).toBe('first') - - await waitForNextUpdate({ timeout: false }) - - expect(result.current).toBe('second') - }) - - test('should wait for expectation to pass', async () => { - const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) - - expect(result.current).toBe('first') - - let complete = false - await waitFor(() => { - expect(result.current).toBe('third') - complete = true - }) - expect(complete).toBe(true) - }) - - test('should wait for arbitrary expectation to pass', async () => { - const { waitFor } = renderHook(() => null) - - let actual = 0 - const expected = 1 - - setTimeout(() => { - actual = expected - }, 200) - - let complete = false - await waitFor(() => { - expect(actual).toBe(expected) - complete = true - }) - - expect(complete).toBe(true) - }) - - test('should not hang if expectation is already passing', async () => { - const { result, waitFor } = renderHook(() => useSequence(['first', 'second'])) - - expect(result.current).toBe('first') - - let complete = false - await waitFor(() => { - expect(result.current).toBe('first') - complete = true - }) - expect(complete).toBe(true) - }) - - test('should wait for truthy value', async () => { - const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) - - expect(result.current).toBe('first') - - await waitFor(() => result.current === 'third') - - expect(result.current).toBe('third') - }) - - test('should wait for arbitrary truthy value', async () => { - const { waitFor } = renderHook(() => null) - - let actual = 0 - const expected = 1 - - setTimeout(() => { - actual = expected - }, 200) - - await waitFor(() => actual === 1) - - expect(actual).toBe(expected) - }) - - test('should reject if timeout exceeded when waiting for expectation to pass', async () => { - const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) - - expect(result.current).toBe('first') - - await expect( - waitFor( - () => { - expect(result.current).toBe('third') - }, - { timeout: 75 } - ) - ).rejects.toThrow(Error('Timed out in waitFor after 75ms.')) - }) - - test('should not reject when waiting for expectation to pass if timeout has been disabled', async () => { - const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'], 550)) - - expect(result.current).toBe('first') - - await waitFor( - () => { - expect(result.current).toBe('third') - }, - { timeout: false } - ) - - expect(result.current).toBe('third') - }) - - test('should check on interval when waiting for expectation to pass', async () => { - const { result, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) - - let checks = 0 - - try { - await waitFor( - () => { - checks++ - return result.current === 'third' - }, - { interval: 100 } - ) - } catch {} - - expect(checks).toBe(3) - }) - - test('should wait for value to change', async () => { - const { result, waitForValueToChange } = renderHook(() => - useSequence(['first', 'second', 'third']) - ) - - expect(result.current).toBe('first') - - await waitForValueToChange(() => result.current === 'third') - - expect(result.current).toBe('third') - }) - - test('should wait for arbitrary value to change', async () => { - const { waitForValueToChange } = renderHook(() => null) - - let actual = 0 - const expected = 1 - - setTimeout(() => { - actual = expected - }, 200) - - await waitForValueToChange(() => actual) - - expect(actual).toBe(expected) - }) - - test('should reject if timeout exceeded when waiting for value to change', async () => { - const { result, waitForValueToChange } = renderHook(() => - useSequence(['first', 'second', 'third']) - ) - - expect(result.current).toBe('first') - - await expect( - waitForValueToChange(() => result.current === 'third', { - timeout: 75 - }) - ).rejects.toThrow(Error('Timed out in waitForValueToChange after 75ms.')) - }) - - test('should not reject when waiting for value to change if timeout is disabled', async () => { - const { result, waitForValueToChange } = renderHook(() => - useSequence(['first', 'second', 'third'], 550) - ) - - expect(result.current).toBe('first') - - await waitForValueToChange(() => result.current === 'third', { - timeout: false - }) - - expect(result.current).toBe('third') - }) - - test('should reject if selector throws error', async () => { - const { result, waitForValueToChange } = renderHook(() => useSequence(['first', 'second'])) - - expect(result.current).toBe('first') - - await expect( - waitForValueToChange(() => { - if (result.current === 'second') { - throw new Error('Something Unexpected') - } - return result.current - }) - ).rejects.toThrow(Error('Something Unexpected')) - }) -}) diff --git a/src/native/__tests__/autoCleanup.disabled.test.ts b/src/native/__tests__/autoCleanup.disabled.test.ts deleted file mode 100644 index cd32a7ee..00000000 --- a/src/native/__tests__/autoCleanup.disabled.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { useEffect } from 'react' - -import { ReactHooksRenderer } from '../../types/react' - -// This verifies that if RHTL_SKIP_AUTO_CLEANUP is set -// then we DON'T auto-wire up the afterEach for folks -describe('skip auto cleanup (disabled) tests', () => { - let cleanupCalled = false - process.env.RHTL_SKIP_AUTO_CLEANUP = 'true' - const renderHook = (require('..') as ReactHooksRenderer).renderHook - - test('first', () => { - const hookWithCleanup = () => { - useEffect(() => { - return () => { - cleanupCalled = true - } - }) - } - renderHook(() => hookWithCleanup()) - }) - - test('second', () => { - expect(cleanupCalled).toBe(false) - }) -}) diff --git a/src/native/__tests__/autoCleanup.noAfterEach.test.ts b/src/native/__tests__/autoCleanup.noAfterEach.test.ts deleted file mode 100644 index 5f773d93..00000000 --- a/src/native/__tests__/autoCleanup.noAfterEach.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { useEffect } from 'react' - -import { ReactHooksRenderer } from '../../types/react' - -// This verifies that if afterEach is unavailable -// then we DON'T auto-wire up the afterEach for folks -describe('skip auto cleanup (no afterEach) tests', () => { - let cleanupCalled = false - // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type - afterEach = false - const renderHook = (require('..') as ReactHooksRenderer).renderHook - - test('first', () => { - const hookWithCleanup = () => { - useEffect(() => { - return () => { - cleanupCalled = true - } - }) - } - renderHook(() => hookWithCleanup()) - }) - - test('second', () => { - expect(cleanupCalled).toBe(false) - }) -}) diff --git a/src/native/__tests__/autoCleanup.noProcessEnv.test.ts b/src/native/__tests__/autoCleanup.noProcessEnv.test.ts deleted file mode 100644 index 35febc66..00000000 --- a/src/native/__tests__/autoCleanup.noProcessEnv.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { useEffect } from 'react' - -import { ReactHooksRenderer } from '../../types/react' - -// This verifies that if process.env is unavailable -// then we still auto-wire up the afterEach for folks -describe('auto cleanup (no process.env) tests', () => { - let cleanupCalled = false - process.env = { - ...process.env, - get RHTL_SKIP_AUTO_CLEANUP(): string | undefined { - throw new Error('expected') - } - } - const renderHook = (require('..') as ReactHooksRenderer).renderHook - - test('first', () => { - const hookWithCleanup = () => { - useEffect(() => { - return () => { - cleanupCalled = true - } - }) - } - renderHook(() => hookWithCleanup()) - }) - - test('second', () => { - expect(cleanupCalled).toBe(true) - }) -}) diff --git a/src/native/__tests__/autoCleanup.pure.test.ts b/src/native/__tests__/autoCleanup.pure.test.ts deleted file mode 100644 index 66c27a07..00000000 --- a/src/native/__tests__/autoCleanup.pure.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { useEffect } from 'react' -import { renderHook } from '../pure' - -// This verifies that if pure imports are used -// then we DON'T auto-wire up the afterEach for folks -describe('skip auto cleanup (pure) tests', () => { - let cleanupCalled = false - - test('first', () => { - const hookWithCleanup = () => { - useEffect(() => { - return () => { - cleanupCalled = true - } - }) - } - renderHook(() => hookWithCleanup()) - }) - - test('second', () => { - expect(cleanupCalled).toBe(false) - }) -}) diff --git a/src/native/__tests__/autoCleanup.test.ts b/src/native/__tests__/autoCleanup.test.ts deleted file mode 100644 index f783f1c2..00000000 --- a/src/native/__tests__/autoCleanup.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { useEffect } from 'react' -import { renderHook } from '..' - -// This verifies that by importing RHTL in an -// environment which supports afterEach (like Jest) -// we'll get automatic cleanup between tests. -describe('auto cleanup tests', () => { - let cleanupCalled = false - - test('first', () => { - const hookWithCleanup = () => { - useEffect(() => { - return () => { - cleanupCalled = true - } - }) - } - renderHook(() => hookWithCleanup()) - }) - - test('second', () => { - expect(cleanupCalled).toBe(true) - }) -}) diff --git a/src/native/__tests__/cleanup.test.ts b/src/native/__tests__/cleanup.test.ts deleted file mode 100644 index 20a0f267..00000000 --- a/src/native/__tests__/cleanup.test.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { useEffect } from 'react' -import { renderHook, cleanup, addCleanup, removeCleanup } from '../pure' - -describe('cleanup tests', () => { - test('should flush effects on cleanup', async () => { - let cleanupCalled = false - - const hookWithCleanup = () => { - useEffect(() => { - return () => { - cleanupCalled = true - } - }) - } - - renderHook(() => hookWithCleanup()) - - await cleanup() - - expect(cleanupCalled).toBe(true) - }) - - test('should cleanup all rendered hooks', async () => { - const cleanupCalled: boolean[] = [] - const hookWithCleanup = (id: number) => { - useEffect(() => { - return () => { - cleanupCalled[id] = true - } - }) - } - - renderHook(() => hookWithCleanup(1)) - renderHook(() => hookWithCleanup(2)) - - await cleanup() - - expect(cleanupCalled[1]).toBe(true) - expect(cleanupCalled[2]).toBe(true) - }) - - test('should call cleanups in reverse order', async () => { - const callSequence: string[] = [] - addCleanup(() => { - callSequence.push('cleanup') - }) - addCleanup(() => { - callSequence.push('another cleanup') - }) - const hookWithCleanup = () => { - useEffect(() => { - return () => { - callSequence.push('unmount') - } - }) - } - renderHook(() => hookWithCleanup()) - - await cleanup() - - expect(callSequence).toEqual(['unmount', 'another cleanup', 'cleanup']) - }) - - test('should wait for async cleanup', async () => { - const callSequence: string[] = [] - addCleanup(() => { - callSequence.push('cleanup') - }) - addCleanup(async () => { - await new Promise((resolve) => setTimeout(resolve, 10)) - callSequence.push('another cleanup') - }) - const hookWithCleanup = () => { - useEffect(() => { - return () => { - callSequence.push('unmount') - } - }) - } - renderHook(() => hookWithCleanup()) - - await cleanup() - - expect(callSequence).toEqual(['unmount', 'another cleanup', 'cleanup']) - }) - - test('should remove cleanup using removeCleanup', async () => { - const callSequence: string[] = [] - addCleanup(() => { - callSequence.push('cleanup') - }) - const anotherCleanup = () => { - callSequence.push('another cleanup') - } - addCleanup(anotherCleanup) - const hookWithCleanup = () => { - useEffect(() => { - return () => { - callSequence.push('unmount') - } - }) - } - renderHook(() => hookWithCleanup()) - - removeCleanup(anotherCleanup) - - await cleanup() - - expect(callSequence).toEqual(['unmount', 'cleanup']) - }) - - test('should remove cleanup using returned handler', async () => { - const callSequence: string[] = [] - addCleanup(() => { - callSequence.push('cleanup') - }) - const remove = addCleanup(() => { - callSequence.push('another cleanup') - }) - const hookWithCleanup = () => { - useEffect(() => { - return () => { - callSequence.push('unmount') - } - }) - } - renderHook(() => hookWithCleanup()) - - remove() - - await cleanup() - - expect(callSequence).toEqual(['unmount', 'cleanup']) - }) -}) diff --git a/src/native/__tests__/customHook.test.ts b/src/native/__tests__/customHook.test.ts deleted file mode 100644 index 5a1e83ab..00000000 --- a/src/native/__tests__/customHook.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { useState, useCallback } from 'react' -import { renderHook, act } from '..' - -describe('custom hook tests', () => { - function useCounter() { - const [count, setCount] = useState(0) - - const increment = useCallback(() => setCount(count + 1), [count]) - const decrement = useCallback(() => setCount(count - 1), [count]) - - return { count, increment, decrement } - } - - test('should increment counter', () => { - const { result } = renderHook(() => useCounter()) - - act(() => result.current.increment()) - - expect(result.current.count).toBe(1) - }) - - test('should decrement counter', () => { - const { result } = renderHook(() => useCounter()) - - act(() => result.current.decrement()) - - expect(result.current.count).toBe(-1) - }) -}) diff --git a/src/native/__tests__/errorHook.test.ts b/src/native/__tests__/errorHook.test.ts deleted file mode 100644 index 8e97e5de..00000000 --- a/src/native/__tests__/errorHook.test.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { useState, useEffect } from 'react' -import { renderHook } from '..' - -describe('error hook tests', () => { - function useError(throwError?: boolean) { - if (throwError) { - throw new Error('expected') - } - return true - } - - function useAsyncError(throwError: boolean) { - const [value, setValue] = useState() - useEffect(() => { - const timeout = setTimeout(() => setValue(throwError), 100) - return () => clearTimeout(timeout) - }, [throwError]) - return useError(value) - } - - function useEffectError(throwError: boolean) { - useEffect(() => { - useError(throwError) - }, [throwError]) - return true - } - - describe('synchronous', () => { - test('should raise error', () => { - const { result } = renderHook(() => useError(true)) - - expect(() => { - expect(result.current).not.toBe(undefined) - }).toThrow(Error('expected')) - }) - - test('should capture error', () => { - const { result } = renderHook(() => useError(true)) - - expect(result.error).toEqual(Error('expected')) - }) - - test('should not capture error', () => { - const { result } = renderHook(() => useError(false)) - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - - test('should reset error', () => { - const { result, rerender } = renderHook(({ throwError }) => useError(throwError), { - initialProps: { throwError: true } - }) - - expect(result.error).not.toBe(undefined) - - rerender({ throwError: false }) - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - }) - - describe('asynchronous', () => { - test('should raise async error', async () => { - const { result, waitForNextUpdate } = renderHook(() => useAsyncError(true)) - - await waitForNextUpdate() - - expect(() => { - expect(result.current).not.toBe(undefined) - }).toThrow(Error('expected')) - }) - - test('should capture async error', async () => { - const { result, waitForNextUpdate } = renderHook(() => useAsyncError(true)) - - await waitForNextUpdate() - - expect(result.error).toEqual(Error('expected')) - }) - - test('should not capture async error', async () => { - const { result, waitForNextUpdate } = renderHook(() => useAsyncError(false)) - - await waitForNextUpdate() - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - - test('should reset async error', async () => { - const { result, waitForNextUpdate, rerender } = renderHook( - ({ throwError }) => useAsyncError(throwError), - { initialProps: { throwError: true } } - ) - - await waitForNextUpdate() - - expect(result.error).not.toBe(undefined) - - rerender({ throwError: false }) - - await waitForNextUpdate() - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - }) - - describe('effect', () => { - test('this one - should raise effect error', () => { - const { result } = renderHook(() => useEffectError(true)) - - expect(() => { - expect(result.current).not.toBe(undefined) - }).toThrow(Error('expected')) - }) - - test('this one - should capture effect error', () => { - const { result } = renderHook(() => useEffectError(true)) - expect(result.error).toEqual(Error('expected')) - }) - - test('should not capture effect error', () => { - const { result } = renderHook(() => useEffectError(false)) - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - - test('should reset effect error', () => { - const { result, rerender } = renderHook(({ throwError }) => useEffectError(throwError), { - initialProps: { throwError: true } - }) - - expect(result.error).not.toBe(undefined) - - rerender({ throwError: false }) - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - }) -}) diff --git a/src/native/__tests__/errorSuppression.disabled.test.ts b/src/native/__tests__/errorSuppression.disabled.test.ts deleted file mode 100644 index 8cf200ab..00000000 --- a/src/native/__tests__/errorSuppression.disabled.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -// This verifies that if RHTL_DISABLE_ERROR_FILTERING is set -// then we DON'T auto-wire up the afterEach for folks -describe('error output suppression (disabled) tests', () => { - const originalConsoleError = console.error - process.env.RHTL_DISABLE_ERROR_FILTERING = 'true' - require('..') - - test('should not patch console.error', () => { - expect(console.error).toBe(originalConsoleError) - }) -}) - -export {} diff --git a/src/native/__tests__/errorSuppression.noAfterEach.test.ts b/src/native/__tests__/errorSuppression.noAfterEach.test.ts deleted file mode 100644 index f83d068f..00000000 --- a/src/native/__tests__/errorSuppression.noAfterEach.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This verifies that if afterEach is unavailable -// then we DON'T auto-wire up the afterEach for folks -describe('error output suppression (noAfterEach) tests', () => { - const originalConsoleError = console.error - // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type - afterEach = false - require('..') - - test('should not patch console.error', () => { - expect(console.error).toBe(originalConsoleError) - }) -}) - -export {} diff --git a/src/native/__tests__/errorSuppression.noBeforeEach.test.ts b/src/native/__tests__/errorSuppression.noBeforeEach.test.ts deleted file mode 100644 index 609cab95..00000000 --- a/src/native/__tests__/errorSuppression.noBeforeEach.test.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This verifies that if afterEach is unavailable -// then we DON'T auto-wire up the afterEach for folks -describe('error output suppression (noBeforeEach) tests', () => { - const originalConsoleError = console.error - // @ts-expect-error Turning off BeforeEach -- ignore Jest LifeCycle Type - beforeEach = false - require('..') - - test('should not patch console.error', () => { - expect(console.error).toBe(originalConsoleError) - }) -}) - -export {} diff --git a/src/native/__tests__/errorSuppression.noProcessEnv.test.ts b/src/native/__tests__/errorSuppression.noProcessEnv.test.ts deleted file mode 100644 index 414aea26..00000000 --- a/src/native/__tests__/errorSuppression.noProcessEnv.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This verifies that if process.env is unavailable -// then we still auto-wire up the afterEach for folks -describe('error output suppression (no process.env) tests', () => { - const originalConsoleError = console.error - process.env = { - ...process.env, - get RHTL_DISABLE_ERROR_FILTERING(): string | undefined { - throw new Error('expected') - } - } - require('..') - - test('should not patch console.error', () => { - expect(console.error).not.toBe(originalConsoleError) - }) -}) - -export {} diff --git a/src/native/__tests__/errorSuppression.pure.test.ts b/src/native/__tests__/errorSuppression.pure.test.ts deleted file mode 100644 index 6e356cb6..00000000 --- a/src/native/__tests__/errorSuppression.pure.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { suppressErrorOutput } from '../pure' - -// This verifies that if pure imports are used -// then we DON'T auto-wire up the afterEach for folks -describe('error output suppression (pure) tests', () => { - const originalConsoleError = console.error - - test('should not patch console.error', () => { - expect(console.error).toBe(originalConsoleError) - }) - - test('should manually patch console.error', () => { - const restore = suppressErrorOutput() - - try { - expect(console.error).not.toBe(originalConsoleError) - } finally { - restore() - } - - expect(console.error).toBe(originalConsoleError) - }) -}) diff --git a/src/native/__tests__/errorSuppression.test.ts b/src/native/__tests__/errorSuppression.test.ts deleted file mode 100644 index a5cb4b79..00000000 --- a/src/native/__tests__/errorSuppression.test.ts +++ /dev/null @@ -1,70 +0,0 @@ -import { useEffect } from 'react' -import { renderHook, act, suppressErrorOutput } from '..' - -describe('error output suppression tests', () => { - const consoleError = console.error - - test('should not suppress relevant errors', () => { - console.error = jest.fn() - - try { - const restoreConsole = suppressErrorOutput() - - console.error('expected') - console.error(new Error('expected')) - console.error('expected with args', new Error('expected')) - - restoreConsole() - - expect(console.error).toBeCalledWith('expected') - expect(console.error).toBeCalledWith(new Error('expected')) - expect(console.error).toBeCalledWith('expected with args', new Error('expected')) - expect(console.error).toBeCalledTimes(3) - } finally { - console.error = consoleError - } - }) - - test('should allow console.error to be mocked', async () => { - console.error = jest.fn() - try { - const { rerender, unmount } = renderHook( - (stage) => { - useEffect(() => { - console.error(`expected in effect`) - return () => { - console.error(`expected in unmount`) - } - }, []) - console.error(`expected in ${stage}`) - }, - { - initialProps: 'render' - } - ) - - act(() => { - console.error('expected in act') - }) - - await act(async () => { - await new Promise((resolve) => setTimeout(resolve, 100)) - console.error('expected in async act') - }) - - rerender('rerender') - - unmount() - - expect(console.error).toBeCalledWith('expected in render') - expect(console.error).toBeCalledWith('expected in effect') - expect(console.error).toBeCalledWith('expected in act') - expect(console.error).toBeCalledWith('expected in async act') - expect(console.error).toBeCalledWith('expected in rerender') - expect(console.error).toBeCalledWith('expected in unmount') - expect(console.error).toBeCalledTimes(6) - } finally { - console.error = consoleError - } - }) -}) diff --git a/src/native/__tests__/resultHistory.test.ts b/src/native/__tests__/resultHistory.test.ts deleted file mode 100644 index 69ce2408..00000000 --- a/src/native/__tests__/resultHistory.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { renderHook } from '..' - -describe('result history tests', () => { - function useValue(value: number) { - if (value === 2) { - throw Error('expected') - } - return value - } - - test('should capture all renders states of hook', () => { - const { result, rerender } = renderHook((value) => useValue(value), { - initialProps: 0 - }) - - expect(result.current).toEqual(0) - expect(result.all).toEqual([0]) - - rerender(1) - - expect(result.current).toBe(1) - expect(result.all).toEqual([0, 1]) - - rerender(2) - - expect(result.error).toEqual(Error('expected')) - expect(result.all).toEqual([0, 1, Error('expected')]) - - rerender(3) - - expect(result.current).toBe(3) - expect(result.all).toEqual([0, 1, Error('expected'), 3]) - - rerender() - - expect(result.current).toBe(3) - expect(result.all).toEqual([0, 1, Error('expected'), 3, 3]) - }) -}) diff --git a/src/native/__tests__/suspenseHook.test.ts b/src/native/__tests__/suspenseHook.test.ts deleted file mode 100644 index 41e9f99a..00000000 --- a/src/native/__tests__/suspenseHook.test.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { renderHook } from '..' - -describe('suspense hook tests', () => { - const cache: { value?: Promise | string | Error } = {} - const fetchName = (isSuccessful: boolean) => { - if (!cache.value) { - cache.value = new Promise((resolve, reject) => { - setTimeout(() => { - if (isSuccessful) { - resolve('Bob') - } else { - reject(new Error('Failed to fetch name')) - } - }, 50) - }) - .then((value) => (cache.value = value)) - .catch((e: Error) => (cache.value = e)) - } - return cache.value - } - - const useFetchName = (isSuccessful = true) => { - const name = fetchName(isSuccessful) - if (name instanceof Promise || name instanceof Error) { - throw name as unknown - } - return name - } - - beforeEach(() => { - delete cache.value - }) - - test('should allow rendering to be suspended', async () => { - const { result, waitForNextUpdate } = renderHook(() => useFetchName(true)) - - await waitForNextUpdate() - - expect(result.current).toBe('Bob') - }) - - test('should set error if suspense promise rejects', async () => { - const { result, waitForNextUpdate } = renderHook(() => useFetchName(false)) - - await waitForNextUpdate() - - expect(result.error).toEqual(new Error('Failed to fetch name')) - }) - - test('should return undefined if current value is requested before suspension has resolved', async () => { - const { result } = renderHook(() => useFetchName(true)) - - expect(result.current).toBe(undefined) - }) - - test('should return undefined if error is requested before suspension has resolved', async () => { - const { result } = renderHook(() => useFetchName(true)) - - expect(result.error).toBe(undefined) - }) -}) diff --git a/src/native/__tests__/useContext.test.tsx b/src/native/__tests__/useContext.test.tsx deleted file mode 100644 index 84046e30..00000000 --- a/src/native/__tests__/useContext.test.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import React, { createContext, useContext } from 'react' -import { renderHook } from '..' - -describe('useContext tests', () => { - test('should get default value from context', () => { - const TestContext = createContext('foo') - - const { result } = renderHook(() => useContext(TestContext)) - - const value = result.current - - expect(value).toBe('foo') - }) - - test('should get value from context provider', () => { - const TestContext = createContext('foo') - - const wrapper: React.FC = ({ children }) => ( - {children} - ) - - const { result } = renderHook(() => useContext(TestContext), { wrapper }) - - expect(result.current).toBe('bar') - }) - - test('should update mutated value in context', () => { - const TestContext = createContext('foo') - - const value = { current: 'bar' } - - const wrapper: React.FC = ({ children }) => ( - {children} - ) - - const { result, rerender } = renderHook(() => useContext(TestContext), { wrapper }) - - value.current = 'baz' - - rerender() - - expect(result.current).toBe('baz') - }) - - test('should update value in context when props are updated', () => { - const TestContext = createContext('foo') - - const wrapper: React.FC<{ current: string }> = ({ current, children }) => ( - {children} - ) - - const { result, rerender } = renderHook(() => useContext(TestContext), { - wrapper, - initialProps: { - current: 'bar' - } - }) - - rerender({ current: 'baz' }) - - expect(result.current).toBe('baz') - }) -}) diff --git a/src/native/__tests__/useEffect.test.ts b/src/native/__tests__/useEffect.test.ts deleted file mode 100644 index 0091b7a8..00000000 --- a/src/native/__tests__/useEffect.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { useEffect, useLayoutEffect } from 'react' -import { renderHook } from '..' - -describe('useEffect tests', () => { - test('should handle useEffect hook', () => { - const sideEffect: { [key: number]: boolean } = { 1: false, 2: false } - - const { rerender, unmount } = renderHook( - ({ id }) => { - useEffect(() => { - sideEffect[id] = true - return () => { - sideEffect[id] = false - } - }, [id]) - }, - { initialProps: { id: 1 } } - ) - - expect(sideEffect[1]).toBe(true) - expect(sideEffect[2]).toBe(false) - - rerender({ id: 2 }) - - expect(sideEffect[1]).toBe(false) - expect(sideEffect[2]).toBe(true) - - unmount() - - expect(sideEffect[1]).toBe(false) - expect(sideEffect[2]).toBe(false) - }) - - test('should handle useLayoutEffect hook', () => { - const sideEffect: { [key: number]: boolean } = { 1: false, 2: false } - - const { rerender, unmount } = renderHook( - ({ id }) => { - useLayoutEffect(() => { - sideEffect[id] = true - return () => { - sideEffect[id] = false - } - }, [id]) - }, - { initialProps: { id: 1 } } - ) - - expect(sideEffect[1]).toBe(true) - expect(sideEffect[2]).toBe(false) - - rerender({ id: 2 }) - - expect(sideEffect[1]).toBe(false) - expect(sideEffect[2]).toBe(true) - - unmount() - - expect(sideEffect[1]).toBe(false) - expect(sideEffect[2]).toBe(false) - }) -}) diff --git a/src/native/__tests__/useMemo.test.ts b/src/native/__tests__/useMemo.test.ts deleted file mode 100644 index dcf0de7d..00000000 --- a/src/native/__tests__/useMemo.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { useMemo, useCallback } from 'react' -import { renderHook } from '..' - -describe('useCallback tests', () => { - test('should handle useMemo hook', () => { - const { result, rerender } = renderHook(({ value }) => useMemo(() => ({ value }), [value]), { - initialProps: { value: 1 } - }) - - const value1 = result.current - - expect(value1).toEqual({ value: 1 }) - - rerender() - - const value2 = result.current - - expect(value2).toEqual({ value: 1 }) - - expect(value2).toBe(value1) - - rerender({ value: 2 }) - - const value3 = result.current - - expect(value3).toEqual({ value: 2 }) - - expect(value3).not.toBe(value1) - }) - - test('should handle useCallback hook', () => { - const { result, rerender } = renderHook( - ({ value }) => { - const callback = () => ({ value }) - return useCallback(callback, [value]) - }, - { initialProps: { value: 1 } } - ) - - const callback1 = result.current - - const callbackValue1 = callback1() - - expect(callbackValue1).toEqual({ value: 1 }) - - const callback2 = result.current - - const callbackValue2 = callback2() - - expect(callbackValue2).toEqual({ value: 1 }) - - expect(callback2).toBe(callback1) - - rerender({ value: 2 }) - - const callback3 = result.current - - const callbackValue3 = callback3() - - expect(callbackValue3).toEqual({ value: 2 }) - - expect(callback3).not.toBe(callback1) - }) -}) diff --git a/src/native/__tests__/useReducer.test.ts b/src/native/__tests__/useReducer.test.ts deleted file mode 100644 index fab39201..00000000 --- a/src/native/__tests__/useReducer.test.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { useReducer } from 'react' -import { renderHook, act } from '..' - -describe('useReducer tests', () => { - test('should handle useReducer hook', () => { - const reducer = (state: number, action: { type: string }) => - action.type === 'inc' ? state + 1 : state - const { result } = renderHook(() => useReducer(reducer, 0)) - - const [initialState, dispatch] = result.current - - expect(initialState).toBe(0) - - act(() => dispatch({ type: 'inc' })) - - const [state] = result.current - - expect(state).toBe(1) - }) -}) diff --git a/src/native/__tests__/useRef.test.ts b/src/native/__tests__/useRef.test.ts deleted file mode 100644 index a8663e16..00000000 --- a/src/native/__tests__/useRef.test.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { useRef, useImperativeHandle } from 'react' -import { renderHook } from '..' - -describe('useHook tests', () => { - test('should handle useRef hook', () => { - const { result } = renderHook(() => useRef()) - - const refContainer = result.current - - expect(Object.keys(refContainer)).toEqual(['current']) - expect(refContainer.current).toBeUndefined() - }) - - test('should handle useImperativeHandle hook', () => { - const { result } = renderHook(() => { - const ref = useRef boolean>>({}) - useImperativeHandle(ref, () => ({ - fakeImperativeMethod: () => true - })) - return ref - }) - - const refContainer = result.current - - expect(refContainer.current.fakeImperativeMethod()).toBe(true) - }) -}) diff --git a/src/native/__tests__/useState.test.ts b/src/native/__tests__/useState.test.ts deleted file mode 100644 index 78cbaa6f..00000000 --- a/src/native/__tests__/useState.test.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { useState } from 'react' -import { renderHook, act } from '..' - -describe('useState tests', () => { - test('should use setState value', () => { - const { result } = renderHook(() => useState('foo')) - - const [value] = result.current - - expect(value).toBe('foo') - }) - - test('should update setState value using setter', () => { - const { result } = renderHook(() => useState('foo')) - - const [ignoredValue, setValue] = result.current - - act(() => setValue('bar')) - - const [value] = result.current - - expect(value).toBe('bar') - }) -}) diff --git a/src/server/__tests__/asyncHook.test.ts b/src/server/__tests__/asyncHook.test.ts deleted file mode 100644 index 7d23a981..00000000 --- a/src/server/__tests__/asyncHook.test.ts +++ /dev/null @@ -1,325 +0,0 @@ -import { useState, useRef, useEffect } from 'react' -import { renderHook } from '..' - -describe('async hook tests', () => { - const useSequence = (values: string[], intervalMs = 50) => { - const [first, ...otherValues] = values - const [value, setValue] = useState(() => first) - const index = useRef(0) - - useEffect(() => { - const interval = setInterval(() => { - setValue(otherValues[index.current++]) - if (index.current >= otherValues.length) { - clearInterval(interval) - } - }, intervalMs) - return () => { - clearInterval(interval) - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, otherValues) - - return value - } - - test('should wait for next update', async () => { - const { result, hydrate, waitForNextUpdate } = renderHook(() => - useSequence(['first', 'second']) - ) - - expect(result.current).toBe('first') - - hydrate() - - expect(result.current).toBe('first') - - await waitForNextUpdate() - - expect(result.current).toBe('second') - }) - - test('should wait for multiple updates', async () => { - const { result, hydrate, waitForNextUpdate } = renderHook(() => - useSequence(['first', 'second', 'third']) - ) - - expect(result.current).toBe('first') - - hydrate() - - expect(result.current).toBe('first') - - await waitForNextUpdate() - - expect(result.current).toBe('second') - - await waitForNextUpdate() - - expect(result.current).toBe('third') - }) - - test('should reject if timeout exceeded when waiting for next update', async () => { - const { result, hydrate, waitForNextUpdate } = renderHook(() => - useSequence(['first', 'second']) - ) - - expect(result.current).toBe('first') - - hydrate() - - expect(result.current).toBe('first') - - await expect(waitForNextUpdate({ timeout: 10 })).rejects.toThrow( - Error('Timed out in waitForNextUpdate after 10ms.') - ) - }) - - test('should not reject when waiting for next update if timeout has been disabled', async () => { - const { result, hydrate, waitForNextUpdate } = renderHook(() => - useSequence(['first', 'second'], 1100) - ) - - expect(result.current).toBe('first') - - hydrate() - - expect(result.current).toBe('first') - - await waitForNextUpdate({ timeout: false }) - - expect(result.current).toBe('second') - }) - - test('should wait for expectation to pass', async () => { - const { result, hydrate, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) - - expect(result.current).toBe('first') - - hydrate() - - expect(result.current).toBe('first') - - let complete = false - await waitFor(() => { - expect(result.current).toBe('third') - complete = true - }) - expect(complete).toBe(true) - }) - - test('should wait for arbitrary expectation to pass', async () => { - const { waitFor, hydrate } = renderHook(() => null) - - hydrate() - - let actual = 0 - const expected = 1 - - setTimeout(() => { - actual = expected - }, 200) - - let complete = false - await waitFor(() => { - expect(actual).toBe(expected) - complete = true - }) - - expect(complete).toBe(true) - }) - - test('should not hang if expectation is already passing', async () => { - const { result, hydrate, waitFor } = renderHook(() => useSequence(['first', 'second'])) - - expect(result.current).toBe('first') - - hydrate() - - expect(result.current).toBe('first') - - let complete = false - await waitFor(() => { - expect(result.current).toBe('first') - complete = true - }) - expect(complete).toBe(true) - }) - - test('should wait for truthy value', async () => { - const { result, hydrate, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) - - expect(result.current).toBe('first') - - hydrate() - - expect(result.current).toBe('first') - - await waitFor(() => result.current === 'third') - - expect(result.current).toBe('third') - }) - - test('should wait for arbitrary truthy value', async () => { - const { waitFor } = renderHook(() => null) - - let actual = 0 - const expected = 1 - - setTimeout(() => { - actual = expected - }, 200) - - await waitFor(() => actual === 1) - - expect(actual).toBe(expected) - }) - - test('should reject if timeout exceeded when waiting for expectation to pass', async () => { - const { result, hydrate, waitFor } = renderHook(() => useSequence(['first', 'second', 'third'])) - - expect(result.current).toBe('first') - - hydrate() - - expect(result.current).toBe('first') - - await expect( - waitFor( - () => { - expect(result.current).toBe('third') - }, - { timeout: 75 } - ) - ).rejects.toThrow(Error('Timed out in waitFor after 75ms.')) - }) - - test('should not reject when waiting for expectation to pass if timeout has been disabled', async () => { - const { result, hydrate, waitFor } = renderHook(() => - useSequence(['first', 'second', 'third'], 550) - ) - - expect(result.current).toBe('first') - - hydrate() - - expect(result.current).toBe('first') - - await waitFor( - () => { - expect(result.current).toBe('third') - }, - { timeout: false } - ) - - expect(result.current).toBe('third') - }) - - test('should check on interval when waiting for expectation to pass', async () => { - const { result, waitFor, hydrate } = renderHook(() => useSequence(['first', 'second', 'third'])) - - hydrate() - - let checks = 0 - - try { - await waitFor( - () => { - checks++ - return result.current === 'third' - }, - { interval: 100 } - ) - } catch {} - - expect(checks).toBe(3) - }) - - test('should wait for value to change', async () => { - const { result, hydrate, waitForValueToChange } = renderHook(() => - useSequence(['first', 'second', 'third']) - ) - - expect(result.current).toBe('first') - - hydrate() - - expect(result.current).toBe('first') - - await waitForValueToChange(() => result.current === 'third') - - expect(result.current).toBe('third') - }) - - test('should wait for arbitrary value to change', async () => { - const { waitForValueToChange } = renderHook(() => null) - - let actual = 0 - const expected = 1 - - setTimeout(() => { - actual = expected - }, 200) - - await waitForValueToChange(() => actual) - - expect(actual).toBe(expected) - }) - - test('should reject if timeout exceeded when waiting for value to change', async () => { - const { result, hydrate, waitForValueToChange } = renderHook(() => - useSequence(['first', 'second', 'third']) - ) - - expect(result.current).toBe('first') - - hydrate() - - expect(result.current).toBe('first') - - await expect( - waitForValueToChange(() => result.current === 'third', { - timeout: 75 - }) - ).rejects.toThrow(Error('Timed out in waitForValueToChange after 75ms.')) - }) - - test('should not reject when waiting for value to change if timeout is disabled', async () => { - const { result, hydrate, waitForValueToChange } = renderHook(() => - useSequence(['first', 'second', 'third'], 550) - ) - - expect(result.current).toBe('first') - - hydrate() - - expect(result.current).toBe('first') - - await waitForValueToChange(() => result.current === 'third', { - timeout: false - }) - - expect(result.current).toBe('third') - }) - - test('should reject if selector throws error', async () => { - const { result, hydrate, waitForValueToChange } = renderHook(() => - useSequence(['first', 'second']) - ) - - expect(result.current).toBe('first') - - hydrate() - - expect(result.current).toBe('first') - - await expect( - waitForValueToChange(() => { - if (result.current === 'second') { - throw new Error('Something Unexpected') - } - return result.current - }) - ).rejects.toThrow(Error('Something Unexpected')) - }) -}) diff --git a/src/server/__tests__/autoCleanup.disabled.test.ts b/src/server/__tests__/autoCleanup.disabled.test.ts deleted file mode 100644 index fd597168..00000000 --- a/src/server/__tests__/autoCleanup.disabled.test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { useEffect } from 'react' - -import { ReactHooksServerRenderer } from '../../types/react' - -// This verifies that if RHTL_SKIP_AUTO_CLEANUP is set -// then we DON'T auto-wire up the afterEach for folks -describe('skip auto cleanup (disabled) tests', () => { - const cleanups: Record = { - ssr: false, - hydrated: false - } - process.env.RHTL_SKIP_AUTO_CLEANUP = 'true' - const renderHook = (require('..') as ReactHooksServerRenderer).renderHook - - test('first', () => { - const hookWithCleanup = (name: string) => { - useEffect(() => { - return () => { - cleanups[name] = true - } - }) - } - - renderHook(() => hookWithCleanup('ssr')) - - const { hydrate } = renderHook(() => hookWithCleanup('hydrated')) - hydrate() - }) - - test('second', () => { - expect(cleanups.ssr).toBe(false) - expect(cleanups.hydrated).toBe(false) - }) -}) diff --git a/src/server/__tests__/autoCleanup.noAfterEach.test.ts b/src/server/__tests__/autoCleanup.noAfterEach.test.ts deleted file mode 100644 index d7ea75ac..00000000 --- a/src/server/__tests__/autoCleanup.noAfterEach.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { useEffect } from 'react' - -import { ReactHooksServerRenderer } from '../../types/react' - -// This verifies that if afterEach is unavailable -// then we DON'T auto-wire up the afterEach for folks -describe('skip auto cleanup (no afterEach) tests', () => { - const cleanups: Record = { - ssr: false, - hydrated: false - } - // @ts-expect-error Turning off AfterEach -- ignore Jest LifeCycle Type - afterEach = false - const renderHook = (require('..') as ReactHooksServerRenderer).renderHook - - test('first', () => { - const hookWithCleanup = (name: string) => { - useEffect(() => { - return () => { - cleanups[name] = true - } - }) - } - - renderHook(() => hookWithCleanup('ssr')) - - const { hydrate } = renderHook(() => hookWithCleanup('hydrated')) - hydrate() - }) - - test('second', () => { - expect(cleanups.ssr).toBe(false) - expect(cleanups.hydrated).toBe(false) - }) -}) diff --git a/src/server/__tests__/autoCleanup.noProcessEnv.test.ts b/src/server/__tests__/autoCleanup.noProcessEnv.test.ts deleted file mode 100644 index de8bf795..00000000 --- a/src/server/__tests__/autoCleanup.noProcessEnv.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { useEffect } from 'react' - -import { ReactHooksServerRenderer } from '../../types/react' - -// This verifies that if process.env is unavailable -// then we still auto-wire up the afterEach for folks -describe('skip auto cleanup (no process.env) tests', () => { - const cleanups: Record = { - ssr: false, - hydrated: false - } - process.env = { - ...process.env, - get RHTL_SKIP_AUTO_CLEANUP(): string | undefined { - throw new Error('expected') - } - } - const renderHook = (require('..') as ReactHooksServerRenderer).renderHook - - test('first', () => { - const hookWithCleanup = (name: string) => { - useEffect(() => { - return () => { - cleanups[name] = true - } - }) - } - - renderHook(() => hookWithCleanup('ssr')) - - const { hydrate } = renderHook(() => hookWithCleanup('hydrated')) - hydrate() - }) - - test('second', () => { - expect(cleanups.ssr).toBe(false) - expect(cleanups.hydrated).toBe(true) - }) -}) diff --git a/src/server/__tests__/autoCleanup.pure.test.ts b/src/server/__tests__/autoCleanup.pure.test.ts deleted file mode 100644 index ecf8a72d..00000000 --- a/src/server/__tests__/autoCleanup.pure.test.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { useEffect } from 'react' -import { renderHook } from '../pure' - -// This verifies that if pure imports are used -// then we DON'T auto-wire up the afterEach for folks -describe('skip auto cleanup (pure) tests', () => { - const cleanups: Record = { - ssr: false, - hydrated: false - } - - test('first', () => { - const hookWithCleanup = (name: string) => { - useEffect(() => { - return () => { - cleanups[name] = true - } - }) - } - - renderHook(() => hookWithCleanup('ssr')) - - const { hydrate } = renderHook(() => hookWithCleanup('hydrated')) - hydrate() - }) - - test('second', () => { - expect(cleanups.ssr).toBe(false) - expect(cleanups.hydrated).toBe(false) - }) -}) diff --git a/src/server/__tests__/autoCleanup.test.ts b/src/server/__tests__/autoCleanup.test.ts deleted file mode 100644 index 87e473c1..00000000 --- a/src/server/__tests__/autoCleanup.test.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { useEffect } from 'react' -import { renderHook } from '..' - -// This verifies that by importing RHTL in an -// environment which supports afterEach (like Jest) -// we'll get automatic cleanup between tests. -describe('auto cleanup tests', () => { - const cleanups: Record = { - ssr: false, - hydrated: false - } - - test('first', () => { - const hookWithCleanup = (name: string) => { - useEffect(() => { - return () => { - cleanups[name] = true - } - }) - } - - renderHook(() => hookWithCleanup('ssr')) - - const { hydrate } = renderHook(() => hookWithCleanup('hydrated')) - hydrate() - }) - - test('second', () => { - expect(cleanups.ssr).toBe(false) - expect(cleanups.hydrated).toBe(true) - }) -}) diff --git a/src/server/__tests__/cleanup.test.ts b/src/server/__tests__/cleanup.test.ts deleted file mode 100644 index c12815ac..00000000 --- a/src/server/__tests__/cleanup.test.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { useEffect } from 'react' -import { renderHook, cleanup } from '..' - -describe('cleanup tests', () => { - test('should flush effects on cleanup', async () => { - let cleanupCalled = false - - const hookWithCleanup = () => { - useEffect(() => { - return () => { - cleanupCalled = true - } - }) - } - - const { hydrate } = renderHook(() => hookWithCleanup()) - - hydrate() - - await cleanup() - - expect(cleanupCalled).toBe(true) - }) - - test('should cleanup all rendered hooks', async () => { - let cleanupCalled = [false, false] - const hookWithCleanup = (id: number) => { - useEffect(() => { - return () => { - cleanupCalled = cleanupCalled.map((_, i) => (i === id ? true : _)) - } - }) - } - - const { hydrate: hydrate1 } = renderHook(() => hookWithCleanup(0)) - const { hydrate: hydrate2 } = renderHook(() => hookWithCleanup(1)) - - hydrate1() - hydrate2() - - await cleanup() - - expect(cleanupCalled[0]).toBe(true) - expect(cleanupCalled[1]).toBe(true) - }) - - test('should only cleanup hydrated hooks', async () => { - let cleanupCalled = [false, false] - const hookWithCleanup = (id: number) => { - useEffect(() => { - return () => { - cleanupCalled = cleanupCalled.map((_, i) => (i === id ? true : _)) - } - }) - } - - renderHook(() => hookWithCleanup(0)) - const { hydrate } = renderHook(() => hookWithCleanup(1)) - - hydrate() - - await cleanup() - - expect(cleanupCalled[0]).toBe(false) - expect(cleanupCalled[1]).toBe(true) - }) -}) diff --git a/src/server/__tests__/customHook.test.ts b/src/server/__tests__/customHook.test.ts deleted file mode 100644 index cb512682..00000000 --- a/src/server/__tests__/customHook.test.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { useState, useCallback } from 'react' -import { renderHook, act } from '..' - -describe('custom hook tests', () => { - function useCounter() { - const [count, setCount] = useState(0) - - const increment = useCallback(() => setCount(count + 1), [count]) - const decrement = useCallback(() => setCount(count - 1), [count]) - - return { count, increment, decrement } - } - - test('should increment counter', () => { - const { result, hydrate } = renderHook(() => useCounter()) - - hydrate() - - act(() => result.current.increment()) - - expect(result.current.count).toBe(1) - }) - - test('should decrement counter', () => { - const { result, hydrate } = renderHook(() => useCounter()) - - hydrate() - - act(() => result.current.decrement()) - - expect(result.current.count).toBe(-1) - }) -}) diff --git a/src/server/__tests__/errorHook.test.ts b/src/server/__tests__/errorHook.test.ts deleted file mode 100644 index f7977465..00000000 --- a/src/server/__tests__/errorHook.test.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { useState, useEffect } from 'react' - -import { renderHook } from '..' - -describe('error hook tests', () => { - function useError(throwError?: boolean) { - if (throwError) { - throw new Error('expected') - } - return true - } - - function useAsyncError(throwError: boolean) { - const [value, setValue] = useState() - useEffect(() => { - const timeout = setTimeout(() => setValue(throwError), 100) - return () => clearTimeout(timeout) - }, [throwError]) - return useError(value) - } - - function useEffectError(throwError: boolean) { - useEffect(() => { - useError(throwError) - }, [throwError]) - return true - } - - describe('synchronous', () => { - test('should raise error', () => { - const { result } = renderHook(() => useError(true)) - - expect(() => { - expect(result.current).not.toBe(undefined) - }).toThrow(Error('expected')) - }) - - test('should capture error', () => { - const { result } = renderHook(() => useError(true)) - - expect(result.error).toEqual(Error('expected')) - }) - - test('should not capture error', () => { - const { result } = renderHook(() => useError(false)) - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - - test('should reset error', () => { - const { result, hydrate, rerender } = renderHook(({ throwError }) => useError(throwError), { - initialProps: { throwError: true } - }) - - expect(result.error).not.toBe(undefined) - - hydrate() - - rerender({ throwError: false }) - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - }) - - describe('asynchronous', () => { - test('should raise async error', async () => { - const { result, hydrate, waitForNextUpdate } = renderHook(() => useAsyncError(true)) - - hydrate() - - await waitForNextUpdate() - - expect(() => { - expect(result.current).not.toBe(undefined) - }).toThrow(Error('expected')) - }) - - test('should capture async error', async () => { - const { result, hydrate, waitForNextUpdate } = renderHook(() => useAsyncError(true)) - - hydrate() - - await waitForNextUpdate() - - expect(result.error).toEqual(Error('expected')) - }) - - test('should not capture async error', async () => { - const { result, hydrate, waitForNextUpdate } = renderHook(() => useAsyncError(false)) - - hydrate() - - await waitForNextUpdate() - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - - test('should reset async error', async () => { - const { result, hydrate, waitForNextUpdate, rerender } = renderHook( - ({ throwError }) => useAsyncError(throwError), - { initialProps: { throwError: true } } - ) - - hydrate() - - await waitForNextUpdate() - - expect(result.error).not.toBe(undefined) - - rerender({ throwError: false }) - - await waitForNextUpdate() - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - }) - - describe('effect', () => { - test('should raise effect error', () => { - const { result, hydrate } = renderHook(() => useEffectError(true)) - - hydrate() - - expect(() => { - expect(result.current).not.toBe(undefined) - }).toThrow(Error('expected')) - }) - - test('should capture effect error', () => { - const { result, hydrate } = renderHook(() => useEffectError(true)) - - hydrate() - - expect(result.error).toEqual(Error('expected')) - }) - - test('should not capture effect error', () => { - const { result, hydrate } = renderHook(() => useEffectError(false)) - - hydrate() - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - - test('should reset effect error', () => { - const { result, hydrate, rerender } = renderHook( - ({ throwError }) => useEffectError(throwError), - { initialProps: { throwError: true } } - ) - - hydrate() - - expect(result.error).not.toBe(undefined) - - rerender({ throwError: false }) - - expect(result.current).not.toBe(undefined) - expect(result.error).toBe(undefined) - }) - }) -}) diff --git a/src/server/__tests__/errorSuppression.noProcessEnv.test.ts b/src/server/__tests__/errorSuppression.noProcessEnv.test.ts deleted file mode 100644 index 414aea26..00000000 --- a/src/server/__tests__/errorSuppression.noProcessEnv.test.ts +++ /dev/null @@ -1,18 +0,0 @@ -// This verifies that if process.env is unavailable -// then we still auto-wire up the afterEach for folks -describe('error output suppression (no process.env) tests', () => { - const originalConsoleError = console.error - process.env = { - ...process.env, - get RHTL_DISABLE_ERROR_FILTERING(): string | undefined { - throw new Error('expected') - } - } - require('..') - - test('should not patch console.error', () => { - expect(console.error).not.toBe(originalConsoleError) - }) -}) - -export {} diff --git a/src/server/__tests__/errorSuppression.pure.test.ts b/src/server/__tests__/errorSuppression.pure.test.ts deleted file mode 100644 index 6e356cb6..00000000 --- a/src/server/__tests__/errorSuppression.pure.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { suppressErrorOutput } from '../pure' - -// This verifies that if pure imports are used -// then we DON'T auto-wire up the afterEach for folks -describe('error output suppression (pure) tests', () => { - const originalConsoleError = console.error - - test('should not patch console.error', () => { - expect(console.error).toBe(originalConsoleError) - }) - - test('should manually patch console.error', () => { - const restore = suppressErrorOutput() - - try { - expect(console.error).not.toBe(originalConsoleError) - } finally { - restore() - } - - expect(console.error).toBe(originalConsoleError) - }) -}) diff --git a/src/server/__tests__/errorSuppression.test.ts b/src/server/__tests__/errorSuppression.test.ts deleted file mode 100644 index d97f9735..00000000 --- a/src/server/__tests__/errorSuppression.test.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { useEffect } from 'react' -import { renderHook, act, suppressErrorOutput } from '..' - -describe('error output suppression tests', () => { - const consoleError = console.error - - test('should not suppress relevant errors', () => { - console.error = jest.fn() - - try { - const restoreConsole = suppressErrorOutput() - - console.error('expected') - console.error(new Error('expected')) - console.error('expected with args', new Error('expected')) - - restoreConsole() - - expect(console.error).toBeCalledWith('expected') - expect(console.error).toBeCalledWith(new Error('expected')) - expect(console.error).toBeCalledWith('expected with args', new Error('expected')) - expect(console.error).toBeCalledTimes(3) - } finally { - console.error = consoleError - } - }) - - test('should allow console.error to be mocked', async () => { - console.error = jest.fn() - try { - const { hydrate, rerender, unmount } = renderHook( - (stage) => { - useEffect(() => { - console.error(`expected in effect`) - return () => { - console.error(`expected in unmount`) - } - }, []) - console.error(`expected in ${stage}`) - }, - { - initialProps: 'render' - } - ) - - hydrate() - - act(() => { - console.error('expected in act') - }) - - await act(async () => { - await new Promise((resolve) => setTimeout(resolve, 100)) - console.error('expected in async act') - }) - - rerender('rerender') - - unmount() - - expect(console.error).toBeCalledWith('expected in render') // twice render/hydrate - expect(console.error).toBeCalledWith('expected in effect') - expect(console.error).toBeCalledWith('expected in act') - expect(console.error).toBeCalledWith('expected in async act') - expect(console.error).toBeCalledWith('expected in rerender') - expect(console.error).toBeCalledWith('expected in unmount') - expect(console.error).toBeCalledTimes(7) - } finally { - console.error = consoleError - } - }) -}) diff --git a/src/server/__tests__/hydrationErrors.test.ts b/src/server/__tests__/hydrationErrors.test.ts deleted file mode 100644 index 56a11aea..00000000 --- a/src/server/__tests__/hydrationErrors.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { useState, useCallback } from 'react' -import { renderHook } from '..' - -describe('hydration errors tests', () => { - function useCounter() { - const [count, setCount] = useState(0) - - const increment = useCallback(() => setCount(count + 1), [count]) - const decrement = useCallback(() => setCount(count - 1), [count]) - - return { count, increment, decrement } - } - - test('should throw error if component is rehydrated twice in a row', () => { - const { hydrate } = renderHook(() => useCounter()) - - hydrate() - - expect(() => hydrate()).toThrow(Error('The component can only be hydrated once')) - }) - - test('should throw error if component tries to rerender without hydrating', () => { - const { rerender } = renderHook(() => useCounter()) - - expect(() => rerender()).toThrow( - Error('You must hydrate the component before you can rerender') - ) - }) -}) diff --git a/src/server/__tests__/resultHistory.test.ts b/src/server/__tests__/resultHistory.test.ts deleted file mode 100644 index 5f2f8b9c..00000000 --- a/src/server/__tests__/resultHistory.test.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { renderHook } from '..' - -describe('result history tests', () => { - function useValue(value: number) { - if (value === 2) { - throw Error('expected') - } - return value - } - - test('should capture all renders states of hook', () => { - const { result, hydrate, rerender } = renderHook((value) => useValue(value), { - initialProps: 0 - }) - - expect(result.current).toEqual(0) - expect(result.all).toEqual([0]) - - hydrate() - - expect(result.current).toEqual(0) - expect(result.all).toEqual([0, 0]) - - rerender(1) - - expect(result.current).toBe(1) - expect(result.all).toEqual([0, 0, 1]) - - rerender(2) - - expect(result.error).toEqual(Error('expected')) - expect(result.all).toEqual([0, 0, 1, Error('expected')]) - - rerender(3) - - expect(result.current).toBe(3) - expect(result.all).toEqual([0, 0, 1, Error('expected'), 3]) - - rerender() - - expect(result.current).toBe(3) - expect(result.all).toEqual([0, 0, 1, Error('expected'), 3, 3]) - }) -}) diff --git a/src/server/__tests__/useContext.test.tsx b/src/server/__tests__/useContext.test.tsx deleted file mode 100644 index cf92aab4..00000000 --- a/src/server/__tests__/useContext.test.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React, { createContext, useContext } from 'react' -import { renderHook } from '..' - -describe('useContext tests', () => { - test('should get default value from context', () => { - const TestContext = createContext('foo') - - const { result } = renderHook(() => useContext(TestContext)) - - const value = result.current - - expect(value).toBe('foo') - }) - - test('should get value from context provider', () => { - const TestContext = createContext('foo') - - const wrapper: React.FC = ({ children }) => ( - {children} - ) - - const { result } = renderHook(() => useContext(TestContext), { wrapper }) - - expect(result.current).toBe('bar') - }) - - test('should update value in context when props are updated', () => { - const TestContext = createContext('foo') - - const wrapper: React.FC<{ contextValue: string }> = ({ contextValue, children }) => ( - {children} - ) - - const { result, hydrate, rerender } = renderHook(() => useContext(TestContext), { - wrapper, - initialProps: { contextValue: 'bar' } - }) - - hydrate() - - rerender({ contextValue: 'baz' }) - - expect(result.current).toBe('baz') - }) -}) diff --git a/src/server/__tests__/useEffect.test.ts b/src/server/__tests__/useEffect.test.ts deleted file mode 100644 index 782b7a03..00000000 --- a/src/server/__tests__/useEffect.test.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { useEffect } from 'react' -import { renderHook } from '..' - -describe('useEffect tests', () => { - test('should handle useEffect hook', () => { - const sideEffect: { [key: number]: boolean } = { 1: false, 2: false } - - const { hydrate, rerender, unmount } = renderHook( - ({ id }) => { - useEffect(() => { - sideEffect[id] = true - return () => { - sideEffect[id] = false - } - }, [id]) - }, - { initialProps: { id: 1 } } - ) - - expect(sideEffect[1]).toBe(false) - expect(sideEffect[2]).toBe(false) - - hydrate() - - expect(sideEffect[1]).toBe(true) - expect(sideEffect[2]).toBe(false) - - rerender({ id: 2 }) - - expect(sideEffect[1]).toBe(false) - expect(sideEffect[2]).toBe(true) - - unmount() - - expect(sideEffect[1]).toBe(false) - expect(sideEffect[2]).toBe(false) - }) -}) diff --git a/src/server/__tests__/useMemo.test.ts b/src/server/__tests__/useMemo.test.ts deleted file mode 100644 index d762cf6a..00000000 --- a/src/server/__tests__/useMemo.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { useMemo, useCallback } from 'react' -import { renderHook } from '..' - -describe('useCallback tests', () => { - test('should handle useMemo hook', () => { - const { result, hydrate, rerender } = renderHook( - ({ value }) => useMemo(() => ({ value }), [value]), - { - initialProps: { value: 1 } - } - ) - - const value1 = result.current - - expect(value1).toEqual({ value: 1 }) - - hydrate() - - const value2 = result.current - - expect(value2).toEqual({ value: 1 }) - - expect(value2).not.toBe(value1) - - rerender() - - const value3 = result.current - - expect(value3).toEqual({ value: 1 }) - - expect(value3).toBe(value2) - - rerender({ value: 2 }) - - const value4 = result.current - - expect(value4).toEqual({ value: 2 }) - - expect(value4).not.toBe(value2) - }) - - test('should handle useCallback hook', () => { - const { result, hydrate, rerender } = renderHook( - ({ value }) => { - const callback = () => ({ value }) - return useCallback(callback, [value]) - }, - { initialProps: { value: 1 } } - ) - - const callback1 = result.current - - const calbackValue1 = callback1() - - expect(calbackValue1).toEqual({ value: 1 }) - - hydrate() - - const callback2 = result.current - - const calbackValue2 = callback2() - - expect(calbackValue2).toEqual({ value: 1 }) - - expect(callback2).not.toBe(callback1) - - rerender() - - const callback3 = result.current - - const calbackValue3 = callback3() - - expect(calbackValue3).toEqual({ value: 1 }) - - expect(callback3).toBe(callback2) - - rerender({ value: 2 }) - - const callback4 = result.current - - const calbackValue4 = callback4() - - expect(calbackValue4).toEqual({ value: 2 }) - - expect(callback4).not.toBe(callback2) - }) -}) diff --git a/src/server/__tests__/useReducer.test.ts b/src/server/__tests__/useReducer.test.ts deleted file mode 100644 index 6184094a..00000000 --- a/src/server/__tests__/useReducer.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { useReducer } from 'react' -import { renderHook, act } from '..' - -describe('useReducer tests', () => { - test('should handle useReducer hook', () => { - const reducer = (state: number, action: { type: string }) => - action.type === 'inc' ? state + 1 : state - - const { result, hydrate } = renderHook(() => { - const [state, dispatch] = useReducer(reducer, 0) - return { state, dispatch } - }) - - hydrate() - - expect(result.current.state).toBe(0) - - act(() => result.current.dispatch({ type: 'inc' })) - - expect(result.current.state).toBe(1) - }) -}) diff --git a/src/server/__tests__/useRef.test.ts b/src/server/__tests__/useRef.test.ts deleted file mode 100644 index f30d0bd7..00000000 --- a/src/server/__tests__/useRef.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { useRef, useImperativeHandle } from 'react' -import { renderHook } from '..' - -describe('useHook tests', () => { - test('should handle useRef hook', () => { - const { result } = renderHook(() => useRef('foo')) - - const refContainer = result.current - - expect(Object.keys(refContainer)).toEqual(['current']) - expect(refContainer.current).toBe('foo') - }) - - test('should handle useImperativeHandle hook', () => { - const { result, hydrate } = renderHook(() => { - const ref = useRef boolean>>({}) - useImperativeHandle(ref, () => ({ - fakeImperativeMethod: () => true - })) - return ref - }) - - expect(result.current.current).toEqual({}) - - hydrate() - - expect(result.current.current.fakeImperativeMethod()).toBe(true) - }) -}) diff --git a/src/server/__tests__/useState.test.ts b/src/server/__tests__/useState.test.ts deleted file mode 100644 index 27925863..00000000 --- a/src/server/__tests__/useState.test.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { useState } from 'react' -import { renderHook, act } from '..' - -describe('useState tests', () => { - test('should use state value', () => { - const { result } = renderHook(() => { - const [value, setValue] = useState('foo') - return { value, setValue } - }) - - expect(result.current.value).toBe('foo') - }) - - test('should retain state value after hydration', () => { - const { result, hydrate } = renderHook(() => { - const [value, setValue] = useState('foo') - return { value, setValue } - }) - - hydrate() - - expect(result.current.value).toBe('foo') - }) - - test('should update state value using setter', () => { - const { result, hydrate } = renderHook(() => { - const [value, setValue] = useState('foo') - return { value, setValue } - }) - - hydrate() - - act(() => { - result.current.setValue('bar') - }) - - expect(result.current.value).toBe('bar') - }) -}) diff --git a/src/types/react.ts b/src/types/react.ts index d7091776..c03ad33d 100644 --- a/src/types/react.ts +++ b/src/types/react.ts @@ -24,7 +24,7 @@ export type ReactHooksRenderer = { options?: RenderHookOptions ) => RenderHookResult act: Act - cleanup: () => void + cleanup: () => Promise addCleanup: (callback: CleanupCallback) => () => void removeCleanup: (callback: CleanupCallback) => void suppressErrorOutput: () => () => void From c2d32b6fde39cc92212e1bdecc5460dcc324246c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 1 Jul 2021 12:59:32 +1000 Subject: [PATCH 06/95] chore(deps-dev): bump typescript from 4.3.4 to 4.3.5 (#644) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.3.4 to 4.3.5. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.3.4...v4.3.5) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 56daa2b7..9ca8ee97 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "react-dom": "^17.0.1", "react-test-renderer": "17.0.2", "ts-node": "^10.0.0", - "typescript": "4.3.4" + "typescript": "4.3.5" }, "peerDependencies": { "react": ">=16.9.0", From 0c39e8a1503da6e62fefe21f83ba0456c891b746 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jul 2021 16:14:18 +1000 Subject: [PATCH 07/95] chore(deps-dev): bump eslint from 7.29.0 to 7.30.0 (#645) Bumps [eslint](https://github.com/eslint/eslint) from 7.29.0 to 7.30.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v7.29.0...v7.30.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9ca8ee97..a5d1d142 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "docz": "2.3.1", "docz-theme-default": "1.2.0", "docz-utils": "2.3.0", - "eslint": "7.29.0", + "eslint": "7.30.0", "kcd-scripts": "11.1.0", "prettier": "^2.2.1", "react": "17.0.2", From be296267a81250667d0bfc8498bf05d2f5d829ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Jul 2021 13:44:05 +1000 Subject: [PATCH 08/95] chore(deps-dev): bump eslint from 7.30.0 to 7.31.0 (#650) Bumps [eslint](https://github.com/eslint/eslint) from 7.30.0 to 7.31.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v7.30.0...v7.31.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a5d1d142..fbe314bc 100644 --- a/package.json +++ b/package.json @@ -60,7 +60,7 @@ "docz": "2.3.1", "docz-theme-default": "1.2.0", "docz-utils": "2.3.0", - "eslint": "7.30.0", + "eslint": "7.31.0", "kcd-scripts": "11.1.0", "prettier": "^2.2.1", "react": "17.0.2", From fa859764d483c46d213c7905ab33179b3dfc23ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jul 2021 12:38:53 +1000 Subject: [PATCH 09/95] chore(deps): bump codecov/codecov-action from 1 to 2.0.1 (#651) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 1 to 2.0.1. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v1...v2.0.1) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/validate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 0144c34c..b121fcd4 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -41,7 +41,7 @@ jobs: run: npm run validate - name: ⬆️ Upload coverage report - uses: codecov/codecov-action@v1 + uses: codecov/codecov-action@v2.0.1 release: needs: main From 2546dc2af8c281bb5dff70b43687b53322c50809 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 20 Jul 2021 18:05:50 +1000 Subject: [PATCH 10/95] chore(deps-dev): bump codecov from 3.8.2 to 3.8.3 (#652) Bumps [codecov](https://github.com/codecov/codecov-node) from 3.8.2 to 3.8.3. - [Release notes](https://github.com/codecov/codecov-node/releases) - [Changelog](https://github.com/codecov/codecov-node/blob/master/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-node/compare/v3.8.2...v3.8.3) --- updated-dependencies: - dependency-name: codecov dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fbe314bc..9751b608 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "@typescript-eslint/eslint-plugin": "^4.9.1", "@typescript-eslint/parser": "^4.9.1", "all-contributors-cli": "6.20.0", - "codecov": "3.8.2", + "codecov": "3.8.3", "docz": "2.3.1", "docz-theme-default": "1.2.0", "docz-utils": "2.3.0", From 170f64c1af5184e0f24cba385c266a1b6e933e32 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Jul 2021 15:18:27 +1000 Subject: [PATCH 11/95] chore(deps-dev): bump kcd-scripts from 11.1.0 to 11.2.0 (#653) Bumps [kcd-scripts](https://github.com/kentcdodds/kcd-scripts) from 11.1.0 to 11.2.0. - [Release notes](https://github.com/kentcdodds/kcd-scripts/releases) - [Changelog](https://github.com/kentcdodds/kcd-scripts/blob/main/CHANGELOG.md) - [Commits](https://github.com/kentcdodds/kcd-scripts/compare/v11.1.0...v11.2.0) --- updated-dependencies: - dependency-name: kcd-scripts dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9751b608..9d9c0928 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "docz-theme-default": "1.2.0", "docz-utils": "2.3.0", "eslint": "7.31.0", - "kcd-scripts": "11.1.0", + "kcd-scripts": "11.2.0", "prettier": "^2.2.1", "react": "17.0.2", "react-dom": "^17.0.1", From 73518f96af58d2692cea82ecdfd725ca521dad09 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Jul 2021 18:58:32 +1000 Subject: [PATCH 12/95] chore(deps): bump codecov/codecov-action from 2.0.1 to 2.0.2 (#657) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 2.0.1 to 2.0.2. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v2.0.1...v2.0.2) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/validate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index b121fcd4..c9143fba 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -41,7 +41,7 @@ jobs: run: npm run validate - name: ⬆️ Upload coverage report - uses: codecov/codecov-action@v2.0.1 + uses: codecov/codecov-action@v2.0.2 release: needs: main From 77792feb9054ce50a7a147c0a2469db04215a6f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 30 Jul 2021 12:49:11 +1000 Subject: [PATCH 13/95] chore(deps): bump styfle/cancel-workflow-action from 0.9.0 to 0.9.1 (#659) Bumps [styfle/cancel-workflow-action](https://github.com/styfle/cancel-workflow-action) from 0.9.0 to 0.9.1. - [Release notes](https://github.com/styfle/cancel-workflow-action/releases) - [Commits](https://github.com/styfle/cancel-workflow-action/compare/0.9.0...0.9.1) --- updated-dependencies: - dependency-name: styfle/cancel-workflow-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/validate.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index c9143fba..ed3d3724 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -20,7 +20,7 @@ jobs: runs-on: ubuntu-latest steps: - name: 🛑 Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.9.0 + uses: styfle/cancel-workflow-action@0.9.1 - name: ⬇️ Checkout repo uses: actions/checkout@v2 @@ -52,7 +52,7 @@ jobs: github.event_name == 'push' }} steps: - name: 🛑 Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.9.0 + uses: styfle/cancel-workflow-action@0.9.1 - name: ⬇️ Checkout repo uses: actions/checkout@v2 From 089a3d9433b938398bb849ef0027e6fd68b8241a Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Fri, 30 Jul 2021 21:26:34 +1000 Subject: [PATCH 14/95] docs: fix for failing docz build (#660) --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 9d9c0928..d632b898 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "docz-theme-default": "1.2.0", "docz-utils": "2.3.0", "eslint": "7.31.0", + "get-pkg-repo": "4.1.1", "kcd-scripts": "11.2.0", "prettier": "^2.2.1", "react": "17.0.2", From a54eeb3c529feeda09443118f3ffba7195318935 Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Fri, 30 Jul 2021 21:48:43 +1000 Subject: [PATCH 15/95] chore(deps): pin all dev deps (#661) --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d632b898..797f1ff3 100644 --- a/package.json +++ b/package.json @@ -53,8 +53,8 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^4.9.1", - "@typescript-eslint/parser": "^4.9.1", + "@typescript-eslint/eslint-plugin": "4.28.5", + "@typescript-eslint/parser": "4.28.5", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "docz": "2.3.1", @@ -63,11 +63,11 @@ "eslint": "7.31.0", "get-pkg-repo": "4.1.1", "kcd-scripts": "11.2.0", - "prettier": "^2.2.1", + "prettier": "2.3.2", "react": "17.0.2", - "react-dom": "^17.0.1", + "react-dom": "17.0.2", "react-test-renderer": "17.0.2", - "ts-node": "^10.0.0", + "ts-node": "10.1.0", "typescript": "4.3.5" }, "peerDependencies": { From 7273ba4fb22d43baf84ae87fa0d2e491ed446309 Mon Sep 17 00:00:00 2001 From: Chris Chen Date: Fri, 30 Jul 2021 05:19:36 -0700 Subject: [PATCH 16/95] test: add tests to prove jest useFakeTimers is supported (#641) Co-authored-by: Lei Chen Co-authored-by: Michael Peyper --- src/__tests__/asyncHook.fakeTimers.test.ts | 58 ++++++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 src/__tests__/asyncHook.fakeTimers.test.ts diff --git a/src/__tests__/asyncHook.fakeTimers.test.ts b/src/__tests__/asyncHook.fakeTimers.test.ts new file mode 100644 index 00000000..98d6b2c9 --- /dev/null +++ b/src/__tests__/asyncHook.fakeTimers.test.ts @@ -0,0 +1,58 @@ +describe('async hook (fake timers) tests', () => { + beforeEach(() => { + jest.useFakeTimers() + }) + + afterEach(() => { + jest.useRealTimers() + }) + + runForRenderers(['default', 'dom', 'native', 'server/hydrated'], ({ renderHook }) => { + test('should wait for arbitrary expectation to pass when using advanceTimersByTime()', async () => { + const { waitFor } = renderHook(() => null) + + let actual = 0 + const expected = 1 + + setTimeout(() => { + actual = expected + }, 200) + + let complete = false + + jest.advanceTimersByTime(200) + + await waitFor(() => { + expect(actual).toBe(expected) + complete = true + }) + + expect(complete).toBe(true) + }) + + test('should wait for arbitrary expectation to pass when using runOnlyPendingTimers()', async () => { + const { waitFor } = renderHook(() => null) + + let actual = 0 + const expected = 1 + + setTimeout(() => { + actual = expected + }, 200) + + let complete = false + + jest.runOnlyPendingTimers() + + await waitFor(() => { + expect(actual).toBe(expected) + complete = true + }) + + expect(complete).toBe(true) + }) + }) +}) + +// eslint-disable-next-line jest/no-export +export {} From ea92648785f407729d6f188fa81f77f492e28b41 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Fri, 30 Jul 2021 22:20:21 +1000 Subject: [PATCH 17/95] docs: add chris110408 as a contributor for test, test, test (#662) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 9c318f40..098d70cd 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -566,6 +566,15 @@ "bug", "review" ] + }, + { + "login": "chris110408", + "name": "Chris Chen", + "avatar_url": "https://avatars.githubusercontent.com/u/10645051?v=4", + "profile": "https://github.com/chris110408", + "contributions": [ + "test" + ] } ], "skipCi": true, diff --git a/README.md b/README.md index e3bba708..7117e70b 100644 --- a/README.md +++ b/README.md @@ -246,6 +246,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Matan Borenkraout

🚧
andyrooger

💻
Bryan Wain

🐛 👀 +
Chris Chen

⚠️ From d946e3c202d8d19571da77d37982c7a011f00a1a Mon Sep 17 00:00:00 2001 From: Robert Snow Date: Sun, 1 Aug 2021 05:25:59 -0700 Subject: [PATCH 18/95] test: run test against multiple versions of React (#663) * Test against multiple versions of React * add to contributors * chore(scripts): add extra install scripts for other react versions Co-authored-by: Michael Peyper --- .all-contributorsrc | 9 +++++++++ .github/workflows/validate.yml | 4 ++++ README.md | 1 + package.json | 6 ++++-- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 098d70cd..0f175cdb 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -567,6 +567,15 @@ "review" ] }, + { + "login": "snowystinger", + "name": "Robert Snow", + "avatar_url": "https://avatars.githubusercontent.com/u/698229?v=4", + "profile": "https://github.com/snowystinger", + "contributions": [ + "test" + ] + }, { "login": "chris110408", "name": "Chris Chen", diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index ed3d3724..2bdcf04e 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -17,6 +17,7 @@ jobs: strategy: matrix: node: [12.13, 12, 14, 16] + react: [16.9.0, ^16, ^17] runs-on: ubuntu-latest steps: - name: 🛑 Cancel Previous Runs @@ -37,6 +38,9 @@ jobs: env: HUSKY_SKIP_INSTALL: true + - name: Use React version + run: npm install --save-dev react@"${{ matrix.react }}" react-dom@"${{ matrix.react }}" react-test-renderer@"${{ matrix.react }}" + - name: ▶️ Run validate script run: npm run validate diff --git a/README.md b/README.md index 7117e70b..eb79ae8b 100644 --- a/README.md +++ b/README.md @@ -246,6 +246,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Matan Borenkraout

🚧
andyrooger

💻
Bryan Wain

🐛 👀 +
Robert Snow

⚠️
Chris Chen

⚠️ diff --git a/package.json b/package.json index 797f1ff3..ba03720e 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,6 @@ "scripts": { "setup": "npm install && npm run validate -s", "validate": "kcd-scripts validate", - "prepare": "npm run build", "build": "kcd-scripts build --out-dir lib && npm run generate:submodules", "generate:submodules": "ts-node scripts/generate-submodules.ts", "test": "kcd-scripts test", @@ -43,7 +42,10 @@ "coverage": "codecov", "docs:dev": "docz dev", "docs:build": "docz build", - "contributors:add": "all-contributors add" + "contributors:add": "all-contributors add", + "install:react-16-9": "npm install --no-save react@16.9.0 react-dom@16.9.0 react-test-renderer@16.9.0", + "install:react-16": "npm install --no-save react@^16 react-dom@^16 react-test-renderer@^16", + "install:react-17": "npm install --no-save react@^17 react-dom@^17 react-test-renderer@^17" }, "dependencies": { "@babel/runtime": "^7.12.5", From 238a9ea184f68cba3d0dbfe3aef883174b61161c Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Sun, 1 Aug 2021 23:46:18 +1000 Subject: [PATCH 19/95] chore(ci): clean up validate scripts to remove duplication (#664) --- .github/workflows/validate.yml | 4 ++-- package.json | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 2bdcf04e..b6d12ed5 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -38,8 +38,8 @@ jobs: env: HUSKY_SKIP_INSTALL: true - - name: Use React version - run: npm install --save-dev react@"${{ matrix.react }}" react-dom@"${{ matrix.react }}" react-test-renderer@"${{ matrix.react }}" + - name: ⚛️ Use React version + run: REACT_VERSION=${{ matrix.react }} npm run install:react - name: ▶️ Run validate script run: npm run validate diff --git a/package.json b/package.json index ba03720e..4f36440a 100644 --- a/package.json +++ b/package.json @@ -43,9 +43,10 @@ "docs:dev": "docz dev", "docs:build": "docz build", "contributors:add": "all-contributors add", - "install:react-16-9": "npm install --no-save react@16.9.0 react-dom@16.9.0 react-test-renderer@16.9.0", - "install:react-16": "npm install --no-save react@^16 react-dom@^16 react-test-renderer@^16", - "install:react-17": "npm install --no-save react@^17 react-dom@^17 react-test-renderer@^17" + "install:react": "npm install --no-save react@${REACT_VERSION:-latest} react-dom@${REACT_VERSION:-latest} react-test-renderer@${REACT_VERSION:-latest}", + "install:react-16.9.0": "cross-env REACT_VERSION=16.9.0 npm run install:react", + "install:react-16": "cross-env REACT_VERSION=^16 npm run install:react", + "install:react-17": "cross-env REACT_VERSION=^17 npm run install:react" }, "dependencies": { "@babel/runtime": "^7.12.5", @@ -59,6 +60,7 @@ "@typescript-eslint/parser": "4.28.5", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", + "cross-env": "^7.0.3", "docz": "2.3.1", "docz-theme-default": "1.2.0", "docz-utils": "2.3.0", From 528c288a2ac391020c38197fd4f227ab4e051ccf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Aug 2021 08:21:49 +0100 Subject: [PATCH 20/95] chore(deps-dev): bump eslint from 7.31.0 to 7.32.0 (#665) Bumps [eslint](https://github.com/eslint/eslint) from 7.31.0 to 7.32.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v7.31.0...v7.32.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f36440a..b0fc7087 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "docz": "2.3.1", "docz-theme-default": "1.2.0", "docz-utils": "2.3.0", - "eslint": "7.31.0", + "eslint": "7.32.0", "get-pkg-repo": "4.1.1", "kcd-scripts": "11.2.0", "prettier": "2.3.2", From fe6040bb78f006685775a36d29dbd309dab560f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Aug 2021 08:44:12 +0100 Subject: [PATCH 21/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#667) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 4.28.5 to 4.29.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.29.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b0fc7087..5c7bc475 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "4.28.5", + "@typescript-eslint/eslint-plugin": "4.29.0", "@typescript-eslint/parser": "4.28.5", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 95d234050f465a7cb3f191ab66c47950dacaeee2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Aug 2021 09:14:10 +0100 Subject: [PATCH 22/95] chore(deps-dev): bump @typescript-eslint/parser from 4.28.5 to 4.29.0 (#668) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.28.5 to 4.29.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.29.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5c7bc475..f4076dbd 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "4.29.0", - "@typescript-eslint/parser": "4.28.5", + "@typescript-eslint/parser": "4.29.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From 3f944e36b9811ecb5d4518492b928946cde0947d Mon Sep 17 00:00:00 2001 From: Masious Date: Sat, 7 Aug 2021 23:02:39 +0430 Subject: [PATCH 23/95] chore: Pr/fix typo in docs (#671) * Changes "The current value or" to "the current value of" in the docs * Adds masious as a contributor Co-authored-by: Masoud Bonabi --- .all-contributorsrc | 9 +++++++++ README.md | 1 + docs/api-reference.md | 2 +- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.all-contributorsrc b/.all-contributorsrc index 0f175cdb..5ea4dc36 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -584,6 +584,15 @@ "contributions": [ "test" ] + }, + { + "login": "masious", + "name": "Masious", + "avatar_url": "https://avatars.githubusercontent.com/u/6429009?v=4", + "profile": "https://www.facebook.com/masoud.bonabi", + "contributions": [ + "doc" + ] } ], "skipCi": true, diff --git a/README.md b/README.md index eb79ae8b..88f0944b 100644 --- a/README.md +++ b/README.md @@ -248,6 +248,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Bryan Wain

🐛 👀
Robert Snow

⚠️
Chris Chen

⚠️ +
Masious

📖 diff --git a/docs/api-reference.md b/docs/api-reference.md index 7416d1f7..d8d36f89 100644 --- a/docs/api-reference.md +++ b/docs/api-reference.md @@ -68,7 +68,7 @@ The `renderHook` function returns an object that has the following properties: } ``` -The `current` value or the `result` will reflect the latest of whatever is returned from the +The `current` value of the `result` will reflect the latest of whatever is returned from the `callback` passed to `renderHook`. Any thrown values from the latest call will be reflected in the `error` value of the `result`. The `all` value is an array containing all the returns (including the most recent) from the callback. These could be `result` or an `error` depending on what the callback From 88b21e0a47572857480e573c834011420a1e7e7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Aug 2021 08:38:10 +0100 Subject: [PATCH 24/95] chore(deps-dev): bump @typescript-eslint/parser from 4.29.0 to 4.29.1 (#673) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.29.0 to 4.29.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.29.1/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f4076dbd..b9849e51 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "4.29.0", - "@typescript-eslint/parser": "4.29.0", + "@typescript-eslint/parser": "4.29.1", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From fe3c938a937d366cf191c00a2c064057e78e73d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Aug 2021 08:49:08 +0100 Subject: [PATCH 25/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#674) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 4.29.0 to 4.29.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.29.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b9849e51..ea873f16 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "4.29.0", + "@typescript-eslint/eslint-plugin": "4.29.1", "@typescript-eslint/parser": "4.29.1", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 50b8d5d227f83034b8a38b4bb30548ed63efa370 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Aug 2021 23:07:58 +1000 Subject: [PATCH 26/95] chore(deps-dev): bump ts-node from 10.1.0 to 10.2.0 (#672) Bumps [ts-node](https://github.com/TypeStrong/ts-node) from 10.1.0 to 10.2.0. - [Release notes](https://github.com/TypeStrong/ts-node/releases) - [Commits](https://github.com/TypeStrong/ts-node/compare/v10.1.0...v10.2.0) --- updated-dependencies: - dependency-name: ts-node dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Josh <37798644+joshuaellis@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ea873f16..4252476b 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "react": "17.0.2", "react-dom": "17.0.2", "react-test-renderer": "17.0.2", - "ts-node": "10.1.0", + "ts-node": "10.2.0", "typescript": "4.3.5" }, "peerDependencies": { From 58ced9087e40e6831fb8d1dbe2dd5ac145f5f740 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Aug 2021 08:59:03 +0100 Subject: [PATCH 27/95] chore(deps-dev): bump @typescript-eslint/parser from 4.29.1 to 4.29.2 (#675) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.29.1 to 4.29.2. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.29.2/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4252476b..d41c7d2b 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "4.29.1", - "@typescript-eslint/parser": "4.29.1", + "@typescript-eslint/parser": "4.29.2", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From f3f4de7a8c8234a52bb28adb82270bfe01de6589 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Aug 2021 09:21:51 +0100 Subject: [PATCH 28/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#676) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 4.29.1 to 4.29.2. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.29.2/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d41c7d2b..1144fe6a 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "4.29.1", + "@typescript-eslint/eslint-plugin": "4.29.2", "@typescript-eslint/parser": "4.29.2", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 97a031ffb022b6a54f15dc32ebeb7b74cddac41c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Aug 2021 12:08:46 +1000 Subject: [PATCH 29/95] chore(deps-dev): bump ts-node from 10.2.0 to 10.2.1 (#677) Bumps [ts-node](https://github.com/TypeStrong/ts-node) from 10.2.0 to 10.2.1. - [Release notes](https://github.com/TypeStrong/ts-node/releases) - [Commits](https://github.com/TypeStrong/ts-node/compare/v10.2.0...v10.2.1) --- updated-dependencies: - dependency-name: ts-node dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1144fe6a..1a99afa9 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "react": "17.0.2", "react-dom": "17.0.2", "react-test-renderer": "17.0.2", - "ts-node": "10.2.0", + "ts-node": "10.2.1", "typescript": "4.3.5" }, "peerDependencies": { From fae4e7779511224f82acec7dfedddafb5e0abcde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Aug 2021 09:59:20 +1000 Subject: [PATCH 30/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#678) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 4.29.2 to 4.29.3. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.29.3/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1a99afa9..188d5784 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "4.29.2", + "@typescript-eslint/eslint-plugin": "4.29.3", "@typescript-eslint/parser": "4.29.2", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 3a858434a83ba30ad7d5a5d23a84e141460b02ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Aug 2021 08:33:16 +0100 Subject: [PATCH 31/95] chore(deps): bump codecov/codecov-action from 2.0.2 to 2.0.3 (#680) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 2.0.2 to 2.0.3. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v2.0.2...v2.0.3) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/validate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index b6d12ed5..37aacd7e 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -45,7 +45,7 @@ jobs: run: npm run validate - name: ⬆️ Upload coverage report - uses: codecov/codecov-action@v2.0.2 + uses: codecov/codecov-action@v2.0.3 release: needs: main From 73e265c15c23f6f1bd02dca454575b94faf035cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Aug 2021 17:42:51 +1000 Subject: [PATCH 32/95] chore(deps-dev): bump @typescript-eslint/parser from 4.29.2 to 4.29.3 (#679) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.29.2 to 4.29.3. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.29.3/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 188d5784..98896637 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "4.29.3", - "@typescript-eslint/parser": "4.29.2", + "@typescript-eslint/parser": "4.29.3", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From cb259d18ac5d369f0d3e7007aa06fc9a5a4ccb21 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Aug 2021 08:37:09 +0100 Subject: [PATCH 33/95] chore(deps-dev): bump typescript from 4.3.5 to 4.4.2 (#681) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.3.5 to 4.4.2. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.3.5...v4.4.2) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 98896637..8e2143b5 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "react-dom": "17.0.2", "react-test-renderer": "17.0.2", "ts-node": "10.2.1", - "typescript": "4.3.5" + "typescript": "4.4.2" }, "peerDependencies": { "react": ">=16.9.0", From 084bb662e7cdf8b645fd8449d0629e218190968d Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Mon, 30 Aug 2021 10:03:38 +1000 Subject: [PATCH 34/95] test(renderers): fix test util to use correct renderers for pure tests --- src/__tests__/utils/runForRenderers.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/__tests__/utils/runForRenderers.ts b/src/__tests__/utils/runForRenderers.ts index c0375f4d..13c9aa92 100644 --- a/src/__tests__/utils/runForRenderers.ts +++ b/src/__tests__/utils/runForRenderers.ts @@ -58,8 +58,8 @@ const rendererResolvers = { native: () => requireRenderer('native'), server: () => requireRenderer('server'), 'default/pure': () => requireRenderer('default/pure'), - 'dom/pure': () => requireRenderer('default/pure'), - 'native/pure': () => requireRenderer('default/pure'), + 'dom/pure': () => requireRenderer('dom/pure'), + 'native/pure': () => requireRenderer('native/pure'), 'server/pure': () => requireRenderer('server/pure'), 'server/hydrated': () => hydratedServerRenderer('server'), 'server/hydrated/pure': () => hydratedServerRenderer('server/pure') From f786b9505d8a27921ba51133d594d7627388fd18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Aug 2021 10:40:26 +0100 Subject: [PATCH 35/95] chore(deps-dev): bump @typescript-eslint/parser from 4.29.3 to 4.30.0 (#683) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.29.3 to 4.30.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.30.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8e2143b5..716536d5 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "4.29.3", - "@typescript-eslint/parser": "4.29.3", + "@typescript-eslint/parser": "4.30.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From b869640154dfaf7e4bbbf6f7b4461ec5c3238c0a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 31 Aug 2021 11:08:30 +0100 Subject: [PATCH 36/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#684) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 4.29.3 to 4.30.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.30.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 716536d5..3a854f40 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "4.29.3", + "@typescript-eslint/eslint-plugin": "4.30.0", "@typescript-eslint/parser": "4.30.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 4a037040e5d9d806a9d7a9c8fd3fc3b243e4617f Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Tue, 31 Aug 2021 21:25:26 +1000 Subject: [PATCH 37/95] fix(async-utils): prevent timeout and interval checks in wait from leaving open handles (#682) * fix(async-utils): prevent timeout and interval checks in wait from leaving open handles * refactor(async-utils): rename timeoutSignal to timeoutController --- src/core/asyncUtils.ts | 33 ++++++++-------------- src/helpers/createTimeoutController.ts | 39 ++++++++++++++++++++++++++ src/helpers/promises.ts | 10 ------- 3 files changed, 50 insertions(+), 32 deletions(-) create mode 100644 src/helpers/createTimeoutController.ts delete mode 100644 src/helpers/promises.ts diff --git a/src/core/asyncUtils.ts b/src/core/asyncUtils.ts index fe44c715..a7424036 100644 --- a/src/core/asyncUtils.ts +++ b/src/core/asyncUtils.ts @@ -7,7 +7,7 @@ import { AsyncUtils } from '../types' -import { resolveAfter, callAfter } from '../helpers/promises' +import { createTimeoutController } from '../helpers/createTimeoutController' import { TimeoutError } from '../helpers/error' const DEFAULT_INTERVAL = 50 @@ -20,37 +20,26 @@ function asyncUtils(act: Act, addResolver: (callback: () => void) => void): Asyn return callbackResult ?? callbackResult === undefined } + const timeoutSignal = createTimeoutController(timeout) + const waitForResult = async () => { while (true) { - await Promise.race( - [ - new Promise((resolve) => addResolver(resolve)), - interval && resolveAfter(interval) - ].filter(Boolean) - ) - - if (checkResult()) { + const intervalSignal = createTimeoutController(interval) + timeoutSignal.onTimeout(() => intervalSignal.cancel()) + + await intervalSignal.wrap(new Promise(addResolver)) + + if (checkResult() || timeoutSignal.timedOut) { return } } } - let timedOut = false - if (!checkResult()) { - if (timeout) { - const timeoutPromise = () => - callAfter(() => { - timedOut = true - }, timeout) - - await act(() => Promise.race([waitForResult(), timeoutPromise()])) - } else { - await act(waitForResult) - } + await act(() => timeoutSignal.wrap(waitForResult())) } - return !timedOut + return !timeoutSignal.timedOut } const waitFor = async ( diff --git a/src/helpers/createTimeoutController.ts b/src/helpers/createTimeoutController.ts new file mode 100644 index 00000000..643d3768 --- /dev/null +++ b/src/helpers/createTimeoutController.ts @@ -0,0 +1,39 @@ +import { WaitOptions } from '../types' + +function createTimeoutController(timeout: WaitOptions['timeout']) { + let timeoutId: NodeJS.Timeout + const timeoutCallbacks: Array<() => void> = [] + + const timeoutController = { + onTimeout(callback: () => void) { + timeoutCallbacks.push(callback) + }, + wrap(promise: Promise) { + return new Promise((resolve, reject) => { + timeoutController.timedOut = false + timeoutController.onTimeout(resolve) + + if (timeout) { + timeoutId = setTimeout(() => { + timeoutController.timedOut = true + timeoutCallbacks.forEach((callback) => callback()) + resolve() + }, timeout) + } + + promise + .then(resolve) + .catch(reject) + .finally(() => timeoutController.cancel()) + }) + }, + cancel() { + clearTimeout(timeoutId) + }, + timedOut: false + } + + return timeoutController +} + +export { createTimeoutController } diff --git a/src/helpers/promises.ts b/src/helpers/promises.ts deleted file mode 100644 index 2fa89e5f..00000000 --- a/src/helpers/promises.ts +++ /dev/null @@ -1,10 +0,0 @@ -function resolveAfter(ms: number) { - return new Promise((resolve) => setTimeout(resolve, ms)) -} - -async function callAfter(callback: () => void, ms: number) { - await resolveAfter(ms) - callback() -} - -export { resolveAfter, callAfter } From 79b2245c51c9231261f487b4a3bc2cb25ea4a62b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Sep 2021 10:28:54 +0100 Subject: [PATCH 38/95] chore(deps-dev): bump @typescript-eslint/parser from 4.30.0 to 4.31.0 (#689) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.30.0 to 4.31.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.31.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3a854f40..7c26c013 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "4.30.0", - "@typescript-eslint/parser": "4.30.0", + "@typescript-eslint/parser": "4.31.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From 0df0c4ca3d175f2abe93eafed552b0ca29a6f618 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Sep 2021 11:02:49 +0100 Subject: [PATCH 39/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#690) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 4.30.0 to 4.31.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.31.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7c26c013..eeef84a7 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "4.30.0", + "@typescript-eslint/eslint-plugin": "4.31.0", "@typescript-eslint/parser": "4.31.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 1e1d3fae5d87afd23b92d5b02cda8959b5fc7cb7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 10 Sep 2021 16:20:26 +1000 Subject: [PATCH 40/95] chore(deps-dev): bump prettier from 2.3.2 to 2.4.0 (#693) Bumps [prettier](https://github.com/prettier/prettier) from 2.3.2 to 2.4.0. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/2.3.2...2.4.0) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index eeef84a7..731c9545 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "eslint": "7.32.0", "get-pkg-repo": "4.1.1", "kcd-scripts": "11.2.0", - "prettier": "2.3.2", + "prettier": "2.4.0", "react": "17.0.2", "react-dom": "17.0.2", "react-test-renderer": "17.0.2", From 937b9c8637fb4c49905b03942d59431c07f1b3d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Sep 2021 08:23:24 +0100 Subject: [PATCH 41/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#697) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 4.31.0 to 4.31.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.31.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 731c9545..2177137b 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "4.31.0", + "@typescript-eslint/eslint-plugin": "4.31.1", "@typescript-eslint/parser": "4.31.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 4cb7dff148bbdbbe406352531a30cd0aeda9c289 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Sep 2021 08:47:54 +0100 Subject: [PATCH 42/95] chore(deps-dev): bump @typescript-eslint/parser from 4.31.0 to 4.31.1 (#696) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.31.0 to 4.31.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.31.1/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2177137b..44b108c2 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "4.31.1", - "@typescript-eslint/parser": "4.31.0", + "@typescript-eslint/parser": "4.31.1", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From 17861103ffb011fe1854e4e302022c070f213afc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Sep 2021 13:40:45 +1000 Subject: [PATCH 43/95] chore(deps): bump codecov/codecov-action from 2.0.3 to 2.1.0 (#695) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 2.0.3 to 2.1.0. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/master/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v2.0.3...v2.1.0) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Josh <37798644+joshuaellis@users.noreply.github.com> --- .github/workflows/validate.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 37aacd7e..50d61077 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -45,7 +45,7 @@ jobs: run: npm run validate - name: ⬆️ Upload coverage report - uses: codecov/codecov-action@v2.0.3 + uses: codecov/codecov-action@v2.1.0 release: needs: main From efb0ac93ea1ee4aa7c761416737a36cd6c0ceb4f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 Sep 2021 08:24:56 +0100 Subject: [PATCH 44/95] chore(deps-dev): bump typescript from 4.4.2 to 4.4.3 (#694) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.4.2 to 4.4.3. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.4.2...v4.4.3) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Josh <37798644+joshuaellis@users.noreply.github.com> Co-authored-by: Michael Peyper --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 44b108c2..c0c156ac 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "react-dom": "17.0.2", "react-test-renderer": "17.0.2", "ts-node": "10.2.1", - "typescript": "4.4.2" + "typescript": "4.4.3" }, "peerDependencies": { "react": ">=16.9.0", From 1dcf74cd73de032744f749841f7cd8281c598d9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Sep 2021 13:37:00 +1000 Subject: [PATCH 45/95] chore(deps-dev): bump kcd-scripts from 11.2.0 to 11.2.2 (#698) Bumps [kcd-scripts](https://github.com/kentcdodds/kcd-scripts) from 11.2.0 to 11.2.2. - [Release notes](https://github.com/kentcdodds/kcd-scripts/releases) - [Changelog](https://github.com/kentcdodds/kcd-scripts/blob/main/CHANGELOG.md) - [Commits](https://github.com/kentcdodds/kcd-scripts/compare/v11.2.0...v11.2.2) --- updated-dependencies: - dependency-name: kcd-scripts dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c0c156ac..c78b724c 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "docz-utils": "2.3.0", "eslint": "7.32.0", "get-pkg-repo": "4.1.1", - "kcd-scripts": "11.2.0", + "kcd-scripts": "11.2.2", "prettier": "2.4.0", "react": "17.0.2", "react-dom": "17.0.2", From 8b72a87d18f8d6a0c26b622f77b1bf319f7751b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 19 Sep 2021 20:52:26 +1000 Subject: [PATCH 46/95] chore(deps-dev): bump prettier from 2.4.0 to 2.4.1 (#699) Bumps [prettier](https://github.com/prettier/prettier) from 2.4.0 to 2.4.1. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/2.4.0...2.4.1) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c78b724c..fe038177 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "eslint": "7.32.0", "get-pkg-repo": "4.1.1", "kcd-scripts": "11.2.2", - "prettier": "2.4.0", + "prettier": "2.4.1", "react": "17.0.2", "react-dom": "17.0.2", "react-test-renderer": "17.0.2", From 507774ce11c06ec821e8bd744a62bafe66cea783 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Sep 2021 21:07:29 +1000 Subject: [PATCH 47/95] chore(deps-dev): bump @typescript-eslint/parser from 4.31.1 to 4.31.2 (#700) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.31.1 to 4.31.2. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.31.2/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fe038177..fbbddf6c 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "4.31.1", - "@typescript-eslint/parser": "4.31.1", + "@typescript-eslint/parser": "4.31.2", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From 6e040314ab88e0a3ed39818867159f779093f90a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Sep 2021 00:01:26 +1000 Subject: [PATCH 48/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#701) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 4.31.1 to 4.31.2. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.31.2/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fbbddf6c..b882bcf6 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "4.31.1", + "@typescript-eslint/eslint-plugin": "4.31.2", "@typescript-eslint/parser": "4.31.2", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 25def653ea222f1f1915b15ac29207760b1cce25 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Sep 2021 18:46:18 +0100 Subject: [PATCH 49/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#704) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 4.31.2 to 4.32.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.32.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b882bcf6..5e9ab9dd 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "4.31.2", + "@typescript-eslint/eslint-plugin": "4.32.0", "@typescript-eslint/parser": "4.31.2", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 565c9f80ff969c3b9f20d8b2efdc033996d9ec27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Sep 2021 08:35:49 +0100 Subject: [PATCH 50/95] chore(deps-dev): bump @typescript-eslint/parser from 4.31.2 to 4.32.0 (#705) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.31.2 to 4.32.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v4.32.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5e9ab9dd..d1358dba 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "4.32.0", - "@typescript-eslint/parser": "4.31.2", + "@typescript-eslint/parser": "4.32.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From c7663b759d6b22ffcf711c0265c957d5d4f03651 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Oct 2021 23:02:20 +1100 Subject: [PATCH 51/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#711) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 4.32.0 to 5.0.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.0.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d1358dba..0d1b8417 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "4.32.0", + "@typescript-eslint/eslint-plugin": "5.0.0", "@typescript-eslint/parser": "4.32.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 1c5fe1bdb7b68d54b8e731f8935f1d1594b6edc2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Oct 2021 23:03:16 +1100 Subject: [PATCH 52/95] chore(deps-dev): bump ts-node from 10.2.1 to 10.3.0 (#712) Bumps [ts-node](https://github.com/TypeStrong/ts-node) from 10.2.1 to 10.3.0. - [Release notes](https://github.com/TypeStrong/ts-node/releases) - [Commits](https://github.com/TypeStrong/ts-node/compare/v10.2.1...v10.3.0) --- updated-dependencies: - dependency-name: ts-node dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0d1b8417..a5f578d4 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "react": "17.0.2", "react-dom": "17.0.2", "react-test-renderer": "17.0.2", - "ts-node": "10.2.1", + "ts-node": "10.3.0", "typescript": "4.4.3" }, "peerDependencies": { From c55c3d1fa1dc3ef654c3c6485ac1f52aee9862cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Oct 2021 23:18:05 +1100 Subject: [PATCH 53/95] chore(deps-dev): bump @typescript-eslint/parser from 4.32.0 to 5.0.0 (#713) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 4.32.0 to 5.0.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.0.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a5f578d4..10d2ac68 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "5.0.0", - "@typescript-eslint/parser": "4.32.0", + "@typescript-eslint/parser": "5.0.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From 425dd40ea88e3c3ee22585e1bd5b16971aa72506 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Oct 2021 08:28:47 +0100 Subject: [PATCH 54/95] chore(deps-dev): bump typescript from 4.4.3 to 4.4.4 (#715) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.4.3 to 4.4.4. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.4.3...v4.4.4) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 10d2ac68..8a0320ac 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "react-dom": "17.0.2", "react-test-renderer": "17.0.2", "ts-node": "10.3.0", - "typescript": "4.4.3" + "typescript": "4.4.4" }, "peerDependencies": { "react": ">=16.9.0", From 4fb089e0191be0b0bd24c5edd7dfd6d61c94d521 Mon Sep 17 00:00:00 2001 From: Veniamin Krol <153412+vkrol@users.noreply.github.com> Date: Wed, 13 Oct 2021 10:45:05 +0300 Subject: [PATCH 55/95] chore(docs): Fix the installation docs link in README.md (#714) Co-authored-by: Josh <37798644+joshuaellis@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 88f0944b..df95e9ea 100644 --- a/README.md +++ b/README.md @@ -146,7 +146,7 @@ to test against. It also does not come installed with a specific renderer, we cu [`react-test-renderer`](https://www.npmjs.com/package/react-test-renderer) and [`react-dom`](https://www.npmjs.com/package/react-dom). You only need to install one of them, however, if you do have both installed, we will use `react-test-renderer` as the default. For more -information see the [installation docs](https://react-hooks-testing-library.com/#installation). +information see the [installation docs](https://react-hooks-testing-library.com/installation#renderer). Generally, the installed versions for `react` and the selected renderer should have matching versions: From f68368598697eb54bab26de6f9a11b064b2b9afb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Oct 2021 13:01:28 +0100 Subject: [PATCH 56/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#720) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.0.0 to 5.1.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.1.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8a0320ac..3ef9a3d8 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "5.0.0", + "@typescript-eslint/eslint-plugin": "5.1.0", "@typescript-eslint/parser": "5.0.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From e0bcd4b5c3c4060fd9479d230f4698b81d006c2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Oct 2021 13:12:15 +0100 Subject: [PATCH 57/95] chore(deps-dev): bump @typescript-eslint/parser from 5.0.0 to 5.1.0 (#719) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.0.0 to 5.1.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.1.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3ef9a3d8..28b07617 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "5.1.0", - "@typescript-eslint/parser": "5.0.0", + "@typescript-eslint/parser": "5.1.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From f42a2d526f2c24d0c2822c168dab243f1f9d8057 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Oct 2021 22:01:41 +1100 Subject: [PATCH 58/95] chore(deps-dev): bump ts-node from 10.3.0 to 10.3.1 (#722) Bumps [ts-node](https://github.com/TypeStrong/ts-node) from 10.3.0 to 10.3.1. - [Release notes](https://github.com/TypeStrong/ts-node/releases) - [Commits](https://github.com/TypeStrong/ts-node/compare/v10.3.0...v10.3.1) --- updated-dependencies: - dependency-name: ts-node dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 28b07617..00d4b519 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "react": "17.0.2", "react-dom": "17.0.2", "react-test-renderer": "17.0.2", - "ts-node": "10.3.0", + "ts-node": "10.3.1", "typescript": "4.4.4" }, "peerDependencies": { From 16d0119bb8f42e6fec9d487d2978e1d328296786 Mon Sep 17 00:00:00 2001 From: Laishuxin <56504759+Laishuxin@users.noreply.github.com> Date: Mon, 25 Oct 2021 06:54:13 +0800 Subject: [PATCH 59/95] docs: extra arguments (#723) --- docs/usage/ssr.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/usage/ssr.md b/docs/usage/ssr.md index e3ff6672..88f0c9cc 100644 --- a/docs/usage/ssr.md +++ b/docs/usage/ssr.md @@ -46,7 +46,7 @@ import { renderHook, act } from '@testing-library/react-hooks/server' import useCounter from './useCounter' test('should increment counter', () => { - const { result } = renderHook(() => useCounter(0)) + const { result } = renderHook(() => useCounter()) act(() => { result.current.increment() @@ -64,7 +64,7 @@ import { renderHook, act } from '@testing-library/react-hooks/server' import useCounter from './useCounter' test('should increment counter', () => { - const { result, hydrate } = renderHook(() => useCounter(0)) + const { result, hydrate } = renderHook(() => useCounter()) hydrate() From ca13ed9ae8b9c7dc92ffe586e48cbf46f1cfc3a9 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Mon, 25 Oct 2021 09:57:13 +1100 Subject: [PATCH 60/95] docs: add Laishuxin as a contributor for doc (#724) * docs: update README.md [skip ci] * docs: update .all-contributorsrc [skip ci] Co-authored-by: allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> --- .all-contributorsrc | 9 +++++++++ README.md | 1 + 2 files changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index 5ea4dc36..c9aecfcd 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -593,6 +593,15 @@ "contributions": [ "doc" ] + }, + { + "login": "Laishuxin", + "name": "Laishuxin", + "avatar_url": "https://avatars.githubusercontent.com/u/56504759?v=4", + "profile": "https://github.com/Laishuxin", + "contributions": [ + "doc" + ] } ], "skipCi": true, diff --git a/README.md b/README.md index df95e9ea..fc95d837 100644 --- a/README.md +++ b/README.md @@ -249,6 +249,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Robert Snow

⚠️
Chris Chen

⚠️
Masious

📖 +
Laishuxin

📖 From 15e87fe11b031c0e8a6a71c3eae05527a8e58e8b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Oct 2021 19:12:11 +1100 Subject: [PATCH 61/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#727) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.1.0 to 5.2.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.2.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 00d4b519..2a62c834 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "5.1.0", + "@typescript-eslint/eslint-plugin": "5.2.0", "@typescript-eslint/parser": "5.1.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 05048c797f1845eeb3861ecd067a83c07f71e313 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Oct 2021 19:12:47 +1100 Subject: [PATCH 62/95] chore(deps-dev): bump ts-node from 10.3.1 to 10.4.0 (#726) Bumps [ts-node](https://github.com/TypeStrong/ts-node) from 10.3.1 to 10.4.0. - [Release notes](https://github.com/TypeStrong/ts-node/releases) - [Commits](https://github.com/TypeStrong/ts-node/compare/v10.3.1...v10.4.0) --- updated-dependencies: - dependency-name: ts-node dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2a62c834..384241b5 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "react": "17.0.2", "react-dom": "17.0.2", "react-test-renderer": "17.0.2", - "ts-node": "10.3.1", + "ts-node": "10.4.0", "typescript": "4.4.4" }, "peerDependencies": { From 9b70777f49f913a57ff269c325a569fb4fe82ce5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Oct 2021 19:51:57 +1100 Subject: [PATCH 63/95] chore(deps-dev): bump @typescript-eslint/parser from 5.1.0 to 5.2.0 (#728) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.1.0 to 5.2.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.2.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 384241b5..14fcd311 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "5.2.0", - "@typescript-eslint/parser": "5.1.0", + "@typescript-eslint/parser": "5.2.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From 5d2b71f4b4a839b6c4ee3f0c26c19a7d74c5a573 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Nov 2021 08:09:29 +0000 Subject: [PATCH 64/95] chore(deps-dev): bump @typescript-eslint/parser from 5.2.0 to 5.3.0 (#731) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.2.0 to 5.3.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.3.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 14fcd311..52c79ba0 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "5.2.0", - "@typescript-eslint/parser": "5.2.0", + "@typescript-eslint/parser": "5.3.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From ddfedd0f20b456861c5ea6670769dfecb3840a09 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Nov 2021 10:33:00 +0000 Subject: [PATCH 65/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#730) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 52c79ba0..e7b64612 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "5.2.0", + "@typescript-eslint/eslint-plugin": "5.3.0", "@typescript-eslint/parser": "5.3.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 668031977c3be5646dfa8b7a543c65e9ef1b8f7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Nov 2021 17:22:14 +1100 Subject: [PATCH 66/95] chore(deps-dev): bump @typescript-eslint/parser from 5.3.0 to 5.3.1 (#733) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.3.0 to 5.3.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.3.1/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e7b64612..1d990b87 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "5.3.0", - "@typescript-eslint/parser": "5.3.0", + "@typescript-eslint/parser": "5.3.1", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From 722949306da1bba23ca4f54dd8ed4bf2d255f2ea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Nov 2021 21:28:06 +1100 Subject: [PATCH 67/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#734) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.3.0 to 5.3.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.3.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d990b87..4ac0c00a 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "5.3.0", + "@typescript-eslint/eslint-plugin": "5.3.1", "@typescript-eslint/parser": "5.3.1", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From d7c5510bfa50e41cd9c2e56a14f78e8f2bea6c9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Nov 2021 08:20:16 +0000 Subject: [PATCH 68/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#736) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.3.1 to 5.4.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.4.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4ac0c00a..7f449249 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "5.3.1", + "@typescript-eslint/eslint-plugin": "5.4.0", "@typescript-eslint/parser": "5.3.1", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 8d343ed024738d2f961d7f618a685b1a59721b0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Nov 2021 08:55:17 +0000 Subject: [PATCH 69/95] chore(deps-dev): bump @typescript-eslint/parser from 5.3.1 to 5.4.0 (#735) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.3.1 to 5.4.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.4.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7f449249..78aedeba 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "5.4.0", - "@typescript-eslint/parser": "5.3.1", + "@typescript-eslint/parser": "5.4.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From a6ff03cb4ec3e57026f9dda7f2aa1acaa064e0c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Nov 2021 15:22:15 +1100 Subject: [PATCH 70/95] chore(deps-dev): bump typescript from 4.4.4 to 4.5.2 (#737) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.4.4 to 4.5.2. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.4.4...v4.5.2) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 78aedeba..8d99b279 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "react-dom": "17.0.2", "react-test-renderer": "17.0.2", "ts-node": "10.4.0", - "typescript": "4.4.4" + "typescript": "4.5.2" }, "peerDependencies": { "react": ">=16.9.0", From 58a0072104d86df266f656b984af0bc63a3f91b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 27 Nov 2021 07:50:20 +1100 Subject: [PATCH 71/95] chore(deps-dev): bump prettier from 2.4.1 to 2.5.0 (#739) Bumps [prettier](https://github.com/prettier/prettier) from 2.4.1 to 2.5.0. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/2.4.1...2.5.0) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8d99b279..66e19d10 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "eslint": "7.32.0", "get-pkg-repo": "4.1.1", "kcd-scripts": "11.2.2", - "prettier": "2.4.1", + "prettier": "2.5.0", "react": "17.0.2", "react-dom": "17.0.2", "react-test-renderer": "17.0.2", From 50495554883ffa1e3edd01dcf8ba756d4ff8f750 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Nov 2021 22:50:14 +1100 Subject: [PATCH 72/95] chore(deps-dev): bump @typescript-eslint/parser from 5.4.0 to 5.5.0 (#741) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.4.0 to 5.5.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.5.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 66e19d10..2f2b9838 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "5.4.0", - "@typescript-eslint/parser": "5.4.0", + "@typescript-eslint/parser": "5.5.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From 4ddd6c24577814f7215308e0ce180dc39588f197 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Nov 2021 23:03:34 +1100 Subject: [PATCH 73/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#740) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.4.0 to 5.5.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.5.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2f2b9838..7a9969d0 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "5.4.0", + "@typescript-eslint/eslint-plugin": "5.5.0", "@typescript-eslint/parser": "5.5.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 21a20baf4c92e94055d725ce96a29b73aa0fa9cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Dec 2021 19:04:03 +1100 Subject: [PATCH 74/95] chore(deps-dev): bump prettier from 2.5.0 to 2.5.1 (#745) Bumps [prettier](https://github.com/prettier/prettier) from 2.5.0 to 2.5.1. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/2.5.0...2.5.1) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7a9969d0..d7103074 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "eslint": "7.32.0", "get-pkg-repo": "4.1.1", "kcd-scripts": "11.2.2", - "prettier": "2.5.0", + "prettier": "2.5.1", "react": "17.0.2", "react-dom": "17.0.2", "react-test-renderer": "17.0.2", From 0473feb5973105a2b738bca092f0b226c36e501f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Dec 2021 09:26:49 +1100 Subject: [PATCH 75/95] chore(deps-dev): bump typescript from 4.5.2 to 4.5.4 (#755) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.5.2 to 4.5.4. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.5.2...v4.5.4) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d7103074..a5d363b1 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "react-dom": "17.0.2", "react-test-renderer": "17.0.2", "ts-node": "10.4.0", - "typescript": "4.5.2" + "typescript": "4.5.4" }, "peerDependencies": { "react": ">=16.9.0", From 4f22f1ea34e8361fd64bdc0a162ad38ad1b361b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Dec 2021 09:57:04 +1100 Subject: [PATCH 76/95] chore(deps-dev): bump @typescript-eslint/parser from 5.5.0 to 5.7.0 (#756) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.5.0 to 5.7.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.7.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a5d363b1..ba31ad5d 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "5.5.0", - "@typescript-eslint/parser": "5.5.0", + "@typescript-eslint/parser": "5.7.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From bb86e9048048f931e8373ca104cfe988d0f517f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Dec 2021 13:47:27 +1100 Subject: [PATCH 77/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#754) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.5.0 to 5.7.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.7.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ba31ad5d..99f8fe02 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "5.5.0", + "@typescript-eslint/eslint-plugin": "5.7.0", "@typescript-eslint/parser": "5.7.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From d795be5d39e27a2c69943f0ce2d7e3f17529deb5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jan 2022 09:03:08 +1100 Subject: [PATCH 78/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#764) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.7.0 to 5.9.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.9.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 99f8fe02..4bfaef28 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "5.7.0", + "@typescript-eslint/eslint-plugin": "5.9.0", "@typescript-eslint/parser": "5.7.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 2f2982d4cc51ec2d0c1e0dc199a071a2d14cdd79 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 7 Jan 2022 09:27:55 +1100 Subject: [PATCH 79/95] chore(deps-dev): bump @typescript-eslint/parser from 5.7.0 to 5.9.0 (#765) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.7.0 to 5.9.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.9.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4bfaef28..807483cf 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "5.9.0", - "@typescript-eslint/parser": "5.7.0", + "@typescript-eslint/parser": "5.9.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From 7d29b528ad49e96c80a4bcdb13cbd8f6cbebb90b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jan 2022 08:15:24 +0000 Subject: [PATCH 80/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#770) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.9.0 to 5.9.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.9.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 807483cf..47a16916 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "5.9.0", + "@typescript-eslint/eslint-plugin": "5.9.1", "@typescript-eslint/parser": "5.9.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 64e074ec03262f1a636461bae19faec46774aad1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Jan 2022 08:24:31 +0000 Subject: [PATCH 81/95] chore(deps-dev): bump @typescript-eslint/parser from 5.9.0 to 5.9.1 (#769) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.9.0 to 5.9.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.9.1/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 47a16916..9a4dae22 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "5.9.1", - "@typescript-eslint/parser": "5.9.0", + "@typescript-eslint/parser": "5.9.1", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From ee7027befac50d061c2b1030b7742a81fd18fdec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jan 2022 08:41:08 +0000 Subject: [PATCH 82/95] chore(deps-dev): bump @typescript-eslint/parser from 5.9.1 to 5.10.0 (#776) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.9.1 to 5.10.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.10.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9a4dae22..b2b800a2 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "5.9.1", - "@typescript-eslint/parser": "5.9.1", + "@typescript-eslint/parser": "5.10.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From 4224fb946d4db2176c7b4cae5b9dfda60b11c420 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Jan 2022 08:58:09 +0000 Subject: [PATCH 83/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#775) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.9.1 to 5.10.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.10.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b2b800a2..ac9c5fa9 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "5.9.1", + "@typescript-eslint/eslint-plugin": "5.10.0", "@typescript-eslint/parser": "5.10.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From d0372250f540955a86924cd6ea249a930aa3d004 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 13 Feb 2022 21:09:31 +1100 Subject: [PATCH 84/95] chore(deps-dev): bump typescript from 4.5.4 to 4.5.5 (#778) Bumps [typescript](https://github.com/Microsoft/TypeScript) from 4.5.4 to 4.5.5. - [Release notes](https://github.com/Microsoft/TypeScript/releases) - [Commits](https://github.com/Microsoft/TypeScript/compare/v4.5.4...v4.5.5) --- updated-dependencies: - dependency-name: typescript dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ac9c5fa9..00c9cf83 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "react-dom": "17.0.2", "react-test-renderer": "17.0.2", "ts-node": "10.4.0", - "typescript": "4.5.4" + "typescript": "4.5.5" }, "peerDependencies": { "react": ">=16.9.0", From 36c6ec830a0392a06539df749572e6ae69529470 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 13 Feb 2022 21:11:16 +1100 Subject: [PATCH 85/95] chore(deps-dev): bump @typescript-eslint/eslint-plugin (#788) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.10.0 to 5.11.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.11.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 00c9cf83..209c9679 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "react-error-boundary": "^3.1.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "5.10.0", + "@typescript-eslint/eslint-plugin": "5.11.0", "@typescript-eslint/parser": "5.10.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", From 2cd10b785c9df1110af98123fcba965801c9751a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 13 Feb 2022 21:27:30 +1100 Subject: [PATCH 86/95] chore(deps-dev): bump @typescript-eslint/parser from 5.10.0 to 5.11.0 (#789) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.10.0 to 5.11.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.11.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 209c9679..a7444aeb 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ }, "devDependencies": { "@typescript-eslint/eslint-plugin": "5.11.0", - "@typescript-eslint/parser": "5.10.0", + "@typescript-eslint/parser": "5.11.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", "cross-env": "^7.0.3", From f410f9e75448a2233fda378139037089905e4c6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 13 Feb 2022 21:50:48 +1100 Subject: [PATCH 87/95] chore(deps-dev): bump ts-node from 10.4.0 to 10.5.0 (#793) Bumps [ts-node](https://github.com/TypeStrong/ts-node) from 10.4.0 to 10.5.0. - [Release notes](https://github.com/TypeStrong/ts-node/releases) - [Commits](https://github.com/TypeStrong/ts-node/compare/v10.4.0...v10.5.0) --- updated-dependencies: - dependency-name: ts-node dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a7444aeb..4f398a30 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "react": "17.0.2", "react-dom": "17.0.2", "react-test-renderer": "17.0.2", - "ts-node": "10.4.0", + "ts-node": "10.5.0", "typescript": "4.5.5" }, "peerDependencies": { From 19ac8dde5c16f53d963277543997fa7a7ffd5fe4 Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Sun, 10 Apr 2022 20:29:22 +1000 Subject: [PATCH 88/95] fix(types): move types to optional peer dependencies BREAKING CHANGE: type dependencies will not longer be automatically installed. If @types/react is not already listed in your package.json, please install it with `npm install --save-dev @types/react@^17`. --- package.json | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 4f398a30..0b89d6eb 100644 --- a/package.json +++ b/package.json @@ -50,17 +50,17 @@ }, "dependencies": { "@babel/runtime": "^7.12.5", - "@types/react": ">=16.9.0", - "@types/react-dom": ">=16.9.0", - "@types/react-test-renderer": ">=16.9.0", "react-error-boundary": "^3.1.0" }, "devDependencies": { + "@types/react": "17.0.44", + "@types/react-dom": "17.0.15", + "@types/react-test-renderer": "17.0.1", "@typescript-eslint/eslint-plugin": "5.11.0", "@typescript-eslint/parser": "5.11.0", "all-contributors-cli": "6.20.0", "codecov": "3.8.3", - "cross-env": "^7.0.3", + "cross-env": "7.0.3", "docz": "2.3.1", "docz-theme-default": "1.2.0", "docz-utils": "2.3.0", @@ -75,11 +75,15 @@ "typescript": "4.5.5" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0", - "react-test-renderer": ">=16.9.0" + "@types/react": "^16.9.0 || ^17.0.0", + "react": "^16.9.0 || ^17.0.0", + "react-dom": "^16.9.0 || ^17.0.0", + "react-test-renderer": "^16.9.0 || ^17.0.0" }, "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, "react-dom": { "optional": true }, From a267f1e7b7ac8b89bf7d809f25bd94faf850b727 Mon Sep 17 00:00:00 2001 From: Michael Peyper Date: Sun, 10 Apr 2022 20:39:27 +1000 Subject: [PATCH 89/95] chore(docs): add note about React 18 support --- README.md | 17 ++++++++++++++--- docs/introduction.md | 11 +++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fc95d837..a903beb5 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,17 @@ [![Tweet](https://img.shields.io/twitter/url/https/github.com/testing-library/react-hooks-testing-library.svg?style=social)](https://twitter.com/intent/tweet?text=Check%20out%20react-hooks-testing-library%20by%20%40testing-library%20https%3A%2F%2Fgithub.com%2Ftesting-library%2Freact-hooks-testing-library%20%F0%9F%91%8D) +## A Note about React 18 Support + +As part of the changes for React 18, it has been decided that the `renderHook` API provided by this +library will instead be included as official additions to both `react-testing-library` +([PR](https://github.com/testing-library/react-testing-library/pull/991)) and +`react-native-testing-library` +([PR](https://github.com/callstack/react-native-testing-library/pull/923)) with the intention being +to provide a more cohesive and consistent implementation for our users. + +Please be patient as we finalise these changes in the respective testing libraries. + ## Table of Contents @@ -146,9 +157,9 @@ to test against. It also does not come installed with a specific renderer, we cu [`react-test-renderer`](https://www.npmjs.com/package/react-test-renderer) and [`react-dom`](https://www.npmjs.com/package/react-dom). You only need to install one of them, however, if you do have both installed, we will use `react-test-renderer` as the default. For more -information see the [installation docs](https://react-hooks-testing-library.com/installation#renderer). -Generally, the installed versions for `react` and the selected renderer should have matching -versions: +information see the +[installation docs](https://react-hooks-testing-library.com/installation#renderer). Generally, the +installed versions for `react` and the selected renderer should have matching versions: ```sh npm install react@^16.9.0 diff --git a/docs/introduction.md b/docs/introduction.md index de33732a..34467e3e 100644 --- a/docs/introduction.md +++ b/docs/introduction.md @@ -23,6 +23,17 @@ route: '/'
+## A Note about React 18 Support + +As part of the changes for React 18, it has been decided that the `renderHook` API provided by this +library will instead be included as official additions to both `react-testing-library` +([PR](https://github.com/testing-library/react-testing-library/pull/991)) and +`react-native-testing-library` +([PR](https://github.com/callstack/react-native-testing-library/pull/923)) with the intention being +to provide a more cohesive and consistent implementation for our users. + +Please be patient as we finalise these changes in the respective testing libraries. + ## The problem You're writing an awesome custom hook and you want to test it, but as soon as you call it you see From efd262c52165459684292ac38673daad5a1f9187 Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Fri, 20 May 2022 17:03:12 +0800 Subject: [PATCH 90/95] chore(docs): Update README.md (#843) The documentation isnt clear. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a903beb5..0cd2f5fa 100644 --- a/README.md +++ b/README.md @@ -47,6 +47,7 @@ library will instead be included as official additions to both `react-testing-li to provide a more cohesive and consistent implementation for our users. Please be patient as we finalise these changes in the respective testing libraries. +In the mean time you can install `@testing-library/react@^13.1` ## Table of Contents From e2461ca4b5ab45813527f5e2478c4e8552f16c51 Mon Sep 17 00:00:00 2001 From: Joe Previte Date: Sat, 18 Jun 2022 06:14:09 -0700 Subject: [PATCH 91/95] fix(server): remove act around server renderer to fix support for older versions of react * refactor(server/pure): remove unnecessary type annotation * feat: add ssr.test.ts This adds a new test to verify that renderHook can be called in an SSR-like environment based on the changes implemented in #607. * chore: update contributors table * refactor: remove act call in render in sever/pure @mpeyper explained how this `act` call in server rendering is not really necessary so we can remove it. --- .all-contributorsrc | 3 ++- README.md | 2 +- src/__tests__/ssr.test.ts | 18 ++++++++++++++++++ src/server/pure.ts | 14 ++++++-------- 4 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 src/__tests__/ssr.test.ts diff --git a/.all-contributorsrc b/.all-contributorsrc index c9aecfcd..b8a61f52 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -145,7 +145,8 @@ "avatar_url": "https://avatars3.githubusercontent.com/u/3806031?v=4", "profile": "https://jsjoe.io", "contributions": [ - "tutorial" + "tutorial", + "test" ] }, { diff --git a/README.md b/README.md index 0cd2f5fa..c9fca586 100644 --- a/README.md +++ b/README.md @@ -198,7 +198,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Vince Malone

💻
Sebastian Weber

📝
Christian Gill

📖 -
JavaScript Joe

+
JavaScript Joe

⚠️
Sarah Dayan

📦 diff --git a/src/__tests__/ssr.test.ts b/src/__tests__/ssr.test.ts new file mode 100644 index 00000000..1119d1a1 --- /dev/null +++ b/src/__tests__/ssr.test.ts @@ -0,0 +1,18 @@ +/** + * @jest-environment node + */ +import { useState } from 'react' + +// This verifies that renderHook can be called in +// a SSR-like environment. +describe('renderHook', () => { + function useLoading() { + const [loading, setLoading] = useState(false) + return { loading, setLoading } + } + runForRenderers(['server'], ({ renderHook }) => { + test('should not throw in SSR environment', () => { + expect(() => renderHook(() => useLoading())).not.toThrowError('document is not defined') + }) + }) +}) diff --git a/src/server/pure.ts b/src/server/pure.ts index 1978f2d0..aa62a283 100644 --- a/src/server/pure.ts +++ b/src/server/pure.ts @@ -13,19 +13,17 @@ function createServerRenderer( ) { let renderProps: TProps | undefined let container: HTMLDivElement | undefined - let serverOutput: string = '' + let serverOutput = '' const testHarness = createTestHarness(rendererProps, wrapper, false) return { render(props?: TProps) { renderProps = props - act(() => { - try { - serverOutput = ReactDOMServer.renderToString(testHarness(props)) - } catch (e: unknown) { - rendererProps.setError(e as Error) - } - }) + try { + serverOutput = ReactDOMServer.renderToString(testHarness(props)) + } catch (e: unknown) { + rendererProps.setError(e as Error) + } }, hydrate() { if (container) { From 7a6e9356f92bdb2c1b21aa979a85133af73a3e0c Mon Sep 17 00:00:00 2001 From: Joe Podwys Date: Fri, 15 Jul 2022 22:51:49 -0600 Subject: [PATCH 92/95] docs: update api-reference.md (#872) --- docs/api-reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api-reference.md b/docs/api-reference.md index d8d36f89..6a95b87f 100644 --- a/docs/api-reference.md +++ b/docs/api-reference.md @@ -327,7 +327,7 @@ variable to `true` before importing `@testing-library/react-hooks` will also dis If you are using [a pure import](/installation#pure-imports), you are running your tests in an environment that does not support `beforeEach` and `afterEach`, or if the automatic suppression is not available to you for some other reason, then you can use the `suppressErrorOutput` export to -manually start and top suppress the output: +manually start and stop suppressing the output: ```ts import { renderHook, suppressErrorOutput } from '@testing-library/react-hooks/pure' From db18d8ce6194ac948e373834aa1bbb1c0b1a9cf9 Mon Sep 17 00:00:00 2001 From: Lukas Elmer Date: Mon, 15 Aug 2022 09:35:06 +0200 Subject: [PATCH 93/95] chore(readme): Update the React 18 upgrade docs (#841) --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index c9fca586..969e6bc7 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,22 @@ ## A Note about React 18 Support +If you are using the current version of `react-testing-library`, replace + +```js +import { renderHook } from '@testing-library/react-hooks' +``` + +with + +```js +import { renderHook } from '@testing-library/react' +``` + +Once replaced, `@testing-library/react-hooks` can be uninstalled. + +### Details + As part of the changes for React 18, it has been decided that the `renderHook` API provided by this library will instead be included as official additions to both `react-testing-library` ([PR](https://github.com/testing-library/react-testing-library/pull/991)) and From 121344370b2285dc3d5166a16ead71186bfe85d8 Mon Sep 17 00:00:00 2001 From: Andreas Date: Fri, 9 Sep 2022 23:46:51 +0200 Subject: [PATCH 94/95] chore(docs): update installation.md (#897) --- docs/installation.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/installation.md b/docs/installation.md index d83eed05..13104cfe 100644 --- a/docs/installation.md +++ b/docs/installation.md @@ -42,7 +42,7 @@ your hook. We currently support two different renderers: - `react-test-renderer` - `react-dom` -When using standard import for this library (show below), we will attempt to auto-detect which +When using standard import for this library (see below), we will attempt to auto-detect which renderer you have installed and use it without needing any specific wiring up to make it happen. If you have both installed in your project, and you use the standard import (see below) the library will default to using `react-test-renderer`. @@ -63,7 +63,7 @@ import { renderHook } from '@testing-library/react-hooks' ### Act Each render also provides a unique [`act` function](https://reactjs.org/docs/test-utils.html#act) -that cannot be used with other renderers. In order to simplify with `act `function you need to use, +that cannot be used with other renderers. In order to simplify which `act `function you need to use, we also export the correct one alongside the detected renderer for you: ```js @@ -73,8 +73,8 @@ import { renderHook, act } from '@testing-library/react-hooks' ## Being specific Auto-detection is great for simplifying setup and getting out of your way, but sometimes you do need -a little but more control. If a test needs requires a specific type of environment, the import can -be appended to force a specific renderer to be use. The supported environments are: +a little bit more control. If a test needs a specific type of environment, the import can +be appended to force a specific renderer to be used. The supported environments are: - `dom` - `native` From 1e01273374af4e48a0feb1f2233bf6c76d742167 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20De=20Boey?= Date: Mon, 8 May 2023 01:26:27 +0200 Subject: [PATCH 95/95] chore: remove `styfle/cancel-workflow-action` usage (#961) --- .github/workflows/validate.yml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 50d61077..41dde974 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -9,7 +9,12 @@ on: - 'beta' - 'alpha' - '!all-contributors/**' - pull_request: {} + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: main: # ignore all-contributors PRs @@ -20,9 +25,6 @@ jobs: react: [16.9.0, ^16, ^17] runs-on: ubuntu-latest steps: - - name: 🛑 Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.9.1 - - name: ⬇️ Checkout repo uses: actions/checkout@v2 @@ -55,9 +57,6 @@ jobs: contains('refs/heads/main,refs/heads/beta,refs/heads/next,refs/heads/alpha', github.ref) && github.event_name == 'push' }} steps: - - name: 🛑 Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.9.1 - - name: ⬇️ Checkout repo uses: actions/checkout@v2