From e44adc5585bb7550d83c6f6ac7e37b16e6f91dc1 Mon Sep 17 00:00:00 2001
From: eps1lon <silbermann.sebastian@gmail.com>
Date: Sat, 12 Jun 2021 10:33:27 +0200
Subject: [PATCH 1/2] test: Ignore React 18 legacy root deprecation warnings

---
 tests/setup-env.js | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/tests/setup-env.js b/tests/setup-env.js
index 264828a9..71eeac3d 100644
--- a/tests/setup-env.js
+++ b/tests/setup-env.js
@@ -1 +1,21 @@
 import '@testing-library/jest-dom/extend-expect'
+
+beforeEach(() => {
+  const originalConsoleError = console.error
+  jest
+    .spyOn(console, 'error')
+    .mockImplementation((message, ...optionalParams) => {
+      // Ignore ReactDOM.render/ReactDOM.hydrate deprecation warning
+      if (message.indexOf('Use createRoot instead.') !== -1) {
+        return
+      }
+      originalConsoleError(message, ...optionalParams)
+    })
+})
+
+afterEach(() => {
+  // maybe another test already restore console error mocks
+  if (typeof console.error.mockRestore === 'function') {
+    console.error.mockRestore()
+  }
+})

From e891310fb0278d0587a4b6bab70c643c873ac8b5 Mon Sep 17 00:00:00 2001
From: eps1lon <silbermann.sebastian@gmail.com>
Date: Sat, 12 Jun 2021 10:50:28 +0200
Subject: [PATCH 2/2] Update tests asserting on console.error

---
 src/__tests__/cleanup.js   | 19 ++++++++++++++-----
 src/__tests__/no-act.js    | 36 ++++++++++++++++++++++++------------
 src/__tests__/stopwatch.js |  5 ++++-
 3 files changed, 42 insertions(+), 18 deletions(-)

diff --git a/src/__tests__/cleanup.js b/src/__tests__/cleanup.js
index 6043ae06..b034ca75 100644
--- a/src/__tests__/cleanup.js
+++ b/src/__tests__/cleanup.js
@@ -82,7 +82,10 @@ describe('fake timers and missing act warnings', () => {
     expect(microTaskSpy).toHaveBeenCalledTimes(0)
     // console.error is mocked
     // eslint-disable-next-line no-console
-    expect(console.error).toHaveBeenCalledTimes(0)
+    expect(console.error).toHaveBeenCalledTimes(
+      // ReactDOM.render is deprecated in React 18
+      React.version.startsWith('18') ? 1 : 0,
+    )
   })
 
   test('cleanup does not swallow missing act warnings', () => {
@@ -114,10 +117,16 @@ describe('fake timers and missing act warnings', () => {
     expect(deferredStateUpdateSpy).toHaveBeenCalledTimes(1)
     // console.error is mocked
     // eslint-disable-next-line no-console
-    expect(console.error).toHaveBeenCalledTimes(1)
-    // eslint-disable-next-line no-console
-    expect(console.error.mock.calls[0][0]).toMatch(
-      'a test was not wrapped in act(...)',
+    expect(console.error).toHaveBeenCalledTimes(
+      // ReactDOM.render is deprecated in React 18
+      React.version.startsWith('18') ? 2 : 1,
     )
+    // eslint-disable-next-line no-console
+    expect(
+      console.error.mock.calls[
+        // ReactDOM.render is deprecated in React 18
+        React.version.startsWith('18') ? 1 : 0
+      ][0],
+    ).toMatch('a test was not wrapped in act(...)')
   })
 })
diff --git a/src/__tests__/no-act.js b/src/__tests__/no-act.js
index 039a79ae..1e53e125 100644
--- a/src/__tests__/no-act.js
+++ b/src/__tests__/no-act.js
@@ -1,9 +1,10 @@
-let act, asyncAct
+let act, asyncAct, React
 
 beforeEach(() => {
   jest.resetModules()
   act = require('..').act
   asyncAct = require('../act-compat').asyncAct
+  React = require('react')
   jest.spyOn(console, 'error').mockImplementation(() => {})
 })
 
@@ -17,7 +18,10 @@ test('act works even when there is no act from test utils', () => {
   const callback = jest.fn()
   act(callback)
   expect(callback).toHaveBeenCalledTimes(1)
-  expect(console.error).toHaveBeenCalledTimes(0)
+  expect(console.error).toHaveBeenCalledTimes(
+    // ReactDOM.render is deprecated in React 18
+    React.version.startsWith('18') ? 1 : 0,
+  )
 })
 
 test('async act works when it does not exist (older versions of react)', async () => {
@@ -26,7 +30,10 @@ test('async act works when it does not exist (older versions of react)', async (
     await Promise.resolve()
     await callback()
   })
-  expect(console.error).toHaveBeenCalledTimes(0)
+  expect(console.error).toHaveBeenCalledTimes(
+    // ReactDOM.render is deprecated in React 18
+    React.version.startsWith('18') ? 2 : 0,
+  )
   expect(callback).toHaveBeenCalledTimes(1)
 
   callback.mockClear()
@@ -36,7 +43,10 @@ test('async act works when it does not exist (older versions of react)', async (
     await Promise.resolve()
     await callback()
   })
-  expect(console.error).toHaveBeenCalledTimes(0)
+  expect(console.error).toHaveBeenCalledTimes(
+    // ReactDOM.render is deprecated in React 18
+    React.version.startsWith('18') ? 2 : 0,
+  )
   expect(callback).toHaveBeenCalledTimes(1)
 })
 
@@ -49,14 +59,16 @@ test('async act recovers from errors', async () => {
   } catch (err) {
     console.error('call console.error')
   }
-  expect(console.error).toHaveBeenCalledTimes(1)
-  expect(console.error.mock.calls).toMatchInlineSnapshot(`
-    Array [
-      Array [
-        "call console.error",
-      ],
-    ]
-  `)
+  expect(console.error).toHaveBeenCalledTimes(
+    // ReactDOM.render is deprecated in React 18
+    React.version.startsWith('18') ? 2 : 1,
+  )
+  expect(
+    console.error.mock.calls[
+      // ReactDOM.render is deprecated in React 18
+      React.version.startsWith('18') ? 1 : 0
+    ][0],
+  ).toMatch('call console.error')
 })
 
 test('async act recovers from sync errors', async () => {
diff --git a/src/__tests__/stopwatch.js b/src/__tests__/stopwatch.js
index eeaf395c..400fce10 100644
--- a/src/__tests__/stopwatch.js
+++ b/src/__tests__/stopwatch.js
@@ -53,5 +53,8 @@ test('unmounts a component', async () => {
   // and get an error.
   await sleep(5)
   // eslint-disable-next-line no-console
-  expect(console.error).not.toHaveBeenCalled()
+  expect(console.error).toHaveBeenCalledTimes(
+    // ReactDOM.render is deprecated in React 18
+    React.version.startsWith('18') ? 1 : 0,
+  )
 })