From 48093b87a9c01265d017ce49da806b9d31dc1cd8 Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Thu, 28 Sep 2023 16:15:51 +0200 Subject: [PATCH] Allow jest to run with use server directive (#56148) Disable server components and server actions SWC transform when it's running jest. You can only do basic DOM testing like what we described in #54891 instead the server action itself. Closes #53065 Closes NEXT-1473 --- packages/next/src/build/swc/options.ts | 20 +++++++++---------- .../jest/rsc/app/server-action/action.js | 5 +++++ .../jest/rsc/app/server-action/page.jsx | 9 +++++++++ .../jest/rsc/app/server-action/page.test.jsx | 10 ++++++++++ 4 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 test/production/jest/rsc/app/server-action/action.js create mode 100644 test/production/jest/rsc/app/server-action/page.jsx create mode 100644 test/production/jest/rsc/app/server-action/page.test.jsx diff --git a/packages/next/src/build/swc/options.ts b/packages/next/src/build/swc/options.ts index fa91033272141..66fc96dc66573 100644 --- a/packages/next/src/build/swc/options.ts +++ b/packages/next/src/build/swc/options.ts @@ -178,16 +178,16 @@ function getBaseSWCOptions({ development ), }), - serverComponents: hasServerComponents - ? { isServer: !!isServerLayer } - : undefined, - serverActions: hasServerComponents - ? { - // TODO-APP: When Server Actions is stable, we need to remove this flag. - enabled: !!isServerActionsEnabled, - isServer: !!isServerLayer, - } - : undefined, + serverComponents: + hasServerComponents && !jest ? { isServer: !!isServerLayer } : undefined, + serverActions: + hasServerComponents && !jest + ? { + // TODO-APP: When Server Actions is stable, we need to remove this flag. + enabled: !!isServerActionsEnabled, + isServer: !!isServerLayer, + } + : undefined, bundleTarget, } } diff --git a/test/production/jest/rsc/app/server-action/action.js b/test/production/jest/rsc/app/server-action/action.js new file mode 100644 index 0000000000000..e2903615f728c --- /dev/null +++ b/test/production/jest/rsc/app/server-action/action.js @@ -0,0 +1,5 @@ +'use server' + +export async function action(data) { + console.log(data) +} diff --git a/test/production/jest/rsc/app/server-action/page.jsx b/test/production/jest/rsc/app/server-action/page.jsx new file mode 100644 index 0000000000000..554ef1b172861 --- /dev/null +++ b/test/production/jest/rsc/app/server-action/page.jsx @@ -0,0 +1,9 @@ +import { action } from './action' + +export default function Page() { + return ( + + ) +} diff --git a/test/production/jest/rsc/app/server-action/page.test.jsx b/test/production/jest/rsc/app/server-action/page.test.jsx new file mode 100644 index 0000000000000..e077b511e0899 --- /dev/null +++ b/test/production/jest/rsc/app/server-action/page.test.jsx @@ -0,0 +1,10 @@ +/** + * @jest-environment jsdom + */ +import { render, screen } from '@testing-library/react' +import Page from './page' + +it('works with client-only code', () => { + render() + expect(screen.getByTestId('log')).toHaveTextContent('log') +})