Skip to content

Commit

Permalink
add E2E tests for unstable_after
Browse files Browse the repository at this point in the history
  • Loading branch information
lubieowoce committed May 17, 2024
1 parent e38194e commit 5cc8b6c
Show file tree
Hide file tree
Showing 16 changed files with 504 additions and 1 deletion.
27 changes: 27 additions & 0 deletions test/e2e/app-dir/next-after/app/[id]/dynamic/page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { unstable_after as after } from 'next/server'
import { cache } from 'react'
import { persistentLog } from '../../../utils/log'
import { headers } from 'next/headers'

const thing = cache(() => Symbol('cache me please'))

export default function Index({ params }) {
const hostFromRender = headers().get('host')
const valueFromRender = thing()

after(() => {
const hostFromAfter = headers().get('host')
const valueFromAfter = thing()

persistentLog({
source: '[page] /[id]/dynamic',
value: params.id,
assertions: {
'cache() works in after()': valueFromRender === valueFromAfter,
'headers() works in after()': hostFromRender === hostFromAfter,
},
})
})

return <div>Page with after()</div>
}
9 changes: 9 additions & 0 deletions test/e2e/app-dir/next-after/app/[id]/layout.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { unstable_after as after } from 'next/server'
import { persistentLog } from '../../utils/log'

export default function Layout({ children }) {
after(async () => {
persistentLog({ source: '[layout] /[id]' })
})
return <>{children}</>
}
28 changes: 28 additions & 0 deletions test/e2e/app-dir/next-after/app/[id]/setting-cookies/page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { unstable_after as after } from 'next/server'
import { cookies } from 'next/headers'

export default function Index() {
after(() => {
cookies().set('testCookie', 'after-render')
})
const action = async () => {
'use server'
cookies().set('testCookie', 'action')

after(() => {
cookies().set('testCookie', 'after-action')
})
}

return (
<div>
<h1>Page with after() that tries to set cookies</h1>
<div id="cookie">
Cookie: {JSON.stringify(cookies().get('testCookie')?.value ?? null)}
</div>
<form action={action}>
<button type="submit">Submit</button>
</form>
</div>
)
}
38 changes: 38 additions & 0 deletions test/e2e/app-dir/next-after/app/[id]/with-action/page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { unstable_after as after } from 'next/server'
import { cache } from 'react'
import { persistentLog } from '../../../utils/log'
import { headers } from 'next/headers'

const thing = cache(() => Symbol('cache me please'))

export default function Index({ params }) {
const action = async () => {
'use server'

const hostFromAction = headers().get('host')
const valueFromAction = thing()

after(() => {
const valueFromAfter = thing()
const hostFromAfter = headers().get('host')

persistentLog({
source: '[action] /[id]/with-action',
value: params.id,
assertions: {
'cache() works in after()': valueFromAction === valueFromAfter,
'headers() works in after()': hostFromAction === hostFromAfter,
},
})
})
}

return (
<div>
<h1>Page with after() in an action</h1>
<form action={action}>
<button type="submit">Submit</button>
</form>
</div>
)
}
18 changes: 18 additions & 0 deletions test/e2e/app-dir/next-after/app/[id]/with-metadata/page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import { unstable_after as after } from 'next/server'
import { persistentLog } from '../../../utils/log'

export function generateMetadata({ params }) {
after(() => {
persistentLog({
source: '[metadata] /[id]/with-metadata',
value: params.id,
})
})
return {
title: `With metadata: ${params.id}`,
}
}

export default function Page() {
return <div>With metadata</div>
}
30 changes: 30 additions & 0 deletions test/e2e/app-dir/next-after/app/delay/page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { Suspense } from 'react'
import { unstable_after as after } from 'next/server'
import { persistentLog } from '../../utils/log'

export const dynamic = 'force-dynamic'

export default async function Page() {
after(() => {
persistentLog({ source: '[page] /delay (Page)' })
})
return (
<Suspense fallback={'Loading...'}>
<Inner>Delay</Inner>
</Suspense>
)
}

async function Inner({ children }) {
after(() => {
persistentLog({ source: '[page] /delay (Inner)' })
})

// the test intercepts this to assert on whether the after() callbacks ran
// before and after we finish handling the request.
await fetch('https://example.test/delayed-request', {
signal: AbortSignal.timeout(10_000),
})

return <>{children}</>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { notFound } from 'next/navigation'
import { unstable_after as after } from 'next/server'
import { persistentLog } from '../../../utils/log'

export default function Page() {
after(() => {
persistentLog({
source: '[page] /interrupted/calls-not-found',
})
})
notFound()
}
12 changes: 12 additions & 0 deletions test/e2e/app-dir/next-after/app/interrupted/calls-redirect/page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { redirect } from 'next/navigation'
import { unstable_after as after } from 'next/server'
import { persistentLog } from '../../../utils/log'

export default function Page() {
after(() => {
persistentLog({
source: '[page] /interrupted/calls-redirect',
})
})
redirect('/interrupted/redirect-target')
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { unstable_after as after } from 'next/server'
import { persistentLog } from '../../../utils/log'

export default function Page() {
after(() => {
persistentLog({
source: '[page] /interrupted/redirect-target',
})
})
return <div>Redirect</div>
}
11 changes: 11 additions & 0 deletions test/e2e/app-dir/next-after/app/interrupted/throws-error/page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { unstable_after as after } from 'next/server'
import { persistentLog } from '../../../utils/log'

export default function Page() {
after(() => {
persistentLog({
source: '[page] /interrupted/throws-error',
})
})
throw new Error('User error')
}
10 changes: 10 additions & 0 deletions test/e2e/app-dir/next-after/app/layout.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
export default function AppLayout({ children }) {
return (
<html>
<head>
<title>after</title>
</head>
<body>{children}</body>
</html>
)
}
3 changes: 3 additions & 0 deletions test/e2e/app-dir/next-after/app/middleware/redirect/page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export default function Page() {
return <div>Redirect</div>
}
13 changes: 13 additions & 0 deletions test/e2e/app-dir/next-after/app/route/route.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { unstable_after as after } from 'next/server'
import { persistentLog } from '../../utils/log'

export const dynamic = 'force-dynamic'

export async function GET() {
const data = { message: 'Hello, world!' }
after(() => {
persistentLog({ source: '[route handler] /route' })
})

return Response.json({ data })
}
12 changes: 12 additions & 0 deletions test/e2e/app-dir/next-after/app/static/page.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { unstable_after as after } from 'next/server'
import { persistentLog } from '../../utils/log'

// (patched in tests)
// export const dynamic = 'REPLACE_ME'

export default function Index() {
after(async () => {
persistentLog({ source: '[page] /static' })
})
return <div>Page with after()</div>
}

0 comments on commit 5cc8b6c

Please sign in to comment.