From 621124643c354b3be87990cb333076f3fe4b88e4 Mon Sep 17 00:00:00 2001 From: Jiachi Liu Date: Mon, 14 Apr 2025 11:54:56 +0200 Subject: [PATCH] [test] isolate parallel metadata test --- .../app/layout.tsx | 22 +++++++ .../app/page.tsx | 12 ++++ .../parallel-routes-default/@bar/default.tsx | 0 .../parallel-routes-default/@bar/layout.tsx | 0 .../app/parallel-routes-default/@bar/page.tsx | 0 .../@bar/test-page/page.tsx | 0 .../parallel-routes-default/@foo/default.tsx | 0 .../parallel-routes-default/@foo/layout.tsx | 0 .../@foo/no-bar/page.tsx | 0 .../app/parallel-routes-default/@foo/page.tsx | 0 .../@foo/test-page/page.tsx | 0 .../app/parallel-routes-default/default.tsx | 0 .../app/parallel-routes-default/layout.tsx | 0 .../parallel-routes-default/no-bar/page.tsx | 0 .../test-page/page.tsx | 0 .../app/parallel-routes/@bar/default.tsx | 0 .../app/parallel-routes/@bar/layout.tsx | 0 .../app/parallel-routes/@bar/page.tsx | 0 .../parallel-routes/@bar/test-page/page.tsx | 0 .../app/parallel-routes/@foo/default.tsx | 0 .../app/parallel-routes/@foo/layout.tsx | 0 .../app/parallel-routes/@foo/no-bar/page.tsx | 0 .../app/parallel-routes/@foo/page.tsx | 0 .../parallel-routes/@foo/test-page/page.tsx | 0 .../app/parallel-routes/layout.tsx | 0 .../app/parallel-routes/no-bar/page.tsx | 0 .../app/parallel-routes/page.tsx | 0 .../app/parallel-routes/test-page/page.tsx | 0 ...metadata-streaming-parallel-routes.test.ts | 60 +++++++++++++++++++ .../next.config.js | 6 ++ .../metadata-streaming.test.ts | 52 ---------------- 31 files changed, 100 insertions(+), 52 deletions(-) create mode 100644 test/e2e/app-dir/metadata-streaming-parallel-routes/app/layout.tsx create mode 100644 test/e2e/app-dir/metadata-streaming-parallel-routes/app/page.tsx rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes-default/@bar/default.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes-default/@bar/layout.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes-default/@bar/page.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes-default/@bar/test-page/page.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes-default/@foo/default.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes-default/@foo/layout.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes-default/@foo/no-bar/page.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes-default/@foo/page.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes-default/@foo/test-page/page.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes-default/default.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes-default/layout.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes-default/no-bar/page.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes-default/test-page/page.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes/@bar/default.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes/@bar/layout.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes/@bar/page.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes/@bar/test-page/page.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes/@foo/default.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes/@foo/layout.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes/@foo/no-bar/page.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes/@foo/page.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes/@foo/test-page/page.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes/layout.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes/no-bar/page.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes/page.tsx (100%) rename test/e2e/app-dir/{metadata-streaming => metadata-streaming-parallel-routes}/app/parallel-routes/test-page/page.tsx (100%) create mode 100644 test/e2e/app-dir/metadata-streaming-parallel-routes/metadata-streaming-parallel-routes.test.ts create mode 100644 test/e2e/app-dir/metadata-streaming-parallel-routes/next.config.js diff --git a/test/e2e/app-dir/metadata-streaming-parallel-routes/app/layout.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/layout.tsx new file mode 100644 index 0000000000000..3d424723b93b1 --- /dev/null +++ b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/layout.tsx @@ -0,0 +1,22 @@ +import Link from 'next/link' +import { ReactNode } from 'react' + +export default function Root({ children }: { children: ReactNode }) { + return ( + + +
+ + {`to /parallel-routes`} + +
+ + {`to /parallel-routes-default`} + +
+
+ {children} + + + ) +} diff --git a/test/e2e/app-dir/metadata-streaming-parallel-routes/app/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/page.tsx new file mode 100644 index 0000000000000..101b2d74bd0d5 --- /dev/null +++ b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/page.tsx @@ -0,0 +1,12 @@ +export default function Page() { + return

index page

+} + +export async function generateMetadata() { + await new Promise((resolve) => setTimeout(resolve, 1 * 1000)) + return { + title: 'index page', + } +} + +export const dynamic = 'force-dynamic' diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@bar/default.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@bar/default.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@bar/default.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@bar/default.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@bar/layout.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@bar/layout.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@bar/layout.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@bar/layout.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@bar/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@bar/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@bar/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@bar/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@bar/test-page/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@bar/test-page/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@bar/test-page/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@bar/test-page/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@foo/default.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@foo/default.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@foo/default.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@foo/default.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@foo/layout.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@foo/layout.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@foo/layout.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@foo/layout.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@foo/no-bar/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@foo/no-bar/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@foo/no-bar/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@foo/no-bar/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@foo/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@foo/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@foo/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@foo/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@foo/test-page/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@foo/test-page/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/@foo/test-page/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/@foo/test-page/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/default.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/default.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/default.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/default.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/layout.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/layout.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/layout.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/layout.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/no-bar/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/no-bar/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/no-bar/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/no-bar/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/test-page/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/test-page/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes-default/test-page/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes-default/test-page/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes/@bar/default.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@bar/default.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes/@bar/default.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@bar/default.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes/@bar/layout.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@bar/layout.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes/@bar/layout.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@bar/layout.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes/@bar/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@bar/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes/@bar/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@bar/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes/@bar/test-page/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@bar/test-page/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes/@bar/test-page/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@bar/test-page/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes/@foo/default.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@foo/default.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes/@foo/default.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@foo/default.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes/@foo/layout.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@foo/layout.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes/@foo/layout.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@foo/layout.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes/@foo/no-bar/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@foo/no-bar/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes/@foo/no-bar/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@foo/no-bar/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes/@foo/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@foo/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes/@foo/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@foo/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes/@foo/test-page/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@foo/test-page/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes/@foo/test-page/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/@foo/test-page/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes/layout.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/layout.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes/layout.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/layout.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes/no-bar/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/no-bar/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes/no-bar/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/no-bar/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming/app/parallel-routes/test-page/page.tsx b/test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/test-page/page.tsx similarity index 100% rename from test/e2e/app-dir/metadata-streaming/app/parallel-routes/test-page/page.tsx rename to test/e2e/app-dir/metadata-streaming-parallel-routes/app/parallel-routes/test-page/page.tsx diff --git a/test/e2e/app-dir/metadata-streaming-parallel-routes/metadata-streaming-parallel-routes.test.ts b/test/e2e/app-dir/metadata-streaming-parallel-routes/metadata-streaming-parallel-routes.test.ts new file mode 100644 index 0000000000000..08f8469bb503c --- /dev/null +++ b/test/e2e/app-dir/metadata-streaming-parallel-routes/metadata-streaming-parallel-routes.test.ts @@ -0,0 +1,60 @@ +import { nextTestSetup } from 'e2e-utils' +import { retry } from 'next-test-utils' + +describe('app-dir - metadata-streaming', () => { + const { next } = nextTestSetup({ + files: __dirname, + }) + + it('should only insert metadata once for parallel routes when slots match', async () => { + const browser = await next.browser('/parallel-routes') + + expect((await browser.elementsByCss('head title')).length).toBe(1) + expect((await browser.elementsByCss('body title')).length).toBe(0) + expect(await browser.elementByCss('title').text()).toBe('parallel title') + + const $ = await next.render$('/parallel-routes') + expect($('title').length).toBe(1) + expect($('head title').text()).toBe('parallel title') + + // validate behavior remains the same on client navigations + await browser.elementByCss('[href="/parallel-routes/test-page"]').click() + + await retry(async () => { + expect(await browser.elementByCss('title').text()).toContain( + 'Dynamic api' + ) + }) + + expect((await browser.elementsByCss('title')).length).toBe(1) + }) + + it('should only insert metadata once for parallel routes when there is a missing slot', async () => { + const browser = await next.browser('/parallel-routes') + await browser.elementByCss('[href="/parallel-routes/no-bar"]').click() + + // Wait for navigation is finished and metadata is updated + await retry(async () => { + expect(await browser.elementByCss('title').text()).toContain( + 'Dynamic api' + ) + }) + + await retry(async () => { + expect((await browser.elementsByCss('title')).length).toBe(1) + }) + }) + + it('should still render metadata if children is not rendered in parallel routes layout', async () => { + const browser = await next.browser('/parallel-routes-default') + + expect((await browser.elementsByCss('title')).length).toBe(1) + expect(await browser.elementByCss('body title').text()).toBe( + 'parallel-routes-default layout title' + ) + + const $ = await next.render$('/parallel-routes-default') + expect($('title').length).toBe(1) + expect($('body title').text()).toBe('parallel-routes-default layout title') + }) +}) diff --git a/test/e2e/app-dir/metadata-streaming-parallel-routes/next.config.js b/test/e2e/app-dir/metadata-streaming-parallel-routes/next.config.js new file mode 100644 index 0000000000000..807126e4cf0bf --- /dev/null +++ b/test/e2e/app-dir/metadata-streaming-parallel-routes/next.config.js @@ -0,0 +1,6 @@ +/** + * @type {import('next').NextConfig} + */ +const nextConfig = {} + +module.exports = nextConfig diff --git a/test/e2e/app-dir/metadata-streaming/metadata-streaming.test.ts b/test/e2e/app-dir/metadata-streaming/metadata-streaming.test.ts index b761c235c80f2..b7882776e9d66 100644 --- a/test/e2e/app-dir/metadata-streaming/metadata-streaming.test.ts +++ b/test/e2e/app-dir/metadata-streaming/metadata-streaming.test.ts @@ -88,58 +88,6 @@ describe('app-dir - metadata-streaming', () => { expect((await browser.elementsByCss('body meta')).length).toBe(9) }) - it('should only insert metadata once for parallel routes when slots match', async () => { - const browser = await next.browser('/parallel-routes') - - expect((await browser.elementsByCss('head title')).length).toBe(1) - expect((await browser.elementsByCss('body title')).length).toBe(0) - expect(await browser.elementByCss('title').text()).toBe('parallel title') - - const $ = await next.render$('/parallel-routes') - expect($('title').length).toBe(1) - expect($('head title').text()).toBe('parallel title') - - // validate behavior remains the same on client navigations - await browser.elementByCss('[href="/parallel-routes/test-page"]').click() - - await retry(async () => { - expect(await browser.elementByCss('title').text()).toContain( - 'Dynamic api' - ) - }) - - expect((await browser.elementsByCss('title')).length).toBe(1) - }) - - it('should only insert metadata once for parallel routes when there is a missing slot', async () => { - const browser = await next.browser('/parallel-routes') - await browser.elementByCss('[href="/parallel-routes/no-bar"]').click() - - // Wait for navigation is finished and metadata is updated - await retry(async () => { - expect(await browser.elementByCss('title').text()).toContain( - 'Dynamic api' - ) - }) - - await retry(async () => { - expect((await browser.elementsByCss('title')).length).toBe(1) - }) - }) - - it('should still render metadata if children is not rendered in parallel routes layout', async () => { - const browser = await next.browser('/parallel-routes-default') - - expect((await browser.elementsByCss('title')).length).toBe(1) - expect(await browser.elementByCss('body title').text()).toBe( - 'parallel-routes-default layout title' - ) - - const $ = await next.render$('/parallel-routes-default') - expect($('title').length).toBe(1) - expect($('body title').text()).toBe('parallel-routes-default layout title') - }) - describe('dynamic api', () => { it('should render metadata to body', async () => { const $ = await next.render$('/dynamic-api')