From 0699e6bf12ca525f4c5c9b606e528d32a0b9a3e9 Mon Sep 17 00:00:00 2001 From: Andrew Duthie Date: Sun, 20 Sep 2020 15:15:49 -0400 Subject: [PATCH] fix: flush pending hooks effects in rerender Call preact/test-utils act which manages the same setupRerender behavior implemented previously in preact-testing-library, but also flushes any pending hook effects --- src/__tests__/rerender.js | 18 ++++++++++++++++++ src/pure.js | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/__tests__/rerender.js b/src/__tests__/rerender.js index a8e321e..b31ae6c 100644 --- a/src/__tests__/rerender.js +++ b/src/__tests__/rerender.js @@ -1,5 +1,6 @@ import '@testing-library/jest-dom/extend-expect' import { h } from 'preact' +import { useState, useEffect } from 'preact/hooks' import { render } from '..' test('rerender will re-render the element', () => { @@ -12,6 +13,23 @@ test('rerender will re-render the element', () => { expect(container.firstChild).toHaveTextContent('hey') }) +test('rerender will flush pending hooks effects', async () => { + const Component = () => { + const [value, setValue] = useState(0) + useEffect(() => { + const timeoutId = setTimeout(() => setValue(1), 0) + return () => clearTimeout(timeoutId) + }) + + return value + } + + const { rerender, findByText } = render() + rerender() + + await findByText('1') +}) + test('hydrate will not update props until next render', () => { const initialInputElement = document.createElement('input') const container = document.createElement('div') diff --git a/src/pure.js b/src/pure.js index 56d7d79..c5d809e 100644 --- a/src/pure.js +++ b/src/pure.js @@ -69,7 +69,7 @@ function render ( : console.log(prettyDOM(el, maxLength, options)), unmount: () => preactRender(null, container), rerender: (rerenderUi) => { - setupRerender()() + act(() => {}) render(wrapUiIfNeeded(rerenderUi), { container, baseElement }) // Intentionally do not return anything to avoid unnecessarily complicating the API. // folks can use all the same utilities we return in the first place that are bound to