From 90bfbe72bb79a0f6951c9e0eae24d6aa8a6c342d Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Fri, 15 Dec 2023 10:12:46 +0100 Subject: [PATCH] Add tests for invalid React server APIs (#59622) Follow-up to #59621. Adds tests for: - findDOMNode - flushSync - unstable_batchedUpdates - useFormStatus - useFormState Closes NEXT-1877 --- .../react-dom-apis/finddomnode/page.js | 7 ++++++ .../react-dom-apis/flushsync/page.js | 7 ++++++ .../unstable_batchedupdates/page.js | 7 ++++++ .../react-dom-apis/useformstate/page.js | 7 ++++++ .../react-dom-apis/useformstatus/page.js | 7 ++++++ .../acceptance-app/rsc-build-errors.test.ts | 24 +++++++++++++++++++ test/turbopack-tests-manifest.json | 7 +++++- 7 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/finddomnode/page.js create mode 100644 test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/flushsync/page.js create mode 100644 test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/unstable_batchedupdates/page.js create mode 100644 test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/useformstate/page.js create mode 100644 test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/useformstatus/page.js diff --git a/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/finddomnode/page.js b/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/finddomnode/page.js new file mode 100644 index 0000000000000..e62824bbe8598 --- /dev/null +++ b/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/finddomnode/page.js @@ -0,0 +1,7 @@ +import { findDOMNode } from 'react-dom' + +console.log({ findDOMNode }) + +export default function Page() { + return null +} diff --git a/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/flushsync/page.js b/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/flushsync/page.js new file mode 100644 index 0000000000000..6ced04ccb15c1 --- /dev/null +++ b/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/flushsync/page.js @@ -0,0 +1,7 @@ +import { flushSync } from 'react-dom' + +console.log({ flushSync }) + +export default function Page() { + return null +} diff --git a/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/unstable_batchedupdates/page.js b/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/unstable_batchedupdates/page.js new file mode 100644 index 0000000000000..49be3eb04c0b6 --- /dev/null +++ b/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/unstable_batchedupdates/page.js @@ -0,0 +1,7 @@ +import { unstable_batchedUpdates } from 'react-dom' + +console.log({ unstable_batchedUpdates }) + +export default function Page() { + return null +} diff --git a/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/useformstate/page.js b/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/useformstate/page.js new file mode 100644 index 0000000000000..021e222cc7c99 --- /dev/null +++ b/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/useformstate/page.js @@ -0,0 +1,7 @@ +import { useFormState } from 'react-dom' + +console.log({ useFormState }) + +export default function Page() { + return null +} diff --git a/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/useformstatus/page.js b/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/useformstatus/page.js new file mode 100644 index 0000000000000..743e9b31de168 --- /dev/null +++ b/test/development/acceptance-app/fixtures/rsc-build-errors/app/server-with-errors/react-dom-apis/useformstatus/page.js @@ -0,0 +1,7 @@ +import { useFormStatus } from 'react-dom' + +console.log({ useFormStatus }) + +export default function Page() { + return null +} diff --git a/test/development/acceptance-app/rsc-build-errors.test.ts b/test/development/acceptance-app/rsc-build-errors.test.ts index 621bfe1b1b477..644e0b8d5f4e5 100644 --- a/test/development/acceptance-app/rsc-build-errors.test.ts +++ b/test/development/acceptance-app/rsc-build-errors.test.ts @@ -263,6 +263,30 @@ describe('Error overlay - RSC build errors', () => { }) } + const invalidReactDomServerApis = [ + 'findDOMNode', + 'flushSync', + 'unstable_batchedUpdates', + 'useFormStatus', + 'useFormState', + ] + for (const api of invalidReactDomServerApis) { + it(`should error when ${api} from react-dom is used in server component`, async () => { + const { session, cleanup } = await sandbox( + next, + undefined, + `/server-with-errors/react-dom-apis/${api.toLowerCase()}` + ) + + expect(await session.hasRedbox(true)).toBe(true) + expect(await session.getRedboxSource()).toInclude( + `You're importing a component that needs ${api}. It only works in a Client Component but none of its parents are marked with "use client", so they're Server Components by default.` + ) + + await cleanup() + }) + } + it('should allow to use and handle rsc poisoning server-only', async () => { const { session, cleanup } = await sandbox( next, diff --git a/test/turbopack-tests-manifest.json b/test/turbopack-tests-manifest.json index f8b3e37f42e21..32dfa53aad505 100644 --- a/test/turbopack-tests-manifest.json +++ b/test/turbopack-tests-manifest.json @@ -1137,7 +1137,12 @@ "Error overlay - RSC build errors should error when useState from react is used in server component", "Error overlay - RSC build errors should error when useSyncExternalStore from react is used in server component", "Error overlay - RSC build errors should error when useTransition from react is used in server component", - "Error overlay - RSC build errors should error when useOptimistic from react is used in server component" + "Error overlay - RSC build errors should error when useOptimistic from react is used in server component", + "Error overlay - RSC build errors should error when findDOMNode from react-dom is used in server component", + "Error overlay - RSC build errors should error when flushSync from react-dom is used in server component", + "Error overlay - RSC build errors should error when unstable_batchedUpdates from react-dom is used in server component", + "Error overlay - RSC build errors should error when useFormStatus from react-dom is used in server component", + "Error overlay - RSC build errors should error when useFormState from react-dom is used in server component" ], "pending": [ "Error overlay - RSC build errors should throw an error when getStaticProps is used"