rsnext/test/development/acceptance-app/invalid-imports.test.ts
Balázs Orbán 33db463fe4
chore: upgrade jest (#56909)
### What?

Upgrade jest to its latest version

### Why?

#56899 fails because historically Jest stripped the globals in Node.js, but 28+ isn't doing that anymore. If we upgrade, we don't have to keep track of Node.js globals and when they are added. This will be useful in removing even more polyfills for things that are natively shipped in Node.js now.

### How?

Jest 29 introduced a change to the snapshot format: https://jestjs.io/blog/2022/08/25/jest-29

First, I tried setting the old compat option to not require updating snapshots, but some tests were still failing: https://dev.azure.com/nextjs/next.js/_build/results?buildId=70633&view=logs&j=8af7cf9c-43a1-584d-6f5c-57bad8880974&t=7ae70e63-3625-50f4-6764-5b3e72b4bd7a&l=273 So going through the pain now instead.
2023-10-19 17:38:24 +00:00

231 lines
6 KiB
TypeScript

/* eslint-env jest */
import { sandbox } from 'development-sandbox'
import { FileRef, nextTestSetup } from 'e2e-utils'
import path from 'path'
import { outdent } from 'outdent'
describe('Error Overlay invalid imports', () => {
const { next } = nextTestSetup({
files: new FileRef(path.join(__dirname, 'fixtures', 'default-template')),
dependencies: {
react: 'latest',
'react-dom': 'latest',
'server-only': 'latest',
'client-only': 'latest',
},
skipStart: true,
})
it('should show error when using styled-jsx in server component', async () => {
const { session, cleanup } = await sandbox(
next,
new Map([
[
'app/comp1.js',
outdent`
import { Comp2 } from './comp2'
export function Comp1() {
return <Comp2 />
}
`,
],
[
'app/comp2.js',
outdent`
export function Comp2() {
return (
<div>
<style jsx>{\`
p {
color: red;
}
\`}</style>
</div>
)
}
`,
],
[
'app/page.js',
outdent`
'use client'
import { Comp1 } from './comp1'
export default function Page() {
return <Comp1 />
}
`,
],
])
)
const pageFile = 'app/page.js'
const content = await next.readFile(pageFile)
const withoutUseClient = content.replace("'use client'", '')
await session.patch(pageFile, withoutUseClient)
expect(await session.hasRedbox(true)).toBe(true)
expect(await session.getRedboxSource()).toMatchInlineSnapshot(`
"./app/comp2.js
'client-only' cannot be imported from a Server Component module. It should only be used from a Client Component.
The error was caused by using 'styled-jsx' in './app/comp2.js'. It only works in a Client Component but none of its parents are marked with "use client", so they're Server Components by default.
Import trace for requested module:
./app/comp2.js
./app/comp1.js
./app/page.js"
`)
await cleanup()
})
it('should show error when external package imports client-only in server component', async () => {
const { session, cleanup } = await sandbox(
next,
new Map([
[
'node_modules/client-only-package/index.js',
outdent`
require("client-only")
`,
],
[
'node_modules/client-only-package/package.json',
outdent`
{
"name": "client-only-package",
"main": "index.js"
}
`,
],
[
'app/comp1.js',
outdent`
import { Comp2 } from './comp2'
export function Comp1() {
return <Comp2 />
}
`,
],
[
'app/comp2.js',
outdent`
import "client-only-package"
export function Comp2() {
return (
<div>Hello world</div>
)
}
`,
],
[
'app/page.js',
outdent`
'use client'
import { Comp1 } from './comp1'
export default function Page() {
return <Comp1 />
}
`,
],
])
)
const pageFile = 'app/page.js'
const content = await next.readFile(pageFile)
const withoutUseClient = content.replace("'use client'", '')
await session.patch(pageFile, withoutUseClient)
expect(await session.hasRedbox(true)).toBe(true)
expect(await session.getRedboxSource()).toMatchInlineSnapshot(`
"./app/comp2.js
'client-only' cannot be imported from a Server Component module. It should only be used from a Client Component.
The error was caused by importing 'client-only-package/index.js' in './app/comp2.js'.
Import trace for requested module:
./app/comp2.js
./app/comp1.js
./app/page.js"
`)
await cleanup()
})
it('should show error when external package imports server-only in client component', async () => {
const { session, cleanup } = await sandbox(
next,
new Map([
[
'node_modules/server-only-package/index.js',
outdent`
require("server-only")
`,
],
[
'node_modules/server-only-package/package.json',
outdent`
{
"name": "server-only-package",
"main": "index.js"
}
`,
],
[
'app/comp1.js',
outdent`
import { Comp2 } from './comp2'
export function Comp1() {
return <Comp2 />
}
`,
],
[
'app/comp2.js',
outdent`
import 'server-only-package'
export function Comp2() {
return (
<div>Hello world</div>
)
}
`,
],
[
'app/page.js',
outdent`
import { Comp1 } from './comp1'
export default function Page() {
return <Comp1 />
}
`,
],
])
)
const file = 'app/page.js'
const content = await next.readFile(file)
await session.patch(file, "'use client'\n" + content)
expect(await session.hasRedbox(true)).toBe(true)
expect(await session.getRedboxSource()).toMatchInlineSnapshot(`
"./app/comp2.js
'server-only' cannot be imported from a Client Component module. It should only be used from a Server Component.
The error was caused by importing 'server-only-package/index.js' in './app/comp2.js'.
Import trace for requested module:
./app/comp2.js
./app/comp1.js
./app/page.js"
`)
await cleanup()
})
})