diff --git a/.gitignore b/.gitignore index 590a8c143f..08456566e8 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ edge-runtime/vendor # Local Netlify folder .netlify + /test-results/ /playwright-report/ /blob-report/ @@ -12,10 +13,8 @@ edge-runtime/vendor deno.lock .eslintcache -/report/index.html .DS_Store tests/**/package-lock.json tests/**/pnpm-lock.yaml tests/**/yarn.lock tests/**/out/ -report/test-results.json diff --git a/deno.json b/deno.json index 561c910ed5..735d9c4a1d 100644 --- a/deno.json +++ b/deno.json @@ -1,11 +1,12 @@ { "lint": { "files": { - "include": ["edge-runtime/middleware.ts"] + "include": [ + "edge-runtime/middleware.ts" + ] } }, "imports": { "@netlify/edge-functions": "https://edge.netlify.com/v1/index.ts" - }, - "importMap": "./edge-runtime/vendor/import_map.json" + } } diff --git a/e2e-report/app/globals.scss b/e2e-report/app/globals.scss index cfa1feea2b..f8ff798011 100644 --- a/e2e-report/app/globals.scss +++ b/e2e-report/app/globals.scss @@ -68,7 +68,6 @@ span { p { font-size: $base-font-size; - font-weight: bold; } img { @@ -92,10 +91,6 @@ th { font-weight: 400; } -tr { - font-weight: bold; -} - a:visited, a:link { color: white; @@ -241,14 +236,14 @@ button.nav { overflow-x: hidden; } -.skipped.card:hover { +.skipped.card:hover, +.open-issue.card:hover { background-color: initial; color: initial; } .testCases { display: none; - // background: $netlify-blue; padding: 0.5% 2%; box-shadow: inset -1px 4px 10px #00000047; border-radius: 11px; @@ -313,7 +308,8 @@ button.nav { } } - .card.skipped { + .card.skipped, + .card.open-issues { display: none; width: clamp(350px, 55%, 1000px); cursor: default; @@ -321,7 +317,8 @@ button.nav { overflow: scroll; } - .card.skipped.open { + .card.skipped.open, + .card.open-issues.open { display: block; } } @@ -365,7 +362,7 @@ button.nav { } } -.card:hover:not(.skipped) { +.card.test-group:hover { background-color: $netlify-blue; background-image: $card-bg-img; background-blend-mode: screen; @@ -400,7 +397,8 @@ span[data-status='skipped'] { width: 35vw; } -.skipped { +.skipped, +.open-issues { td, th { padding: 0.5% 2%; @@ -412,19 +410,26 @@ span[data-status='skipped'] { font-size: clamp(1rem, 0.8764rem + 0.4121vw, 1.16rem); } } +} +.open-issues { a { color: black; font-weight: bold; - display: flex; - flex-flow: column; + display: inline; } - :hover a { - color: white; + a:hover { + color: $netlify-blue; + } + .github-link-icon { + width: 0.75em; + height: auto; + margin: 0 0.5em; } } -.skipped .card { +.skipped .card, +.open-issues .card { display: flex; justify-content: space-between; padding: 4%; @@ -433,7 +438,8 @@ span[data-status='skipped'] { } } -.skipped .card:hover { +.skipped .card:hover, +.open-issues .card:hover { p { color: #2bdcd2; } diff --git a/e2e-report/app/page.js b/e2e-report/app/page.js index 11a688acf3..564c7609e6 100644 --- a/e2e-report/app/page.js +++ b/e2e-report/app/page.js @@ -1,23 +1,17 @@ -import { SkippedTests } from '../components/filter-data.js' +import { OpenIssues, SkippedTests } from '../components/filter-data.js' import GroupedTests from '../components/grouped-tests.js' import Hero from '../components/hero.js' import testData from '../data/test-results.json' export default function Home() { const { results, passed, failed, total, passRate, skipped, testDate, nextVersion } = testData - const skippedTests = [] - results.forEach((suite) => { - if (suite.skipped === true) { - skippedTests.push(suite) - } - - const { testCases } = suite - testCases?.forEach((testCase) => { - if (testCase.status === 'failed') { - skippedTests.push(testCase) - } - }) - }) + const skippedSuites = results.filter(({ skipped }) => skipped === true) + const skippedTestCases = results.flatMap( + ({ testCases }) => testCases?.filter(({ status }) => status === 'skipped') ?? [], + ) + const failedTestCases = results.flatMap( + ({ testCases }) => testCases?.filter(({ status }) => status === 'failed') ?? [], + ) return ( <> @@ -34,7 +28,8 @@ export default function Home() {
- + +
) diff --git a/e2e-report/components/filter-data.js b/e2e-report/components/filter-data.js index 5da1766320..e4011c8f6f 100644 --- a/e2e-report/components/filter-data.js +++ b/e2e-report/components/filter-data.js @@ -4,6 +4,7 @@ import { useState } from 'react' import Down from '../public/down.svg' import Up from '../public/up.svg' +import ExternalLinkIcon from '../public/arrow-up-right-from-square-solid.svg' export const groupDefinitions = [ { @@ -58,7 +59,60 @@ export const groupTests = (testSuites) => { ) } -export const SkippedTests = ({ testSuites }) => { +export const OpenIssues = ({ testCases }) => { + const [slider, setSlider] = useState({}) + + function handleSelect(el) { + setSlider({ + ...slider, + [el]: !slider[el], + }) + } + + return ( +
+
handleSelect('openIssues')}> +

Open Issues

+

Total: {testCases.length}

+ {slider.openIssues ? ( + + ) : ( + + )} +
+ + + + + + + {testCases.map((testCase, index) => { + const { name, link, reason = 'Reason not yet assigned' } = testCase + return ( + + + + + ) + })} + +
TestReason
{name} +

+ {link ? ( + + + {reason} + + ) : ( + reason + )} +

+
+
+ ) +} + +export const SkippedTests = ({ testCases, testSuites }) => { const [slider, setSlider] = useState({}) function handleSelect(el) { @@ -71,8 +125,10 @@ export const SkippedTests = ({ testSuites }) => { return (
handleSelect('skipped')}> -

Open Issues + Skipped Tests

-

Total: {testSuites.length}

+

Skipped Tests

+

+ Total: {testSuites.length} suites + {testCases.length} tests +

{slider.skipped ? ( ) : ( @@ -85,21 +141,24 @@ export const SkippedTests = ({ testSuites }) => { Test Reason - {testSuites?.map((testCase, index) => { - const { name, link, reason, file } = testCase + {testSuites.map((testCase, index) => { + const { file, reason } = testCase return ( - - {file || name} + + {file} + +

{reason}

+ + + ) + })} + {testCases.map((testCase, index) => { + const { name, reason } = testCase + return ( + + {name}

{reason}

- {link && ( - - )} ) diff --git a/e2e-report/components/grouped-tests.js b/e2e-report/components/grouped-tests.js index a346823fec..94e36f950a 100644 --- a/e2e-report/components/grouped-tests.js +++ b/e2e-report/components/grouped-tests.js @@ -35,7 +35,7 @@ export default function GroupedTests({ testData }) { const groupTotal = (testGroup.passed ?? 0) + (testGroup.failed ?? 0) return (
-
handleSelect(testGroup.id)}> +
handleSelect(testGroup.id)}> diff --git a/e2e-report/data/issues.json b/e2e-report/data/issues.json new file mode 100644 index 0000000000..8f1d096ad0 --- /dev/null +++ b/e2e-report/data/issues.json @@ -0,0 +1,46 @@ +[ + { + "body": "I'm not quite sure exactly what the scope of this is, but the failing tests here have a fixture site that enables `skipMiddlewareUrlNormalize` and a user middleware that redirects any other casing of `/en/*` to `/en/*` (and so on), but when `/EN` is fetched it redirects to `/en/en` instead of `/en`:\r\n\r\n```\r\n ● skip-trailing-slash-redirect › should be able to redirect locale casing $1\r\n\r\n expect(received).toBe(expected) // Object.is equality\r\n\r\n Expected: \"/en\"\r\n Received: \"/en/en\"\r\n\r\n 155 | const res = await next.fetch(`/${locale}`, { redirect: 'manual' })\r\n 156 | expect(res.status).toBe(307)\r\n > 157 | expect(new URL(res.headers.get('location'), 'http://n').pathname).toBe(\r\n | ^\r\n 158 | `/${locale.toLowerCase()}`\r\n 159 | )\r\n 160 | }\r\n\r\n at toBe (e2e/skip-trailing-slash-redirect/index.test.ts:157:73)\r\n\r\n ● skip-trailing-slash-redirect › should be able to redirect locale casing $1\r\n\r\n expect(received).toBe(expected) // Object.is equality\r\n\r\n Expected: \"/ja-jp\"\r\n Received: \"/ja-jp/ja-jp\"\r\n\r\n 155 | const res = await next.fetch(`/${locale}`, { redirect: 'manual' })\r\n 156 | expect(res.status).toBe(307)\r\n > 157 | expect(new URL(res.headers.get('location'), 'http://n').pathname).toBe(\r\n | ^\r\n 158 | `/${locale.toLowerCase()}`\r\n 159 | )\r\n 160 | }\r\n\r\n at toBe (e2e/skip-trailing-slash-redirect/index.test.ts:157:73)\r\n```\r\n\r\nIt looks like we [previously claimed to have fixed this in FRA-332](https://github.com/netlify/next-runtime-minimal/pull/287), but it must have regressed at some point.\r\n\r\ntest: test/e2e/skip-trailing-slash-redirect/index.test.ts\r\nreason: does not correctly handle user middleware that redirects to path with canonical locale casing when app enables `skipMiddlewareUrlNormalize` and path contains locale slug with non-canonical casing", + "number": 564 + }, + { + "body": "A pages router site with both basepath and i18n enabled does not match middleware targeted at the root unless a locale is in the URL. It should match when using the default locale\r\n\r\nDemo: \r\n- https://6634b69452829cd391cab206--next-e2e-tests.netlify.app/root/ does not have `x-from-middleware` header\r\n- https://6634b69452829cd391cab206--next-e2e-tests.netlify.app/root/en/ does have `x-from-middleware` header\r\n\r\ntest: test/e2e/middleware-matcher/index.test.ts\r\nreason: Middleware does not match when using basePath and default locale", + "number": 454 + }, + { + "body": "There are a few scenarios where our the custom matchers from middleware are not correctly being transformed when using i18n and default locales, as they're either matching too broadly or too narrowly. See the two linked GH issues for details:\r\n\r\n[https://github.com/netlify/next-runtime-minimal/issues/453](https://github.com/netlify/next-runtime-minimal/issues/453)
[https://github.com/netlify/next-runtime-minimal/issues/454](https://github.com/netlify/next-runtime-minimal/issues/454)\r\n\r\ntest: Middleware custom matchers i18n should not match\r\nreason: Middleware matching is too broad when using i18n", + "number": 453 + }, + { + "body": "On sites that use pages router and have middleware, loading a page using next/link will attempt to load a JSON file, which will return a 404. If there is no middleware then it works fine. This applies even if the middleware does nothing.\r\n\r\ntest: test/e2e/middleware-base-path/test/index.test.ts\r\nreason: Pages router data requests returning 404 when middleware is used\r\ntest case: \"Middleware base tests router.query must exist when Link clicked page routing\"", + "number": 450 + }, + { + "body": "When appending a `set-cookie` header, the server returns two copies of the header. e.g. \r\n\r\n```ts\r\nexport async function middleware(request, ev) {\r\n const next = NextResponse.next()\r\n next.headers.append('set-cookie', 'bar=chocochip')\r\n return next\r\n}\r\n```\r\n\r\nLeads to: \r\n\r\n![image](https://github.com/netlify/next-runtime-minimal/assets/213306/22c51860-fbde-4b70-b9aa-18172ee0d6e2)\r\n\r\ntest: test/e2e/middleware-responses/test/index.test.ts\r\nreason: Appending set-cookie header in middleware leads to duplicate header\r\n", + "number": 447 + }, + { + "body": "The test [\"app-dir action handling fetch actions should store revalidation data in the prefetch cache\"](https://github.com/vercel/next.js/blob/6475431a4cbbf2b71c38158e0e722183779faf4f/test/e2e/app-dir/actions/app-action.test.ts#L980) fails when running tests, but seems to work fine when testing manually. It may be a first-run issue, which needs investigation.\r\n\r\ntest: test/e2e/app-dir/actions/app-action.test.ts\r\nreason: Fetch action prefetch cache test is flakey", + "number": 444 + }, + { + "body": "If a Next.js page returns a 500 error and the browser sent accept-encoding gzip, it seems the returned data _is_ encoded, but no encoding header is set, so the browser cannot decode it.\r\n\r\n`curl --request GET --url https://66056f2be8186e00aaea53d3--next-e2e-tests.netlify.app/enoent --header 'Accept-Encoding: gzip'`\r\n\r\ntest case: https://github.com/vercel/next.js/blob/canary/test/e2e/getserversideprops/test/index.test.ts#L367\r\ntest: test/e2e/getserversideprops/test/index.test.ts\r\nreason: Server error pages return encoded data without content-encoding header if accept-encoding is gzip", + "number": 387 + }, + { + "body": "When redirecting a data request, middleware returns a response with `x-nextjs-redirect`, rather than a `location` header. We handle this correctly. However Next.js expects us to directly return and empty response with a 302 response code (without the location header), whereas we're currently passing the request on to the origin and returning the body with 404 code. I'm unsure if it's legal to return a 302 with no location, but it's what next start does, and the router expects.\r\n\r\ntest case: https://github.com/vercel/next.js/blob/canary/test/e2e/middleware-redirects/test/index.test.ts#L100\r\ntest: test/e2e/middleware-redirects/test/index.test.ts\r\nreason: Pages router middleware should return 302 status for redirected data requests", + "number": 386 + }, + { + "body": "In sites with trailing slashes enabled, requests should not add a trailing slash when they're for non-data static files.\r\n\r\ntest case: https://github.com/vercel/next.js/blob/canary/test/e2e/middleware-trailing-slash/test/index.test.ts#L436-L437\r\ntest: test/e2e/middleware-trailing-slash/test/index.test.ts\r\nreason: Middleware should not add trailing slashes to non-data requests in static dir", + "number": 385 + }, + { + "body": "Rewrites in middleware on i18n sites add the locale to the target automatically. However it is supposed to skip this if the target is a static file. This does not currently work, as the middleware doesn't know if a static file exists. This is documented as a known issue.\r\n\r\ntest: test/e2e/i18n-ignore-rewrite-source-locale/rewrites-with-basepath.test.ts, test/e2e/i18n-ignore-rewrite-source-locale/rewrites.test.ts\r\nreason: Middleware on sites with i18n cannot rewrite to static files", + "number": 383 + }, + { + "body": "It doesn't seem to be documented, but the e2e test and fixture here expects a CSP to be automatically applied to scripts in the head. The docs show manually setting it, but [the fixture](https://github.com/vercel/next.js/blob/canary/test/e2e/app-dir/app/middleware.js#L30) seems to only set it in the response. Nevertheless, running `next start` does seem to set it automatically, but when deployed it doesn't. I think this is low priority because it seems to be undocumented behaviour.\r\n\r\ntest case: https://github.com/vercel/next.js/blob/canary/test/e2e/app-dir/app/index.test.ts#L1711\r\ntest: test/e2e/app-dir/app/index.test.ts\r\nreason: Nonce not automatically set in script tags when using CSP", + "number": 381 + } +] diff --git a/e2e-report/data/test-results.json b/e2e-report/data/test-results.json index d5e61f24f2..4e771591f5 100644 --- a/e2e-report/data/test-results.json +++ b/e2e-report/data/test-results.json @@ -1,10 +1,11 @@ { - "failed": 48, - "skipped": 74, - "passed": 1780, - "total": 1902, - "passRate": "97.37%", - "testDate": "04/23/2024", + "failed": 22, + "skipped": 47, + "passed": 1519, + "total": 1588, + "passRate": "98.57%", + "testDate": "2024-06-03", + "nextVersion": "v14.2.3", "results": [ { "name": "app-dir edge runtime config", @@ -12,6 +13,7 @@ "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { "name": "app-dir edge runtime config should skip next deploy", @@ -20,10063 +22,9151 @@ ] }, { - "name": "app-dir action handling - next export", - "file": "test/e2e/app-dir/actions/app-action-export.test.ts", + "name": "app dir - basepath", + "file": "test/e2e/app-dir/app-basepath/index.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app-dir action handling - next export should skip next deploy", + "name": "app dir - basepath should skip next deploy", "status": "passed" } ] }, { - "name": "app-dir action size limit invalid config", - "file": "test/e2e/app-dir/actions/app-action-size-limit-invalid.test.ts", + "name": "app-dir - custom-cache-handler - cjs", + "file": "test/e2e/app-dir/app-custom-cache-handler/index.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "app-dir - custom-cache-handler - cjs should skip next deploy", + "status": "passed" + }, + { + "name": "app-dir - custom-cache-handler - cjs-default-export should skip next deploy", + "status": "passed" + }, + { + "name": "app-dir - custom-cache-handler - esm should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-prefetch-false", + "file": "test/e2e/app-dir/app-prefetch-false/app-prefetch-false.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app-dir action size limit invalid config should skip next deploy", + "name": "app-prefetch-false should avoid double-fetching when optimistic navigation fails", "status": "passed" } ] }, { - "name": "app-dir action handling", - "file": "test/e2e/app-dir/actions/app-action.test.ts", - "passed": 57, - "failed": 1, + "name": "app-custom-routes", + "file": "test/e2e/app-dir/app-routes/app-custom-routes.test.ts", + "passed": 62, + "failed": 0, "skipped": 2, + "total": "65", "testCases": [ { - "name": "app-dir action handling should handle basic actions correctly", + "name": "app-custom-routes works with api prefix correctly statically generates correctly with no dynamic usage", "status": "passed" }, { - "name": "app-dir action handling should report errors with bad inputs correctly", + "name": "app-custom-routes works with api prefix correctly does not statically generate with dynamic usage", "status": "passed" }, { - "name": "app-dir action handling should support headers and cookies", + "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/first/data.json", "status": "passed" }, { - "name": "app-dir action handling should push new route when redirecting", + "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/second/data.json", "status": "passed" }, { - "name": "app-dir action handling should support headers in client imported actions", + "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/three/data.json", "status": "passed" }, { - "name": "app-dir action handling should not log errors for non-action form POSTs", + "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/first/data.json", "status": "passed" }, { - "name": "app-dir action handling should support setting cookies in route handlers with the correct overrides", + "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/second/data.json", "status": "passed" }, { - "name": "app-dir action handling should support formData and redirect", + "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/three/data.json", "status": "passed" }, { - "name": "app-dir action handling should support .bind", + "name": "app-custom-routes basic fetch request with a response made via a GET request responds correctly on /basic/endpoint", "status": "passed" }, { - "name": "app-dir action handling should support chained .bind", + "name": "app-custom-routes basic fetch request with a response made via a GET request responds correctly on /basic/vercel/endpoint", "status": "passed" }, { - "name": "app-dir action handling should support notFound (javascript disabled)", + "name": "app-custom-routes basic fetch request with a response made via a POST request responds correctly on /basic/endpoint", "status": "passed" }, { - "name": "app-dir action handling should support notFound", + "name": "app-custom-routes basic fetch request with a response made via a POST request responds correctly on /basic/vercel/endpoint", "status": "passed" }, { - "name": "app-dir action handling should support uploading files", + "name": "app-custom-routes basic fetch request with a response made via a PUT request responds correctly on /basic/endpoint", "status": "passed" }, { - "name": "app-dir action handling should support hoc auth wrappers", + "name": "app-custom-routes basic fetch request with a response made via a PUT request responds correctly on /basic/vercel/endpoint", "status": "passed" }, { - "name": "app-dir action handling should support importing actions in client components", + "name": "app-custom-routes basic fetch request with a response made via a DELETE request responds correctly on /basic/endpoint", "status": "passed" }, { - "name": "app-dir action handling should support importing the same action module instance in both server and action layers", + "name": "app-custom-routes basic fetch request with a response made via a DELETE request responds correctly on /basic/vercel/endpoint", "status": "passed" }, { - "name": "app-dir action handling should not block navigation events while a server action is in flight", + "name": "app-custom-routes basic fetch request with a response made via a PATCH request responds correctly on /basic/endpoint", "status": "passed" }, { - "name": "app-dir action handling should not block router.back() while a server action is in flight", + "name": "app-custom-routes basic fetch request with a response made via a PATCH request responds correctly on /basic/vercel/endpoint", "status": "passed" }, { - "name": "app-dir action handling should trigger a refresh for a server action that gets discarded due to a navigation", + "name": "app-custom-routes basic fetch request with a response abort via a GET request aborts without error on /basic/endpoint", "status": "passed" }, { - "name": "app-dir action handling should trigger a refresh for a server action that also dispatches a navigation event", + "name": "app-custom-routes basic fetch request with a response abort via a GET request aborts without error on /basic/vercel/endpoint", "status": "passed" }, { - "name": "app-dir action handling should support next/dynamic with ssr: false", + "name": "app-custom-routes basic fetch request with a response abort via a POST request aborts without error on /basic/endpoint", "status": "passed" }, { - "name": "app-dir action handling should support next/dynamic with ssr: false (edge)", + "name": "app-custom-routes basic fetch request with a response abort via a POST request aborts without error on /basic/vercel/endpoint", "status": "passed" }, { - "name": "app-dir action handling should only submit action once when resubmitting an action after navigation", + "name": "app-custom-routes basic fetch request with a response abort via a PUT request aborts without error on /basic/endpoint", "status": "passed" }, { - "name": "app-dir action handling should handle actions executed in quick succession", + "name": "app-custom-routes basic fetch request with a response abort via a PUT request aborts without error on /basic/vercel/endpoint", "status": "passed" }, { - "name": "app-dir action handling should 404 when POSTing an invalid server action", + "name": "app-custom-routes basic fetch request with a response abort via a DELETE request aborts without error on /basic/endpoint", "status": "passed" }, { - "name": "app-dir action handling should be possible to catch network errors", + "name": "app-custom-routes basic fetch request with a response abort via a DELETE request aborts without error on /basic/vercel/endpoint", "status": "passed" }, { - "name": "app-dir action handling should be possible to catch regular errors", + "name": "app-custom-routes basic fetch request with a response abort via a PATCH request aborts without error on /basic/endpoint", "status": "passed" }, { - "name": "app-dir action handling should forward action request to a worker that contains the action handler (node)", + "name": "app-custom-routes basic fetch request with a response abort via a PATCH request aborts without error on /basic/vercel/endpoint", "status": "passed" }, { - "name": "app-dir action handling should forward action request to a worker that contains the action handler (edge)", + "name": "app-custom-routes basic fetch request with a response route groups routes to the correct handler", "status": "passed" }, { - "name": "app-dir action handling Edge SSR should handle basic actions correctly", + "name": "app-custom-routes basic fetch request with a response request can read query parameters", "status": "passed" }, { - "name": "app-dir action handling Edge SSR should return error response for hoc auth wrappers in edge runtime", + "name": "app-custom-routes basic fetch request with a response request can read query parameters (edge)", "status": "passed" }, { - "name": "app-dir action handling Edge SSR should handle redirect to a relative URL in a single pass", + "name": "app-custom-routes basic fetch request with a response response supports the NextResponse.redirect() helper", "status": "passed" }, { - "name": "app-dir action handling Edge SSR should handle regular redirects", + "name": "app-custom-routes basic fetch request with a response response supports the NextResponse.json() helper", "status": "passed" }, { - "name": "app-dir action handling Edge SSR should allow cookie and header async storages", + "name": "app-custom-routes body can handle handle a streaming request and streaming response (edge)", "status": "passed" }, { - "name": "app-dir action handling Edge SSR should handle unicode search params", + "name": "app-custom-routes body can read a JSON encoded body", "status": "passed" }, { - "name": "app-dir action handling fetch actions should handle a fetch action initiated from a static page", + "name": "app-custom-routes body can read a JSON encoded body (edge)", "status": "passed" }, { - "name": "app-dir action handling fetch actions should handle redirect to a relative URL in a single pass", + "name": "app-custom-routes body can read a JSON encoded body for DELETE requests", "status": "passed" }, { - "name": "app-dir action handling fetch actions should handle regular redirects", + "name": "app-custom-routes body can read a JSON encoded body for OPTIONS requests", "status": "passed" }, { - "name": "app-dir action handling fetch actions should handle redirects to routes that provide an invalid RSC response", + "name": "app-custom-routes body can read a streamed JSON encoded body (edge)", "status": "passed" }, { - "name": "app-dir action handling fetch actions should handle revalidatePath", + "name": "app-custom-routes body can read the text body", "status": "passed" }, { - "name": "app-dir action handling fetch actions should handle revalidateTag", + "name": "app-custom-routes body can read the text body (edge)", "status": "passed" }, { - "name": "app-dir action handling fetch actions should store revalidation data in the prefetch cache", - "status": "failed" + "name": "app-custom-routes context provides params to routes with dynamic parameters", + "status": "passed" }, { - "name": "app-dir action handling fetch actions should revalidate when cookies.set is called", + "name": "app-custom-routes context provides params to routes with catch-all routes", "status": "passed" }, { - "name": "app-dir action handling fetch actions should invalidate client cache on other routes when cookies.set is called", + "name": "app-custom-routes context does not provide params to routes without dynamic parameters", "status": "passed" }, { - "name": "app-dir action handling fetch actions should revalidate when cookies.set is called in a client action", + "name": "app-custom-routes hooks headers gets the correct values", "status": "passed" }, { - "name": "app-dir action handling fetch actions should invalidate client cache when tag is revalidated", + "name": "app-custom-routes hooks cookies gets the correct values", "status": "passed" }, { - "name": "app-dir action handling fetch actions should invalidate client cache when path is revalidated", + "name": "app-custom-routes hooks req.cookies gets the correct values", "status": "passed" }, { - "name": "app-dir action handling encryption should send encrypted values from the closed over closure", + "name": "app-custom-routes hooks cookies().has() gets the correct values", "status": "passed" }, { - "name": "app-dir action handling redirects redirects properly when server action handler uses `redirect`", + "name": "app-custom-routes hooks redirect can respond correctly", "status": "passed" }, { - "name": "app-dir action handling redirects redirects properly when server action handler uses `permanentRedirect`", + "name": "app-custom-routes hooks permanentRedirect can respond correctly", "status": "passed" }, { - "name": "app-dir action handling redirects displays searchParams correctly when redirecting with SearchParams", + "name": "app-custom-routes hooks notFound can respond correctly in nodejs", "status": "passed" }, { - "name": "app-dir action handling redirects merges cookies correctly when redirecting", + "name": "app-custom-routes hooks notFound can respond correctly in edge", "status": "passed" }, { - "name": "app-dir action handling redirects redirects properly when server action handler redirects with a 307 status code", + "name": "app-custom-routes error conditions responds with 405 (Method Not Allowed) when method is not implemented", "status": "passed" }, { - "name": "app-dir action handling redirects redirects properly when server action handler redirects with a 308 status code", + "name": "app-custom-routes error conditions responds with 500 (Internal Server Error) when the handler throws an error", "status": "passed" }, { - "name": "app-dir action handling server actions render client components server component imported action should support importing client components from actions", + "name": "app-custom-routes error conditions responds with 500 (Internal Server Error) when the handler calls NextResponse.next()", "status": "passed" }, { - "name": "app-dir action handling caching disabled by default should use no-store as default for server action", + "name": "app-custom-routes automatic implementations implements HEAD on routes with GET already implemented", "status": "passed" }, { - "name": "app-dir action handling caching disabled by default should not override force-cache in server action", + "name": "app-custom-routes automatic implementations implements OPTIONS on routes", "status": "passed" }, { - "name": "app-dir action handling caching disabled by default should not override revalidate in server action", + "name": "app-custom-routes edge functions returns response using edge runtime", "status": "passed" }, { - "name": "app-dir action handling should log a warning when a server action is not found but an id is provided", + "name": "app-custom-routes edge functions returns a response when headers are accessed", + "status": "passed" + }, + { + "name": "app-custom-routes dynamic = \"force-static\" strips search, headers, and domain from request", + "status": "passed" + }, + { + "name": "app-custom-routes customized metadata routes should work if conflict with metadata routes convention", + "status": "passed" + }, + { + "name": "app-custom-routes no bundle error should not print bundling warning about React", + "status": "passed" + }, + { + "name": "app-custom-routes no response returned should print an error when no response is returned", "status": "skipped", "reason": "Uses CLI output" }, { - "name": "app-dir action handling should work with interception routes", + "name": "app-custom-routes error conditions responds with 400 (Bad Request) when the requested method is not a valid HTTP method", "status": "skipped", "reason": "Uses CLI output" } ] }, { - "name": "referencing a client component in an app route", - "file": "test/e2e/app-dir/app-routes-client-component/app-routes-client-component.test.ts", - "passed": 1, + "name": "app dir - not found navigation", + "file": "test/e2e/app-dir/error-boundary-navigation/override-node-env.test.ts", + "passed": 14, "failed": 0, "skipped": 0, + "total": "14", "testCases": [ { - "name": "referencing a client component in an app route responds without error", - "status": "passed" - } - ] - }, - { - "name": "app-custom-routes", - "file": "test/e2e/app-dir/app-routes/app-custom-routes.test.ts", - "passed": 62, - "failed": 0, - "skipped": 2, - "testCases": [ - { - "name": "app-custom-routes works with api prefix correctly statically generates correctly with no dynamic usage", - "status": "passed" - }, - { - "name": "app-custom-routes works with api prefix correctly does not statically generate with dynamic usage", + "name": "app dir - not found navigation should allow navigation on not-found", "status": "passed" }, { - "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/first/data.json", + "name": "app dir - not found navigation should allow navigation on error", "status": "passed" }, { - "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/second/data.json", + "name": "app dir - not found navigation should allow navigation to other routes on route that was initially not-found", "status": "passed" }, { - "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/three/data.json", + "name": "app dir - not found navigation should allow navigation back to route that was initially not-found", "status": "passed" }, { - "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/first/data.json", + "name": "app dir - not found navigation should allow navigating to a page calling notfound", "status": "passed" }, { - "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/second/data.json", + "name": "app dir - not found navigation should allow navigating to a non-existent page", "status": "passed" }, { - "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/three/data.json", + "name": "app dir - not found navigation should be able to navigate to other page from root not-found page", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response made via a GET request responds correctly on /basic/endpoint", + "name": "app dir - not found navigation - with overridden node env should allow navigation on not-found", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response made via a GET request responds correctly on /basic/vercel/endpoint", + "name": "app dir - not found navigation - with overridden node env should allow navigation on error", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response made via a POST request responds correctly on /basic/endpoint", + "name": "app dir - not found navigation - with overridden node env should allow navigation to other routes on route that was initially not-found", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response made via a POST request responds correctly on /basic/vercel/endpoint", + "name": "app dir - not found navigation - with overridden node env should allow navigation back to route that was initially not-found", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response made via a PUT request responds correctly on /basic/endpoint", + "name": "app dir - not found navigation - with overridden node env should allow navigating to a page calling notfound", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response made via a PUT request responds correctly on /basic/vercel/endpoint", + "name": "app dir - not found navigation - with overridden node env should allow navigating to a non-existent page", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response made via a DELETE request responds correctly on /basic/endpoint", + "name": "app dir - not found navigation - with overridden node env should be able to navigate to other page from root not-found page", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - metadata dynamic routes suspense", + "file": "test/e2e/app-dir/metadata-suspense/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "app-custom-routes basic fetch request with a response made via a DELETE request responds correctly on /basic/vercel/endpoint", + "name": "app dir - metadata dynamic routes suspense should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - metadata missing metadataBase", + "file": "test/e2e/app-dir/metadata-warnings/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "app-custom-routes basic fetch request with a response made via a PATCH request responds correctly on /basic/endpoint", + "name": "app dir - metadata missing metadataBase should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - navigation", + "file": "test/e2e/app-dir/navigation/navigation.test.ts", + "passed": 48, + "failed": 0, + "skipped": 0, + "total": "48", + "testCases": [ + { + "name": "app dir - navigation query string should set query correctly", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response made via a PATCH request responds correctly on /basic/vercel/endpoint", + "name": "app dir - navigation query string should handle unicode search params", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a GET request aborts without error on /basic/endpoint", + "name": "app dir - navigation query string should not reset shallow url updates on prefetch", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a GET request aborts without error on /basic/vercel/endpoint", + "name": "app dir - navigation query string useParams identity between renders should be stable in app", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a POST request aborts without error on /basic/endpoint", + "name": "app dir - navigation query string useParams identity between renders should be stable in pages", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a POST request aborts without error on /basic/vercel/endpoint", + "name": "app dir - navigation hash should scroll to the specified hash", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a PUT request aborts without error on /basic/endpoint", + "name": "app dir - navigation hash should not scroll to hash when scroll={false} is set", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a PUT request aborts without error on /basic/vercel/endpoint", + "name": "app dir - navigation hash-with-scroll-offset should scroll to the specified hash", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a DELETE request aborts without error on /basic/endpoint", + "name": "app dir - navigation hash-link-back-to-same-page should scroll to the specified hash", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a DELETE request aborts without error on /basic/vercel/endpoint", + "name": "app dir - navigation relative hashes and queries should work with a hash-only href", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a PATCH request aborts without error on /basic/endpoint", + "name": "app dir - navigation relative hashes and queries should work with a hash-only `router.push(...)`", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a PATCH request aborts without error on /basic/vercel/endpoint", + "name": "app dir - navigation relative hashes and queries should work with a query-only href", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response route groups routes to the correct handler", + "name": "app dir - navigation relative hashes and queries should work with both relative hashes and queries", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response request can read query parameters", + "name": "app dir - navigation not-found should trigger not-found in a server component", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response request can read query parameters (edge)", + "name": "app dir - navigation not-found should trigger not-found in a client component", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response response supports the NextResponse.redirect() helper", + "name": "app dir - navigation not-found should trigger not-found client-side", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response response supports the NextResponse.json() helper", + "name": "app dir - navigation not-found should trigger not-found while streaming", "status": "passed" }, { - "name": "app-custom-routes body can handle handle a streaming request and streaming response (edge)", + "name": "app dir - navigation redirect components should redirect in a server component", "status": "passed" }, { - "name": "app-custom-routes body can read a JSON encoded body", + "name": "app dir - navigation redirect components should redirect in a client component", "status": "passed" }, { - "name": "app-custom-routes body can read a JSON encoded body (edge)", + "name": "app dir - navigation redirect components should redirect client-side", "status": "passed" }, { - "name": "app-custom-routes body can read a JSON encoded body for DELETE requests", + "name": "app dir - navigation redirect components should redirect to external url", "status": "passed" }, { - "name": "app-custom-routes body can read a JSON encoded body for OPTIONS requests", + "name": "app dir - navigation redirect components should redirect to external url, initiating only once", "status": "passed" }, { - "name": "app-custom-routes body can read a streamed JSON encoded body (edge)", + "name": "app dir - navigation redirect components should only trigger the redirect once (/redirect/servercomponent)", "status": "passed" }, { - "name": "app-custom-routes body can read the text body", + "name": "app dir - navigation redirect components should only trigger the redirect once (redirect/redirect-with-loading)", "status": "passed" }, { - "name": "app-custom-routes body can read the text body (edge)", + "name": "app dir - navigation redirect next.config.js redirects should redirect from next.config.js", "status": "passed" }, { - "name": "app-custom-routes context provides params to routes with dynamic parameters", + "name": "app dir - navigation redirect next.config.js redirects should redirect from next.config.js with link navigation", "status": "passed" }, { - "name": "app-custom-routes context provides params to routes with catch-all routes", + "name": "app dir - navigation redirect middleware redirects should redirect from middleware", "status": "passed" }, { - "name": "app-custom-routes context does not provide params to routes without dynamic parameters", + "name": "app dir - navigation redirect middleware redirects should redirect from middleware with link navigation", "status": "passed" }, { - "name": "app-custom-routes hooks headers gets the correct values", + "name": "app dir - navigation redirect status code should respond with 307 status code in server component", "status": "passed" }, { - "name": "app-custom-routes hooks cookies gets the correct values", + "name": "app dir - navigation redirect status code should respond with 307 status code in client component", "status": "passed" }, { - "name": "app-custom-routes hooks req.cookies gets the correct values", + "name": "app dir - navigation redirect status code should respond with 308 status code if permanent flag is set", "status": "passed" }, { - "name": "app-custom-routes hooks cookies().has() gets the correct values", + "name": "app dir - navigation external push should push external url without affecting hooks", "status": "passed" }, { - "name": "app-custom-routes hooks redirect can respond correctly", + "name": "app dir - navigation navigation between pages and app should not contain _rsc query while navigating from app to pages", "status": "passed" }, { - "name": "app-custom-routes hooks permanentRedirect can respond correctly", + "name": "app dir - navigation navigation between pages and app should not contain _rsc query while navigating from pages to app", "status": "passed" }, { - "name": "app-custom-routes hooks notFound can respond correctly in nodejs", + "name": "app dir - navigation navigation between pages and app should not omit the hash while navigating from app to pages", "status": "passed" }, { - "name": "app-custom-routes hooks notFound can respond correctly in edge", + "name": "app dir - navigation navigation between pages and app should not continously initiate a mpa navigation to the same URL when router state changes", "status": "passed" }, { - "name": "app-custom-routes error conditions responds with 405 (Method Not Allowed) when method is not implemented", + "name": "app dir - navigation nested navigation should navigate to nested pages", "status": "passed" }, { - "name": "app-custom-routes error conditions responds with 500 (Internal Server Error) when the handler throws an error", + "name": "app dir - navigation nested navigation should load chunks correctly without double encoding of url", "status": "passed" }, { - "name": "app-custom-routes error conditions responds with 500 (Internal Server Error) when the handler calls NextResponse.next()", + "name": "app dir - navigation SEO should emit noindex meta tag for not found page when streaming", "status": "passed" }, { - "name": "app-custom-routes automatic implementations implements HEAD on routes with GET already implemented", + "name": "app dir - navigation SEO should emit refresh meta tag for redirect page when streaming", "status": "passed" }, { - "name": "app-custom-routes automatic implementations implements OPTIONS on routes", + "name": "app dir - navigation SEO should emit refresh meta tag (permanent) for redirect page when streaming", "status": "passed" }, { - "name": "app-custom-routes edge functions returns response using edge runtime", + "name": "app dir - navigation SEO should contain default meta tags in error page", "status": "passed" }, { - "name": "app-custom-routes edge functions returns a response when headers are accessed", + "name": "app dir - navigation SEO should not log 404 errors in ipc server", "status": "passed" }, { - "name": "app-custom-routes dynamic = \"force-static\" strips search, headers, and domain from request", + "name": "app dir - navigation navigations when attaching a Proxy to `window.Promise` should navigate without issue", "status": "passed" }, { - "name": "app-custom-routes customized metadata routes should work if conflict with metadata routes convention", + "name": "app dir - navigation scroll restoration should restore original scroll position when navigating back", "status": "passed" }, { - "name": "app-custom-routes no bundle error should not print bundling warning about React", + "name": "app dir - navigation navigating to a page with async metadata should render the final state of the page with correct metadata", "status": "passed" }, { - "name": "app-custom-routes no response returned should print an error when no response is returned", - "status": "skipped", - "reason": "Uses CLI output" + "name": "app dir - navigation navigating to dynamic params & changing the casing should load the page correctly", + "status": "passed" }, { - "name": "app-custom-routes error conditions responds with 400 (Bad Request) when the requested method is not a valid HTTP method", - "status": "skipped", - "reason": "Uses CLI output" + "name": "app dir - navigation browser back to a revalidated page should load the page", + "status": "passed" } ] }, { - "name": "async-component-preload", - "file": "test/e2e/app-dir/async-component-preload/async-component-preload.test.ts", + "name": "SCSS Support loader handling External imports", + "file": "test/e2e/app-dir/scss/external-url/external-url.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "async-component-preload should skip next deploy", + "name": "SCSS Support loader handling External imports should include font on the page", "status": "passed" } ] }, { - "name": "router autoscrolling on navigation with css modules", - "file": "test/e2e/app-dir/autoscroll-with-css-modules/index.test.ts", - "passed": 2, + "name": "Nested @import() Global Support", + "file": "test/e2e/app-dir/scss/nested-global/nested-global.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "router autoscrolling on navigation with css modules vertical scroll when page imports css modules should scroll to top of document when navigating between to pages without layout when", + "name": "Nested @import() Global Support should render the page", "status": "passed" - }, + } + ] + }, + { + "name": "SCSS Support loader handling", + "file": "test/e2e/app-dir/scss/url-global/url-global.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "router autoscrolling on navigation with css modules vertical scroll when page imports css modules should scroll when clicking in JS", + "name": "SCSS Support loader handling CSS URL via `file-loader` should render the page", "status": "passed" } ] }, { - "name": "css-order strict", - "file": "test/e2e/app-dir/css-order/css-order.test.ts", - "passed": 176, + "name": "syntax-highlighter-crash", + "file": "test/e2e/app-dir/syntax-highlighter-crash/syntax-highlighter-crash.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "css-order strict should load correct styles navigating back again first -> second -> first -> second", + "name": "syntax-highlighter-crash should render the page", "status": "passed" - }, + } + ] + }, + { + "name": "disabled JS preloads", + "file": "test/e2e/disable-js-preload/test/index.test.js", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "css-order strict should load correct styles navigating back again first -> third -> first -> third", + "name": "disabled JS preloads should render the page", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again first -> first-client -> first -> first-client", + "name": "disabled JS preloads should not have JS preload links", "status": "passed" - }, + } + ] + }, + { + "name": "handle-non-hoisted-swc-helpers", + "file": "test/e2e/handle-non-hoisted-swc-helpers/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating back again first -> second-client -> first -> second-client", + "name": "handle-non-hoisted-swc-helpers should work", "status": "passed" - }, + } + ] + }, + { + "name": "link-with-api-rewrite", + "file": "test/e2e/link-with-api-rewrite/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "css-order strict should load correct styles navigating back again second -> first -> second -> first", + "name": "link-with-api-rewrite should perform hard navigation for rewritten urls", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again second -> third -> second -> third", + "name": "link-with-api-rewrite should perform hard navigation for direct urls", "status": "passed" - }, + } + ] + }, + { + "name": "Prerender crawler handling", + "file": "test/e2e/prerender-crawler.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ { - "name": "css-order strict should load correct styles navigating back again second -> first-client -> second -> first-client", + "name": "Prerender crawler handling should return prerendered page for correctly", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again second -> second-client -> second -> second-client", + "name": "Prerender crawler handling should return fallback for non-crawler correctly", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again third -> first -> third -> first", + "name": "Prerender crawler handling should block for crawler correctly", "status": "passed" - }, + } + ] + }, + { + "name": "Type module interop", + "file": "test/e2e/type-module-interop/index.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ { - "name": "css-order strict should load correct styles navigating back again third -> second -> third -> second", + "name": "Type module interop should render server-side", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again third -> first-client -> third -> first-client", + "name": "Type module interop should render client-side", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again third -> second-client -> third -> second-client", + "name": "Type module interop should render server-side with modules", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again first-client -> first -> first-client -> first", + "name": "Type module interop should render client-side with modules", "status": "passed" - }, + } + ] + }, + { + "name": "app-dir action handling", + "file": "test/e2e/app-dir/actions/app-action.test.ts", + "passed": 57, + "failed": 1, + "skipped": 2, + "total": "62", + "testCases": [ { - "name": "css-order strict should load correct styles navigating back again first-client -> second -> first-client -> second", + "name": "app-dir action handling should handle basic actions correctly", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again first-client -> third -> first-client -> third", + "name": "app-dir action handling should report errors with bad inputs correctly", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again first-client -> second-client -> first-client -> second-client", + "name": "app-dir action handling should support headers and cookies", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again second-client -> first -> second-client -> first", + "name": "app-dir action handling should push new route when redirecting", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again second-client -> second -> second-client -> second", + "name": "app-dir action handling should support headers in client imported actions", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again second-client -> third -> second-client -> third", + "name": "app-dir action handling should not log errors for non-action form POSTs", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again second-client -> first-client -> second-client -> first-client", + "name": "app-dir action handling should support setting cookies in route handlers with the correct overrides", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again interleaved-a -> interleaved-b -> interleaved-a -> interleaved-b", + "name": "app-dir action handling should support formData and redirect", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again interleaved-b -> interleaved-a -> interleaved-b -> interleaved-a", + "name": "app-dir action handling should support .bind", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again big-interleaved-a -> big-interleaved-b -> big-interleaved-a -> big-interleaved-b", + "name": "app-dir action handling should support chained .bind", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again big-interleaved-b -> big-interleaved-a -> big-interleaved-b -> big-interleaved-a", + "name": "app-dir action handling should support notFound (javascript disabled)", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-first -> pages-second -> pages-first -> pages-second", + "name": "app-dir action handling should support notFound", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-first -> pages-third -> pages-first -> pages-third", + "name": "app-dir action handling should support uploading files", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-second -> pages-first -> pages-second -> pages-first", + "name": "app-dir action handling should support hoc auth wrappers", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-second -> pages-third -> pages-second -> pages-third", + "name": "app-dir action handling should support importing actions in client components", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-third -> pages-first -> pages-third -> pages-first", + "name": "app-dir action handling should support importing the same action module instance in both server and action layers", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-third -> pages-second -> pages-third -> pages-second", + "name": "app-dir action handling should not block navigation events while a server action is in flight", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b", + "name": "app-dir action handling should not block router.back() while a server action is in flight", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a", + "name": "app-dir action handling should trigger a refresh for a server action that gets discarded due to a navigation", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-reversed-a -> pages-reversed-b -> pages-reversed-a -> pages-reversed-b", + "name": "app-dir action handling should trigger a refresh for a server action that also dispatches a navigation event", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-reversed-b -> pages-reversed-a -> pages-reversed-b -> pages-reversed-a", + "name": "app-dir action handling should support next/dynamic with ssr: false", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b", + "name": "app-dir action handling should support next/dynamic with ssr: false (edge)", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a", + "name": "app-dir action handling should only submit action once when resubmitting an action after navigation", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again first -> second -> first -> second", + "name": "app-dir action handling should handle actions executed in quick succession", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again first -> third -> first -> third", + "name": "app-dir action handling should 404 when POSTing an invalid server action", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again first -> first-client -> first -> first-client", + "name": "app-dir action handling should be possible to catch network errors", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again first -> second-client -> first -> second-client", + "name": "app-dir action handling should be possible to catch regular errors", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second -> first -> second -> first", + "name": "app-dir action handling should forward action request to a worker that contains the action handler (node)", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second -> third -> second -> third", + "name": "app-dir action handling should forward action request to a worker that contains the action handler (edge)", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second -> first-client -> second -> first-client", + "name": "app-dir action handling Edge SSR should handle basic actions correctly", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second -> second-client -> second -> second-client", + "name": "app-dir action handling Edge SSR should return error response for hoc auth wrappers in edge runtime", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again third -> first -> third -> first", + "name": "app-dir action handling Edge SSR should handle redirect to a relative URL in a single pass", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again third -> second -> third -> second", + "name": "app-dir action handling Edge SSR should handle regular redirects", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again third -> first-client -> third -> first-client", + "name": "app-dir action handling Edge SSR should allow cookie and header async storages", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again third -> second-client -> third -> second-client", + "name": "app-dir action handling Edge SSR should handle unicode search params", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again first-client -> first -> first-client -> first", + "name": "app-dir action handling fetch actions should handle a fetch action initiated from a static page", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again first-client -> second -> first-client -> second", + "name": "app-dir action handling fetch actions should handle redirect to a relative URL in a single pass", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again first-client -> third -> first-client -> third", + "name": "app-dir action handling fetch actions should handle regular redirects", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again first-client -> second-client -> first-client -> second-client", + "name": "app-dir action handling fetch actions should handle redirects to routes that provide an invalid RSC response", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second-client -> first -> second-client -> first", + "name": "app-dir action handling fetch actions should handle revalidatePath", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second-client -> second -> second-client -> second", + "name": "app-dir action handling fetch actions should handle revalidateTag", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second-client -> third -> second-client -> third", - "status": "passed" + "name": "app-dir action handling fetch actions should store revalidation data in the prefetch cache", + "status": "failed", + "reason": "Fetch action prefetch cache test is flakey", + "link": "https://github.com/netlify/next-runtime-minimal/issues/444" }, { - "name": "css-order loose should load correct styles navigating back again second-client -> first-client -> second-client -> first-client", + "name": "app-dir action handling fetch actions should revalidate when cookies.set is called", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again interleaved-a -> interleaved-b -> interleaved-a -> interleaved-b", + "name": "app-dir action handling fetch actions should invalidate client cache on other routes when cookies.set is called", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again interleaved-b -> interleaved-a -> interleaved-b -> interleaved-a", + "name": "app-dir action handling fetch actions should revalidate when cookies.set is called in a client action", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again big-interleaved-a -> big-interleaved-b -> big-interleaved-a -> big-interleaved-b", + "name": "app-dir action handling fetch actions should invalidate client cache when tag is revalidated", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again big-interleaved-b -> big-interleaved-a -> big-interleaved-b -> big-interleaved-a", + "name": "app-dir action handling fetch actions should invalidate client cache when path is revalidated", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-first -> pages-second -> pages-first -> pages-second", + "name": "app-dir action handling encryption should send encrypted values from the closed over closure", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-first -> pages-third -> pages-first -> pages-third", + "name": "app-dir action handling redirects redirects properly when server action handler uses `redirect`", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-second -> pages-first -> pages-second -> pages-first", + "name": "app-dir action handling redirects redirects properly when server action handler uses `permanentRedirect`", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-second -> pages-third -> pages-second -> pages-third", + "name": "app-dir action handling redirects displays searchParams correctly when redirecting with SearchParams", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-third -> pages-first -> pages-third -> pages-first", + "name": "app-dir action handling redirects merges cookies correctly when redirecting", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-third -> pages-second -> pages-third -> pages-second", + "name": "app-dir action handling redirects redirects properly when server action handler redirects with a 307 status code", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b", + "name": "app-dir action handling redirects redirects properly when server action handler redirects with a 308 status code", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a", + "name": "app-dir action handling server actions render client components server component imported action should support importing client components from actions", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-reversed-a -> pages-reversed-b -> pages-reversed-a -> pages-reversed-b", + "name": "app-dir action handling caching disabled by default should use no-store as default for server action", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-reversed-b -> pages-reversed-a -> pages-reversed-b -> pages-reversed-a", + "name": "app-dir action handling caching disabled by default should not override force-cache in server action", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b", + "name": "app-dir action handling caching disabled by default should not override revalidate in server action", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a", - "status": "passed" + "name": "app-dir action handling should log a warning when a server action is not found but an id is provided", + "status": "skipped", + "reason": "Uses CLI output" }, { - "name": "css-order strict should load correct styles navigating first -> second", - "status": "passed" - }, + "name": "app-dir action handling should work with interception routes", + "status": "skipped", + "reason": "Uses CLI output" + } + ] + }, + { + "name": "dynamic-data", + "file": "test/e2e/app-dir/dynamic-data/dynamic-data.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ { - "name": "css-order strict should load correct styles navigating first -> third", + "name": "dynamic-data should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "i18n-hybrid", + "file": "test/e2e/app-dir/i18n-hybrid/i18n-hybrid.test.js", + "passed": 9, + "failed": 0, + "skipped": 0, + "total": "9", + "testCases": [ { - "name": "css-order strict should load correct styles navigating first -> first-client", + "name": "i18n-hybrid does not resolve /en-CA/blog/first-post", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating first -> second-client", + "name": "i18n-hybrid does not resolve /en-US/blog/first-post", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating second -> first", + "name": "i18n-hybrid does not resolve /fr-CA/blog/first-post", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating second -> third", + "name": "i18n-hybrid does not resolve /fr-FR/blog/first-post", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating second -> first-client", + "name": "i18n-hybrid does resolve /about", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating second -> second-client", + "name": "i18n-hybrid does resolve /en-CA/about", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating third -> first", + "name": "i18n-hybrid does resolve /en-US/about", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating third -> second", + "name": "i18n-hybrid does resolve /fr-CA/about", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating third -> first-client", + "name": "i18n-hybrid does resolve /fr-FR/about", "status": "passed" - }, + } + ] + }, + { + "name": "Error test if the loader file export a named function", + "file": "test/e2e/app-dir/loader-file-named-export-custom-loader-error/loader-file-named-export-custom-loader-error.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "5", + "testCases": [ { - "name": "css-order strict should load correct styles navigating third -> second-client", + "name": "Error test if the loader file export a named function in Development should skip next deploy", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating first-client -> first", + "name": "Error test if the loader file export a named function in Build and Start should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "app-dir - fetch warnings", + "file": "test/e2e/app-dir/logging/fetch-warning.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating first-client -> second", + "name": "app-dir - fetch warnings should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - next-image (with https)", + "file": "test/e2e/app-dir/next-image/next-image-https.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating first-client -> third", + "name": "app dir - next-image (with https) should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "pages-to-app-routing", + "file": "test/e2e/app-dir/pages-to-app-routing/pages-to-app-routing.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating first-client -> second-client", + "name": "pages-to-app-routing should work using browser", "status": "passed" - }, + } + ] + }, + { + "name": "parallel-routes-catchall-default", + "file": "test/e2e/app-dir/parallel-routes-catchall-default/parallel-routes-catchall-default.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating second-client -> first", + "name": "parallel-routes-catchall-default should match default paths before catch-all", "status": "passed" - }, + } + ] + }, + { + "name": "prefetching-not-found", + "file": "test/e2e/app-dir/prefetching-not-found/prefetching-not-found.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating second-client -> second", + "name": "prefetching-not-found should correctly navigate to/from a global 404 page when following links with prefetch=auto", "status": "passed" - }, + } + ] + }, + { + "name": "app-dir root layout render once", + "file": "test/e2e/app-dir/root-layout-render-once/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating second-client -> third", + "name": "app-dir root layout render once should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "Basic Module Include Paths Support", + "file": "test/e2e/app-dir/scss/basic-module-include-paths/basic-module-include-paths.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating second-client -> first-client", + "name": "Basic Module Include Paths Support should render the module", "status": "passed" - }, + } + ] + }, + { + "name": "CSS Module Composes Usage (External)", + "file": "test/e2e/app-dir/scss/composes-external/composes-external.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating interleaved-a -> interleaved-b", + "name": "CSS Module Composes Usage (External) should render the module", "status": "passed" - }, + } + ] + }, + { + "name": "Invalid SCSS in _document", + "file": "test/e2e/app-dir/scss/invalid-module-document/invalid-module-document.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "SCSS Support loader handling Preprocessor loader order", + "file": "test/e2e/app-dir/scss/loader-order/loader-order.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating interleaved-b -> interleaved-a", + "name": "SCSS Support loader handling Preprocessor loader order should render the module", "status": "passed" - }, + } + ] + }, + { + "name": "Has CSS Module in computed styles in Production", + "file": "test/e2e/app-dir/scss/prod-module/prod-module.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating big-interleaved-a -> big-interleaved-b", + "name": "Has CSS Module in computed styles in Production should render the page", "status": "passed" - }, + } + ] + }, + { + "name": "app-dir trailingSlash handling", + "file": "test/e2e/app-dir/trailingslash/trailingslash.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating big-interleaved-b -> big-interleaved-a", + "name": "app-dir trailingSlash handling should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "basePath", + "file": "test/e2e/basepath.test.ts", + "passed": 60, + "failed": 0, + "skipped": 3, + "total": "65", + "testCases": [ { - "name": "css-order strict should load correct styles navigating pages-first -> pages-second", + "name": "basePath should navigate to /404 correctly client-side", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-first -> pages-third", + "name": "basePath should navigate to /_error correctly client-side", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-second -> pages-first", + "name": "basePath should navigate to external site and back", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-second -> pages-third", + "name": "basePath should handle query/hash correctly during query updating #hello? $search", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-third -> pages-first", + "name": "basePath should handle query/hash correctly during query updating #? $search", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-third -> pages-second", + "name": "basePath should handle query/hash correctly during query updating ## $search", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-interleaved-a -> pages-interleaved-b", + "name": "basePath should handle query/hash correctly during query updating ##? $search", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-interleaved-b -> pages-interleaved-a", + "name": "basePath should handle query/hash correctly during query updating ##hello? $search", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-reversed-a -> pages-reversed-b", + "name": "basePath should handle query/hash correctly during query updating ##hello $search", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-reversed-b -> pages-reversed-a", + "name": "basePath should handle query/hash correctly during query updating #hello?world $search", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-partial-reversed-a -> pages-partial-reversed-b", + "name": "basePath should handle query/hash correctly during query updating #a ?hello=world", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-partial-reversed-b -> pages-partial-reversed-a", + "name": "basePath should handle query/hash correctly during query updating #a ?hello", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating first -> second", + "name": "basePath should handle query/hash correctly during query updating #a ?hello=", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating first -> third", + "name": "basePath should navigate back correctly to a dynamic route", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating first -> first-client", + "name": "basePath should respect basePath in amphtml link rel", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating first -> second-client", + "name": "basePath should prefetch pages correctly when manually called", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second -> first", + "name": "basePath should prefetch pages correctly in viewport with ", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second -> third", + "name": "basePath should 404 for public file without basePath", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second -> first-client", + "name": "basePath should serve public file with basePath correctly", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second -> second-client", + "name": "basePath should rewrite with basePath by default", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating third -> first", + "name": "basePath should not rewrite without basePath without disabling", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating third -> second", + "name": "basePath should not rewrite with basePath when set to false", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating third -> first-client", + "name": "basePath should rewrite without basePath when set to false", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating third -> second-client", + "name": "basePath should redirect with basePath by default", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating first-client -> first", + "name": "basePath should not redirect without basePath without disabling", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating first-client -> second", + "name": "basePath should not redirect with basePath when set to false", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating first-client -> third", + "name": "basePath should redirect without basePath when set to false", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating first-client -> second-client", + "name": "basePath should add header with basePath by default", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second-client -> first", + "name": "basePath should not add header without basePath without disabling", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second-client -> second", + "name": "basePath should not add header with basePath when set to false", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second-client -> third", + "name": "basePath should add header without basePath when set to false", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second-client -> first-client", + "name": "basePath should update dynamic params after mount correctly", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating interleaved-a -> interleaved-b", + "name": "basePath should navigate to index page with getStaticProps", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating interleaved-b -> interleaved-a", + "name": "basePath should work with nested folder with same name as basePath", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating big-interleaved-a -> big-interleaved-b", + "name": "basePath should work with normal dynamic page", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating big-interleaved-b -> big-interleaved-a", + "name": "basePath should work with hash links", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-first -> pages-second", + "name": "basePath should work with catch-all page", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-first -> pages-third", + "name": "basePath should redirect trailing slash correctly", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-second -> pages-first", + "name": "basePath should redirect trailing slash on root correctly", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-second -> pages-third", + "name": "basePath should navigate an absolute url", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-third -> pages-first", + "name": "basePath should 404 when manually adding basePath with ", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-third -> pages-second", + "name": "basePath should 404 when manually adding basePath with router.push", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-interleaved-a -> pages-interleaved-b", + "name": "basePath should 404 when manually adding basePath with router.replace", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-interleaved-b -> pages-interleaved-a", + "name": "basePath should show the hello page under the /docs prefix", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-reversed-a -> pages-reversed-b", + "name": "basePath should have correct router paths on first load of /", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-reversed-b -> pages-reversed-a", + "name": "basePath should have correct router paths on first load of /hello", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-partial-reversed-a -> pages-partial-reversed-b", + "name": "basePath should fetch data for getStaticProps without reloading", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-partial-reversed-b -> pages-partial-reversed-a", + "name": "basePath should fetch data for getServerSideProps without reloading", "status": "passed" }, { - "name": "css-order strict should load correct styles on first", + "name": "basePath should have correct href for a link", "status": "passed" }, { - "name": "css-order strict should load correct styles on second", + "name": "basePath should have correct href for a link to /", "status": "passed" }, { - "name": "css-order strict should load correct styles on third", + "name": "basePath should show the other-page page under the /docs prefix", "status": "passed" }, { - "name": "css-order strict should load correct styles on first-client", + "name": "basePath should have basePath field on Router", "status": "passed" }, { - "name": "css-order strict should load correct styles on second-client", + "name": "basePath should navigate to the page without refresh", "status": "passed" }, { - "name": "css-order strict should load correct styles on interleaved-a", + "name": "basePath should use urls with basepath in router events", "status": "passed" }, { - "name": "css-order strict should load correct styles on interleaved-b", + "name": "basePath should use urls with basepath in router events for hash changes", "status": "passed" }, { - "name": "css-order strict should load correct styles on big-interleaved-a", + "name": "basePath should use urls with basepath in router events for cancelled routes", "status": "passed" }, { - "name": "css-order strict should load correct styles on big-interleaved-b", + "name": "basePath should use urls with basepath in router events for failed route change", "status": "passed" }, { - "name": "css-order strict should load correct styles on reversed-a", + "name": "basePath should allow URL query strings without refresh", "status": "passed" }, { - "name": "css-order strict should load correct styles on reversed-b", + "name": "basePath should allow URL query strings on index without refresh", "status": "passed" }, { - "name": "css-order strict should load correct styles on partial-reversed-a", + "name": "basePath should correctly replace state when same asPath but different url", "status": "passed" }, { - "name": "css-order strict should load correct styles on partial-reversed-b", - "status": "passed" + "name": "basePath should not update URL for a 404", + "status": "skipped", + "reason": "Hard-coded Vercel error message" }, { - "name": "css-order strict should load correct styles on pages-first", - "status": "passed" + "name": "basePath should handle 404 urls that start with basePath", + "status": "skipped", + "reason": "Hard-coded Vercel error message" }, { - "name": "css-order strict should load correct styles on pages-second", - "status": "passed" - }, + "name": "basePath should show 404 for page not under the /docs prefix", + "status": "skipped", + "reason": "Hard-coded Vercel error message" + } + ] + }, + { + "name": "Middleware custom matchers basePath", + "file": "test/e2e/middleware-custom-matchers-basepath/test/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ { - "name": "css-order strict should load correct styles on pages-third", + "name": "Middleware custom matchers basePath should not match", "status": "passed" }, { - "name": "css-order strict should load correct styles on pages-interleaved-a", + "name": "Middleware custom matchers basePath should not match", "status": "passed" - }, + } + ] + }, + { + "name": "multi-zone", + "file": "test/e2e/multi-zone/multi-zone.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles on pages-interleaved-b", + "name": "multi-zone should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "og-api", + "file": "test/e2e/og-api/index.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ { - "name": "css-order strict should load correct styles on pages-reversed-a", + "name": "og-api should respond from index", "status": "passed" }, { - "name": "css-order strict should load correct styles on pages-reversed-b", + "name": "og-api should work in pages/api", "status": "passed" }, { - "name": "css-order strict should load correct styles on pages-partial-reversed-a", + "name": "og-api should work in app route", "status": "passed" }, { - "name": "css-order strict should load correct styles on pages-partial-reversed-b", + "name": "og-api should work in app route in node runtime", "status": "passed" - }, + } + ] + }, + { + "name": "useSelectedLayoutSegment(s) in Pages Router", + "file": "test/e2e/useselectedlayoutsegment-s-in-pages-router/useselectedlayoutsegment-s-in-pages-router.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order loose should load correct styles on first", + "name": "useSelectedLayoutSegment(s) in Pages Router Should render with `useSelectedLayoutSegment(s) hooks", "status": "passed" - }, + } + ] + }, + { + "name": "app a11y features", + "file": "test/e2e/app-dir/app-a11y/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order loose should load correct styles on second", + "name": "app a11y features should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "app-dir edge SSR", + "file": "test/e2e/app-dir/app-edge/app-edge.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order loose should load correct styles on third", + "name": "app-dir edge SSR should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "app-prefetch-static", + "file": "test/e2e/app-dir/app-prefetch-static/app-prefetch-static.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order loose should load correct styles on first-client", + "name": "app-prefetch-static should correctly navigate between static & dynamic pages", "status": "passed" - }, + } + ] + }, + { + "name": "app-custom-routes", + "file": "test/e2e/app-dir/app-routes/app-custom-route-base-path.test.ts", + "passed": 62, + "failed": 0, + "skipped": 2, + "total": "65", + "testCases": [ { - "name": "css-order loose should load correct styles on second-client", + "name": "app-custom-routes works with api prefix correctly statically generates correctly with no dynamic usage", "status": "passed" }, { - "name": "css-order loose should load correct styles on interleaved-a", + "name": "app-custom-routes works with api prefix correctly does not statically generate with dynamic usage", "status": "passed" }, { - "name": "css-order loose should load correct styles on interleaved-b", + "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/first/data.json", "status": "passed" }, { - "name": "css-order loose should load correct styles on big-interleaved-a", + "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/second/data.json", "status": "passed" }, { - "name": "css-order loose should load correct styles on big-interleaved-b", + "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/three/data.json", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-first", + "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/first/data.json", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-second", + "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/second/data.json", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-third", + "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/three/data.json", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-interleaved-a", + "name": "app-custom-routes basic fetch request with a response made via a GET request responds correctly on /basic/endpoint", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-interleaved-b", + "name": "app-custom-routes basic fetch request with a response made via a GET request responds correctly on /basic/vercel/endpoint", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-reversed-a", + "name": "app-custom-routes basic fetch request with a response made via a POST request responds correctly on /basic/endpoint", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-reversed-b", + "name": "app-custom-routes basic fetch request with a response made via a POST request responds correctly on /basic/vercel/endpoint", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-partial-reversed-a", + "name": "app-custom-routes basic fetch request with a response made via a PUT request responds correctly on /basic/endpoint", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-partial-reversed-b", + "name": "app-custom-routes basic fetch request with a response made via a PUT request responds correctly on /basic/vercel/endpoint", "status": "passed" - } - ] - }, - { - "name": "css-order strict", - "file": "test/e2e/app-dir/css-order/css-order.test.ts", - "passed": 175, - "failed": 1, - "skipped": 0, - "testCases": [ + }, { - "name": "css-order strict should load correct styles navigating back again first -> second -> first -> second", + "name": "app-custom-routes basic fetch request with a response made via a DELETE request responds correctly on /basic/endpoint", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again first -> third -> first -> third", + "name": "app-custom-routes basic fetch request with a response made via a DELETE request responds correctly on /basic/vercel/endpoint", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again first -> first-client -> first -> first-client", + "name": "app-custom-routes basic fetch request with a response made via a PATCH request responds correctly on /basic/endpoint", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again first -> second-client -> first -> second-client", + "name": "app-custom-routes basic fetch request with a response made via a PATCH request responds correctly on /basic/vercel/endpoint", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again second -> first -> second -> first", + "name": "app-custom-routes basic fetch request with a response abort via a GET request aborts without error on /basic/endpoint", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again second -> third -> second -> third", + "name": "app-custom-routes basic fetch request with a response abort via a GET request aborts without error on /basic/vercel/endpoint", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again second -> first-client -> second -> first-client", + "name": "app-custom-routes basic fetch request with a response abort via a POST request aborts without error on /basic/endpoint", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again second -> second-client -> second -> second-client", + "name": "app-custom-routes basic fetch request with a response abort via a POST request aborts without error on /basic/vercel/endpoint", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again third -> first -> third -> first", + "name": "app-custom-routes basic fetch request with a response abort via a PUT request aborts without error on /basic/endpoint", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again third -> second -> third -> second", + "name": "app-custom-routes basic fetch request with a response abort via a PUT request aborts without error on /basic/vercel/endpoint", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again third -> first-client -> third -> first-client", + "name": "app-custom-routes basic fetch request with a response abort via a DELETE request aborts without error on /basic/endpoint", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again third -> second-client -> third -> second-client", + "name": "app-custom-routes basic fetch request with a response abort via a DELETE request aborts without error on /basic/vercel/endpoint", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again first-client -> first -> first-client -> first", + "name": "app-custom-routes basic fetch request with a response abort via a PATCH request aborts without error on /basic/endpoint", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again first-client -> second -> first-client -> second", + "name": "app-custom-routes basic fetch request with a response abort via a PATCH request aborts without error on /basic/vercel/endpoint", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again first-client -> third -> first-client -> third", + "name": "app-custom-routes basic fetch request with a response route groups routes to the correct handler", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again first-client -> second-client -> first-client -> second-client", + "name": "app-custom-routes basic fetch request with a response request can read query parameters", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again second-client -> first -> second-client -> first", + "name": "app-custom-routes basic fetch request with a response request can read query parameters (edge)", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again second-client -> second -> second-client -> second", + "name": "app-custom-routes basic fetch request with a response response supports the NextResponse.redirect() helper", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again second-client -> third -> second-client -> third", + "name": "app-custom-routes basic fetch request with a response response supports the NextResponse.json() helper", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again second-client -> first-client -> second-client -> first-client", + "name": "app-custom-routes body can handle handle a streaming request and streaming response (edge)", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again interleaved-a -> interleaved-b -> interleaved-a -> interleaved-b", + "name": "app-custom-routes body can read a JSON encoded body", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again interleaved-b -> interleaved-a -> interleaved-b -> interleaved-a", + "name": "app-custom-routes body can read a JSON encoded body (edge)", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again big-interleaved-a -> big-interleaved-b -> big-interleaved-a -> big-interleaved-b", + "name": "app-custom-routes body can read a JSON encoded body for DELETE requests", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again big-interleaved-b -> big-interleaved-a -> big-interleaved-b -> big-interleaved-a", + "name": "app-custom-routes body can read a JSON encoded body for OPTIONS requests", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-first -> pages-second -> pages-first -> pages-second", + "name": "app-custom-routes body can read a streamed JSON encoded body (edge)", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-first -> pages-third -> pages-first -> pages-third", + "name": "app-custom-routes body can read the text body", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-second -> pages-first -> pages-second -> pages-first", - "status": "failed" + "name": "app-custom-routes body can read the text body (edge)", + "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-second -> pages-third -> pages-second -> pages-third", + "name": "app-custom-routes context provides params to routes with dynamic parameters", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-third -> pages-first -> pages-third -> pages-first", + "name": "app-custom-routes context provides params to routes with catch-all routes", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-third -> pages-second -> pages-third -> pages-second", + "name": "app-custom-routes context does not provide params to routes without dynamic parameters", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b", + "name": "app-custom-routes hooks headers gets the correct values", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a", + "name": "app-custom-routes hooks cookies gets the correct values", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-reversed-a -> pages-reversed-b -> pages-reversed-a -> pages-reversed-b", + "name": "app-custom-routes hooks req.cookies gets the correct values", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-reversed-b -> pages-reversed-a -> pages-reversed-b -> pages-reversed-a", + "name": "app-custom-routes hooks cookies().has() gets the correct values", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b", + "name": "app-custom-routes hooks redirect can respond correctly", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating back again pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a", + "name": "app-custom-routes hooks permanentRedirect can respond correctly", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again first -> second -> first -> second", + "name": "app-custom-routes hooks notFound can respond correctly in nodejs", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again first -> third -> first -> third", + "name": "app-custom-routes hooks notFound can respond correctly in edge", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again first -> first-client -> first -> first-client", + "name": "app-custom-routes error conditions responds with 405 (Method Not Allowed) when method is not implemented", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again first -> second-client -> first -> second-client", + "name": "app-custom-routes error conditions responds with 500 (Internal Server Error) when the handler throws an error", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second -> first -> second -> first", + "name": "app-custom-routes error conditions responds with 500 (Internal Server Error) when the handler calls NextResponse.next()", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second -> third -> second -> third", + "name": "app-custom-routes automatic implementations implements HEAD on routes with GET already implemented", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second -> first-client -> second -> first-client", + "name": "app-custom-routes automatic implementations implements OPTIONS on routes", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second -> second-client -> second -> second-client", + "name": "app-custom-routes edge functions returns response using edge runtime", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again third -> first -> third -> first", + "name": "app-custom-routes edge functions returns a response when headers are accessed", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again third -> second -> third -> second", + "name": "app-custom-routes dynamic = \"force-static\" strips search, headers, and domain from request", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again third -> first-client -> third -> first-client", + "name": "app-custom-routes customized metadata routes should work if conflict with metadata routes convention", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again third -> second-client -> third -> second-client", + "name": "app-custom-routes no bundle error should not print bundling warning about React", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again first-client -> first -> first-client -> first", - "status": "passed" + "name": "app-custom-routes no response returned should print an error when no response is returned", + "status": "skipped", + "reason": "Uses CLI output" }, { - "name": "css-order loose should load correct styles navigating back again first-client -> second -> first-client -> second", + "name": "app-custom-routes error conditions responds with 400 (Bad Request) when the requested method is not a valid HTTP method", + "status": "skipped", + "reason": "Uses CLI output" + } + ] + }, + { + "name": "dynamic-interception-route-revalidate", + "file": "test/e2e/app-dir/dynamic-interception-route-revalidate/dynamic-interception-route-revalidate.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "dynamic-interception-route-revalidate should refresh the dynamic intercepted route when the interception route is revalidated", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - global error", + "file": "test/e2e/app-dir/global-error/basic/index.test.ts", + "passed": 6, + "failed": 0, + "skipped": 0, + "total": "6", + "testCases": [ { - "name": "css-order loose should load correct styles navigating back again first-client -> third -> first-client -> third", + "name": "app dir - global error should trigger error component when an error happens during rendering", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again first-client -> second-client -> first-client -> second-client", + "name": "app dir - global error should render global error for error in server components", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second-client -> first -> second-client -> first", + "name": "app dir - global error should render global error for error in client components", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second-client -> second -> second-client -> second", + "name": "app dir - global error should catch metadata error in error boundary if presented", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second-client -> third -> second-client -> third", + "name": "app dir - global error should catch metadata error in global-error if no error boundary is presented", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again second-client -> first-client -> second-client -> first-client", + "name": "app dir - global error should catch the client error thrown in the nested routes", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - metadata dynamic routes", + "file": "test/e2e/app-dir/metadata-dynamic-routes/index.test.ts", + "passed": 10, + "failed": 0, + "skipped": 12, + "total": "19", + "testCases": [ { - "name": "css-order loose should load correct styles navigating back again interleaved-a -> interleaved-b -> interleaved-a -> interleaved-b", + "name": "app dir - metadata dynamic routes text routes should not throw if client components are imported but not used", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again interleaved-b -> interleaved-a -> interleaved-b -> interleaved-a", + "name": "app dir - metadata dynamic routes text routes should support alternate.languages in sitemap", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again big-interleaved-a -> big-interleaved-b -> big-interleaved-a -> big-interleaved-b", + "name": "app dir - metadata dynamic routes social image routes should support generate multi images with generateImageMetadata", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again big-interleaved-b -> big-interleaved-a -> big-interleaved-b -> big-interleaved-a", + "name": "app dir - metadata dynamic routes social image routes should support generate multi sitemaps with generateSitemaps", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-first -> pages-second -> pages-first -> pages-second", + "name": "app dir - metadata dynamic routes social image routes should fill params into dynamic routes url of metadata images", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-first -> pages-third -> pages-first -> pages-third", + "name": "app dir - metadata dynamic routes social image routes should support params as argument in dynamic routes", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-second -> pages-first -> pages-second -> pages-first", + "name": "app dir - metadata dynamic routes social image routes should fill params into routes groups url of static images", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-second -> pages-third -> pages-second -> pages-third", + "name": "app dir - metadata dynamic routes social image routes should handle custom fonts in both edge and nodejs runtime", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-third -> pages-first -> pages-third -> pages-first", + "name": "app dir - metadata dynamic routes should generate unique path for image routes under group routes", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-third -> pages-second -> pages-third -> pages-second", + "name": "app dir - metadata dynamic routes should pick configured metadataBase instead of deployment url for canonical url", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating back again pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b", - "status": "passed" + "name": "app dir - metadata dynamic routes text routes should handle robots.[ext] dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" }, { - "name": "css-order loose should load correct styles navigating back again pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a", - "status": "passed" + "name": "app dir - metadata dynamic routes text routes should handle sitemap.[ext] dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" }, { - "name": "css-order loose should load correct styles navigating back again pages-reversed-a -> pages-reversed-b -> pages-reversed-a -> pages-reversed-b", - "status": "passed" + "name": "app dir - metadata dynamic routes robots.txt should handle robots.[ext] dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" }, { - "name": "css-order loose should load correct styles navigating back again pages-reversed-b -> pages-reversed-a -> pages-reversed-b -> pages-reversed-a", - "status": "passed" + "name": "app dir - metadata dynamic routes sitemap should handle sitemap.[ext] dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" }, { - "name": "css-order loose should load correct styles navigating back again pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b", - "status": "passed" + "name": "app dir - metadata dynamic routes robots.txt should handle sitemap.[ext] dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" }, { - "name": "css-order loose should load correct styles navigating back again pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a", - "status": "passed" + "name": "app dir - metadata dynamic routes social image routes should handle manifest.[ext] dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" }, { - "name": "css-order strict should load correct styles navigating first -> second", - "status": "passed" + "name": "app dir - metadata dynamic routes social image routes should render og image with opengraph-image dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" }, { - "name": "css-order strict should load correct styles navigating first -> third", - "status": "passed" + "name": "app dir - metadata dynamic routes social image routes should render og image with twitter-image dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" }, { - "name": "css-order strict should load correct styles navigating first -> first-client", - "status": "passed" + "name": "app dir - metadata dynamic routes icon image routes should render icon with dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" }, { - "name": "css-order strict should load correct styles navigating first -> second-client", - "status": "passed" + "name": "app dir - metadata dynamic routes icon image routes should render apple icon with dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" }, { - "name": "css-order strict should load correct styles navigating second -> first", - "status": "passed" + "name": "app dir - metadata dynamic routes should inject dynamic metadata properly to head", + "status": "skipped", + "reason": "Header whitespace mismatch" }, { - "name": "css-order strict should load correct styles navigating second -> third", + "name": "app dir - metadata dynamic routes should use localhost for local prod and fallback to deployment url when metadataBase is falsy", + "status": "skipped", + "reason": "Header whitespace mismatch" + } + ] + }, + { + "name": "app dir - next config", + "file": "test/e2e/app-dir/next-config/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - next config should support importing webpack in next.config", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - not-found - group route", + "file": "test/e2e/app-dir/not-found/group-route/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating second -> first-client", + "name": "app dir - not-found - group route should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "parallel-routes-and-interception", + "file": "test/e2e/app-dir/parallel-routes-and-interception/parallel-routes-and-interception.test.ts", + "passed": 24, + "failed": 0, + "skipped": 2, + "total": "25", + "testCases": [ { - "name": "css-order strict should load correct styles navigating second -> second-client", + "name": "parallel-routes-and-interception parallel routes should support parallel route tab bars", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating third -> first", + "name": "parallel-routes-and-interception parallel routes should match parallel routes", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating third -> second", + "name": "parallel-routes-and-interception parallel routes should match parallel routes in route groups", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating third -> first-client", + "name": "parallel-routes-and-interception parallel routes should throw a 404 when no matching parallel route is found", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating third -> second-client", + "name": "parallel-routes-and-interception parallel routes should render nested parallel routes", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating first-client -> first", + "name": "parallel-routes-and-interception parallel routes should support layout files in parallel routes", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating first-client -> second", + "name": "parallel-routes-and-interception parallel routes should only scroll to the parallel route that was navigated to", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating first-client -> third", + "name": "parallel-routes-and-interception parallel routes should apply the catch-all route to the parallel route if no matching route is found", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating first-client -> second-client", + "name": "parallel-routes-and-interception parallel routes should match the catch-all routes of the more specific path, if there is more than one catch-all route", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating second-client -> first", + "name": "parallel-routes-and-interception parallel routes should navigate with a link with prefetch=false", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating second-client -> second", + "name": "parallel-routes-and-interception parallel routes should display all parallel route params with useParams", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating second-client -> third", + "name": "parallel-routes-and-interception parallel routes should load CSS for a default page that exports another page", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating second-client -> first-client", + "name": "parallel-routes-and-interception parallel routes should handle a loading state", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating interleaved-a -> interleaved-b", + "name": "parallel-routes-and-interception route intercepting with dynamic routes should render intercepted route", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating interleaved-b -> interleaved-a", + "name": "parallel-routes-and-interception route intercepting with dynamic optional catch-all routes should render intercepted route", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating big-interleaved-a -> big-interleaved-b", + "name": "parallel-routes-and-interception route intercepting with dynamic catch-all routes should render intercepted route", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating big-interleaved-b -> big-interleaved-a", + "name": "parallel-routes-and-interception route intercepting should render intercepted route", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-first -> pages-second", + "name": "parallel-routes-and-interception route intercepting should render an intercepted route from a slot", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-first -> pages-third", + "name": "parallel-routes-and-interception route intercepting should render an intercepted route at the top level from a nested path", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-second -> pages-first", + "name": "parallel-routes-and-interception route intercepting should render intercepted route from a nested route", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-second -> pages-third", + "name": "parallel-routes-and-interception route intercepting should re-render the layout on the server when it had a default child route", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-third -> pages-first", + "name": "parallel-routes-and-interception route intercepting should render modal when paired with parallel routes", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-third -> pages-second", + "name": "parallel-routes-and-interception route intercepting should support intercepting with beforeFiles rewrites", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-interleaved-a -> pages-interleaved-b", + "name": "parallel-routes-and-interception route intercepting should support intercepting local dynamic sibling routes", "status": "passed" }, { - "name": "css-order strict should load correct styles navigating pages-interleaved-b -> pages-interleaved-a", - "status": "passed" + "name": "parallel-routes-and-interception parallel routes should gracefully handle when two page segments match the `children` parallel slot", + "status": "skipped", + "reason": "Tries to patch deployed files" }, { - "name": "css-order strict should load correct styles navigating pages-reversed-a -> pages-reversed-b", + "name": "parallel-routes-and-interception with patching should gracefully handle when two page segments match the `children` parallel slot", + "status": "skipped", + "reason": "Tries to patch deployed files" + } + ] + }, + { + "name": "Dynamic Route CSS Module Usage", + "file": "test/e2e/app-dir/scss/dynamic-route-module/dynamic-route-module.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Dynamic Route CSS Module Usage should apply styles correctly", "status": "passed" - }, + } + ] + }, + { + "name": "CSS Import from node_modules", + "file": "test/e2e/app-dir/scss/npm-import-bad/npm-import-bad.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "Basic Global Support scss", + "file": "test/e2e/app-dir/scss/single-global/single-global.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating pages-reversed-b -> pages-reversed-a", + "name": "Basic Global Support scss should render the page", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - taint", + "file": "test/e2e/app-dir/taint/process-taint.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles navigating pages-partial-reversed-a -> pages-partial-reversed-b", + "name": "app dir - taint should error when passing process env to client component", "status": "passed" - }, + } + ] + }, + { + "name": "basePath + trailingSlash", + "file": "test/e2e/basepath-trailing-slash.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ { - "name": "css-order strict should load correct styles navigating pages-partial-reversed-b -> pages-partial-reversed-a", + "name": "basePath + trailingSlash should allow URL query strings without refresh", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating first -> second", + "name": "basePath + trailingSlash should allow URL query strings on index without refresh", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating first -> third", + "name": "basePath + trailingSlash should correctly replace state when same asPath but different url", "status": "passed" - }, + } + ] + }, + { + "name": "Configurable runtime for src/pages and API routes", + "file": "test/e2e/edge-configurable-runtime/index.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [] + }, + { + "name": "edge-render-getserversideprops", + "file": "test/e2e/edge-pages-support/index.test.ts", + "passed": 8, + "failed": 0, + "skipped": 0, + "total": "8", + "testCases": [ { - "name": "css-order loose should load correct styles navigating first -> first-client", + "name": "edge-render-getserversideprops should have correct query for pages/api", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating first -> second-client", + "name": "edge-render-getserversideprops should have correct query for pages/api dynamic", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second -> first", + "name": "edge-render-getserversideprops should have correct query/params on index", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second -> third", + "name": "edge-render-getserversideprops should have correct query/params on /[id]", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second -> first-client", + "name": "edge-render-getserversideprops should have correct query/params on rewrite", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second -> second-client", - "status": "passed" - }, - { - "name": "css-order loose should load correct styles navigating third -> first", + "name": "edge-render-getserversideprops should have correct query/params on dynamic rewrite", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating third -> second", + "name": "edge-render-getserversideprops should respond to _next/data for index correctly", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating third -> first-client", + "name": "edge-render-getserversideprops should respond to _next/data for [id] correctly", "status": "passed" - }, + } + ] + }, + { + "name": "i18n-disallow-multiple-locales", + "file": "test/e2e/i18n-disallow-multiple-locales/i18n-disallow-multiple-locales.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order loose should load correct styles navigating third -> second-client", + "name": "i18n-disallow-multiple-locales should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "i18n-ignore-redirect-source-locale", + "file": "test/e2e/i18n-ignore-redirect-source-locale/redirects.test.ts", + "passed": 16, + "failed": 0, + "skipped": 0, + "total": "16", + "testCases": [ { - "name": "css-order loose should load correct styles navigating first-client -> first", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: to: sv", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating first-client -> second", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /en to: sv", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating first-client -> third", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /sv to: sv", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating first-client -> second-client", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /nl to: sv", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second-client -> first", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: to: en", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second-client -> second", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /en to: en", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second-client -> third", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /sv to: en", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating second-client -> first-client", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /nl to: en", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating interleaved-a -> interleaved-b", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: to: /", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating interleaved-b -> interleaved-a", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /en to: /", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating big-interleaved-a -> big-interleaved-b", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /sv to: /", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating big-interleaved-b -> big-interleaved-a", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /nl to: /", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-first -> pages-second", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from and to: ", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-first -> pages-third", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from and to: /en", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-second -> pages-first", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from and to: /sv", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-second -> pages-third", + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from and to: /nl", "status": "passed" - }, + } + ] + }, + { + "name": "Middleware custom matchers basePath", + "file": "test/e2e/middleware-dynamic-basepath-matcher/test/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ { - "name": "css-order loose should load correct styles navigating pages-third -> pages-first", + "name": "Middleware custom matchers basePath should not match", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-third -> pages-second", + "name": "Middleware custom matchers basePath should not match", "status": "passed" - }, + } + ] + }, + { + "name": "New Link Behavior with material-ui", + "file": "test/e2e/new-link-behavior/material-ui.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order loose should load correct styles navigating pages-interleaved-a -> pages-interleaved-b", + "name": "New Link Behavior with material-ui should render MuiLink with ", "status": "passed" - }, + } + ] + }, + { + "name": "next/font/google fetch error", + "file": "test/e2e/next-font/google-fetch-error.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order loose should load correct styles navigating pages-interleaved-b -> pages-interleaved-a", + "name": "next/font/google fetch error should skip next deploy for now", "status": "passed" - }, + } + ] + }, + { + "name": "next-image-forward-ref", + "file": "test/e2e/next-image-forward-ref/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order loose should load correct styles navigating pages-reversed-a -> pages-reversed-b", + "name": "next-image-forward-ref allows framer-motion to animate opacity", "status": "passed" - }, + } + ] + }, + { + "name": "reload-scroll-back-restoration", + "file": "test/e2e/reload-scroll-backforward-restoration/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "css-order loose should load correct styles navigating pages-reversed-b -> pages-reversed-a", + "name": "reload-scroll-back-restoration should restore the scroll position on navigating back", "status": "passed" }, { - "name": "css-order loose should load correct styles navigating pages-partial-reversed-a -> pages-partial-reversed-b", + "name": "reload-scroll-back-restoration should restore the scroll position on navigating forward", "status": "passed" - }, + } + ] + }, + { + "name": "testmode", + "file": "test/e2e/testmode/testmode.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order loose should load correct styles navigating pages-partial-reversed-b -> pages-partial-reversed-a", + "name": "testmode should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "app-dir alias", + "file": "test/e2e/app-dir/app-alias/app-alias.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles on first", + "name": "app-dir alias should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "app-dir edge runtime root layout", + "file": "test/e2e/app-dir/app-edge-root-layout/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles on second", + "name": "app-dir edge runtime root layout should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "referencing a client component in an app route", + "file": "test/e2e/app-dir/app-routes-client-component/app-routes-client-component.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles on third", + "name": "referencing a client component in an app route responds without error", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - not-found - basic", + "file": "test/e2e/app-dir/not-found/basic/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles on first-client", + "name": "app dir - not-found - basic should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "parallel-routes-and-interception", + "file": "test/e2e/app-dir/parallel-routes-not-found/parallel-routes-not-found.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles on second-client", + "name": "parallel-routes-and-interception should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "route-page-manifest-bug", + "file": "test/e2e/app-dir/route-page-manifest-bug/route-page-manifest-bug.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles on interleaved-a", + "name": "route-page-manifest-bug should work when requesting route handler after page", "status": "passed" - }, + } + ] + }, + { + "name": "Basic Module Prepend Data Support", + "file": "test/e2e/app-dir/scss/basic-module-prepend-data/basic-module-prepend-data.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles on interleaved-b", + "name": "Basic Module Prepend Data Support should render the module", "status": "passed" - }, + } + ] + }, + { + "name": "SCSS Support", + "file": "test/e2e/app-dir/scss/compilation-and-prefixing/compilation-and-prefixing.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "css-order strict should load correct styles on big-interleaved-a", + "name": "SCSS Support Production only CSS Compilation and Prefixing should've compiled and prefixed", "status": "passed" }, { - "name": "css-order strict should load correct styles on big-interleaved-b", + "name": "SCSS Support Production only CSS Compilation and Prefixing should've emitted a source map", "status": "passed" - }, - { - "name": "css-order strict should load correct styles on reversed-a", + } + ] + }, + { + "name": "Invalid CSS Module Usage in node_modules", + "file": "test/e2e/app-dir/scss/invalid-module/invalid-module.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "(SCSS) Multi Global Support (reversed)", + "file": "test/e2e/app-dir/scss/multi-global-reversed/multi-global-reversed.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "(SCSS) Multi Global Support (reversed) should render the page", "status": "passed" - }, + } + ] + }, + { + "name": "Scss Mixins", + "file": "test/e2e/app-dir/scss/scss-mixins/scss-mixins.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles on reversed-b", + "name": "Scss Mixins should work using browser", "status": "passed" - }, + } + ] + }, + { + "name": "server-actions-relative-redirect", + "file": "test/e2e/app-dir/server-actions-relative-redirect/server-actions-relative-redirect.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "css-order strict should load correct styles on partial-reversed-a", + "name": "server-actions-relative-redirect should work with relative redirect", "status": "passed" }, { - "name": "css-order strict should load correct styles on partial-reversed-b", + "name": "server-actions-relative-redirect should work with absolute redirect", "status": "passed" - }, + } + ] + }, + { + "name": "turbopack-reports", + "file": "test/e2e/app-dir/turbopack-reports/turbopack-reports.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles on pages-first", + "name": "turbopack-reports should render page importing sqlite3", "status": "passed" - }, + } + ] + }, + { + "name": "promise export", + "file": "test/e2e/config-promise-export/promise.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles on pages-second", + "name": "promise export should work", "status": "passed" - }, + } + ] + }, + { + "name": "fetch failures have good stack traces in edge runtime", + "file": "test/e2e/fetch-failures-have-good-stack-traces-in-edge-runtime/fetch-failures-have-good-stack-traces-in-edge-runtime.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "css-order strict should load correct styles on pages-third", + "name": "fetch failures have good stack traces in edge runtime should skip next deploy", "status": "passed" + } + ] + }, + { + "name": "i18n-ignore-rewrite-source-locale with basepath", + "file": "test/e2e/i18n-ignore-rewrite-source-locale/rewrites-with-basepath.test.ts", + "passed": 4, + "failed": 4, + "skipped": 0, + "total": "8", + "testCases": [ + { + "name": "i18n-ignore-rewrite-source-locale with basepath get public file by skipping locale in rewrite, locale: ", + "status": "failed", + "reason": "Middleware on sites with i18n cannot rewrite to static files", + "link": "https://github.com/netlify/next-runtime-minimal/issues/383" }, { - "name": "css-order strict should load correct styles on pages-interleaved-a", - "status": "passed" + "name": "i18n-ignore-rewrite-source-locale with basepath get public file by skipping locale in rewrite, locale: /en", + "status": "failed", + "reason": "Middleware on sites with i18n cannot rewrite to static files", + "link": "https://github.com/netlify/next-runtime-minimal/issues/383" }, { - "name": "css-order strict should load correct styles on pages-interleaved-b", - "status": "passed" + "name": "i18n-ignore-rewrite-source-locale with basepath get public file by skipping locale in rewrite, locale: /sv", + "status": "failed", + "reason": "Middleware on sites with i18n cannot rewrite to static files", + "link": "https://github.com/netlify/next-runtime-minimal/issues/383" }, { - "name": "css-order strict should load correct styles on pages-reversed-a", - "status": "passed" + "name": "i18n-ignore-rewrite-source-locale with basepath get public file by skipping locale in rewrite, locale: /nl", + "status": "failed", + "reason": "Middleware on sites with i18n cannot rewrite to static files", + "link": "https://github.com/netlify/next-runtime-minimal/issues/383" }, { - "name": "css-order strict should load correct styles on pages-reversed-b", + "name": "i18n-ignore-rewrite-source-locale with basepath call api by skipping locale in rewrite, locale: ", "status": "passed" }, { - "name": "css-order strict should load correct styles on pages-partial-reversed-a", + "name": "i18n-ignore-rewrite-source-locale with basepath call api by skipping locale in rewrite, locale: /en", "status": "passed" }, { - "name": "css-order strict should load correct styles on pages-partial-reversed-b", + "name": "i18n-ignore-rewrite-source-locale with basepath call api by skipping locale in rewrite, locale: /sv", "status": "passed" }, { - "name": "css-order loose should load correct styles on first", + "name": "i18n-ignore-rewrite-source-locale with basepath call api by skipping locale in rewrite, locale: /nl", + "status": "passed" + } + ] + }, + { + "name": "instrumentation-hook-rsc", + "file": "test/e2e/instrumentation-hook-src/instrumentation-hook-src.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "instrumentation-hook-rsc instrumentation should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "Middleware Redirect", + "file": "test/e2e/middleware-redirects/test/index.test.ts", + "passed": 18, + "failed": 0, + "skipped": 0, + "total": "18", + "testCases": [ + { + "name": "Middleware Redirect should redirect correctly with redirect in next.config.js", "status": "passed" }, { - "name": "css-order loose should load correct styles on second", + "name": "Middleware Redirect does not include the locale in redirects by default", "status": "passed" }, { - "name": "css-order loose should load correct styles on third", + "name": "Middleware Redirect should redirect to data urls with data requests and internal redirects", "status": "passed" }, { - "name": "css-order loose should load correct styles on first-client", + "name": "Middleware Redirect should redirect to external urls with data requests and external redirects", "status": "passed" }, { - "name": "css-order loose should load correct styles on second-client", + "name": "Middleware Redirect should redirect", "status": "passed" }, { - "name": "css-order loose should load correct styles on interleaved-a", + "name": "Middleware Redirect should implement internal redirects", "status": "passed" }, { - "name": "css-order loose should load correct styles on interleaved-b", + "name": "Middleware Redirect should redirect cleanly with the original url param", "status": "passed" }, { - "name": "css-order loose should load correct styles on big-interleaved-a", + "name": "Middleware Redirect should redirect multiple times", "status": "passed" }, { - "name": "css-order loose should load correct styles on big-interleaved-b", + "name": "Middleware Redirect should redirect (infinite-loop)", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-first", + "name": "Middleware Redirect should redirect to api route with locale", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-second", + "name": "Middleware Redirect should redirect with a fragment", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-third", + "name": "Middleware Redirect /fr should redirect", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-interleaved-a", + "name": "Middleware Redirect /fr should implement internal redirects", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-interleaved-b", + "name": "Middleware Redirect /fr should redirect cleanly with the original url param", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-reversed-a", + "name": "Middleware Redirect /fr should redirect multiple times", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-reversed-b", + "name": "Middleware Redirect /fr should redirect (infinite-loop)", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-partial-reversed-a", + "name": "Middleware Redirect /fr should redirect to api route with locale", "status": "passed" }, { - "name": "css-order loose should load correct styles on pages-partial-reversed-b", + "name": "Middleware Redirect /fr should redirect with a fragment", "status": "passed" } ] }, { - "name": "app-dir - errors", - "file": "test/e2e/app-dir/errors/index.test.ts", + "name": "next/font/google with-font-declarations-file", + "file": "test/e2e/next-font/with-font-declarations-file.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app-dir - errors should skip next deploy", + "name": "next/font/google with-font-declarations-file should skip next deploy for now", "status": "passed" } ] }, { - "name": "app dir - global error - with catch-all route", - "file": "test/e2e/app-dir/global-error/catch-all/index.test.ts", - "passed": 1, + "name": "_allow-underscored-root-directory", + "file": "test/e2e/app-dir/_allow-underscored-root-directory/_allow-underscored-root-directory.test.ts", + "passed": 3, "failed": 0, "skipped": 0, + "total": "3", "testCases": [ { - "name": "app dir - global error - with catch-all route should skip next deploy", + "name": "_allow-underscored-root-directory should not serve app path with underscore", + "status": "passed" + }, + { + "name": "_allow-underscored-root-directory should pages path with a underscore at the root", + "status": "passed" + }, + { + "name": "_allow-underscored-root-directory should serve app path with %5F", "status": "passed" } ] }, { - "name": "hello-world", - "file": "test/e2e/app-dir/hello-world/hello-world.test.ts", - "passed": 4, + "name": "custom-app-server-action-redirect", + "file": "test/e2e/app-dir/app-basepath-custom-server/index.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "hello-world should work using cheerio", - "status": "passed" - }, - { - "name": "hello-world should work using browser", + "name": "custom-app-server-action-redirect should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - css", + "file": "test/e2e/app-dir/app-css/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "hello-world should work with html", + "name": "app dir - css should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "app-dir assetPrefix with basePath handling", + "file": "test/e2e/app-dir/asset-prefix-with-basepath/asset-prefix-with-basepath.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "6", + "testCases": [ { - "name": "hello-world should work with fetch", + "name": "app-dir assetPrefix with basePath handling should skip next deploy", "status": "passed" } ] }, { - "name": "i18n-hybrid", - "file": "test/e2e/app-dir/i18n-hybrid/i18n-hybrid.test.js", - "passed": 9, + "name": "dynamic-href", + "file": "test/e2e/app-dir/dynamic-href/dynamic-href.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "i18n-hybrid does not resolve /en-CA/blog/first-post", - "status": "passed" - }, - { - "name": "i18n-hybrid does not resolve /en-US/blog/first-post", - "status": "passed" - }, - { - "name": "i18n-hybrid does not resolve /fr-CA/blog/first-post", - "status": "passed" - }, - { - "name": "i18n-hybrid does not resolve /fr-FR/blog/first-post", - "status": "passed" - }, - { - "name": "i18n-hybrid does resolve /about", - "status": "passed" - }, - { - "name": "i18n-hybrid does resolve /en-CA/about", - "status": "passed" - }, - { - "name": "i18n-hybrid does resolve /en-US/about", - "status": "passed" - }, - { - "name": "i18n-hybrid does resolve /fr-CA/about", - "status": "passed" - }, - { - "name": "i18n-hybrid does resolve /fr-FR/about", + "name": "dynamic-href should skip next deploy", "status": "passed" } ] }, { - "name": "interception-routes-root-catchall", - "file": "test/e2e/app-dir/interception-routes-root-catchall/interception-routes-root-catchall.test.ts", - "passed": 2, + "name": "app dir - emotion-js", + "file": "test/e2e/app-dir/emotion-js/index.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "interception-routes-root-catchall should support having a root catch-all and a catch-all in a parallel route group", - "status": "passed" - }, - { - "name": "interception-routes-root-catchall should handle non-intercepted catch-all pages", + "name": "app dir - emotion-js should skip next deploy", "status": "passed" } ] }, { - "name": "Error test if the loader file export a named function", - "file": "test/e2e/app-dir/loader-file-named-export-custom-loader-error/loader-file-named-export-custom-loader-error.test.ts", - "passed": 2, + "name": "app dir - hooks", + "file": "test/e2e/app-dir/hooks/hooks.test.ts", + "passed": 25, "failed": 0, "skipped": 0, + "total": "25", "testCases": [ { - "name": "Error test if the loader file export a named function in Development should skip next deploy", + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/static", "status": "passed" }, { - "name": "Error test if the loader file export a named function in Build and Start should skip next deploy", + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/1", "status": "passed" - } - ] - }, - { - "name": "mdx with-mdx-rs", - "file": "test/e2e/app-dir/mdx/mdx.test.ts", - "passed": 22, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "mdx with-mdx-rs app directory should work in initial html", + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/2", "status": "passed" }, { - "name": "mdx with-mdx-rs app directory should work using browser", + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/1/account", "status": "passed" }, { - "name": "mdx with-mdx-rs app directory should work in initial html with mdx import", + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/static", "status": "passed" }, { - "name": "mdx with-mdx-rs app directory should work using browser with mdx import", + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/1", "status": "passed" }, { - "name": "mdx with-mdx-rs app directory should allow overriding components", + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/2", "status": "passed" }, { - "name": "mdx with-mdx-rs app directory should allow importing client components", + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/1/account", "status": "passed" }, { - "name": "mdx with-mdx-rs pages directory should work in initial html", + "name": "app dir - hooks usePathname should have the correct pathname", "status": "passed" }, { - "name": "mdx with-mdx-rs pages directory should work using browser", + "name": "app dir - hooks usePathname should have the canonical url pathname on rewrite", "status": "passed" }, { - "name": "mdx with-mdx-rs pages directory should work in initial html with mdx import", + "name": "app dir - hooks useSearchParams should have the correct search params", "status": "passed" }, { - "name": "mdx with-mdx-rs pages directory should work using browser with mdx import", + "name": "app dir - hooks useDraftMode should use initial rand when draft mode be disabled", "status": "passed" }, { - "name": "mdx with-mdx-rs pages directory should allow overriding components", + "name": "app dir - hooks useDraftMode should generate rand when draft mode enabled", "status": "passed" }, { - "name": "mdx without-mdx-rs app directory should work in initial html", + "name": "app dir - hooks useRouter should allow access to the router", "status": "passed" }, { - "name": "mdx without-mdx-rs app directory should work using browser", + "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/first", "status": "passed" }, { - "name": "mdx without-mdx-rs app directory should work in initial html with mdx import", + "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/first/slug1", "status": "passed" }, { - "name": "mdx without-mdx-rs app directory should work using browser with mdx import", + "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/first/slug2/second", "status": "passed" }, { - "name": "mdx without-mdx-rs app directory should allow overriding components", + "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/first/slug2/second/a/b", "status": "passed" }, { - "name": "mdx without-mdx-rs app directory should allow importing client components", + "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/rewritten", "status": "passed" }, { - "name": "mdx without-mdx-rs pages directory should work in initial html", + "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/rewritten-middleware", "status": "passed" }, { - "name": "mdx without-mdx-rs pages directory should work using browser", + "name": "app dir - hooks useSelectedLayoutSegments should return an empty array in pages", "status": "passed" }, { - "name": "mdx without-mdx-rs pages directory should work in initial html with mdx import", + "name": "app dir - hooks useSelectedLayoutSegment should have the correct layout segment at /hooks/use-selected-layout-segment/first", "status": "passed" }, { - "name": "mdx without-mdx-rs pages directory should work using browser with mdx import", + "name": "app dir - hooks useSelectedLayoutSegment should have the correct layout segment at /hooks/use-selected-layout-segment/first/slug1", "status": "passed" }, { - "name": "mdx without-mdx-rs pages directory should allow overriding components", + "name": "app dir - hooks useSelectedLayoutSegment should have the correct layout segment at /hooks/use-selected-layout-segment/first/slug2/second/a/b", + "status": "passed" + }, + { + "name": "app dir - hooks useSelectedLayoutSegment should return null in pages", "status": "passed" } ] }, { - "name": "app dir - metadata dynamic routes suspense", - "file": "test/e2e/app-dir/metadata-suspense/index.test.ts", + "name": "app dir - Metadata API on the Edge runtime", + "file": "test/e2e/app-dir/metadata-edge/index.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app dir - metadata dynamic routes suspense should skip next deploy", + "name": "app dir - Metadata API on the Edge runtime should render OpenGraph image meta tag correctly", "status": "passed" } ] }, { - "name": "mjs as extension", - "file": "test/e2e/app-dir/mjs-as-extension/mjs-as-extension.test.ts", - "passed": 1, + "name": "app dir - next/font", + "file": "test/e2e/app-dir/next-font/next-font.test.ts", + "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "mjs as extension should render the page correctly", + "name": "app dir - next/font app app dir - next-font should skip next deploy", + "status": "passed" + }, + { + "name": "app dir - next/font app-old app dir - next-font should skip next deploy", "status": "passed" } ] }, { - "name": "app dir - next config", - "file": "test/e2e/app-dir/next-config/index.test.ts", + "name": "app dir - group routes with root not-found", + "file": "test/e2e/app-dir/not-found/group-route-root-not-found/index.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app dir - next config should support importing webpack in next.config", + "name": "app dir - group routes with root not-found should skip next deploy", "status": "passed" } ] }, { - "name": "app dir - next-image (with https)", - "file": "test/e2e/app-dir/next-image/next-image-https.test.ts", - "passed": 1, + "name": "parallel-routes-and-interception-basepath", + "file": "test/e2e/app-dir/parallel-routes-and-interception-basepath/parallel-routes-and-interception-basepath.test.ts", + "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "app dir - next-image (with https) should skip next deploy", + "name": "parallel-routes-and-interception-basepath should show parallel intercepted slot with basepath", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception-basepath should show normal route via direct link with basepath when parallel intercepted slot exist", "status": "passed" } ] }, { - "name": "app dir - next-image", - "file": "test/e2e/app-dir/next-image/next-image.test.ts", + "name": "parallel-routes-catchall-slotted-non-catchalls", + "file": "test/e2e/app-dir/parallel-routes-catchall-slotted-non-catchalls/parallel-routes-catchall-slotted-non-catchalls.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app dir - next-image should skip next deploy", + "name": "parallel-routes-catchall-slotted-non-catchalls should match default and dynamic segment paths before catch-all", "status": "passed" } ] }, { - "name": "app dir - not-found - conflict route", - "file": "test/e2e/app-dir/not-found/conflict-route/index.test.ts", + "name": "scripts", + "file": "test/e2e/app-dir/resource-url-encoding/resource-url-encoding.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [] + }, + { + "name": "root-layout-redirect", + "file": "test/e2e/app-dir/root-layout-redirect/root-layout-redirect.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app dir - not-found - conflict route should skip next deploy", + "name": "root-layout-redirect should work using browser", "status": "passed" } ] }, { - "name": "app dir - group routes with root not-found", - "file": "test/e2e/app-dir/not-found/group-route-root-not-found/index.test.ts", + "name": "3rd Party CSS Module Support", + "file": "test/e2e/app-dir/scss/3rd-party-module/3rd-party-module.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app dir - group routes with root not-found should skip next deploy", + "name": "3rd Party CSS Module Support should render the module", "status": "passed" } ] }, { - "name": "pages-to-app-routing", - "file": "test/e2e/app-dir/pages-to-app-routing/pages-to-app-routing.test.ts", + "name": "Basic SCSS Module Support", + "file": "test/e2e/app-dir/scss/basic-module/basic-module.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "pages-to-app-routing should work using browser", + "name": "Basic SCSS Module Support should render the module", "status": "passed" } ] }, { - "name": "parallel-routes-and-interception", - "file": "test/e2e/app-dir/parallel-routes-and-interception/parallel-routes-and-interception.test.ts", - "passed": 21, - "failed": 3, - "skipped": 1, + "name": "SCSS Support loader handling Data Urls", + "file": "test/e2e/app-dir/scss/data-url/data-url.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", "testCases": [ { - "name": "parallel-routes-and-interception parallel routes should support parallel route tab bars", - "status": "failed" - }, + "name": "SCSS Support loader handling Data Urls should render the module", + "status": "passed" + } + ] + }, + { + "name": "Can hot reload CSS Module without losing state", + "file": "test/e2e/app-dir/scss/hmr-module/hmr-module.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "Invalid Global CSS with Custom App", + "file": "test/e2e/app-dir/scss/invalid-global-with-app/invalid-global-with-app.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "SCSS Support", + "file": "test/e2e/app-dir/scss/multi-page/multi-page.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "parallel-routes-and-interception parallel routes should match parallel routes", + "name": "SCSS Support Has CSS in computed styles in Production should have CSS for page", "status": "passed" }, { - "name": "parallel-routes-and-interception parallel routes should match parallel routes in route groups", + "name": "SCSS Support Has CSS in computed styles in Development should have CSS for page", "status": "passed" - }, + } + ] + }, + { + "name": "SCSS Support", + "file": "test/e2e/app-dir/scss/webpack-error/webpack-error.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "searchparams-static-bailout", + "file": "test/e2e/app-dir/searchparams-static-bailout/searchparams-static-bailout.test.ts", + "passed": 5, + "failed": 0, + "skipped": 0, + "total": "5", + "testCases": [ { - "name": "parallel-routes-and-interception parallel routes should throw a 404 when no matching parallel route is found", - "status": "failed" + "name": "searchparams-static-bailout server component should bailout when using searchParams", + "status": "passed" }, { - "name": "parallel-routes-and-interception parallel routes should render nested parallel routes", + "name": "searchparams-static-bailout server component should not bailout when not using searchParams", "status": "passed" }, { - "name": "parallel-routes-and-interception parallel routes should support layout files in parallel routes", + "name": "searchparams-static-bailout client component should bailout when using searchParams", "status": "passed" }, { - "name": "parallel-routes-and-interception parallel routes should only scroll to the parallel route that was navigated to", - "status": "failed" + "name": "searchparams-static-bailout client component should bailout when using searchParams is passed to client component", + "status": "passed" }, { - "name": "parallel-routes-and-interception parallel routes should apply the catch-all route to the parallel route if no matching route is found", + "name": "searchparams-static-bailout client component should not bailout when not using searchParams", + "status": "passed" + } + ] + }, + { + "name": "useSelectedLayoutSegment(s)", + "file": "test/e2e/app-dir/use-selected-layout-segment-s/use-selected-layout-segment-s.test.ts", + "passed": 8, + "failed": 0, + "skipped": 0, + "total": "8", + "testCases": [ + { + "name": "useSelectedLayoutSegment(s) should return correct values for root layout", "status": "passed" }, { - "name": "parallel-routes-and-interception parallel routes should match the catch-all routes of the more specific path, if there is more than one catch-all route", + "name": "useSelectedLayoutSegment(s) should return correct values in layout before static segment", "status": "passed" }, { - "name": "parallel-routes-and-interception parallel routes should navigate with a link with prefetch=false", + "name": "useSelectedLayoutSegment(s) should return correct values in layout before param segment", "status": "passed" }, { - "name": "parallel-routes-and-interception parallel routes should display all parallel route params with useParams", + "name": "useSelectedLayoutSegment(s) should return correct values in layout before catchall segment", "status": "passed" }, { - "name": "parallel-routes-and-interception parallel routes should load CSS for a default page that exports another page", + "name": "useSelectedLayoutSegment(s) should return correct values in layout after last segment", "status": "passed" }, { - "name": "parallel-routes-and-interception parallel routes should handle a loading state", + "name": "useSelectedLayoutSegment(s) should correctly update when changing static segment", "status": "passed" }, { - "name": "parallel-routes-and-interception route intercepting with dynamic routes should render intercepted route", + "name": "useSelectedLayoutSegment(s) should correctly update when changing param segment", "status": "passed" }, { - "name": "parallel-routes-and-interception route intercepting with dynamic optional catch-all routes should render intercepted route", + "name": "useSelectedLayoutSegment(s) should correctly update when changing catchall segment", + "status": "passed" + } + ] + }, + { + "name": "Edge API endpoints can receive body", + "file": "test/e2e/edge-api-endpoints-can-receive-body/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "Edge API endpoints can receive body reads the body as text", "status": "passed" }, { - "name": "parallel-routes-and-interception route intercepting with dynamic catch-all routes should render intercepted route", + "name": "Edge API endpoints can receive body reads the body from index", + "status": "passed" + } + ] + }, + { + "name": "i18-default-locale-redirect", + "file": "test/e2e/i18n-default-locale-redirect/i18n-default-locale-redirect.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "i18-default-locale-redirect should not request a path prefixed with default locale", "status": "passed" }, { - "name": "parallel-routes-and-interception route intercepting should render intercepted route", + "name": "i18-default-locale-redirect should request a path prefixed with non-default locale", + "status": "passed" + } + ] + }, + { + "name": "Event with stale state - static route previously was dynamic", + "file": "test/e2e/ignore-invalid-popstateevent/without-i18n.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "Event with stale state - static route previously was dynamic Ignore event without query param", "status": "passed" }, { - "name": "parallel-routes-and-interception route intercepting should render an intercepted route from a slot", + "name": "Event with stale state - static route previously was dynamic Ignore event with query param", + "status": "passed" + } + ] + }, + { + "name": "Middleware can set the matcher in its config", + "file": "test/e2e/middleware-matcher/index.test.ts", + "passed": 33, + "failed": 2, + "skipped": 0, + "total": "35", + "testCases": [ + { + "name": "Middleware can set the matcher in its config does add the header for root request", "status": "passed" }, { - "name": "parallel-routes-and-interception route intercepting should render an intercepted route at the top level from a nested path", + "name": "Middleware can set the matcher in its config adds the header for a matched path", "status": "passed" }, { - "name": "parallel-routes-and-interception route intercepting should render intercepted route from a nested route", + "name": "Middleware can set the matcher in its config adds the header for a matched data path (with header)", "status": "passed" }, { - "name": "parallel-routes-and-interception route intercepting should re-render the layout on the server when it had a default child route", + "name": "Middleware can set the matcher in its config adds the header for a matched data path (without header)", "status": "passed" }, { - "name": "parallel-routes-and-interception route intercepting should render modal when paired with parallel routes", + "name": "Middleware can set the matcher in its config adds the header for another matched path", "status": "passed" }, { - "name": "parallel-routes-and-interception route intercepting should support intercepting with beforeFiles rewrites", + "name": "Middleware can set the matcher in its config adds the header for another matched data path", "status": "passed" }, { - "name": "parallel-routes-and-interception route intercepting should support intercepting local dynamic sibling routes", + "name": "Middleware can set the matcher in its config does add the header for root data request", "status": "passed" }, { - "name": "parallel-routes-and-interception parallel routes should gracefully handle when two page segments match the `children` parallel slot", - "status": "skipped", - "reason": "Tries to patch deployed files" - } - ] - }, - { - "name": "prefetching-not-found", - "file": "test/e2e/app-dir/prefetching-not-found/prefetching-not-found.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + "name": "Middleware can set the matcher in its config should load matches in client matchers correctly", + "status": "passed" + }, { - "name": "prefetching-not-found should correctly navigate to/from a global 404 page when following links with prefetch=auto", + "name": "Middleware can set the matcher in its config should navigate correctly with matchers", "status": "passed" - } - ] - }, - { - "name": "app-dir revalidate-dynamic", - "file": "test/e2e/app-dir/revalidate-dynamic/revalidate-dynamic.test.ts", - "passed": 0, - "failed": 2, - "skipped": 0, - "testCases": [ + }, { - "name": "app-dir revalidate-dynamic should revalidate the data with /api/revalidate-path", - "status": "failed" + "name": "using a single matcher does not add the header for root request", + "status": "passed" }, { - "name": "app-dir revalidate-dynamic should revalidate the data with /api/revalidate-tag", - "status": "failed" - } - ] - }, - { - "name": "app-dir root layout render once", - "file": "test/e2e/app-dir/root-layout-render-once/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + "name": "using a single matcher does not add the header for root data request", + "status": "passed" + }, { - "name": "app-dir root layout render once should skip next deploy", + "name": "using a single matcher adds the header for a matched path", "status": "passed" - } - ] - }, - { - "name": "router autoscrolling on navigation", - "file": "test/e2e/app-dir/router-autoscroll/router-autoscroll.test.ts", - "passed": 13, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "router autoscrolling on navigation vertical scroll should scroll to top of document when navigating between to pages without layout", + "name": "using a single matcher adds the headers for a matched data path (with header)", "status": "passed" }, { - "name": "router autoscrolling on navigation vertical scroll should scroll to top of page when scrolling to phe top of the document wouldn't have the page in the viewport", + "name": "using a single matcher adds the header for a matched data path (without header)", "status": "passed" }, { - "name": "router autoscrolling on navigation vertical scroll should scroll down to the navigated page when it's below viewort", + "name": "using a single matcher does not add the header for an unmatched path", "status": "passed" }, { - "name": "router autoscrolling on navigation vertical scroll should not scroll when the top of the page is in the viewport", + "name": "using root matcher adds the header to the /", "status": "passed" }, { - "name": "router autoscrolling on navigation vertical scroll should not scroll to top of document if page in viewport", + "name": "using root matcher adds the header to the /index", "status": "passed" }, { - "name": "router autoscrolling on navigation vertical scroll should scroll to top of document if possible while giving focus to page", + "name": "using root matcher adds the header for a matched data path (with header)", "status": "passed" }, { - "name": "router autoscrolling on navigation horizontal scroll should't scroll horizontally", + "name": "using root matcher adds the header for a matched data path (without header)", "status": "passed" }, { - "name": "router autoscrolling on navigation router.refresh() should not scroll when called alone", + "name": "using a single matcher with i18n adds the header for a matched path", "status": "passed" }, { - "name": "router autoscrolling on navigation router.refresh() should not stop router.push() from scrolling", + "name": "using a single matcher with i18n adds the header for a mathed root path with /index", "status": "passed" }, { - "name": "router autoscrolling on navigation bugs Should scroll to the top of the layout when the first child is display none", + "name": "using a single matcher with i18n adds the headers for a matched data path", "status": "passed" }, { - "name": "router autoscrolling on navigation bugs Should scroll to the top of the layout when the first child is position fixed", + "name": "using a single matcher with i18n does not add the header for an unmatched path", "status": "passed" }, { - "name": "router autoscrolling on navigation bugs Should scroll to the top of the layout when the first child is position sticky", + "name": "using a single matcher with i18n and trailingSlash adds the header for a matched path", "status": "passed" }, { - "name": "router autoscrolling on navigation bugs Should apply scroll when loading.js is used", + "name": "using a single matcher with i18n and trailingSlash adds the header for a mathed root path with /index", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and trailingSlash adds the headers for a matched data path", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and trailingSlash does not add the header for an unmatched path", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and basePath adds the header for a matched path", + "status": "failed", + "reason": "Middleware does not match when using basePath and default locale", + "link": "https://github.com/netlify/next-runtime-minimal/issues/454" + }, + { + "name": "using a single matcher with i18n and basePath adds the header for a mathed root path with /index", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and basePath adds the headers for a matched data path", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and basePath does not add the header for an unmatched path", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and basePath and trailingSlash adds the header for a matched path", + "status": "failed", + "reason": "Middleware does not match when using basePath and default locale", + "link": "https://github.com/netlify/next-runtime-minimal/issues/454" + }, + { + "name": "using a single matcher with i18n and basePath and trailingSlash adds the header for a mathed root path with /index", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and basePath and trailingSlash adds the headers for a matched data path", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and basePath and trailingSlash does not add the header for an unmatched path", "status": "passed" } ] }, { - "name": "Basic SCSS Module Support", - "file": "test/e2e/app-dir/scss/basic-module/basic-module.test.ts", + "name": "postcss-config-cjs", + "file": "test/e2e/postcss-config-cjs/index.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "Basic SCSS Module Support should render the module", + "name": "postcss-config-cjs works with postcss.config.cjs files", "status": "passed" } ] }, { - "name": "SCSS Support", - "file": "test/e2e/app-dir/scss/compilation-and-prefixing/compilation-and-prefixing.test.ts", - "passed": 2, + "name": "undici fetch", + "file": "test/e2e/undici-fetch/index.test.ts", + "passed": 4, "failed": 0, "skipped": 0, + "total": "4", "testCases": [ { - "name": "SCSS Support Production only CSS Compilation and Prefixing should've compiled and prefixed", + "name": "undici fetch undici global fetch should return true when undici is used", "status": "passed" }, { - "name": "SCSS Support Production only CSS Compilation and Prefixing should've emitted a source map", + "name": "undici fetch undici global Headers should return true when undici is used", + "status": "passed" + }, + { + "name": "undici fetch undici global Request should return true when undici is used", + "status": "passed" + }, + { + "name": "undici fetch undici global Response should return true when undici is used", "status": "passed" } ] }, { - "name": "CSS Module Composes Usage (Basic)", - "file": "test/e2e/app-dir/scss/composes-basic/composes-basic.test.ts", + "name": "app-dir action allowed origins", + "file": "test/e2e/app-dir/actions-allowed-origins/app-action-allowed-origins.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "CSS Module Composes Usage (Basic) should render the module", + "name": "app-dir action allowed origins should skip next deploy", "status": "passed" } ] }, { - "name": "SCSS Support loader handling Data Urls", - "file": "test/e2e/app-dir/scss/data-url/data-url.test.ts", + "name": "app dir - crossOrigin config", + "file": "test/e2e/app-dir/app-config-crossorigin/index.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "SCSS Support loader handling Data Urls should render the module", + "name": "app dir - crossOrigin config should skip next deploy", "status": "passed" } ] }, { - "name": "Can hot reload CSS Module without losing state", - "file": "test/e2e/app-dir/scss/hmr-module/hmr-module.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "Invalid CSS Global Module Usage in node_modules", - "file": "test/e2e/app-dir/scss/invalid-global-module/invalid-global-module.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "Invalid Global CSS with Custom App", - "file": "test/e2e/app-dir/scss/invalid-global-with-app/invalid-global-with-app.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "Invalid Global CSS", - "file": "test/e2e/app-dir/scss/invalid-global/invalid-global.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "Invalid SCSS in _document", - "file": "test/e2e/app-dir/scss/invalid-module-document/invalid-module-document.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "Invalid CSS Module Usage in node_modules", - "file": "test/e2e/app-dir/scss/invalid-module/invalid-module.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "SCSS Support loader handling Preprocessor loader order", - "file": "test/e2e/app-dir/scss/loader-order/loader-order.test.ts", + "name": "app dir rendering", + "file": "test/e2e/app-dir/app-rendering/rendering.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "SCSS Support loader handling Preprocessor loader order should render the module", + "name": "app dir rendering should skip next deploy", "status": "passed" } ] }, { - "name": "Nested @import() Global Support", - "file": "test/e2e/app-dir/scss/nested-global/nested-global.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, + "name": "app dir - basic", + "file": "test/e2e/app-dir/app/index.test.ts", + "passed": 90, + "failed": 2, + "skipped": 2, + "total": "100", "testCases": [ { - "name": "Nested @import() Global Support should render the page", + "name": "app dir - basic should work for catch-all edge page", "status": "passed" - } - ] - }, - { - "name": "Good CSS Import from node_modules with tilde", - "file": "test/e2e/app-dir/scss/npm-import-tilde/npm-import-tilde.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Good CSS Import from node_modules with tilde should render the page", + "name": "app dir - basic should return normalized dynamic route params for catch-all edge page", "status": "passed" - } - ] - }, - { - "name": "Basic Global Support with src/ dir", - "file": "test/e2e/app-dir/scss/single-global-src/single-global-src.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Basic Global Support with src/ dir should render the page", + "name": "app dir - basic should have correct searchParams and params (server)", "status": "passed" - } - ] - }, - { - "name": "SCSS Support loader handling", - "file": "test/e2e/app-dir/scss/url-global-asset-prefix-1/url-global-asset-prefix-1.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "SCSS Support loader handling", - "file": "test/e2e/app-dir/scss/url-global-partial/url-global-partial.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "SCSS Support loader handling CSS URL via file-loader sass partial should render the page", + "name": "app dir - basic should have correct searchParams and params (client)", "status": "passed" - } - ] - }, - { - "name": "searchparams-static-bailout", - "file": "test/e2e/app-dir/searchparams-static-bailout/searchparams-static-bailout.test.ts", - "passed": 5, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "searchparams-static-bailout server component should bailout when using searchParams", + "name": "app dir - basic should successfully detect app route during prefetch", "status": "passed" }, { - "name": "searchparams-static-bailout server component should not bailout when not using searchParams", + "name": "app dir - basic should encode chunk path correctly", "status": "passed" }, { - "name": "searchparams-static-bailout client component should bailout when using searchParams", + "name": "app dir - basic should match redirects in pages correctly $path", "status": "passed" }, { - "name": "searchparams-static-bailout client component should bailout when using searchParams is passed to client component", + "name": "app dir - basic should match redirects in pages correctly $path", "status": "passed" }, { - "name": "searchparams-static-bailout client component should not bailout when not using searchParams", + "name": "app dir - basic should match redirects in pages correctly $path", "status": "passed" - } - ] - }, - { - "name": "app-dir similar pages paths", - "file": "test/e2e/app-dir/similar-pages-paths/similar-pages-paths.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "app-dir similar pages paths should skip next deploy", + "name": "app dir - basic should match redirects in pages correctly $path", "status": "passed" - } - ] - }, - { - "name": "app-dir static-generation-status", - "file": "test/e2e/app-dir/static-generation-status/index.test.ts", - "passed": 3, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "app-dir static-generation-status should render the page using notFound with status 404", + "name": "app dir - basic should match redirects in pages correctly $path", "status": "passed" }, { - "name": "app-dir static-generation-status should render the page using redirect with status 307", + "name": "app dir - basic should not apply client router filter on shallow", "status": "passed" }, { - "name": "app-dir static-generation-status should render the non existed route redirect with status 404", + "name": "app dir - basic should use text/x-component for flight", "status": "passed" - } - ] - }, - { - "name": "{{name}}", - "file": "test/e2e/app-dir/test-template/{{ toFileName name }}/{{ toFileName name }}.test.ts", - "passed": 4, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "{{name}} should work using cheerio", + "name": "app dir - basic should use text/x-component for flight with edge runtime", "status": "passed" }, { - "name": "{{name}} should work using browser", + "name": "app dir - basic should pass props from getServerSideProps in root layout", "status": "passed" }, { - "name": "{{name}} should work with html", + "name": "app dir - basic should serve from pages", "status": "passed" }, { - "name": "{{name}} should work with fetch", + "name": "app dir - basic should serve dynamic route from pages", "status": "passed" - } - ] - }, - { - "name": "useSelectedLayoutSegment(s)", - "file": "test/e2e/app-dir/use-selected-layout-segment-s/use-selected-layout-segment-s.test.ts", - "passed": 8, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "useSelectedLayoutSegment(s) should return correct values for root layout", + "name": "app dir - basic should serve from public", "status": "passed" }, { - "name": "useSelectedLayoutSegment(s) should return correct values in layout before static segment", + "name": "app dir - basic should serve from app", "status": "passed" }, { - "name": "useSelectedLayoutSegment(s) should return correct values in layout before param segment", + "name": "app dir - basic should ensure the suffix is at the end of the stream", "status": "passed" }, { - "name": "useSelectedLayoutSegment(s) should return correct values in layout before catchall segment", + "name": "app dir - basic should include layouts when no direct parent layout", "status": "passed" }, { - "name": "useSelectedLayoutSegment(s) should return correct values in layout after last segment", + "name": "app dir - basic should use new root layout when provided", "status": "passed" }, { - "name": "useSelectedLayoutSegment(s) should correctly update when changing static segment", + "name": "app dir - basic should not create new root layout when nested (optional)", "status": "passed" }, { - "name": "useSelectedLayoutSegment(s) should correctly update when changing param segment", + "name": "app dir - basic should include parent document when no direct parent layout", "status": "passed" }, { - "name": "useSelectedLayoutSegment(s) should correctly update when changing catchall segment", + "name": "app dir - basic should not include parent when not in parent directory", "status": "passed" - } - ] - }, - { - "name": "basePath", - "file": "test/e2e/basepath.test.ts", - "passed": 60, - "failed": 0, - "skipped": 3, - "testCases": [ + }, { - "name": "basePath should navigate to /404 correctly client-side", + "name": "app dir - basic should serve nested parent", "status": "passed" }, { - "name": "basePath should navigate to /_error correctly client-side", + "name": "app dir - basic should serve dynamic parameter", "status": "passed" }, { - "name": "basePath should navigate to external site and back", + "name": "app dir - basic should include document html and body", "status": "passed" }, { - "name": "basePath should handle query/hash correctly during query updating #hello? $search", + "name": "app dir - basic should not serve when layout is provided but no folder index", "status": "passed" }, { - "name": "basePath should handle query/hash correctly during query updating #? $search", + "name": "app dir - basic rewrites should support rewrites on initial load", "status": "passed" }, { - "name": "basePath should handle query/hash correctly during query updating ## $search", + "name": "app dir - basic rewrites should support rewrites on client-side navigation from pages to app with existing pages path", "status": "passed" }, { - "name": "basePath should handle query/hash correctly during query updating ##? $search", + "name": "app dir - basic rewrites should support rewrites on client-side navigation", "status": "passed" }, { - "name": "basePath should handle query/hash correctly during query updating ##hello? $search", + "name": "app dir - basic should not rerender layout when navigating between routes in the same layout", "status": "passed" }, { - "name": "basePath should handle query/hash correctly during query updating ##hello $search", + "name": "app dir - basic should handle hash in initial url", "status": "passed" }, { - "name": "basePath should handle query/hash correctly during query updating #hello?world $search", + "name": "app dir - basic should hard push", "status": "passed" }, { - "name": "basePath should handle query/hash correctly during query updating #a ?hello=world", + "name": "app dir - basic should hard replace", "status": "passed" }, { - "name": "basePath should handle query/hash correctly during query updating #a ?hello", + "name": "app dir - basic should soft push", "status": "passed" }, { - "name": "basePath should handle query/hash correctly during query updating #a ?hello=", + "name": "app dir - basic should be soft for back navigation", "status": "passed" }, { - "name": "basePath should navigate back correctly to a dynamic route", + "name": "app dir - basic should be soft for forward navigation", "status": "passed" }, { - "name": "basePath should respect basePath in amphtml link rel", + "name": "app dir - basic should allow linking from app page to pages page", "status": "passed" }, { - "name": "basePath should prefetch pages correctly when manually called", + "name": "app dir - basic should navigate to pages dynamic route from pages page if it overlaps with an app page", "status": "passed" }, { - "name": "basePath should prefetch pages correctly in viewport with ", + "name": "app dir - basic should push to external url", "status": "passed" }, { - "name": "basePath should 404 for public file without basePath", + "name": "app dir - basic should replace to external url", "status": "passed" }, { - "name": "basePath should serve public file with basePath correctly", + "name": "app dir - basic server components should not serve .server.js as a path", "status": "passed" }, { - "name": "basePath should rewrite with basePath by default", + "name": "app dir - basic server components should not serve .client.js as a path", "status": "passed" }, { - "name": "basePath should not rewrite without basePath without disabling", + "name": "app dir - basic server components should serve shared component", "status": "passed" }, { - "name": "basePath should not rewrite with basePath when set to false", + "name": "app dir - basic server components dynamic routes should only pass params that apply to the layout", "status": "passed" }, { - "name": "basePath should rewrite without basePath when set to false", + "name": "app dir - basic server components catch-all routes should handle optional segments", "status": "passed" }, { - "name": "basePath should redirect with basePath by default", + "name": "app dir - basic server components catch-all routes should handle optional segments root", "status": "passed" }, { - "name": "basePath should not redirect without basePath without disabling", + "name": "app dir - basic server components catch-all routes should handle optional catch-all segments link", "status": "passed" }, { - "name": "basePath should not redirect with basePath when set to false", + "name": "app dir - basic server components catch-all routes should handle required segments", "status": "passed" }, { - "name": "basePath should redirect without basePath when set to false", + "name": "app dir - basic server components catch-all routes should handle required segments root as not found", "status": "passed" }, { - "name": "basePath should add header with basePath by default", + "name": "app dir - basic server components catch-all routes should handle catch-all segments link", "status": "passed" }, { - "name": "basePath should not add header without basePath without disabling", + "name": "app dir - basic server components should serve client component should serve server-side", "status": "passed" }, { - "name": "basePath should not add header with basePath when set to false", + "name": "app dir - basic server components should serve client component should serve client-side", "status": "passed" }, { - "name": "basePath should add header without basePath when set to false", + "name": "app dir - basic server components should include client component layout with server component route should include it server-side", "status": "passed" }, { - "name": "basePath should update dynamic params after mount correctly", + "name": "app dir - basic server components should include client component layout with server component route should include it client-side", "status": "passed" }, { - "name": "basePath should navigate to index page with getStaticProps", + "name": "app dir - basic server components Loading should render loading.js in initial html for slow page", "status": "passed" }, { - "name": "basePath should work with nested folder with same name as basePath", + "name": "app dir - basic server components Loading should render loading.js in browser for slow page", "status": "passed" }, { - "name": "basePath should work with normal dynamic page", + "name": "app dir - basic server components Loading should render loading.js in initial html for slow layout", "status": "passed" }, { - "name": "basePath should work with hash links", + "name": "app dir - basic server components Loading should render loading.js in browser for slow layout", "status": "passed" }, { - "name": "basePath should work with catch-all page", + "name": "app dir - basic server components Loading should render loading.js in initial html for slow layout and page", "status": "passed" }, { - "name": "basePath should redirect trailing slash correctly", + "name": "app dir - basic server components Loading should render loading.js in browser for slow layout and page", "status": "passed" }, { - "name": "basePath should redirect trailing slash on root correctly", + "name": "app dir - basic server components middleware should strip internal query parameters from requests to middleware for rewrite", "status": "passed" }, { - "name": "basePath should navigate an absolute url", + "name": "app dir - basic server components middleware should strip internal query parameters from requests to middleware for redirect", "status": "passed" }, { - "name": "basePath should 404 when manually adding basePath with ", + "name": "app dir - basic server components next/router should support router.back and router.forward", "status": "passed" }, { - "name": "basePath should 404 when manually adding basePath with router.push", + "name": "app dir - basic searchParams prop client component should have the correct search params", "status": "passed" }, { - "name": "basePath should 404 when manually adding basePath with router.replace", + "name": "app dir - basic searchParams prop client component should have the correct search params on rewrite", "status": "passed" }, { - "name": "basePath should show the hello page under the /docs prefix", + "name": "app dir - basic searchParams prop client component should have the correct search params on middleware rewrite", "status": "passed" }, { - "name": "basePath should have correct router paths on first load of /", + "name": "app dir - basic searchParams prop server component should have the correct search params", "status": "passed" }, { - "name": "basePath should have correct router paths on first load of /hello", + "name": "app dir - basic searchParams prop server component should have the correct search params on rewrite", "status": "passed" }, { - "name": "basePath should fetch data for getStaticProps without reloading", + "name": "app dir - basic searchParams prop server component should have the correct search params on middleware rewrite", "status": "passed" }, { - "name": "basePath should fetch data for getServerSideProps without reloading", + "name": "app dir - basic template component should render the template that holds state in a client component and reset on navigation", "status": "passed" }, { - "name": "basePath should have correct href for a link", + "name": "app dir - basic template component should render the template that is a server component and rerender on navigation", "status": "passed" }, { - "name": "basePath should have correct href for a link to /", + "name": "app dir - basic known bugs should support React cache server component", "status": "passed" }, { - "name": "basePath should show the other-page page under the /docs prefix", + "name": "app dir - basic known bugs should support React cache server component client-navigation", "status": "passed" }, { - "name": "basePath should have basePath field on Router", + "name": "app dir - basic known bugs should support React cache client component", "status": "passed" }, { - "name": "basePath should navigate to the page without refresh", + "name": "app dir - basic known bugs should support React cache client component client-navigation", "status": "passed" }, { - "name": "basePath should use urls with basepath in router events", + "name": "app dir - basic known bugs should support React cache middleware overriding headers", "status": "passed" }, { - "name": "basePath should use urls with basepath in router events for hash changes", + "name": "app dir - basic known bugs should support React fetch instrumentation server component", "status": "passed" }, { - "name": "basePath should use urls with basepath in router events for cancelled routes", + "name": "app dir - basic known bugs should support React fetch instrumentation server component client-navigation", "status": "passed" }, { - "name": "basePath should use urls with basepath in router events for failed route change", + "name": "app dir - basic known bugs should not share flight data between requests", "status": "passed" }, { - "name": "basePath should allow URL query strings without refresh", + "name": "app dir - basic known bugs should handle router.refresh without resetting state", "status": "passed" }, { - "name": "basePath should allow URL query strings on index without refresh", + "name": "app dir - basic known bugs should handle as on next/link", "status": "passed" }, { - "name": "basePath should correctly replace state when same asPath but different url", + "name": "app dir - basic known bugs should handle next/link back to initially loaded page", "status": "passed" }, { - "name": "basePath should not update URL for a 404", - "status": "skipped", - "reason": "Hard-coded Vercel error message" + "name": "app dir - basic known bugs should not do additional pushState when already on the page", + "status": "passed" }, { - "name": "basePath should handle 404 urls that start with basePath", + "name": "app dir - basic next/script should insert preload tags for beforeInteractive and afterInteractive scripts", + "status": "passed" + }, + { + "name": "app dir - basic next/script should load stylesheets for next/scripts", + "status": "passed" + }, + { + "name": "app dir - basic next/script should pass `nonce`", + "status": "failed", + "reason": "Nonce not automatically set in script tags when using CSP", + "link": "https://github.com/netlify/next-runtime-minimal/issues/381" + }, + { + "name": "app dir - basic data fetch with response over 16KB with chunked encoding should load page when fetching a large amount of data", + "status": "passed" + }, + { + "name": "app dir - basic bootstrap scripts should only bootstrap with one script, prinitializing the rest", + "status": "passed" + }, + { + "name": "app dir - basic bootstrap scripts should successfully bootstrap even when using CSP", + "status": "failed", + "reason": "Nonce not automatically set in script tags when using CSP", + "link": "https://github.com/netlify/next-runtime-minimal/issues/381" + }, + { + "name": "app dir - basic should return the `vary` header from edge runtime", "status": "skipped", - "reason": "Hard-coded Vercel error message" + "reason": "Whitespace mismatch" }, { - "name": "basePath should show 404 for page not under the /docs prefix", + "name": "app dir - basic should return the `vary` header from pages for flight requests", "status": "skipped", - "reason": "Hard-coded Vercel error message" + "reason": "Whitespace mismatch" } ] }, { - "name": "disabled JS preloads", - "file": "test/e2e/disable-js-preload/test/index.test.js", - "passed": 2, + "name": "mdx with-mdx-rs", + "file": "test/e2e/app-dir/mdx/mdx.test.ts", + "passed": 24, "failed": 0, "skipped": 0, + "total": "24", "testCases": [ { - "name": "disabled JS preloads should render the page", + "name": "mdx with-mdx-rs app directory should work in initial html", "status": "passed" }, { - "name": "disabled JS preloads should not have JS preload links", + "name": "mdx with-mdx-rs app directory should work using browser", "status": "passed" - } - ] - }, - { - "name": "edge api can use async local storage", - "file": "test/e2e/edge-async-local-storage/index.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "edge api can use async local storage cans use a single instance per request", + "name": "mdx with-mdx-rs app directory should work in initial html with mdx import", "status": "passed" }, { - "name": "edge api can use async local storage cans use multiple instances per request", + "name": "mdx with-mdx-rs app directory should work using browser with mdx import", "status": "passed" - } - ] - }, - { - "name": "esm-externals", - "file": "test/e2e/esm-externals/esm-externals.test.ts", - "passed": 10, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "esm-externals should return the correct SSR HTML for /static", + "name": "mdx with-mdx-rs app directory should allow overriding components", "status": "passed" }, { - "name": "esm-externals should render the correct page for /static", + "name": "mdx with-mdx-rs app directory should allow importing client components", "status": "passed" }, { - "name": "esm-externals should return the correct SSR HTML for /ssr", + "name": "mdx with-mdx-rs app directory should work with next/image", "status": "passed" }, { - "name": "esm-externals should render the correct page for /ssr", + "name": "mdx with-mdx-rs pages directory should work in initial html", "status": "passed" }, { - "name": "esm-externals should return the correct SSR HTML for /ssg", + "name": "mdx with-mdx-rs pages directory should work using browser", "status": "passed" }, { - "name": "esm-externals should render the correct page for /ssg", + "name": "mdx with-mdx-rs pages directory should work in initial html with mdx import", "status": "passed" }, { - "name": "esm-externals should return the correct SSR HTML for /server", + "name": "mdx with-mdx-rs pages directory should work using browser with mdx import", "status": "passed" }, { - "name": "esm-externals should render the correct page for /server", + "name": "mdx with-mdx-rs pages directory should allow overriding components", "status": "passed" }, { - "name": "esm-externals should return the correct SSR HTML for /client", + "name": "mdx without-mdx-rs app directory should work in initial html", "status": "passed" }, { - "name": "esm-externals should render the correct page for /client", + "name": "mdx without-mdx-rs app directory should work using browser", "status": "passed" - } - ] - }, - { - "name": "handle-non-hoisted-swc-helpers", - "file": "test/e2e/handle-non-hoisted-swc-helpers/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "handle-non-hoisted-swc-helpers should work", + "name": "mdx without-mdx-rs app directory should work in initial html with mdx import", "status": "passed" - } - ] - }, - { - "name": "i18-default-locale-redirect", - "file": "test/e2e/i18n-default-locale-redirect/i18n-default-locale-redirect.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "i18-default-locale-redirect should not request a path prefixed with default locale", + "name": "mdx without-mdx-rs app directory should work using browser with mdx import", "status": "passed" }, { - "name": "i18-default-locale-redirect should request a path prefixed with non-default locale", + "name": "mdx without-mdx-rs app directory should allow overriding components", "status": "passed" - } - ] - }, - { - "name": "i18n-ignore-rewrite-source-locale with basepath", - "file": "test/e2e/i18n-ignore-rewrite-source-locale/rewrites-with-basepath.test.ts", - "passed": 4, - "failed": 4, - "skipped": 0, - "testCases": [ - { - "name": "i18n-ignore-rewrite-source-locale with basepath get public file by skipping locale in rewrite, locale: ", - "status": "failed", - "reason": "Middleware on sites with i18n cannot rewrite to static files", - "link": "https://github.com/netlify/next-runtime-minimal/issues/383" }, { - "name": "i18n-ignore-rewrite-source-locale with basepath get public file by skipping locale in rewrite, locale: /en", - "status": "failed", - "reason": "Middleware on sites with i18n cannot rewrite to static files", - "link": "https://github.com/netlify/next-runtime-minimal/issues/383" + "name": "mdx without-mdx-rs app directory should allow importing client components", + "status": "passed" }, { - "name": "i18n-ignore-rewrite-source-locale with basepath get public file by skipping locale in rewrite, locale: /sv", - "status": "failed", - "reason": "Middleware on sites with i18n cannot rewrite to static files", - "link": "https://github.com/netlify/next-runtime-minimal/issues/383" + "name": "mdx without-mdx-rs app directory should work with next/image", + "status": "passed" }, { - "name": "i18n-ignore-rewrite-source-locale with basepath get public file by skipping locale in rewrite, locale: /nl", - "status": "failed", - "reason": "Middleware on sites with i18n cannot rewrite to static files", - "link": "https://github.com/netlify/next-runtime-minimal/issues/383" + "name": "mdx without-mdx-rs pages directory should work in initial html", + "status": "passed" }, { - "name": "i18n-ignore-rewrite-source-locale with basepath call api by skipping locale in rewrite, locale: ", + "name": "mdx without-mdx-rs pages directory should work using browser", "status": "passed" }, { - "name": "i18n-ignore-rewrite-source-locale with basepath call api by skipping locale in rewrite, locale: /en", + "name": "mdx without-mdx-rs pages directory should work in initial html with mdx import", "status": "passed" }, { - "name": "i18n-ignore-rewrite-source-locale with basepath call api by skipping locale in rewrite, locale: /sv", + "name": "mdx without-mdx-rs pages directory should work using browser with mdx import", "status": "passed" }, { - "name": "i18n-ignore-rewrite-source-locale with basepath call api by skipping locale in rewrite, locale: /nl", + "name": "mdx without-mdx-rs pages directory should allow overriding components", "status": "passed" } ] }, { - "name": "i18-preferred-locale-redirect", - "file": "test/e2e/i18n-preferred-locale-detection/i18n-preferred-locale-detection.test.ts", - "passed": 3, + "name": "not-found app dir css", + "file": "test/e2e/app-dir/not-found/css-precedence/index.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "i18-preferred-locale-redirect should request a path prefixed with my preferred detected locale when accessing index", + "name": "not-found app dir css should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "parallel-route-not-found", + "file": "test/e2e/app-dir/parallel-route-not-found/parallel-route-not-found.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "parallel-route-not-found should handle a layout that attempts to render a missing parallel route", "status": "passed" }, { - "name": "i18-preferred-locale-redirect should not request a path prefixed with my preferred detected locale when clicking link to index from a non-locale-prefixed path", + "name": "parallel-route-not-found should handle multiple missing parallel routes", "status": "passed" }, { - "name": "i18-preferred-locale-redirect should request a path prefixed with my preferred detected locale when clicking link to index from a locale-prefixed path", + "name": "parallel-route-not-found should render the page & slots if all parallel routes are found", "status": "passed" } ] }, { - "name": "Instrumentation Hook", - "file": "test/e2e/instrumentation-hook/instrumentation-hook.test.ts", - "passed": 8, + "name": "parallel-routes-catchall-groups", + "file": "test/e2e/app-dir/parallel-routes-catchall-groups/parallel-routes-catchall-groups.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "Instrumentation Hook with-middleware should skip next deploy", + "name": "parallel-routes-catchall-groups should work without throwing any errors about conflicting paths", "status": "passed" + } + ] + }, + { + "name": "parallel-routes-revalidation", + "file": "test/e2e/app-dir/parallel-routes-revalidation/parallel-routes-revalidation.test.ts", + "passed": 16, + "failed": 1, + "skipped": 2, + "total": "18", + "testCases": [ + { + "name": "parallel-routes-revalidation should submit the action and revalidate the page data", + "status": "failed" }, { - "name": "Instrumentation Hook with-edge-api should skip next deploy", + "name": "parallel-routes-revalidation should handle router.refresh() when called in a slot", "status": "passed" }, { - "name": "Instrumentation Hook with-edge-page should skip next deploy", + "name": "parallel-routes-revalidation should handle a redirect action when called in a slot", "status": "passed" }, { - "name": "Instrumentation Hook with-node-api should skip next deploy", + "name": "parallel-routes-revalidation should not trigger interception when calling router.refresh() on an intercepted route (/detail-page)", "status": "passed" }, { - "name": "Instrumentation Hook with-node-page should skip next deploy", + "name": "parallel-routes-revalidation should not trigger interception when calling router.refresh() on an intercepted route (/dynamic/foobar)", "status": "passed" }, { - "name": "Instrumentation Hook with-async-node-page should skip next deploy", + "name": "parallel-routes-revalidation should not trigger interception when calling router.refresh() on an intercepted route (/catchall/foobar)", "status": "passed" }, { - "name": "Instrumentation Hook with-async-edge-page should skip next deploy", + "name": "parallel-routes-revalidation should not trigger full page when calling router.refresh() on an intercepted route", "status": "passed" }, { - "name": "Instrumentation Hook general should skip next deploy", + "name": "parallel-routes-revalidation should not trigger the intercepted route when lazy-fetching missing data", "status": "passed" - } - ] - }, - { - "name": "Middleware Request Headers Overrides", - "file": "test/e2e/middleware-request-header-overrides/test/index.test.ts", - "passed": 9, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Middleware Request Headers Overrides Serverless Functions Backend Adds new headers", + "name": "parallel-routes-revalidation router.refresh (regular) - searchParams: false should correctly refresh data for the intercepted route and previously active page slot", "status": "passed" }, { - "name": "Middleware Request Headers Overrides Serverless Functions Backend Deletes headers", + "name": "parallel-routes-revalidation router.refresh (regular) - searchParams: false should correctly refresh data for previously intercepted modal and active page slot", "status": "passed" }, { - "name": "Middleware Request Headers Overrides Serverless Functions Backend Updates headers", + "name": "parallel-routes-revalidation router.refresh (regular) - searchParams: true should correctly refresh data for the intercepted route and previously active page slot", "status": "passed" }, { - "name": "Middleware Request Headers Overrides Edge Functions Backend Adds new headers", + "name": "parallel-routes-revalidation router.refresh (regular) - searchParams: true should correctly refresh data for previously intercepted modal and active page slot", "status": "passed" }, { - "name": "Middleware Request Headers Overrides Edge Functions Backend Deletes headers", + "name": "parallel-routes-revalidation router.refresh (dynamic) - searchParams: false should correctly refresh data for the intercepted route and previously active page slot", "status": "passed" }, { - "name": "Middleware Request Headers Overrides Edge Functions Backend Updates headers", + "name": "parallel-routes-revalidation router.refresh (dynamic) - searchParams: false should correctly refresh data for previously intercepted modal and active page slot", "status": "passed" }, { - "name": "Middleware Request Headers Overrides getServerSideProps Backend Adds new headers", + "name": "parallel-routes-revalidation router.refresh (dynamic) - searchParams: true should correctly refresh data for the intercepted route and previously active page slot", "status": "passed" }, { - "name": "Middleware Request Headers Overrides getServerSideProps Backend Deletes headers", + "name": "parallel-routes-revalidation router.refresh (dynamic) - searchParams: true should correctly refresh data for previously intercepted modal and active page slot", "status": "passed" }, { - "name": "Middleware Request Headers Overrides getServerSideProps Backend Updates headers", + "name": "parallel-routes-revalidation server action revalidation handles refreshing when multiple parallel slots are active", "status": "passed" + }, + { + "name": "parallel-routes-revalidation should refresh the correct page when a server action triggers a redirect", + "status": "skipped", + "reason": "Test is incompatible with serverless because it relies on shared state between requests" + }, + { + "name": "parallel-routes-revalidation should submit the action and revalidate the page data", + "status": "skipped", + "reason": "Test is incompatible with serverless because it relies on shared state between requests" } ] }, { - "name": "Middleware Rewrite", - "file": "test/e2e/middleware-rewrites/test/index.test.ts", - "passed": 54, - "failed": 1, + "name": "Good CSS Import from node_modules with tilde", + "file": "test/e2e/app-dir/scss/npm-import-tilde/npm-import-tilde.test.ts", + "passed": 1, + "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "Middleware Rewrite should handle catch-all rewrite correctly", - "status": "passed" - }, - { - "name": "Middleware Rewrite should handle next.config.js rewrite with body correctly", + "name": "Good CSS Import from node_modules with tilde should render the page", "status": "passed" - }, + } + ] + }, + { + "name": "shallow-routing", + "file": "test/e2e/app-dir/shallow-routing/shallow-routing.test.ts", + "passed": 15, + "failed": 0, + "skipped": 0, + "total": "15", + "testCases": [ { - "name": "Middleware Rewrite should handle middleware rewrite with body correctly", + "name": "shallow-routing pushState should support setting data", "status": "passed" }, { - "name": "Middleware Rewrite should handle static dynamic rewrite from middleware correctly", + "name": "shallow-routing pushState should support setting a different pathname reflected on usePathname", "status": "passed" }, { - "name": "Middleware Rewrite should handle static rewrite from next.config.js correctly", + "name": "shallow-routing pushState should support setting a different searchParam reflected on useSearchParams", "status": "passed" }, { - "name": "Middleware Rewrite should not have un-necessary data request on rewrite", + "name": "shallow-routing pushState should support setting a different url using a string", "status": "passed" }, { - "name": "Middleware Rewrite should not mix component cache when navigating between dynamic routes", + "name": "shallow-routing pushState should work when given a null state value", "status": "passed" }, { - "name": "Middleware Rewrite should have props for afterFiles rewrite to SSG page", + "name": "shallow-routing should work when given an undefined state value", "status": "passed" }, { - "name": "Middleware Rewrite should hard navigate on 404 for data request", + "name": "shallow-routing replaceState should support setting data", "status": "passed" }, { - "name": "Middleware Rewrite should rewrite correctly when navigating via history", + "name": "shallow-routing replaceState should support setting a different pathname reflected on usePathname", "status": "passed" }, { - "name": "Middleware Rewrite should rewrite correctly when navigating via history after query update", + "name": "shallow-routing replaceState should support setting a different searchParam reflected on useSearchParams", "status": "passed" }, { - "name": "Middleware Rewrite should return HTML/data correctly for pre-rendered page", + "name": "shallow-routing replaceState should support setting a different url using a string", "status": "passed" }, { - "name": "Middleware Rewrite should override with rewrite internally correctly", + "name": "shallow-routing replaceState should work when given a null state value", "status": "passed" }, { - "name": "Middleware Rewrite should rewrite to data urls for incoming data request internally rewritten", + "name": "shallow-routing replaceState should work when given an undefined state value", "status": "passed" }, { - "name": "Middleware Rewrite should override with rewrite externally correctly", + "name": "shallow-routing back and forward client-side navigation should support setting a different pathname reflected on usePathname and then still support navigating back and forward", "status": "passed" }, { - "name": "Middleware Rewrite should rewrite to the external url for incoming data request externally rewritten", + "name": "shallow-routing back and forward mpa navigation should support setting data and then still support navigating back and forward", "status": "passed" }, { - "name": "Middleware Rewrite should rewrite to fallback: true page successfully", + "name": "shallow-routing back and forward mpa navigation should support hash navigations while continuing to work for pushState/replaceState APIs", "status": "passed" - }, + } + ] + }, + { + "name": "browserslist-extends", + "file": "test/e2e/browserslist-extends/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "Middleware Rewrite should allow to opt-out prefetch caching", + "name": "browserslist-extends should work", "status": "passed" - }, + } + ] + }, + { + "name": "Edge can read request body", + "file": "test/e2e/edge-can-read-request-body/index.test.ts", + "passed": 5, + "failed": 0, + "skipped": 0, + "total": "5", + "testCases": [ { - "name": "Middleware Rewrite should not prefetch non-SSG routes", + "name": "Edge can read request body renders the static page", "status": "passed" }, { - "name": "Middleware Rewrite should allow to rewrite keeping the locale in pathname", - "status": "failed" - }, - { - "name": "Middleware Rewrite should allow to rewrite to a different locale", + "name": "Edge can read request body middleware reads a JSON body", "status": "passed" }, { - "name": "Middleware Rewrite should behave consistently on recursive rewrites", + "name": "Edge can read request body middleware reads a text body", "status": "passed" }, { - "name": "Middleware Rewrite should allow to switch locales", + "name": "Edge can read request body middleware reads an URL encoded form data", "status": "passed" }, { - "name": "Middleware Rewrite should allow to rewrite to a `beforeFiles` rewrite config", + "name": "Edge can read request body middleware reads a multipart form data", "status": "passed" - }, + } + ] + }, + { + "name": "esm-externals", + "file": "test/e2e/esm-externals/esm-externals.test.ts", + "passed": 10, + "failed": 0, + "skipped": 0, + "total": "10", + "testCases": [ { - "name": "Middleware Rewrite should allow to rewrite to a `afterFiles` rewrite config", + "name": "esm-externals should return the correct SSR HTML for /static", "status": "passed" }, { - "name": "Middleware Rewrite should have correct query info for dynamic route after query hydration", + "name": "esm-externals should render the correct page for /static", "status": "passed" }, { - "name": "Middleware Rewrite should handle shallow navigation correctly (non-dynamic page)", + "name": "esm-externals should return the correct SSR HTML for /ssr", "status": "passed" }, { - "name": "Middleware Rewrite should handle shallow navigation correctly (dynamic page)", + "name": "esm-externals should render the correct page for /ssr", "status": "passed" }, { - "name": "Middleware Rewrite should resolve dynamic route after rewrite correctly", + "name": "esm-externals should return the correct SSR HTML for /ssg", "status": "passed" }, { - "name": "Middleware Rewrite should add a cookie and rewrite to a/b test", + "name": "esm-externals should render the correct page for /ssg", "status": "passed" }, { - "name": "Middleware Rewrite should clear query parameters", + "name": "esm-externals should return the correct SSR HTML for /server", "status": "passed" }, { - "name": "Middleware Rewrite should rewrite to about page", + "name": "esm-externals should render the correct page for /server", "status": "passed" }, { - "name": "Middleware Rewrite support colons in path", + "name": "esm-externals should return the correct SSR HTML for /client", "status": "passed" }, { - "name": "Middleware Rewrite can rewrite to path with colon", + "name": "esm-externals should render the correct page for /client", "status": "passed" - }, + } + ] + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath", + "file": "test/e2e/i18n-ignore-redirect-source-locale/redirects-with-basepath.test.ts", + "passed": 16, + "failed": 0, + "skipped": 0, + "total": "16", + "testCases": [ { - "name": "Middleware Rewrite can rewrite from path with colon", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: to: sv", "status": "passed" }, { - "name": "Middleware Rewrite can rewrite from path with colon and retain query parameter", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /en to: sv", "status": "passed" }, { - "name": "Middleware Rewrite can rewrite to path with colon and retain query parameter", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /sv to: sv", "status": "passed" }, { - "name": "Middleware Rewrite should rewrite to Vercel", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /nl to: sv", "status": "passed" }, { - "name": "Middleware Rewrite should rewrite without hard navigation", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: to: en", "status": "passed" }, { - "name": "Middleware Rewrite should not call middleware with shallow push", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /en to: en", "status": "passed" }, { - "name": "Middleware Rewrite should correctly rewriting to a different dynamic path", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /sv to: en", "status": "passed" }, { - "name": "Middleware Rewrite should not have unexpected errors", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /nl to: en", "status": "passed" }, { - "name": "Middleware Rewrite /fr should add a cookie and rewrite to a/b test", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: to: /", "status": "passed" }, { - "name": "Middleware Rewrite /fr should clear query parameters", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /en to: /", "status": "passed" }, { - "name": "Middleware Rewrite /fr should rewrite to about page", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /sv to: /", "status": "passed" }, { - "name": "Middleware Rewrite /fr support colons in path", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /nl to: /", "status": "passed" }, { - "name": "Middleware Rewrite /fr can rewrite to path with colon", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from and to: ", "status": "passed" }, { - "name": "Middleware Rewrite /fr can rewrite from path with colon", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from and to: /en", "status": "passed" }, { - "name": "Middleware Rewrite /fr can rewrite from path with colon and retain query parameter", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from and to: /sv", "status": "passed" }, { - "name": "Middleware Rewrite /fr can rewrite to path with colon and retain query parameter", + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from and to: /nl", "status": "passed" - }, + } + ] + }, + { + "name": "Middleware fetches with body", + "file": "test/e2e/middleware-fetches-with-body/index.test.ts", + "passed": 9, + "failed": 0, + "skipped": 0, + "total": "9", + "testCases": [ { - "name": "Middleware Rewrite /fr should rewrite to Vercel", + "name": "Middleware fetches with body with default bodyParser sizeLimit (1mb) should return 413 for body greater than 1mb", "status": "passed" }, { - "name": "Middleware Rewrite /fr should rewrite without hard navigation", + "name": "Middleware fetches with body with default bodyParser sizeLimit (1mb) should be able to send and return body size equal to 1mb", "status": "passed" }, { - "name": "Middleware Rewrite /fr should not call middleware with shallow push", + "name": "Middleware fetches with body with default bodyParser sizeLimit (1mb) should be able to send and return body greater than default highWaterMark (16KiB)", "status": "passed" }, { - "name": "Middleware Rewrite /fr should correctly rewriting to a different dynamic path", + "name": "Middleware fetches with body with custom bodyParser sizeLimit (5kb) should return 413 for body greater than 5kb", "status": "passed" }, { - "name": "Middleware Rewrite should not have unexpected errors", - "status": "passed" - } - ] - }, - { - "name": "next/font/google basepath", - "file": "test/e2e/next-font/basepath.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "next/font/google basepath should skip next deploy for now", - "status": "passed" - } - ] - }, - { - "name": "next/font/google with proxy", - "file": "test/e2e/next-font/with-proxy.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "next/font/google with proxy should skip next deploy", - "status": "passed" - } - ] - }, - { - "name": "next/head", - "file": "test/e2e/next-head/index.test.ts", - "passed": 5, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "next/head should place charset element at the top of ", + "name": "Middleware fetches with body with custom bodyParser sizeLimit (5kb) should be able to send and return body size equal to 5kb", "status": "passed" }, { - "name": "next/head should have correct head tags in initial document", + "name": "Middleware fetches with body with custom bodyParser sizeLimit (5mb) should return 413 for body greater than 5mb", "status": "passed" }, { - "name": "next/head should have correct head tags from a fragment", + "name": "Middleware fetches with body with bodyParser = false should be able to send and return with body size equal to 16KiB", "status": "passed" }, { - "name": "next/head should have correct head tags after hydration", + "name": "Middleware fetches with body with bodyParser = false should be able to send and return with body greater than 16KiB", "status": "passed" }, { - "name": "next/head should have current head tags from a _document getInitialProps", + "name": "Middleware fetches with body should return 413 for body equal to 10mb", "status": "passed" } ] }, { - "name": "beforeInteractive in document Head", - "file": "test/e2e/next-script/index.test.ts", - "passed": 8, + "name": "Middleware Request Headers Overrides", + "file": "test/e2e/middleware-request-header-overrides/test/index.test.ts", + "passed": 9, "failed": 0, "skipped": 0, + "total": "9", "testCases": [ { - "name": "beforeInteractive in document Head Script is injected server-side", + "name": "Middleware Request Headers Overrides Serverless Functions Backend Adds new headers", "status": "passed" }, { - "name": "beforeInteractive in document body Script is injected server-side", + "name": "Middleware Request Headers Overrides Serverless Functions Backend Deletes headers", "status": "passed" }, { - "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: false with no Partytown dependency Partytown snippet is not injected to head if not enabled in configuration", + "name": "Middleware Request Headers Overrides Serverless Functions Backend Updates headers", "status": "passed" }, { - "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with required Partytown dependency for external script Partytown snippets are injected to head if enabled in configuration", + "name": "Middleware Request Headers Overrides Edge Functions Backend Adds new headers", "status": "passed" }, { - "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with required Partytown dependency for external script Worker scripts are modified by Partytown to execute on a worker thread", + "name": "Middleware Request Headers Overrides Edge Functions Backend Deletes headers", "status": "passed" }, { - "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with required Partytown dependency for inline script Inline worker script through children is modified by Partytown to execute on a worker thread", + "name": "Middleware Request Headers Overrides Edge Functions Backend Updates headers", "status": "passed" }, { - "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with required Partytown dependency for inline script Inline worker script through dangerouslySetInnerHtml is modified by Partytown to execute on a worker thread", + "name": "Middleware Request Headers Overrides getServerSideProps Backend Adds new headers", "status": "passed" }, { - "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with config override Partytown config script is overwritten", + "name": "Middleware Request Headers Overrides getServerSideProps Backend Deletes headers", "status": "passed" - } - ] - }, - { - "name": "postcss-config-cjs", - "file": "test/e2e/postcss-config-cjs/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "postcss-config-cjs works with postcss.config.cjs files", + "name": "Middleware Request Headers Overrides getServerSideProps Backend Updates headers", "status": "passed" } ] }, { - "name": "styled-jsx", - "file": "test/e2e/styled-jsx/index.test.ts", + "name": "next/font/google basepath", + "file": "test/e2e/next-font/basepath.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "styled-jsx should skip next deploy", + "name": "next/font/google basepath should skip next deploy for now", "status": "passed" } ] }, { - "name": "yarn PnP", - "file": "test/e2e/yarn-pnp/test/with-eslint.test.ts", - "passed": 1, + "name": "instrumentation pages", + "file": "test/e2e/opentelemetry/instrumentation-pages-app-only.test.ts", + "passed": 4, "failed": 0, "skipped": 0, + "total": "8", "testCases": [ { - "name": "yarn PnP should not run for next deploy", + "name": "instrumentation pages should skip next deploy", "status": "passed" - } - ] - }, - { - "name": "_allow-underscored-root-directory", - "file": "test/e2e/app-dir/_allow-underscored-root-directory/_allow-underscored-root-directory.test.ts", - "passed": 3, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "_allow-underscored-root-directory should not serve app path with underscore", + "name": "instrumentation pages src/ should skip next deploy", "status": "passed" }, { - "name": "_allow-underscored-root-directory should pages path with a underscore at the root", + "name": "instrumentation app should skip next deploy", "status": "passed" }, { - "name": "_allow-underscored-root-directory should serve app path with %5F", + "name": "instrumentation app src/ should skip next deploy", "status": "passed" } ] }, { - "name": "app-dir action handling", - "file": "test/e2e/app-dir/actions-navigation/index.test.ts", - "passed": 1, + "name": "opentelemetry", + "file": "test/e2e/opentelemetry/opentelemetry.test.ts", + "passed": 2, "failed": 0, - "skipped": 1, + "skipped": 0, + "total": "2", "testCases": [ { - "name": "app-dir action handling should handle actions correctly after navigation / redirection events", + "name": "opentelemetry should skip next deploy", "status": "passed" }, { - "name": "app-dir action handling should handle actions correctly after following a relative link", - "status": "skipped", - "reason": "Uses CLI output" + "name": "opentelemetry with disabled fetch tracing should skip next deploy", + "status": "passed" } ] }, { - "name": "app a11y features", - "file": "test/e2e/app-dir/app-a11y/index.test.ts", - "passed": 1, + "name": "Optimized loading", + "file": "test/e2e/optimized-loading/test/index.test.ts", + "passed": 6, "failed": 0, "skipped": 0, + "total": "6", "testCases": [ { - "name": "app a11y features should skip next deploy", + "name": "Optimized loading page / should render the page /", "status": "passed" - } - ] - }, - { - "name": "app dir - basepath", - "file": "test/e2e/app-dir/app-basepath/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "app dir - basepath should skip next deploy", + "name": "Optimized loading page / should not have JS preload links", "status": "passed" - } - ] - }, - { - "name": "app dir - css with pageextensions", - "file": "test/e2e/app-dir/app-css-pageextensions/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "app dir - css with pageextensions should skip next deploy", + "name": "Optimized loading page / should load scripts with defer in head", + "status": "passed" + }, + { + "name": "Optimized loading page /page1 should render the page /page1", + "status": "passed" + }, + { + "name": "Optimized loading page /page1 should not have JS preload links", + "status": "passed" + }, + { + "name": "Optimized loading page /page1 should load scripts with defer in head", "status": "passed" } ] }, { - "name": "app dir - css", - "file": "test/e2e/app-dir/app-css/index.test.ts", - "passed": 1, + "name": "React Context", + "file": "test/e2e/ssr-react-context/index.test.ts", + "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "app dir - css should skip next deploy", + "name": "React Context should render a page with context", + "status": "passed" + }, + { + "name": "React Context should render correctly with context consumer", "status": "passed" } ] }, { - "name": "app-invalid-revalidate", - "file": "test/e2e/app-dir/app-invalid-revalidate/app-invalid-revalidate.test.ts", + "name": "nextTestSetup", + "file": "test/e2e/test-utils-tests/basic/basic.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app-invalid-revalidate should skip next deploy", + "name": "nextTestSetup should work", "status": "passed" } ] }, { - "name": "app dir - prefetching", - "file": "test/e2e/app-dir/app-prefetch/prefetching.test.ts", + "name": "yarn PnP", + "file": "test/e2e/yarn-pnp/test/with-eslint.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app dir - prefetching should skip next deploy", + "name": "yarn PnP should not run for next deploy", "status": "passed" } ] }, { - "name": "app dir rendering", - "file": "test/e2e/app-dir/app-rendering/rendering.test.ts", + "name": "app-dir action disallowed origins", + "file": "test/e2e/app-dir/actions-allowed-origins/app-action-disallowed-origins.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app dir rendering should skip next deploy", + "name": "app-dir action disallowed origins should skip next deploy", "status": "passed" } ] }, { - "name": "app-custom-routes", - "file": "test/e2e/app-dir/app-routes/app-custom-route-base-path.test.ts", - "passed": 62, + "name": "app dir client cache semantics", + "file": "test/e2e/app-dir/app-client-cache/client-cache.test.ts", + "passed": 13, "failed": 0, - "skipped": 2, + "skipped": 0, + "total": "13", "testCases": [ { - "name": "app-custom-routes works with api prefix correctly statically generates correctly with no dynamic usage", + "name": "app dir client cache semantics prefetch={true} should prefetch the full page", "status": "passed" }, { - "name": "app-custom-routes works with api prefix correctly does not statically generate with dynamic usage", + "name": "app dir client cache semantics prefetch={true} should re-use the cache for the full page, only for 5 mins", "status": "passed" }, { - "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/first/data.json", + "name": "app dir client cache semantics prefetch={true} should prefetch again after 5 mins if the link is visible again", "status": "passed" }, { - "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/second/data.json", + "name": "app dir client cache semantics prefetch={false} should not prefetch the page at all", "status": "passed" }, { - "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/three/data.json", + "name": "app dir client cache semantics prefetch={false} should re-use the cache only for 30 seconds", "status": "passed" }, { - "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/first/data.json", + "name": "app dir client cache semantics prefetch={undefined} - default should prefetch partially a dynamic page", "status": "passed" }, { - "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/second/data.json", + "name": "app dir client cache semantics prefetch={undefined} - default should re-use the full cache for only 30 seconds", "status": "passed" }, { - "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/three/data.json", + "name": "app dir client cache semantics prefetch={undefined} - default should renew the 30s cache once the data is revalidated", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response made via a GET request responds correctly on /basic/endpoint", + "name": "app dir client cache semantics prefetch={undefined} - default should refetch below the fold after 30 seconds", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response made via a GET request responds correctly on /basic/vercel/endpoint", + "name": "app dir client cache semantics prefetch={undefined} - default should refetch the full page after 5 mins", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response made via a POST request responds correctly on /basic/endpoint", + "name": "app dir client cache semantics prefetch={undefined} - default should respect a loading boundary that returns `null`", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response made via a POST request responds correctly on /basic/vercel/endpoint", + "name": "app dir client cache semantics should seed the prefetch cache with the fetched page data", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response made via a PUT request responds correctly on /basic/endpoint", - "status": "passed" - }, - { - "name": "app-custom-routes basic fetch request with a response made via a PUT request responds correctly on /basic/vercel/endpoint", - "status": "passed" - }, - { - "name": "app-custom-routes basic fetch request with a response made via a DELETE request responds correctly on /basic/endpoint", + "name": "app dir client cache semantics should renew the initial seeded data after expiration time", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - css with pageextensions", + "file": "test/e2e/app-dir/app-css-pageextensions/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "app-custom-routes basic fetch request with a response made via a DELETE request responds correctly on /basic/vercel/endpoint", + "name": "app dir - css with pageextensions should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - prefetching", + "file": "test/e2e/app-dir/app-prefetch/prefetching.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "app-custom-routes basic fetch request with a response made via a PATCH request responds correctly on /basic/endpoint", + "name": "app dir - prefetching should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "Web Crypto API is available globally", + "file": "test/e2e/app-dir/crypto-globally-available/crypto-globally-available.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "app-custom-routes basic fetch request with a response made via a PATCH request responds correctly on /basic/vercel/endpoint", + "name": "Web Crypto API is available globally should be available in Server Components", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a GET request aborts without error on /basic/endpoint", + "name": "Web Crypto API is available globally should be available in Route Handlers", "status": "passed" - }, + } + ] + }, + { + "name": "app-dir - dynamic in generate params", + "file": "test/e2e/app-dir/dynamic-in-generate-params/index.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ { - "name": "app-custom-routes basic fetch request with a response abort via a GET request aborts without error on /basic/vercel/endpoint", + "name": "app-dir - dynamic in generate params should render sitemap with generateSitemaps in force-dynamic config dynamically", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a POST request aborts without error on /basic/endpoint", + "name": "app-dir - dynamic in generate params should be able to call while generating multiple dynamic sitemaps", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a POST request aborts without error on /basic/vercel/endpoint", + "name": "app-dir - dynamic in generate params should be able to call fetch while generating multiple dynamic pages", "status": "passed" - }, + } + ] + }, + { + "name": "edge-route-catchall", + "file": "test/e2e/app-dir/edge-route-catchall/edge-route-catchall.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "app-custom-routes basic fetch request with a response abort via a PUT request aborts without error on /basic/endpoint", + "name": "edge-route-catchall should correctly normalize edge route catch-all with a single param", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a PUT request aborts without error on /basic/vercel/endpoint", + "name": "edge-route-catchall should correctly normalize edge route catch-all with multiple params", "status": "passed" - }, + } + ] + }, + { + "name": "edge runtime node compatibility", + "file": "test/e2e/app-dir/edge-runtime-node-compatibility/edge-runtime-node-compatibility.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "app-custom-routes basic fetch request with a response abort via a DELETE request aborts without error on /basic/endpoint", + "name": "edge runtime node compatibility [app] supports node:buffer", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response abort via a DELETE request aborts without error on /basic/vercel/endpoint", + "name": "edge runtime node compatibility [pages/api] supports node:buffer", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - global error - layout error", + "file": "test/e2e/app-dir/global-error/layout-error/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "app-custom-routes basic fetch request with a response abort via a PATCH request aborts without error on /basic/endpoint", + "name": "app dir - global error - layout error should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "interception-route-prefetch-cache", + "file": "test/e2e/app-dir/interception-route-prefetch-cache/interception-route-prefetch-cache.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "app-custom-routes basic fetch request with a response abort via a PATCH request aborts without error on /basic/vercel/endpoint", + "name": "interception-route-prefetch-cache runtime = nodejs should render the correct interception when two distinct layouts share the same path structure", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response route groups routes to the correct handler", + "name": "interception-route-prefetch-cache runtime = edge should render the correct interception when two distinct layouts share the same path structure", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - not-found - conflict route", + "file": "test/e2e/app-dir/not-found/conflict-route/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "app-custom-routes basic fetch request with a response request can read query parameters", + "name": "app dir - not-found - conflict route should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "parallel-routes-catchall-specificity", + "file": "test/e2e/app-dir/parallel-routes-catchall-specificity/parallel-routes-catchall-specificity.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "app-custom-routes basic fetch request with a response request can read query parameters (edge)", + "name": "parallel-routes-catchall-specificity should match the catch-all route when navigating from a page with a similar path depth as the previously matched slot", "status": "passed" - }, + } + ] + }, + { + "name": "turbo-resolve-extensions", + "file": "test/e2e/app-dir/resolve-extensions/resolve-extensions.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "app-custom-routes basic fetch request with a response response supports the NextResponse.redirect() helper", + "name": "turbo-resolve-extensions should SSR", "status": "passed" }, { - "name": "app-custom-routes basic fetch request with a response response supports the NextResponse.json() helper", + "name": "turbo-resolve-extensions should work using browser", "status": "passed" - }, + } + ] + }, + { + "name": "Basic Module Additional Data Support", + "file": "test/e2e/app-dir/scss/basic-module-additional-data/basic-module-additional-data.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "app-custom-routes body can handle handle a streaming request and streaming response (edge)", + "name": "Basic Module Additional Data Support should render the module", "status": "passed" - }, + } + ] + }, + { + "name": "Has CSS Module in computed styles in Development", + "file": "test/e2e/app-dir/scss/dev-module/dev-module.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "app-custom-routes body can read a JSON encoded body", + "name": "Has CSS Module in computed styles in Development should have CSS for page", "status": "passed" - }, + } + ] + }, + { + "name": "Good Nested CSS Import from node_modules", + "file": "test/e2e/app-dir/scss/npm-import-nested/npm-import-nested.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "app-custom-routes body can read a JSON encoded body (edge)", + "name": "Good Nested CSS Import from node_modules should render the page", "status": "passed" - }, + } + ] + }, + { + "name": "unused scss", + "file": "test/e2e/app-dir/scss/unused/unused.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [] + }, + { + "name": "{{name}}", + "file": "test/e2e/app-dir/test-template/{{ toFileName name }}/{{ toFileName name }}.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ { - "name": "app-custom-routes body can read a JSON encoded body for DELETE requests", + "name": "{{name}} should work using cheerio", "status": "passed" }, { - "name": "app-custom-routes body can read a JSON encoded body for OPTIONS requests", + "name": "{{name}} should work using browser", "status": "passed" }, { - "name": "app-custom-routes body can read a streamed JSON encoded body (edge)", + "name": "{{name}} should work with html", "status": "passed" }, { - "name": "app-custom-routes body can read the text body", + "name": "{{name}} should work with fetch", "status": "passed" - }, + } + ] + }, + { + "name": "Browserslist", + "file": "test/e2e/browserslist/browserslist.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "async export", + "file": "test/e2e/config-promise-export/async-function.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "app-custom-routes body can read the text body (edge)", + "name": "async export should work", "status": "passed" - }, - { - "name": "app-custom-routes context provides params to routes with dynamic parameters", + } + ] + }, + { + "name": "edge-runtime uses edge-light import specifier for packages", + "file": "test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/edge-runtime-uses-edge-light-import-specifier-for-packages.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "edge-runtime uses edge-light import specifier for packages should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "i18-preferred-locale-redirect", + "file": "test/e2e/i18n-preferred-locale-detection/i18n-preferred-locale-detection.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ { - "name": "app-custom-routes context provides params to routes with catch-all routes", + "name": "i18-preferred-locale-redirect should request a path prefixed with my preferred detected locale when accessing index", "status": "passed" }, { - "name": "app-custom-routes context does not provide params to routes without dynamic parameters", + "name": "i18-preferred-locale-redirect should not request a path prefixed with my preferred detected locale when clicking link to index from a non-locale-prefixed path", "status": "passed" }, { - "name": "app-custom-routes hooks headers gets the correct values", + "name": "i18-preferred-locale-redirect should request a path prefixed with my preferred detected locale when clicking link to index from a locale-prefixed path", "status": "passed" - }, + } + ] + }, + { + "name": "Middleware base tests", + "file": "test/e2e/middleware-base-path/test/index.test.ts", + "passed": 1, + "failed": 1, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "app-custom-routes hooks cookies gets the correct values", + "name": "Middleware base tests should execute from absolute paths", "status": "passed" }, { - "name": "app-custom-routes hooks req.cookies gets the correct values", + "name": "Middleware base tests router.query must exist when Link clicked page routing", + "status": "failed", + "reason": "Pages router data requests returning 404 when middleware is used", + "link": "https://github.com/netlify/next-runtime-minimal/issues/450" + } + ] + }, + { + "name": "Middleware Rewrite", + "file": "test/e2e/middleware-rewrites/test/index.test.ts", + "passed": 55, + "failed": 0, + "skipped": 0, + "total": "56", + "testCases": [ + { + "name": "Middleware Rewrite should handle catch-all rewrite correctly", "status": "passed" }, { - "name": "app-custom-routes hooks cookies().has() gets the correct values", + "name": "Middleware Rewrite should handle next.config.js rewrite with body correctly", "status": "passed" }, { - "name": "app-custom-routes hooks redirect can respond correctly", + "name": "Middleware Rewrite should handle middleware rewrite with body correctly", "status": "passed" }, { - "name": "app-custom-routes hooks permanentRedirect can respond correctly", + "name": "Middleware Rewrite should handle static dynamic rewrite from middleware correctly", "status": "passed" }, { - "name": "app-custom-routes hooks notFound can respond correctly in nodejs", + "name": "Middleware Rewrite should handle static rewrite from next.config.js correctly", "status": "passed" }, { - "name": "app-custom-routes hooks notFound can respond correctly in edge", + "name": "Middleware Rewrite should not have un-necessary data request on rewrite", "status": "passed" }, { - "name": "app-custom-routes error conditions responds with 405 (Method Not Allowed) when method is not implemented", + "name": "Middleware Rewrite should not mix component cache when navigating between dynamic routes", "status": "passed" }, { - "name": "app-custom-routes error conditions responds with 500 (Internal Server Error) when the handler throws an error", + "name": "Middleware Rewrite should have props for afterFiles rewrite to SSG page", "status": "passed" }, { - "name": "app-custom-routes error conditions responds with 500 (Internal Server Error) when the handler calls NextResponse.next()", + "name": "Middleware Rewrite should hard navigate on 404 for data request", "status": "passed" }, { - "name": "app-custom-routes automatic implementations implements HEAD on routes with GET already implemented", + "name": "Middleware Rewrite should rewrite correctly when navigating via history", "status": "passed" }, { - "name": "app-custom-routes automatic implementations implements OPTIONS on routes", + "name": "Middleware Rewrite should rewrite correctly when navigating via history after query update", "status": "passed" }, { - "name": "app-custom-routes edge functions returns response using edge runtime", + "name": "Middleware Rewrite should return HTML/data correctly for pre-rendered page", "status": "passed" }, { - "name": "app-custom-routes edge functions returns a response when headers are accessed", + "name": "Middleware Rewrite should override with rewrite internally correctly", "status": "passed" }, { - "name": "app-custom-routes dynamic = \"force-static\" strips search, headers, and domain from request", + "name": "Middleware Rewrite should rewrite to data urls for incoming data request internally rewritten", "status": "passed" }, { - "name": "app-custom-routes customized metadata routes should work if conflict with metadata routes convention", + "name": "Middleware Rewrite should override with rewrite externally correctly", "status": "passed" }, { - "name": "app-custom-routes no bundle error should not print bundling warning about React", + "name": "Middleware Rewrite should rewrite to the external url for incoming data request externally rewritten", "status": "passed" }, { - "name": "app-custom-routes no response returned should print an error when no response is returned", - "status": "skipped", - "reason": "Uses CLI output" + "name": "Middleware Rewrite should rewrite to fallback: true page successfully", + "status": "passed" }, { - "name": "app-custom-routes error conditions responds with 400 (Bad Request) when the requested method is not a valid HTTP method", - "status": "skipped", - "reason": "Uses CLI output" - } - ] - }, - { - "name": "app-dir assetPrefix with basePath handling", - "file": "test/e2e/app-dir/asset-prefix-with-basepath/asset-prefix-with-basepath.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + "name": "Middleware Rewrite should allow to opt-out prefetch caching", + "status": "passed" + }, { - "name": "app-dir assetPrefix with basePath handling should skip next deploy", + "name": "Middleware Rewrite should not prefetch non-SSG routes", "status": "passed" - } - ] - }, - { - "name": "app-dir assetPrefix handling", - "file": "test/e2e/app-dir/asset-prefix/asset-prefix.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "app-dir assetPrefix handling should skip next deploy", + "name": "Middleware Rewrite should allow to rewrite keeping the locale in pathname", "status": "passed" - } - ] - }, - { - "name": "app-dir back button download bug", - "file": "test/e2e/app-dir/back-button-download-bug/back-button-download-bug.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "conflicting-page-segments", - "file": "test/e2e/app-dir/conflicting-page-segments/conflicting-page-segments.test.ts", - "passed": 0, - "failed": 0, - "skipped": 1, - "testCases": [ + }, { - "name": "conflicting-page-segments should throw an error when a route groups causes a conflict with a parallel segment", - "status": "skipped", - "reason": "Uses CLI output" - } - ] - }, - { - "name": "Web Crypto API is available globally", - "file": "test/e2e/app-dir/crypto-globally-available/crypto-globally-available.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ + "name": "Middleware Rewrite should allow to rewrite to a different locale", + "status": "passed" + }, { - "name": "Web Crypto API is available globally should be available in Server Components", + "name": "Middleware Rewrite should behave consistently on recursive rewrites", "status": "passed" }, { - "name": "Web Crypto API is available globally should be available in Route Handlers", + "name": "Middleware Rewrite should allow to switch locales", "status": "passed" - } - ] - }, - { - "name": "app dir - draft mode", - "file": "test/e2e/app-dir/draft-mode/draft-mode.test.ts", - "passed": 21, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "app dir - draft mode in nodejs runtime should use initial rand when draft mode is disabled on /index", + "name": "Middleware Rewrite should allow to rewrite to a `beforeFiles` rewrite config", "status": "passed" }, { - "name": "app dir - draft mode in nodejs runtime should use initial rand when draft mode is disabled on /with-cookies", + "name": "Middleware Rewrite should allow to rewrite to a `afterFiles` rewrite config", "status": "passed" }, { - "name": "app dir - draft mode in nodejs runtime should not generate rand when draft mode disabled during next start", + "name": "Middleware Rewrite should have correct query info for dynamic route after query hydration", "status": "passed" }, { - "name": "app dir - draft mode in nodejs runtime should not read other cookies when draft mode disabled during next start", + "name": "Middleware Rewrite should handle shallow navigation correctly (non-dynamic page)", "status": "passed" }, { - "name": "app dir - draft mode in nodejs runtime should be disabled from api route handler", + "name": "Middleware Rewrite should handle shallow navigation correctly (dynamic page)", "status": "passed" }, { - "name": "app dir - draft mode in nodejs runtime should have set-cookie header on enable", + "name": "Middleware Rewrite should resolve dynamic route after rewrite correctly", "status": "passed" }, { - "name": "app dir - draft mode in nodejs runtime should have set-cookie header with redirect location", + "name": "Middleware Rewrite should add a cookie and rewrite to a/b test", "status": "passed" }, { - "name": "app dir - draft mode in nodejs runtime should genenerate rand when draft mode enabled", + "name": "Middleware Rewrite should clear query parameters", "status": "passed" }, { - "name": "app dir - draft mode in nodejs runtime should read other cookies when draft mode enabled", + "name": "Middleware Rewrite should rewrite to about page", "status": "passed" }, { - "name": "app dir - draft mode in nodejs runtime should be enabled from api route handler when draft mode enabled", + "name": "Middleware Rewrite support colons in path", "status": "passed" }, { - "name": "app dir - draft mode in nodejs runtime should not perform full page navigation on router.refresh()", + "name": "Middleware Rewrite can rewrite to path with colon", "status": "passed" }, { - "name": "app dir - draft mode in edge runtime should use initial rand when draft mode is disabled on /with-edge/index", + "name": "Middleware Rewrite can rewrite from path with colon", "status": "passed" }, { - "name": "app dir - draft mode in edge runtime should use initial rand when draft mode is disabled on /with-edge/with-cookies", + "name": "Middleware Rewrite can rewrite from path with colon and retain query parameter", "status": "passed" }, { - "name": "app dir - draft mode in edge runtime should not read other cookies when draft mode disabled during next start", + "name": "Middleware Rewrite can rewrite to path with colon and retain query parameter", "status": "passed" }, { - "name": "app dir - draft mode in edge runtime should be disabled from api route handler", + "name": "Middleware Rewrite should rewrite to Vercel", "status": "passed" }, { - "name": "app dir - draft mode in edge runtime should have set-cookie header on enable", + "name": "Middleware Rewrite should rewrite without hard navigation", "status": "passed" }, { - "name": "app dir - draft mode in edge runtime should have set-cookie header with redirect location", + "name": "Middleware Rewrite should not call middleware with shallow push", "status": "passed" }, { - "name": "app dir - draft mode in edge runtime should genenerate rand when draft mode enabled", + "name": "Middleware Rewrite should correctly rewriting to a different dynamic path", "status": "passed" }, { - "name": "app dir - draft mode in edge runtime should read other cookies when draft mode enabled", + "name": "Middleware Rewrite should not have unexpected errors", "status": "passed" }, { - "name": "app dir - draft mode in edge runtime should be enabled from api route handler when draft mode enabled", + "name": "Middleware Rewrite /fr should add a cookie and rewrite to a/b test", "status": "passed" }, { - "name": "app dir - draft mode in edge runtime should not perform full page navigation on router.refresh()", + "name": "Middleware Rewrite /fr should clear query parameters", "status": "passed" - } - ] - }, - { - "name": "app dir - dynamic css", - "file": "test/e2e/app-dir/dynamic-css/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "app dir - dynamic css should skip next deploy", + "name": "Middleware Rewrite /fr should rewrite to about page", "status": "passed" - } - ] - }, - { - "name": "dynamic-href", - "file": "test/e2e/app-dir/dynamic-href/dynamic-href.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "dynamic-href should skip next deploy", + "name": "Middleware Rewrite /fr support colons in path", "status": "passed" - } - ] - }, - { - "name": "dynamic-requests", - "file": "test/e2e/app-dir/dynamic-requests/dynamic-requests.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "dynamic-requests should not error for dynamic requests in pages", + "name": "Middleware Rewrite /fr can rewrite to path with colon", "status": "passed" }, { - "name": "dynamic-requests should not error for dynamic requests in routes", + "name": "Middleware Rewrite /fr can rewrite from path with colon", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr can rewrite from path with colon and retain query parameter", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr can rewrite to path with colon and retain query parameter", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr should rewrite to Vercel", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr should rewrite without hard navigation", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr should not call middleware with shallow push", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr should correctly rewriting to a different dynamic path", + "status": "passed" + }, + { + "name": "Middleware Rewrite should not have unexpected errors", "status": "passed" } ] }, { - "name": "edge-route-rewrite", - "file": "test/e2e/app-dir/edge-route-rewrite/edge-route-rewrite.test.ts", - "passed": 2, + "name": "pages performance mark", + "file": "test/e2e/pages-performance-mark/index.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "edge-route-rewrite it should support a rewrite to an edge route", - "status": "passed" - }, - { - "name": "edge-route-rewrite it should support a rewrite to a dynamic edge route", + "name": "pages performance mark should skip next deploy", "status": "passed" } ] }, { - "name": "app dir - emotion-js", - "file": "test/e2e/app-dir/emotion-js/index.test.ts", - "passed": 1, + "name": "streaming SSR with custom next configs", + "file": "test/e2e/streaming-ssr/index.test.ts", + "passed": 5, "failed": 0, "skipped": 0, + "total": "5", "testCases": [ { - "name": "app dir - emotion-js should skip next deploy", + "name": "streaming SSR with custom next configs should match more specific route along with dynamic routes", + "status": "passed" + }, + { + "name": "streaming SSR with custom next configs should render styled-jsx styles in streaming", + "status": "passed" + }, + { + "name": "streaming SSR with custom next configs should redirect paths without trailing-slash and render when slash is appended", + "status": "passed" + }, + { + "name": "streaming SSR with custom next configs should render next/router correctly in edge runtime", + "status": "passed" + }, + { + "name": "streaming SSR with custom next configs should render multi-byte characters correctly in streaming", "status": "passed" } ] }, { - "name": "app dir - front redirect issue", - "file": "test/e2e/app-dir/front-redirect-issue/front-redirect-issue.test.ts", + "name": "app-dir action handling", + "file": "test/e2e/app-dir/actions-navigation/index.test.ts", "passed": 1, "failed": 0, - "skipped": 0, + "skipped": 1, + "total": "2", "testCases": [ { - "name": "app dir - front redirect issue should redirect", + "name": "app-dir action handling should handle actions correctly after navigation / redirection events", "status": "passed" + }, + { + "name": "app-dir action handling should handle actions correctly after following a relative link", + "status": "skipped", + "reason": "Uses CLI output" } ] }, { - "name": "app dir - global error - layout error", - "file": "test/e2e/app-dir/global-error/layout-error/index.test.ts", - "passed": 1, + "name": "app-dir - esm js extension", + "file": "test/e2e/app-dir/app-esm-js/index.test.ts", + "passed": 3, "failed": 0, "skipped": 0, + "total": "3", "testCases": [ { - "name": "app dir - global error - layout error should skip next deploy", + "name": "app-dir - esm js extension should be able to render nextjs api in app router", + "status": "passed" + }, + { + "name": "app-dir - esm js extension should be able to use nextjs api in pages router", + "status": "passed" + }, + { + "name": "app-dir - esm js extension should support next/og image", "status": "passed" } ] }, { - "name": "interception-dynamic-segment", - "file": "test/e2e/app-dir/interception-dynamic-segment/interception-dynamic-segment.test.ts", + "name": "app-invalid-revalidate", + "file": "test/e2e/app-dir/app-invalid-revalidate/app-invalid-revalidate.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "interception-dynamic-segment should work when interception route is paired with a dynamic segment", + "name": "app-invalid-revalidate should skip next deploy", "status": "passed" } ] }, { - "name": "app dir - layout params", - "file": "test/e2e/app-dir/layout-params/layout-params.test.ts", - "passed": 6, + "name": "app-simple-routes", + "file": "test/e2e/app-dir/app-simple-routes/app-simple-routes.test.ts", + "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "app dir - layout params basic params check layout without params get no params", - "status": "passed" - }, - { - "name": "app dir - layout params basic params check layout renders just it's params", - "status": "passed" - }, - { - "name": "app dir - layout params basic params check topmost layout renders all params", - "status": "passed" - }, - { - "name": "app dir - layout params catchall params should give catchall params just to last layout", - "status": "passed" - }, - { - "name": "app dir - layout params catchall params should give optional catchall params just to last layout", + "name": "app-simple-routes works with simple routes renders a node route", "status": "passed" }, { - "name": "app dir - layout params catchall params should give empty optional catchall params won't give params to any layout", + "name": "app-simple-routes works with simple routes renders a edge route", "status": "passed" } ] }, { - "name": "app-dir - logging", - "file": "test/e2e/app-dir/logging/fetch-logging.test.ts", - "passed": 1, + "name": "app-dir back button download bug", + "file": "test/e2e/app-dir/back-button-download-bug/back-button-download-bug.test.ts", + "passed": 0, "failed": 0, "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "conflicting-page-segments", + "file": "test/e2e/app-dir/conflicting-page-segments/conflicting-page-segments.test.ts", + "passed": 0, + "failed": 0, + "skipped": 1, + "total": "1", "testCases": [ { - "name": "app-dir - logging should skip next deploy", - "status": "passed" + "name": "conflicting-page-segments should throw an error when a route groups causes a conflict with a parallel segment", + "status": "skipped", + "reason": "Uses CLI output" } ] }, { - "name": "app dir - metadata", - "file": "test/e2e/app-dir/metadata/metadata.test.ts", - "passed": 43, + "name": "css-order strict", + "file": "test/e2e/app-dir/css-order/css-order.test.ts", + "passed": 176, "failed": 0, - "skipped": 3, + "skipped": 0, + "total": "176", "testCases": [ { - "name": "app dir - metadata basic should support title and description", + "name": "css-order strict should load correct styles navigating back again first -> second -> first -> second", "status": "passed" }, { - "name": "app dir - metadata basic should support title template", + "name": "css-order strict should load correct styles navigating back again first -> third -> first -> third", "status": "passed" }, { - "name": "app dir - metadata basic should support stashed title in one layer of page and layout", + "name": "css-order strict should load correct styles navigating back again first -> first-client -> first -> first-client", "status": "passed" }, { - "name": "app dir - metadata basic should use parent layout title when no title is defined in page", + "name": "css-order strict should load correct styles navigating back again first -> second-client -> first -> second-client", "status": "passed" }, { - "name": "app dir - metadata basic should support stashed title in two layers of page and layout", + "name": "css-order strict should load correct styles navigating back again second -> first -> second -> first", "status": "passed" }, { - "name": "app dir - metadata basic should support other basic tags", + "name": "css-order strict should load correct styles navigating back again second -> third -> second -> third", "status": "passed" }, { - "name": "app dir - metadata basic should support other basic tags (edge)", + "name": "css-order strict should load correct styles navigating back again second -> first-client -> second -> first-client", "status": "passed" }, { - "name": "app dir - metadata basic should support apple related tags `itunes` and `appWebApp`", + "name": "css-order strict should load correct styles navigating back again second -> second-client -> second -> second-client", "status": "passed" }, { - "name": "app dir - metadata basic should support alternate tags", + "name": "css-order strict should load correct styles navigating back again third -> first -> third -> first", "status": "passed" }, { - "name": "app dir - metadata basic should relative canonical url", + "name": "css-order strict should load correct styles navigating back again third -> second -> third -> second", "status": "passed" }, { - "name": "app dir - metadata basic should not contain query in canonical url after client navigation", + "name": "css-order strict should load correct styles navigating back again third -> first-client -> third -> first-client", "status": "passed" }, { - "name": "app dir - metadata basic should support robots tags", + "name": "css-order strict should load correct styles navigating back again third -> second-client -> third -> second-client", "status": "passed" }, { - "name": "app dir - metadata basic should support verification tags", + "name": "css-order strict should load correct styles navigating back again first-client -> first -> first-client -> first", "status": "passed" }, { - "name": "app dir - metadata basic should support appLinks tags", + "name": "css-order strict should load correct styles navigating back again first-client -> second -> first-client -> second", "status": "passed" }, { - "name": "app dir - metadata basic should apply metadata when navigating client-side", + "name": "css-order strict should load correct styles navigating back again first-client -> third -> first-client -> third", "status": "passed" }, { - "name": "app dir - metadata basic should support generateMetadata export", + "name": "css-order strict should load correct styles navigating back again first-client -> second-client -> first-client -> second-client", "status": "passed" }, { - "name": "app dir - metadata basic should handle metadataBase for urls resolved as only URL type", + "name": "css-order strict should load correct styles navigating back again second-client -> first -> second-client -> first", "status": "passed" }, { - "name": "app dir - metadata opengraph should support opengraph tags", + "name": "css-order strict should load correct styles navigating back again second-client -> second -> second-client -> second", "status": "passed" }, { - "name": "app dir - metadata opengraph should support opengraph with article type", + "name": "css-order strict should load correct styles navigating back again second-client -> third -> second-client -> third", "status": "passed" }, { - "name": "app dir - metadata opengraph should override file based images when opengraph-image and twitter-image specify images property", + "name": "css-order strict should load correct styles navigating back again second-client -> first-client -> second-client -> first-client", "status": "passed" }, { - "name": "app dir - metadata navigation should render root not-found with default metadata", + "name": "css-order strict should load correct styles navigating back again interleaved-a -> interleaved-b -> interleaved-a -> interleaved-b", "status": "passed" }, { - "name": "app dir - metadata navigation should support notFound in generateMetadata", + "name": "css-order strict should load correct styles navigating back again interleaved-b -> interleaved-a -> interleaved-b -> interleaved-a", "status": "passed" }, { - "name": "app dir - metadata navigation should support redirect in generateMetadata", + "name": "css-order strict should load correct styles navigating back again big-interleaved-a -> big-interleaved-b -> big-interleaved-a -> big-interleaved-b", "status": "passed" }, { - "name": "app dir - metadata icons should support basic object icons field", + "name": "css-order strict should load correct styles navigating back again big-interleaved-b -> big-interleaved-a -> big-interleaved-b -> big-interleaved-a", "status": "passed" }, { - "name": "app dir - metadata icons should support basic string icons field", + "name": "css-order strict should load correct styles navigating back again pages-first -> pages-second -> pages-first -> pages-second", "status": "passed" }, { - "name": "app dir - metadata icons should support basic complex descriptor icons field", + "name": "css-order strict should load correct styles navigating back again pages-first -> pages-third -> pages-first -> pages-third", "status": "passed" }, { - "name": "app dir - metadata icons should merge icons from layout if no static icons files are specified", + "name": "css-order strict should load correct styles navigating back again pages-second -> pages-first -> pages-second -> pages-first", "status": "passed" }, { - "name": "app dir - metadata icons should not hoist meta[itemProp] to head", + "name": "css-order strict should load correct styles navigating back again pages-second -> pages-third -> pages-second -> pages-third", "status": "passed" }, { - "name": "app dir - metadata icons should support root level of favicon.ico", + "name": "css-order strict should load correct styles navigating back again pages-third -> pages-first -> pages-third -> pages-first", "status": "passed" }, { - "name": "app dir - metadata file based icons should render icon and apple touch icon meta if their images are specified", + "name": "css-order strict should load correct styles navigating back again pages-third -> pages-second -> pages-third -> pages-second", "status": "passed" }, { - "name": "app dir - metadata file based icons should not render if image file is not specified", + "name": "css-order strict should load correct styles navigating back again pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b", "status": "passed" }, { - "name": "app dir - metadata twitter should support twitter card summary_large_image when image present", + "name": "css-order strict should load correct styles navigating back again pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a", "status": "passed" }, { - "name": "app dir - metadata twitter should render twitter card summary when image is not present", + "name": "css-order strict should load correct styles navigating back again pages-reversed-a -> pages-reversed-b -> pages-reversed-a -> pages-reversed-b", "status": "passed" }, { - "name": "app dir - metadata twitter should support default twitter player card", + "name": "css-order strict should load correct styles navigating back again pages-reversed-b -> pages-reversed-a -> pages-reversed-b -> pages-reversed-a", "status": "passed" }, { - "name": "app dir - metadata twitter should support default twitter app card", + "name": "css-order strict should load correct styles navigating back again pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b", "status": "passed" }, { - "name": "app dir - metadata static routes should support root dir robots.txt", + "name": "css-order strict should load correct styles navigating back again pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a", "status": "passed" }, { - "name": "app dir - metadata static routes should support sitemap.xml under every routes", + "name": "css-order loose should load correct styles navigating back again first -> second -> first -> second", "status": "passed" }, { - "name": "app dir - metadata static routes should support static manifest.webmanifest", + "name": "css-order loose should load correct styles navigating back again first -> third -> first -> third", "status": "passed" }, { - "name": "app dir - metadata viewport should support dynamic viewport export", + "name": "css-order loose should load correct styles navigating back again first -> first-client -> first -> first-client", "status": "passed" }, { - "name": "app dir - metadata react cache should have same title and page value on initial load", + "name": "css-order loose should load correct styles navigating back again first -> second-client -> first -> second-client", "status": "passed" }, { - "name": "app dir - metadata react cache should have same title and page value when navigating", + "name": "css-order loose should load correct styles navigating back again second -> first -> second -> first", "status": "passed" }, { - "name": "app dir - metadata should not effect metadata images convention like files under pages directory", + "name": "css-order loose should load correct styles navigating back again second -> third -> second -> third", "status": "passed" }, { - "name": "app dir - metadata should not crash from error thrown during preloading nested generateMetadata", + "name": "css-order loose should load correct styles navigating back again second -> first-client -> second -> first-client", "status": "passed" }, { - "name": "app dir - metadata opengraph should pick up opengraph-image and twitter-image as static metadata files", - "status": "skipped", - "reason": "Hard-coded Vercel URL" + "name": "css-order loose should load correct styles navigating back again second -> second-client -> second -> second-client", + "status": "passed" }, { - "name": "app dir - metadata static routes should have /favicon.ico as route", - "status": "skipped", - "reason": "Hard-coded Vercel URL" + "name": "css-order loose should load correct styles navigating back again third -> first -> third -> first", + "status": "passed" }, { - "name": "app dir - metadata static routes should have icons as route", - "status": "skipped", - "reason": "Hard-coded Vercel URL" - } - ] - }, - { - "name": "app dir - not-found - basic", - "file": "test/e2e/app-dir/not-found/basic/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + "name": "css-order loose should load correct styles navigating back again third -> second -> third -> second", + "status": "passed" + }, { - "name": "app dir - not-found - basic should skip next deploy", + "name": "css-order loose should load correct styles navigating back again third -> first-client -> third -> first-client", "status": "passed" - } - ] - }, - { - "name": "parallel-route-not-found", - "file": "test/e2e/app-dir/parallel-route-not-found/parallel-route-not-found.test.ts", - "passed": 3, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "parallel-route-not-found should handle a layout that attempts to render a missing parallel route", + "name": "css-order loose should load correct styles navigating back again third -> second-client -> third -> second-client", "status": "passed" }, { - "name": "parallel-route-not-found should handle multiple missing parallel routes", + "name": "css-order loose should load correct styles navigating back again first-client -> first -> first-client -> first", "status": "passed" }, { - "name": "parallel-route-not-found should render the page & slots if all parallel routes are found", + "name": "css-order loose should load correct styles navigating back again first-client -> second -> first-client -> second", "status": "passed" - } - ] - }, - { - "name": "parallel-routes-catchall-dynamic-segment", - "file": "test/e2e/app-dir/parallel-routes-catchall-dynamic-segment/parallel-routes-catchall-dynamic-segment.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "parallel-routes-catchall-dynamic-segment should match default and dynamic segment paths before catch-all", + "name": "css-order loose should load correct styles navigating back again first-client -> third -> first-client -> third", "status": "passed" - } - ] - }, - { - "name": "parallel-routes-catchall-specificity", - "file": "test/e2e/app-dir/parallel-routes-catchall-specificity/parallel-routes-catchall-specificity.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "parallel-routes-catchall-specificity should match the catch-all route when navigating from a page with a similar path depth as the previously matched slot", + "name": "css-order loose should load correct styles navigating back again first-client -> second-client -> first-client -> second-client", "status": "passed" - } - ] - }, - { - "name": "parallel-routes-and-interception", - "file": "test/e2e/app-dir/parallel-routes-not-found/parallel-routes-not-found.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "parallel-routes-and-interception should skip next deploy", + "name": "css-order loose should load correct styles navigating back again second-client -> first -> second-client -> first", "status": "passed" - } - ] - }, - { - "name": "parallel-routes-revalidation", - "file": "test/e2e/app-dir/parallel-routes-revalidation/parallel-routes-revalidation.test.ts", - "passed": 15, - "failed": 1, - "skipped": 0, - "testCases": [ + }, { - "name": "parallel-routes-revalidation should submit the action and revalidate the page data", - "status": "failed" + "name": "css-order loose should load correct styles navigating back again second-client -> second -> second-client -> second", + "status": "passed" }, { - "name": "parallel-routes-revalidation should handle router.refresh() when called in a slot", + "name": "css-order loose should load correct styles navigating back again second-client -> third -> second-client -> third", "status": "passed" }, { - "name": "parallel-routes-revalidation should handle a redirect action when called in a slot", + "name": "css-order loose should load correct styles navigating back again second-client -> first-client -> second-client -> first-client", "status": "passed" }, { - "name": "parallel-routes-revalidation should not trigger interception when calling router.refresh() on an intercepted route (/detail-page)", + "name": "css-order loose should load correct styles navigating back again interleaved-a -> interleaved-b -> interleaved-a -> interleaved-b", "status": "passed" }, { - "name": "parallel-routes-revalidation should not trigger interception when calling router.refresh() on an intercepted route (/dynamic/foobar)", + "name": "css-order loose should load correct styles navigating back again interleaved-b -> interleaved-a -> interleaved-b -> interleaved-a", "status": "passed" }, { - "name": "parallel-routes-revalidation should not trigger interception when calling router.refresh() on an intercepted route (/catchall/foobar)", + "name": "css-order loose should load correct styles navigating back again big-interleaved-a -> big-interleaved-b -> big-interleaved-a -> big-interleaved-b", "status": "passed" }, { - "name": "parallel-routes-revalidation should not trigger full page when calling router.refresh() on an intercepted route", + "name": "css-order loose should load correct styles navigating back again big-interleaved-b -> big-interleaved-a -> big-interleaved-b -> big-interleaved-a", "status": "passed" }, { - "name": "parallel-routes-revalidation router.refresh (regular) - searchParams: false should correctly refresh data for the intercepted route and previously active page slot", + "name": "css-order loose should load correct styles navigating back again pages-first -> pages-second -> pages-first -> pages-second", "status": "passed" }, { - "name": "parallel-routes-revalidation router.refresh (regular) - searchParams: false should correctly refresh data for previously intercepted modal and active page slot", + "name": "css-order loose should load correct styles navigating back again pages-first -> pages-third -> pages-first -> pages-third", "status": "passed" }, { - "name": "parallel-routes-revalidation router.refresh (regular) - searchParams: true should correctly refresh data for the intercepted route and previously active page slot", + "name": "css-order loose should load correct styles navigating back again pages-second -> pages-first -> pages-second -> pages-first", "status": "passed" }, { - "name": "parallel-routes-revalidation router.refresh (regular) - searchParams: true should correctly refresh data for previously intercepted modal and active page slot", + "name": "css-order loose should load correct styles navigating back again pages-second -> pages-third -> pages-second -> pages-third", "status": "passed" }, { - "name": "parallel-routes-revalidation router.refresh (dynamic) - searchParams: false should correctly refresh data for the intercepted route and previously active page slot", + "name": "css-order loose should load correct styles navigating back again pages-third -> pages-first -> pages-third -> pages-first", "status": "passed" }, { - "name": "parallel-routes-revalidation router.refresh (dynamic) - searchParams: false should correctly refresh data for previously intercepted modal and active page slot", + "name": "css-order loose should load correct styles navigating back again pages-third -> pages-second -> pages-third -> pages-second", "status": "passed" }, { - "name": "parallel-routes-revalidation router.refresh (dynamic) - searchParams: true should correctly refresh data for the intercepted route and previously active page slot", + "name": "css-order loose should load correct styles navigating back again pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b", "status": "passed" }, { - "name": "parallel-routes-revalidation router.refresh (dynamic) - searchParams: true should correctly refresh data for previously intercepted modal and active page slot", + "name": "css-order loose should load correct styles navigating back again pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a", "status": "passed" }, { - "name": "parallel-routes-revalidation server action revalidation handles refreshing when multiple parallel slots are active", + "name": "css-order loose should load correct styles navigating back again pages-reversed-a -> pages-reversed-b -> pages-reversed-a -> pages-reversed-b", "status": "passed" - } - ] - }, - { - "name": "app dir - rsc basics", - "file": "test/e2e/app-dir/rsc-basic/rsc-basic.test.ts", - "passed": 33, - "failed": 0, - "skipped": 2, - "testCases": [ + }, { - "name": "app dir - rsc basics should correctly render page returning null", + "name": "css-order loose should load correct styles navigating back again pages-reversed-b -> pages-reversed-a -> pages-reversed-b -> pages-reversed-a", "status": "passed" }, { - "name": "app dir - rsc basics should correctly render component returning null", + "name": "css-order loose should load correct styles navigating back again pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b", "status": "passed" }, { - "name": "app dir - rsc basics should correctly render layout returning null", + "name": "css-order loose should load correct styles navigating back again pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a", "status": "passed" }, { - "name": "app dir - rsc basics should correctly render page returning undefined", + "name": "css-order strict should load correct styles navigating first -> second", "status": "passed" }, { - "name": "app dir - rsc basics should correctly render component returning undefined", + "name": "css-order strict should load correct styles navigating first -> third", "status": "passed" }, { - "name": "app dir - rsc basics should correctly render layout returning undefined", + "name": "css-order strict should load correct styles navigating first -> first-client", "status": "passed" }, { - "name": "app dir - rsc basics should render server components correctly", + "name": "css-order strict should load correct styles navigating first -> second-client", "status": "passed" }, { - "name": "app dir - rsc basics should reuse the inline flight response without sending extra requests", + "name": "css-order strict should load correct styles navigating second -> first", "status": "passed" }, { - "name": "app dir - rsc basics should support multi-level server component imports", + "name": "css-order strict should load correct styles navigating second -> third", "status": "passed" }, { - "name": "app dir - rsc basics should create client reference successfully for all file conventions", + "name": "css-order strict should load correct styles navigating second -> first-client", "status": "passed" }, { - "name": "app dir - rsc basics should be able to navigate between rsc routes", + "name": "css-order strict should load correct styles navigating second -> second-client", "status": "passed" }, { - "name": "app dir - rsc basics should handle streaming server components correctly", + "name": "css-order strict should load correct styles navigating third -> first", "status": "passed" }, { - "name": "app dir - rsc basics should track client components in dynamic imports", + "name": "css-order strict should load correct styles navigating third -> second", "status": "passed" }, { - "name": "app dir - rsc basics should support next/link in server components", + "name": "css-order strict should load correct styles navigating third -> first-client", "status": "passed" }, { - "name": "app dir - rsc basics should link correctly with next/link without mpa navigation to the page", + "name": "css-order strict should load correct styles navigating third -> second-client", "status": "passed" }, { - "name": "app dir - rsc basics should escape streaming data correctly", + "name": "css-order strict should load correct styles navigating first-client -> first", "status": "passed" }, { - "name": "app dir - rsc basics should render built-in 404 page for missing route if pagesDir is not presented", + "name": "css-order strict should load correct styles navigating first-client -> second", "status": "passed" }, { - "name": "app dir - rsc basics should suspense next/legacy/image in server components", + "name": "css-order strict should load correct styles navigating first-client -> third", "status": "passed" }, { - "name": "app dir - rsc basics should suspense next/image in server components", + "name": "css-order strict should load correct styles navigating first-client -> second-client", "status": "passed" }, { - "name": "app dir - rsc basics should handle various kinds of exports correctly", + "name": "css-order strict should load correct styles navigating second-client -> first", "status": "passed" }, { - "name": "app dir - rsc basics should support native modules in server component", + "name": "css-order strict should load correct styles navigating second-client -> second", "status": "passed" }, { - "name": "app dir - rsc basics should resolve different kinds of components correctly", + "name": "css-order strict should load correct styles navigating second-client -> third", "status": "passed" }, { - "name": "app dir - rsc basics should render initial styles of css-in-js in nodejs SSR correctly", + "name": "css-order strict should load correct styles navigating second-client -> first-client", "status": "passed" }, { - "name": "app dir - rsc basics should render initial styles of css-in-js in edge SSR correctly", + "name": "css-order strict should load correct styles navigating interleaved-a -> interleaved-b", "status": "passed" }, { - "name": "app dir - rsc basics should render css-in-js suspense boundary correctly", + "name": "css-order strict should load correct styles navigating interleaved-b -> interleaved-a", "status": "passed" }, { - "name": "app dir - rsc basics should stick to the url without trailing /page suffix", + "name": "css-order strict should load correct styles navigating big-interleaved-a -> big-interleaved-b", "status": "passed" }, { - "name": "app dir - rsc basics should support streaming for flight response", + "name": "css-order strict should load correct styles navigating big-interleaved-b -> big-interleaved-a", "status": "passed" }, { - "name": "app dir - rsc basics should support partial hydration with inlined server data", + "name": "css-order strict should load correct styles navigating pages-first -> pages-second", "status": "passed" }, { - "name": "app dir - rsc basics should not apply rsc syntax checks in pages/api", + "name": "css-order strict should load correct styles navigating pages-first -> pages-third", "status": "passed" }, { - "name": "app dir - rsc basics should not use bundled react for pages with app", + "name": "css-order strict should load correct styles navigating pages-second -> pages-first", "status": "passed" }, { - "name": "app dir - rsc basics should use canary react for app", + "name": "css-order strict should load correct styles navigating pages-second -> pages-third", "status": "passed" }, { - "name": "app dir - rsc basics should be able to call legacy react-dom/server APIs in client components", + "name": "css-order strict should load correct styles navigating pages-third -> pages-first", "status": "passed" }, { - "name": "app dir - rsc basics should support webpack loader rules", + "name": "css-order strict should load correct styles navigating pages-third -> pages-second", "status": "passed" }, { - "name": "app dir - rsc basics react@experimental should opt into the react@experimental when enabling ppr", - "status": "skipped", - "reason": "Tries to patch deployed files" + "name": "css-order strict should load correct styles navigating pages-interleaved-a -> pages-interleaved-b", + "status": "passed" }, { - "name": "app dir - rsc basics react@experimental should opt into the react@experimental when enabling taint", - "status": "skipped", - "reason": "Tries to patch deployed files" - } - ] - }, - { - "name": "Has CSS Module in computed styles in Development", - "file": "test/e2e/app-dir/scss/dev-module/dev-module.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + "name": "css-order strict should load correct styles navigating pages-interleaved-b -> pages-interleaved-a", + "status": "passed" + }, { - "name": "Has CSS Module in computed styles in Development should have CSS for page", + "name": "css-order strict should load correct styles navigating pages-reversed-a -> pages-reversed-b", "status": "passed" - } - ] - }, - { - "name": "SCSS Support", - "file": "test/e2e/app-dir/scss/multi-page/multi-page.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "SCSS Support Has CSS in computed styles in Production should have CSS for page", + "name": "css-order strict should load correct styles navigating pages-reversed-b -> pages-reversed-a", "status": "passed" }, { - "name": "SCSS Support Has CSS in computed styles in Development should have CSS for page", + "name": "css-order strict should load correct styles navigating pages-partial-reversed-a -> pages-partial-reversed-b", "status": "passed" - } - ] - }, - { - "name": "Valid Nested CSS Module Usage from within node_modules", - "file": "test/e2e/app-dir/scss/nm-module-nested/nm-module-nested.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Valid Nested CSS Module Usage from within node_modules should render the page", + "name": "css-order strict should load correct styles navigating pages-partial-reversed-b -> pages-partial-reversed-a", "status": "passed" - } - ] - }, - { - "name": "Good CSS Import from node_modules", - "file": "test/e2e/app-dir/scss/npm-import/npm-import.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Good CSS Import from node_modules should render the page", + "name": "css-order loose should load correct styles navigating first -> second", "status": "passed" - } - ] - }, - { - "name": "Basic Global Support scss", - "file": "test/e2e/app-dir/scss/single-global/single-global.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Basic Global Support scss should render the page", + "name": "css-order loose should load correct styles navigating first -> third", "status": "passed" - } - ] - }, - { - "name": "Valid and Invalid Global CSS with Custom App", - "file": "test/e2e/app-dir/scss/valid-and-invalid-global/valid-and-invalid-global.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "SCSS Support", - "file": "test/e2e/app-dir/scss/webpack-error/webpack-error.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "Ordering with styled-jsx", - "file": "test/e2e/app-dir/scss/with-styled-jsx/with-styled-jsx.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Ordering with styled-jsx should have the correct color (css ordering)", + "name": "css-order loose should load correct styles navigating first -> first-client", "status": "passed" - } - ] - }, - { - "name": "app dir - search params keys", - "file": "test/e2e/app-dir/search-params-react-key/layout-params.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "app dir - search params keys should keep the React router instance the same when changing the search params", + "name": "css-order loose should load correct styles navigating first -> second-client", "status": "passed" - } - ] - }, - { - "name": "set-cookies", - "file": "test/e2e/app-dir/set-cookies/set-cookies.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "set-cookies should skip next deploy", + "name": "css-order loose should load correct styles navigating second -> first", "status": "passed" - } - ] - }, - { - "name": "app dir - taint", - "file": "test/e2e/app-dir/taint/process-taint.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "app dir - taint should error when passing process env to client component", + "name": "css-order loose should load correct styles navigating second -> third", "status": "passed" - } - ] - }, - { - "name": "turbopack-reports", - "file": "test/e2e/app-dir/turbopack-reports/turbopack-reports.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "turbopack-reports should render page importing sqlite3", + "name": "css-order loose should load correct styles navigating second -> first-client", "status": "passed" - } - ] - }, - { - "name": "with babel", - "file": "test/e2e/app-dir/with-babel/with-babel.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "with babel with babel should skip next deploy", + "name": "css-order loose should load correct styles navigating second -> second-client", "status": "passed" - } - ] - }, - { - "name": "basePath + trailingSlash", - "file": "test/e2e/basepath-trailing-slash.test.ts", - "passed": 3, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "basePath + trailingSlash should allow URL query strings without refresh", + "name": "css-order loose should load correct styles navigating third -> first", "status": "passed" }, { - "name": "basePath + trailingSlash should allow URL query strings on index without refresh", + "name": "css-order loose should load correct styles navigating third -> second", "status": "passed" }, { - "name": "basePath + trailingSlash should correctly replace state when same asPath but different url", + "name": "css-order loose should load correct styles navigating third -> first-client", "status": "passed" - } - ] - }, - { - "name": "async export", - "file": "test/e2e/config-promise-export/async-function.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "async export should work", + "name": "css-order loose should load correct styles navigating third -> second-client", "status": "passed" - } - ] - }, - { - "name": "promise export", - "file": "test/e2e/config-promise-export/promise.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "promise export should work", + "name": "css-order loose should load correct styles navigating first-client -> first", "status": "passed" - } - ] - }, - { - "name": "custom-app-render", - "file": "test/e2e/custom-app-render/custom-app-render.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "custom-app-render should skip next deploy", + "name": "css-order loose should load correct styles navigating first-client -> second", "status": "passed" - } - ] - }, - { - "name": "Dynamic Route Interpolation", - "file": "test/e2e/dynamic-route-interpolation/index.test.ts", - "passed": 7, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Dynamic Route Interpolation should work", + "name": "css-order loose should load correct styles navigating first-client -> third", "status": "passed" }, { - "name": "Dynamic Route Interpolation should work with parameter itself", + "name": "css-order loose should load correct styles navigating first-client -> second-client", "status": "passed" }, { - "name": "Dynamic Route Interpolation should work with brackets", + "name": "css-order loose should load correct styles navigating second-client -> first", "status": "passed" }, { - "name": "Dynamic Route Interpolation should work with parameter itself in API routes", + "name": "css-order loose should load correct styles navigating second-client -> second", "status": "passed" }, { - "name": "Dynamic Route Interpolation should work with brackets in API routes", + "name": "css-order loose should load correct styles navigating second-client -> third", "status": "passed" }, { - "name": "Dynamic Route Interpolation should bust data cache", + "name": "css-order loose should load correct styles navigating second-client -> first-client", "status": "passed" }, { - "name": "Dynamic Route Interpolation should bust data cache with symbol", + "name": "css-order loose should load correct styles navigating interleaved-a -> interleaved-b", "status": "passed" - } - ] - }, - { - "name": "Edge compiler module exports preference", - "file": "test/e2e/edge-compiler-module-exports-preference/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Edge compiler module exports preference favors the browser export", + "name": "css-order loose should load correct styles navigating interleaved-b -> interleaved-a", "status": "passed" - } - ] - }, - { - "name": "Edge runtime pages-api route", - "file": "test/e2e/edge-runtime-pages-api-route/edge-runtime-pages-api-route.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Edge runtime pages-api route should work edge runtime", + "name": "css-order loose should load correct styles navigating big-interleaved-a -> big-interleaved-b", "status": "passed" }, { - "name": "Edge runtime pages-api route should work with node runtime", + "name": "css-order loose should load correct styles navigating big-interleaved-b -> big-interleaved-a", "status": "passed" - } - ] - }, - { - "name": "fetch failures have good stack traces in edge runtime", - "file": "test/e2e/fetch-failures-have-good-stack-traces-in-edge-runtime/fetch-failures-have-good-stack-traces-in-edge-runtime.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "fetch failures have good stack traces in edge runtime should skip next deploy", + "name": "css-order loose should load correct styles navigating pages-first -> pages-second", "status": "passed" - } - ] - }, - { - "name": "i18n API support", - "file": "test/e2e/i18n-api-support/index.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "i18n API support should respond to normal API request", + "name": "css-order loose should load correct styles navigating pages-first -> pages-third", "status": "passed" }, { - "name": "i18n API support should respond to normal dynamic API request", + "name": "css-order loose should load correct styles navigating pages-second -> pages-first", "status": "passed" - } - ] - }, - { - "name": "i18n-ignore-redirect-source-locale with basepath", - "file": "test/e2e/i18n-ignore-redirect-source-locale/redirects-with-basepath.test.ts", - "passed": 16, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: to: sv", + "name": "css-order loose should load correct styles navigating pages-second -> pages-third", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /en to: sv", + "name": "css-order loose should load correct styles navigating pages-third -> pages-first", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /sv to: sv", + "name": "css-order loose should load correct styles navigating pages-third -> pages-second", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /nl to: sv", + "name": "css-order loose should load correct styles navigating pages-interleaved-a -> pages-interleaved-b", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: to: en", + "name": "css-order loose should load correct styles navigating pages-interleaved-b -> pages-interleaved-a", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /en to: en", + "name": "css-order loose should load correct styles navigating pages-reversed-a -> pages-reversed-b", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /sv to: en", + "name": "css-order loose should load correct styles navigating pages-reversed-b -> pages-reversed-a", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /nl to: en", + "name": "css-order loose should load correct styles navigating pages-partial-reversed-a -> pages-partial-reversed-b", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: to: /", + "name": "css-order loose should load correct styles navigating pages-partial-reversed-b -> pages-partial-reversed-a", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /en to: /", + "name": "css-order strict should load correct styles on first", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /sv to: /", + "name": "css-order strict should load correct styles on second", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /nl to: /", + "name": "css-order strict should load correct styles on third", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from and to: ", + "name": "css-order strict should load correct styles on first-client", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from and to: /en", + "name": "css-order strict should load correct styles on second-client", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from and to: /sv", + "name": "css-order strict should load correct styles on interleaved-a", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from and to: /nl", + "name": "css-order strict should load correct styles on interleaved-b", "status": "passed" - } - ] - }, - { - "name": "Event with stale state - static route previously was dynamic", - "file": "test/e2e/ignore-invalid-popstateevent/without-i18n.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Event with stale state - static route previously was dynamic Ignore event without query param", + "name": "css-order strict should load correct styles on big-interleaved-a", "status": "passed" }, { - "name": "Event with stale state - static route previously was dynamic Ignore event with query param", + "name": "css-order strict should load correct styles on big-interleaved-b", "status": "passed" - } - ] - }, - { - "name": "Middleware custom matchers i18n", - "file": "test/e2e/middleware-custom-matchers-i18n/test/index.test.ts", - "passed": 8, - "failed": 1, - "skipped": 0, - "testCases": [ + }, { - "name": "Middleware custom matchers i18n should match", + "name": "css-order strict should load correct styles on reversed-a", "status": "passed" }, { - "name": "Middleware custom matchers i18n should match", + "name": "css-order strict should load correct styles on reversed-b", "status": "passed" }, { - "name": "Middleware custom matchers i18n should match", + "name": "css-order strict should load correct styles on partial-reversed-a", "status": "passed" }, { - "name": "Middleware custom matchers i18n should match", + "name": "css-order strict should load correct styles on partial-reversed-b", "status": "passed" }, { - "name": "Middleware custom matchers i18n should not match", - "status": "failed" + "name": "css-order strict should load correct styles on pages-first", + "status": "passed" }, { - "name": "Middleware custom matchers i18n should not match", + "name": "css-order strict should load correct styles on pages-second", "status": "passed" }, { - "name": "Middleware custom matchers i18n should not match", + "name": "css-order strict should load correct styles on pages-third", "status": "passed" }, { - "name": "Middleware custom matchers i18n should not match", + "name": "css-order strict should load correct styles on pages-interleaved-a", "status": "passed" }, { - "name": "Middleware custom matchers with root should not match", + "name": "css-order strict should load correct styles on pages-interleaved-b", "status": "passed" - } - ] - }, - { - "name": "Middleware can set the matcher in its config", - "file": "test/e2e/middleware-matcher/index.test.ts", - "passed": 33, - "failed": 2, - "skipped": 0, - "testCases": [ + }, { - "name": "Middleware can set the matcher in its config does add the header for root request", + "name": "css-order strict should load correct styles on pages-reversed-a", "status": "passed" }, { - "name": "Middleware can set the matcher in its config adds the header for a matched path", + "name": "css-order strict should load correct styles on pages-reversed-b", "status": "passed" }, { - "name": "Middleware can set the matcher in its config adds the header for a matched data path (with header)", + "name": "css-order strict should load correct styles on pages-partial-reversed-a", "status": "passed" }, { - "name": "Middleware can set the matcher in its config adds the header for a matched data path (without header)", + "name": "css-order strict should load correct styles on pages-partial-reversed-b", "status": "passed" }, { - "name": "Middleware can set the matcher in its config adds the header for another matched path", + "name": "css-order loose should load correct styles on first", "status": "passed" }, { - "name": "Middleware can set the matcher in its config adds the header for another matched data path", + "name": "css-order loose should load correct styles on second", "status": "passed" }, { - "name": "Middleware can set the matcher in its config does add the header for root data request", + "name": "css-order loose should load correct styles on third", "status": "passed" }, { - "name": "Middleware can set the matcher in its config should load matches in client matchers correctly", + "name": "css-order loose should load correct styles on first-client", "status": "passed" }, { - "name": "Middleware can set the matcher in its config should navigate correctly with matchers", + "name": "css-order loose should load correct styles on second-client", "status": "passed" }, { - "name": "using a single matcher does not add the header for root request", + "name": "css-order loose should load correct styles on interleaved-a", "status": "passed" }, { - "name": "using a single matcher does not add the header for root data request", + "name": "css-order loose should load correct styles on interleaved-b", "status": "passed" }, { - "name": "using a single matcher adds the header for a matched path", + "name": "css-order loose should load correct styles on big-interleaved-a", "status": "passed" }, { - "name": "using a single matcher adds the headers for a matched data path (with header)", + "name": "css-order loose should load correct styles on big-interleaved-b", "status": "passed" }, { - "name": "using a single matcher adds the header for a matched data path (without header)", + "name": "css-order loose should load correct styles on pages-first", "status": "passed" }, { - "name": "using a single matcher does not add the header for an unmatched path", + "name": "css-order loose should load correct styles on pages-second", "status": "passed" }, { - "name": "using root matcher adds the header to the /", + "name": "css-order loose should load correct styles on pages-third", "status": "passed" }, { - "name": "using root matcher adds the header to the /index", + "name": "css-order loose should load correct styles on pages-interleaved-a", "status": "passed" }, { - "name": "using root matcher adds the header for a matched data path (with header)", + "name": "css-order loose should load correct styles on pages-interleaved-b", "status": "passed" }, { - "name": "using root matcher adds the header for a matched data path (without header)", + "name": "css-order loose should load correct styles on pages-reversed-a", "status": "passed" }, { - "name": "using a single matcher with i18n adds the header for a matched path", + "name": "css-order loose should load correct styles on pages-reversed-b", "status": "passed" }, { - "name": "using a single matcher with i18n adds the header for a mathed root path with /index", + "name": "css-order loose should load correct styles on pages-partial-reversed-a", "status": "passed" }, { - "name": "using a single matcher with i18n adds the headers for a matched data path", + "name": "css-order loose should load correct styles on pages-partial-reversed-b", + "status": "passed" + } + ] + }, + { + "name": "custom-app-render", + "file": "test/e2e/custom-app-render/custom-app-render.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "custom-app-render should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "getServerSideProps", + "file": "test/e2e/getserversideprops/test/index.test.ts", + "passed": 43, + "failed": 1, + "skipped": 2, + "total": "46", + "testCases": [ + { + "name": "getServerSideProps should navigate between pages successfully", "status": "passed" }, { - "name": "using a single matcher with i18n does not add the header for an unmatched path", + "name": "getServerSideProps should work with early request ending", "status": "passed" }, { - "name": "using a single matcher with i18n and trailingSlash adds the header for a matched path", + "name": "getServerSideProps should allow POST request for getServerSideProps page", "status": "passed" }, { - "name": "using a single matcher with i18n and trailingSlash adds the header for a mathed root path with /index", + "name": "getServerSideProps should render correctly when notFound is false (non-dynamic)", "status": "passed" }, { - "name": "using a single matcher with i18n and trailingSlash adds the headers for a matched data path", + "name": "getServerSideProps should render 404 correctly when notFound is returned (non-dynamic)", "status": "passed" }, { - "name": "using a single matcher with i18n and trailingSlash does not add the header for an unmatched path", + "name": "getServerSideProps should render 404 correctly when notFound is returned client-transition (non-dynamic)", "status": "passed" }, { - "name": "using a single matcher with i18n and basePath adds the header for a matched path", - "status": "failed" + "name": "getServerSideProps should render correctly when notFound is false (dynamic)", + "status": "passed" }, { - "name": "using a single matcher with i18n and basePath adds the header for a mathed root path with /index", + "name": "getServerSideProps should render 404 correctly when notFound is returned (dynamic)", "status": "passed" }, { - "name": "using a single matcher with i18n and basePath adds the headers for a matched data path", + "name": "getServerSideProps should render 404 correctly when notFound is returned client-transition (dynamic)", "status": "passed" }, { - "name": "using a single matcher with i18n and basePath does not add the header for an unmatched path", + "name": "getServerSideProps should SSR normal page correctly", "status": "passed" }, { - "name": "using a single matcher with i18n and basePath and trailingSlash adds the header for a matched path", - "status": "failed" + "name": "getServerSideProps should SSR getServerSideProps page correctly", + "status": "passed" }, { - "name": "using a single matcher with i18n and basePath and trailingSlash adds the header for a mathed root path with /index", + "name": "getServerSideProps should handle throw ENOENT correctly", + "status": "failed", + "reason": "Server error pages return encoded data without content-encoding header if accept-encoding is gzip", + "link": "https://github.com/netlify/next-runtime-minimal/issues/387" + }, + { + "name": "getServerSideProps should have gssp in __NEXT_DATA__", "status": "passed" }, { - "name": "using a single matcher with i18n and basePath and trailingSlash adds the headers for a matched data path", + "name": "getServerSideProps should not have gssp in __NEXT_DATA__ for non-GSSP page", "status": "passed" }, { - "name": "using a single matcher with i18n and basePath and trailingSlash does not add the header for an unmatched path", + "name": "getServerSideProps should supply query values SSR", "status": "passed" - } - ] - }, - { - "name": "New Link Behavior with child", - "file": "test/e2e/new-link-behavior/child-a-tag-error.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "New Link Behavior with child should throw error with child", + "name": "getServerSideProps should supply params values for catchall correctly", "status": "passed" - } - ] - }, - { - "name": "New Link Behavior with stitches", - "file": "test/e2e/new-link-behavior/stitches.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "New Link Behavior with stitches should render ", + "name": "getServerSideProps should have original req.url for /_next/data request dynamic page", "status": "passed" - } - ] - }, - { - "name": "New Link Behavior", - "file": "test/e2e/new-link-behavior/typescript.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "New Link Behavior should render link with ", + "name": "getServerSideProps should have original req.url for /_next/data request dynamic page with query", "status": "passed" }, { - "name": "New Link Behavior should apply ref on link", + "name": "getServerSideProps should have original req.url for /_next/data request", "status": "passed" - } - ] - }, - { - "name": "next/font/google with-font-declarations-file", - "file": "test/e2e/next-font/with-font-declarations-file.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "next/font/google with-font-declarations-file should skip next deploy for now", + "name": "getServerSideProps should have original req.url for /_next/data request with query", "status": "passed" - } - ] - }, - { - "name": "next-phase", - "file": "test/e2e/next-phase/index.test.ts", - "passed": 0, - "failed": 1, - "skipped": 0, - "testCases": [ + }, { - "name": "next-phase should render page with next phase correctly", - "status": "failed" - } - ] - }, - { - "name": "next-phase", - "file": "test/e2e/next-phase/index.test.ts", - "passed": 0, - "failed": 1, - "skipped": 0, - "testCases": [ - { - "name": "next-phase should render page with next phase correctly", - "status": "failed" - } - ] - }, - { - "name": "instrumentation pages", - "file": "test/e2e/opentelemetry/instrumentation-pages-app-only.test.ts", - "passed": 4, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "instrumentation pages should skip next deploy", - "status": "passed" - }, - { - "name": "instrumentation pages src/ should skip next deploy", - "status": "passed" - }, - { - "name": "instrumentation app should skip next deploy", - "status": "passed" - }, - { - "name": "instrumentation app src/ should skip next deploy", - "status": "passed" - } - ] - }, - { - "name": "reload-scroll-back-restoration", - "file": "test/e2e/reload-scroll-backforward-restoration/index.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "reload-scroll-back-restoration should restore the scroll position on navigating back", - "status": "passed" - }, - { - "name": "reload-scroll-back-restoration should restore the scroll position on navigating forward", - "status": "passed" - } - ] - }, - { - "name": "socket-io", - "file": "test/e2e/socket-io/index.test.js", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "socket-io should support socket.io without falling back to polling", - "status": "passed" - } - ] - }, - { - "name": "nextTestSetup", - "file": "test/e2e/test-utils-tests/basic/basic.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "nextTestSetup should work", - "status": "passed" - } - ] - }, - { - "name": "Type module interop", - "file": "test/e2e/type-module-interop/index.test.ts", - "passed": 4, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "Type module interop should render server-side", - "status": "passed" - }, - { - "name": "Type module interop should render client-side", - "status": "passed" - }, - { - "name": "Type module interop should render server-side with modules", - "status": "passed" - }, - { - "name": "Type module interop should render client-side with modules", - "status": "passed" - } - ] - }, - { - "name": "app-dir action allowed origins", - "file": "test/e2e/app-dir/actions-allowed-origins/app-action-allowed-origins.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app-dir action allowed origins should skip next deploy", - "status": "passed" - } - ] - }, - { - "name": "app-dir action useFormState", - "file": "test/e2e/app-dir/actions/app-action-form-state.test.ts", - "passed": 4, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app-dir action useFormState should support submitting form state with JS", - "status": "passed" - }, - { - "name": "app-dir action useFormState should support submitting form state without JS", - "status": "passed" - }, - { - "name": "app-dir action useFormState should support hydrating the app from progressively enhanced form request", - "status": "passed" - }, - { - "name": "app-dir action useFormState should send the action to the provided permalink with form state when JS disabled", - "status": "passed" - } - ] - }, - { - "name": "custom-app-server-action-redirect", - "file": "test/e2e/app-dir/app-basepath-custom-server/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "custom-app-server-action-redirect should skip next deploy", - "status": "passed" - } - ] - }, - { - "name": "app dir client cache semantics (experimental staleTimes)", - "file": "test/e2e/app-dir/app-client-cache/client-cache.experimental.test.ts", - "passed": 7, - "failed": 2, - "skipped": 0, - "testCases": [ - { - "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={true} should re-use the cache for 5 minutes (default \"static\" time)", - "status": "passed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={false} should trigger a loading state before fetching the page, followed by fresh data on every subsequent navigation", - "status": "passed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={false} without a loading boundary should get fresh data on every subsequent navigation", - "status": "passed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={undefined} - default should trigger a loading state before fetching the page, followed by fresh data on every subsequent navigation", - "status": "passed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={undefined} - default without a loading boundary should get fresh data on every subsequent navigation", - "status": "passed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 telemetry should send staleTimes feature usage event", - "status": "failed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) static: 180 prefetch={true} should use the custom static override time (3 minutes)", - "status": "passed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) static: 180 prefetch={undefined} - default should re-use the loading boundary for the custom static override time (3 minutes)", - "status": "passed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) static: 180 telemetry should send staleTimes feature usage event", - "status": "failed" - } - ] - }, - { - "name": "app dir client cache semantics (experimental staleTimes)", - "file": "test/e2e/app-dir/app-client-cache/client-cache.experimental.test.ts", - "passed": 7, - "failed": 2, - "skipped": 0, - "testCases": [ - { - "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={true} should re-use the cache for 5 minutes (default \"static\" time)", - "status": "passed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={false} should trigger a loading state before fetching the page, followed by fresh data on every subsequent navigation", - "status": "passed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={false} without a loading boundary should get fresh data on every subsequent navigation", - "status": "passed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={undefined} - default should trigger a loading state before fetching the page, followed by fresh data on every subsequent navigation", - "status": "passed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={undefined} - default without a loading boundary should get fresh data on every subsequent navigation", - "status": "passed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 telemetry should send staleTimes feature usage event", - "status": "failed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) static: 180 prefetch={true} should use the custom static override time (3 minutes)", - "status": "passed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) static: 180 prefetch={undefined} - default should re-use the loading boundary for the custom static override time (3 minutes)", - "status": "passed" - }, - { - "name": "app dir client cache semantics (experimental staleTimes) static: 180 telemetry should send staleTimes feature usage event", - "status": "failed" - } - ] - }, - { - "name": "app-dir edge runtime root layout", - "file": "test/e2e/app-dir/app-edge-root-layout/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app-dir edge runtime root layout should skip next deploy", - "status": "passed" - } - ] - }, - { - "name": "app-dir edge SSR", - "file": "test/e2e/app-dir/app-edge/app-edge.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app-dir edge SSR should skip next deploy", - "status": "passed" - } - ] - }, - { - "name": "app-dir - esm js extension", - "file": "test/e2e/app-dir/app-esm-js/index.test.ts", - "passed": 3, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app-dir - esm js extension should be able to render nextjs api in app router", - "status": "passed" - }, - { - "name": "app-dir - esm js extension should be able to use nextjs api in pages router", - "status": "passed" - }, - { - "name": "app-dir - esm js extension should support next/og image", - "status": "passed" - } - ] - }, - { - "name": "app-dir with middleware", - "file": "test/e2e/app-dir/app-middleware/app-middleware.test.ts", - "passed": 3, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app-dir with middleware should skip next deploy", - "status": "passed" - }, - { - "name": "app dir - middleware without pages dir should skip next deploy", - "status": "passed" - }, - { - "name": "app dir - middleware with middleware in src dir should skip next deploy", - "status": "passed" - } - ] - }, - { - "name": "app-routes-trailing-slash", - "file": "test/e2e/app-dir/app-routes-trailing-slash/app-routes-trailing-slash.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app-routes-trailing-slash should handle trailing slash for edge runtime", - "status": "passed" - }, - { - "name": "app-routes-trailing-slash should handle trailing slash for node runtime", - "status": "passed" - } - ] - }, - { - "name": "app-simple-routes", - "file": "test/e2e/app-dir/app-simple-routes/app-simple-routes.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app-simple-routes works with simple routes renders a node route", - "status": "passed" - }, - { - "name": "app-simple-routes works with simple routes renders a edge route", - "status": "passed" - } - ] - }, - { - "name": "app dir - basic", - "file": "test/e2e/app-dir/app/index.test.ts", - "passed": 90, - "failed": 2, - "skipped": 2, - "testCases": [ - { - "name": "app dir - basic should work for catch-all edge page", - "status": "passed" - }, - { - "name": "app dir - basic should return normalized dynamic route params for catch-all edge page", - "status": "passed" - }, - { - "name": "app dir - basic should have correct searchParams and params (server)", - "status": "passed" - }, - { - "name": "app dir - basic should have correct searchParams and params (client)", - "status": "passed" - }, - { - "name": "app dir - basic should successfully detect app route during prefetch", - "status": "passed" - }, - { - "name": "app dir - basic should encode chunk path correctly", - "status": "passed" - }, - { - "name": "app dir - basic should match redirects in pages correctly $path", - "status": "passed" - }, - { - "name": "app dir - basic should match redirects in pages correctly $path", - "status": "passed" - }, - { - "name": "app dir - basic should match redirects in pages correctly $path", - "status": "passed" - }, - { - "name": "app dir - basic should match redirects in pages correctly $path", - "status": "passed" - }, - { - "name": "app dir - basic should match redirects in pages correctly $path", - "status": "passed" - }, - { - "name": "app dir - basic should not apply client router filter on shallow", - "status": "passed" - }, - { - "name": "app dir - basic should use text/x-component for flight", - "status": "passed" - }, - { - "name": "app dir - basic should use text/x-component for flight with edge runtime", - "status": "passed" - }, - { - "name": "app dir - basic should pass props from getServerSideProps in root layout", - "status": "passed" - }, - { - "name": "app dir - basic should serve from pages", - "status": "passed" - }, - { - "name": "app dir - basic should serve dynamic route from pages", - "status": "passed" - }, - { - "name": "app dir - basic should serve from public", - "status": "passed" - }, - { - "name": "app dir - basic should serve from app", - "status": "passed" - }, - { - "name": "app dir - basic should ensure the suffix is at the end of the stream", - "status": "passed" - }, - { - "name": "app dir - basic should include layouts when no direct parent layout", - "status": "passed" - }, - { - "name": "app dir - basic should use new root layout when provided", - "status": "passed" - }, - { - "name": "app dir - basic should not create new root layout when nested (optional)", - "status": "passed" - }, - { - "name": "app dir - basic should include parent document when no direct parent layout", - "status": "passed" - }, - { - "name": "app dir - basic should not include parent when not in parent directory", - "status": "passed" - }, - { - "name": "app dir - basic should serve nested parent", - "status": "passed" - }, - { - "name": "app dir - basic should serve dynamic parameter", - "status": "passed" - }, - { - "name": "app dir - basic should include document html and body", - "status": "passed" - }, - { - "name": "app dir - basic should not serve when layout is provided but no folder index", - "status": "passed" - }, - { - "name": "app dir - basic rewrites should support rewrites on initial load", - "status": "passed" - }, - { - "name": "app dir - basic rewrites should support rewrites on client-side navigation from pages to app with existing pages path", - "status": "passed" - }, - { - "name": "app dir - basic rewrites should support rewrites on client-side navigation", - "status": "passed" - }, - { - "name": "app dir - basic should not rerender layout when navigating between routes in the same layout", - "status": "passed" - }, - { - "name": "app dir - basic should handle hash in initial url", - "status": "passed" - }, - { - "name": "app dir - basic should hard push", - "status": "passed" - }, - { - "name": "app dir - basic should hard replace", - "status": "passed" - }, - { - "name": "app dir - basic should soft push", - "status": "passed" - }, - { - "name": "app dir - basic should be soft for back navigation", - "status": "passed" - }, - { - "name": "app dir - basic should be soft for forward navigation", - "status": "passed" - }, - { - "name": "app dir - basic should allow linking from app page to pages page", - "status": "passed" - }, - { - "name": "app dir - basic should navigate to pages dynamic route from pages page if it overlaps with an app page", - "status": "passed" - }, - { - "name": "app dir - basic should push to external url", - "status": "passed" - }, - { - "name": "app dir - basic should replace to external url", - "status": "passed" - }, - { - "name": "app dir - basic server components should not serve .server.js as a path", - "status": "passed" - }, - { - "name": "app dir - basic server components should not serve .client.js as a path", - "status": "passed" - }, - { - "name": "app dir - basic server components should serve shared component", - "status": "passed" - }, - { - "name": "app dir - basic server components dynamic routes should only pass params that apply to the layout", - "status": "passed" - }, - { - "name": "app dir - basic server components catch-all routes should handle optional segments", - "status": "passed" - }, - { - "name": "app dir - basic server components catch-all routes should handle optional segments root", - "status": "passed" - }, - { - "name": "app dir - basic server components catch-all routes should handle optional catch-all segments link", - "status": "passed" - }, - { - "name": "app dir - basic server components catch-all routes should handle required segments", - "status": "passed" - }, - { - "name": "app dir - basic server components catch-all routes should handle required segments root as not found", - "status": "passed" - }, - { - "name": "app dir - basic server components catch-all routes should handle catch-all segments link", - "status": "passed" - }, - { - "name": "app dir - basic server components should serve client component should serve server-side", - "status": "passed" - }, - { - "name": "app dir - basic server components should serve client component should serve client-side", - "status": "passed" - }, - { - "name": "app dir - basic server components should include client component layout with server component route should include it server-side", - "status": "passed" - }, - { - "name": "app dir - basic server components should include client component layout with server component route should include it client-side", - "status": "passed" - }, - { - "name": "app dir - basic server components Loading should render loading.js in initial html for slow page", - "status": "passed" - }, - { - "name": "app dir - basic server components Loading should render loading.js in browser for slow page", - "status": "passed" - }, - { - "name": "app dir - basic server components Loading should render loading.js in initial html for slow layout", - "status": "passed" - }, - { - "name": "app dir - basic server components Loading should render loading.js in browser for slow layout", - "status": "passed" - }, - { - "name": "app dir - basic server components Loading should render loading.js in initial html for slow layout and page", - "status": "passed" - }, - { - "name": "app dir - basic server components Loading should render loading.js in browser for slow layout and page", - "status": "passed" - }, - { - "name": "app dir - basic server components middleware should strip internal query parameters from requests to middleware for rewrite", - "status": "passed" - }, - { - "name": "app dir - basic server components middleware should strip internal query parameters from requests to middleware for redirect", - "status": "passed" - }, - { - "name": "app dir - basic server components next/router should support router.back and router.forward", - "status": "passed" - }, - { - "name": "app dir - basic searchParams prop client component should have the correct search params", - "status": "passed" - }, - { - "name": "app dir - basic searchParams prop client component should have the correct search params on rewrite", - "status": "passed" - }, - { - "name": "app dir - basic searchParams prop client component should have the correct search params on middleware rewrite", - "status": "passed" - }, - { - "name": "app dir - basic searchParams prop server component should have the correct search params", - "status": "passed" - }, - { - "name": "app dir - basic searchParams prop server component should have the correct search params on rewrite", - "status": "passed" - }, - { - "name": "app dir - basic searchParams prop server component should have the correct search params on middleware rewrite", - "status": "passed" - }, - { - "name": "app dir - basic template component should render the template that holds state in a client component and reset on navigation", - "status": "passed" - }, - { - "name": "app dir - basic template component should render the template that is a server component and rerender on navigation", - "status": "passed" - }, - { - "name": "app dir - basic known bugs should support React cache server component", - "status": "passed" - }, - { - "name": "app dir - basic known bugs should support React cache server component client-navigation", - "status": "passed" - }, - { - "name": "app dir - basic known bugs should support React cache client component", - "status": "passed" - }, - { - "name": "app dir - basic known bugs should support React cache client component client-navigation", - "status": "passed" - }, - { - "name": "app dir - basic known bugs should support React cache middleware overriding headers", - "status": "passed" - }, - { - "name": "app dir - basic known bugs should support React fetch instrumentation server component", - "status": "passed" - }, - { - "name": "app dir - basic known bugs should support React fetch instrumentation server component client-navigation", - "status": "passed" - }, - { - "name": "app dir - basic known bugs should not share flight data between requests", - "status": "passed" - }, - { - "name": "app dir - basic known bugs should handle router.refresh without resetting state", - "status": "passed" - }, - { - "name": "app dir - basic known bugs should handle as on next/link", - "status": "passed" - }, - { - "name": "app dir - basic known bugs should handle next/link back to initially loaded page", - "status": "passed" - }, - { - "name": "app dir - basic known bugs should not do additional pushState when already on the page", - "status": "passed" - }, - { - "name": "app dir - basic next/script should insert preload tags for beforeInteractive and afterInteractive scripts", - "status": "passed" - }, - { - "name": "app dir - basic next/script should load stylesheets for next/scripts", - "status": "passed" - }, - { - "name": "app dir - basic next/script should pass `nonce`", - "status": "failed" - }, - { - "name": "app dir - basic data fetch with response over 16KB with chunked encoding should load page when fetching a large amount of data", - "status": "passed" - }, - { - "name": "app dir - basic bootstrap scripts should only bootstrap with one script, prinitializing the rest", - "status": "passed" - }, - { - "name": "app dir - basic bootstrap scripts should successfully bootstrap even when using CSP", - "status": "failed", - "reason": "Nonce not automatically set in script tags when using CSP", - "link": "https://github.com/netlify/next-runtime-minimal/issues/381" - }, - { - "name": "app dir - basic should return the `vary` header from edge runtime", - "status": "skipped", - "reason": "Whitespace mismatch" - }, - { - "name": "app dir - basic should return the `vary` header from pages for flight requests", - "status": "skipped", - "reason": "Whitespace mismatch" - } - ] - }, - { - "name": "app-dir - dynamic in generate params", - "file": "test/e2e/app-dir/dynamic-in-generate-params/index.test.ts", - "passed": 3, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app-dir - dynamic in generate params should render sitemap with generateSitemaps in force-dynamic config dynamically", - "status": "passed" - }, - { - "name": "app-dir - dynamic in generate params should be able to call while generating multiple dynamic sitemaps", - "status": "passed" - }, - { - "name": "app-dir - dynamic in generate params should be able to call fetch while generating multiple dynamic pages", - "status": "passed" - } - ] - }, - { - "name": "dynamic-interception-route-revalidate", - "file": "test/e2e/app-dir/dynamic-interception-route-revalidate/dynamic-interception-route-revalidate.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "dynamic-interception-route-revalidate should refresh the dynamic intercepted route when the interception route is revalidated", - "status": "passed" - } - ] - }, - { - "name": "edge-route-catchall", - "file": "test/e2e/app-dir/edge-route-catchall/edge-route-catchall.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "edge-route-catchall should correctly normalize edge route catch-all with a single param", - "status": "passed" - }, - { - "name": "edge-route-catchall should correctly normalize edge route catch-all with multiple params", - "status": "passed" - } - ] - }, - { - "name": "app dir - not found navigation", - "file": "test/e2e/app-dir/error-boundary-navigation/override-node-env.test.ts", - "passed": 14, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app dir - not found navigation should allow navigation on not-found", - "status": "passed" - }, - { - "name": "app dir - not found navigation should allow navigation on error", - "status": "passed" - }, - { - "name": "app dir - not found navigation should allow navigation to other routes on route that was initially not-found", - "status": "passed" - }, - { - "name": "app dir - not found navigation should allow navigation back to route that was initially not-found", - "status": "passed" - }, - { - "name": "app dir - not found navigation should allow navigating to a page calling notfound", - "status": "passed" - }, - { - "name": "app dir - not found navigation should allow navigating to a non-existent page", - "status": "passed" - }, - { - "name": "app dir - not found navigation should be able to navigate to other page from root not-found page", - "status": "passed" - }, - { - "name": "app dir - not found navigation - with overridden node env should allow navigation on not-found", - "status": "passed" - }, - { - "name": "app dir - not found navigation - with overridden node env should allow navigation on error", - "status": "passed" - }, - { - "name": "app dir - not found navigation - with overridden node env should allow navigation to other routes on route that was initially not-found", - "status": "passed" - }, - { - "name": "app dir - not found navigation - with overridden node env should allow navigation back to route that was initially not-found", - "status": "passed" - }, - { - "name": "app dir - not found navigation - with overridden node env should allow navigating to a page calling notfound", - "status": "passed" - }, - { - "name": "app dir - not found navigation - with overridden node env should allow navigating to a non-existent page", - "status": "passed" - }, - { - "name": "app dir - not found navigation - with overridden node env should be able to navigate to other page from root not-found page", - "status": "passed" - } - ] - }, - { - "name": "app dir - hooks", - "file": "test/e2e/app-dir/hooks/hooks.test.ts", - "passed": 25, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/static", - "status": "passed" - }, - { - "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/1", - "status": "passed" - }, - { - "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/2", - "status": "passed" - }, - { - "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/1/account", - "status": "passed" - }, - { - "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/static", - "status": "passed" - }, - { - "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/1", - "status": "passed" - }, - { - "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/2", - "status": "passed" - }, - { - "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/1/account", - "status": "passed" - }, - { - "name": "app dir - hooks usePathname should have the correct pathname", - "status": "passed" - }, - { - "name": "app dir - hooks usePathname should have the canonical url pathname on rewrite", - "status": "passed" - }, - { - "name": "app dir - hooks useSearchParams should have the correct search params", - "status": "passed" - }, - { - "name": "app dir - hooks useDraftMode should use initial rand when draft mode be disabled", - "status": "passed" - }, - { - "name": "app dir - hooks useDraftMode should generate rand when draft mode enabled", - "status": "passed" - }, - { - "name": "app dir - hooks useRouter should allow access to the router", - "status": "passed" - }, - { - "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/first", - "status": "passed" - }, - { - "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/first/slug1", - "status": "passed" - }, - { - "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/first/slug2/second", - "status": "passed" - }, - { - "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/first/slug2/second/a/b", - "status": "passed" - }, - { - "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/rewritten", - "status": "passed" - }, - { - "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/rewritten-middleware", - "status": "passed" - }, - { - "name": "app dir - hooks useSelectedLayoutSegments should return an empty array in pages", - "status": "passed" - }, - { - "name": "app dir - hooks useSelectedLayoutSegment should have the correct layout segment at /hooks/use-selected-layout-segment/first", - "status": "passed" - }, - { - "name": "app dir - hooks useSelectedLayoutSegment should have the correct layout segment at /hooks/use-selected-layout-segment/first/slug1", - "status": "passed" - }, - { - "name": "app dir - hooks useSelectedLayoutSegment should have the correct layout segment at /hooks/use-selected-layout-segment/first/slug2/second/a/b", - "status": "passed" - }, - { - "name": "app dir - hooks useSelectedLayoutSegment should return null in pages", - "status": "passed" - } - ] - }, - { - "name": "navigation between pages and app dir", - "file": "test/e2e/app-dir/interoperability-with-pages/navigation.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "navigation between pages and app dir It should be able to navigate app -> pages", - "status": "passed" - }, - { - "name": "navigation between pages and app dir It should be able to navigate pages -> app", - "status": "passed" - } - ] - }, - { - "name": "app-dir - fetch warnings", - "file": "test/e2e/app-dir/logging/fetch-warning.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app-dir - fetch warnings should skip next deploy", - "status": "passed" - } - ] - }, - { - "name": "app dir - metadata dynamic routes", - "file": "test/e2e/app-dir/metadata-dynamic-routes/index.test.ts", - "passed": 10, - "failed": 0, - "skipped": 9, - "testCases": [ - { - "name": "app dir - metadata dynamic routes text routes should not throw if client components are imported but not used", - "status": "passed" - }, - { - "name": "app dir - metadata dynamic routes text routes should support alternate.languages in sitemap", - "status": "passed" - }, - { - "name": "app dir - metadata dynamic routes social image routes should support generate multi images with generateImageMetadata", - "status": "passed" - }, - { - "name": "app dir - metadata dynamic routes social image routes should support generate multi sitemaps with generateSitemaps", - "status": "passed" - }, - { - "name": "app dir - metadata dynamic routes social image routes should fill params into dynamic routes url of metadata images", - "status": "passed" - }, - { - "name": "app dir - metadata dynamic routes social image routes should support params as argument in dynamic routes", - "status": "passed" - }, - { - "name": "app dir - metadata dynamic routes social image routes should fill params into routes groups url of static images", - "status": "passed" - }, - { - "name": "app dir - metadata dynamic routes social image routes should handle custom fonts in both edge and nodejs runtime", - "status": "passed" - }, - { - "name": "app dir - metadata dynamic routes should generate unique path for image routes under group routes", - "status": "passed" - }, - { - "name": "app dir - metadata dynamic routes should pick configured metadataBase instead of deployment url for canonical url", - "status": "passed" - }, - { - "name": "app dir - metadata dynamic routes text routes should handle robots.[ext] dynamic routes", - "status": "skipped", - "reason": "Header whitespace mismatch" - }, - { - "name": "app dir - metadata dynamic routes text routes should handle sitemap.[ext] dynamic routes", - "status": "skipped", - "reason": "Header whitespace mismatch" - }, - { - "name": "app dir - metadata dynamic routes social image routes should handle manifest.[ext] dynamic routes", - "status": "skipped", - "reason": "Header whitespace mismatch" - }, - { - "name": "app dir - metadata dynamic routes social image routes should render og image with opengraph-image dynamic routes", - "status": "skipped", - "reason": "Header whitespace mismatch" - }, - { - "name": "app dir - metadata dynamic routes social image routes should render og image with twitter-image dynamic routes", - "status": "skipped", - "reason": "Header whitespace mismatch" - }, - { - "name": "app dir - metadata dynamic routes icon image routes should render icon with dynamic routes", - "status": "skipped", - "reason": "Header whitespace mismatch" - }, - { - "name": "app dir - metadata dynamic routes icon image routes should render apple icon with dynamic routes", - "status": "skipped", - "reason": "Header whitespace mismatch" - }, - { - "name": "app dir - metadata dynamic routes should inject dynamic metadata properly to head", - "status": "skipped", - "reason": "Header whitespace mismatch" - }, - { - "name": "app dir - metadata dynamic routes should use localhost for local prod and fallback to deployment url when metadataBase is falsy", - "status": "skipped", - "reason": "Header whitespace mismatch" - } - ] - }, - { - "name": "modularizeImports", - "file": "test/e2e/app-dir/modularizeimports/modularizeimports.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "modularizeImports should work", - "status": "passed" - }, - { - "name": "modularizeImports should work with MDX", - "status": "passed" - } - ] - }, - { - "name": "app dir - next/font", - "file": "test/e2e/app-dir/next-font/next-font.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app dir - next/font app app dir - next-font should skip next deploy", + "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page", "status": "passed" }, { - "name": "app dir - next/font app-old app dir - next-font should skip next deploy", - "status": "passed" - } - ] - }, - { - "name": "app dir - not found with default 404 page", - "file": "test/e2e/app-dir/not-found-default/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app dir - not found with default 404 page should skip next deploy", - "status": "passed" - } - ] - }, - { - "name": "not-found app dir css", - "file": "test/e2e/app-dir/not-found/css-precedence/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "not-found app dir css should skip next deploy", - "status": "passed" - } - ] - }, - { - "name": "app dir - not-found - group route", - "file": "test/e2e/app-dir/not-found/group-route/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app dir - not-found - group route should skip next deploy", - "status": "passed" - } - ] - }, - { - "name": "parallel-route-not-found", - "file": "test/e2e/app-dir/parallel-route-not-found-params/parallel-route-not-found-params.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "parallel-route-not-found should behave correctly without any errors", + "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page rewrite direct", "status": "passed" }, { - "name": "parallel-route-not-found should handle the not found case correctly without any errors", - "status": "passed" - } - ] - }, - { - "name": "parallel-routes-catchall-children-slot", - "file": "test/e2e/app-dir/parallel-routes-catchall-children-slot/parallel-routes-catchall-children-slot.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "parallel-routes-catchall-children-slot should match the @children slot for a page before attempting to match the catchall", - "status": "passed" - } - ] - }, - { - "name": "parallel-routes-catchall-groups", - "file": "test/e2e/app-dir/parallel-routes-catchall-groups/parallel-routes-catchall-groups.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "parallel-routes-catchall-groups should work without throwing any errors about conflicting paths", - "status": "passed" - } - ] - }, - { - "name": "parallel-routes-layouts", - "file": "test/e2e/app-dir/parallel-routes-layouts/parallel-routes-layouts.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "parallel-routes-layouts should properly render layouts for multiple slots", - "status": "passed" - } - ] - }, - { - "name": "app-dir - params hooks compat", - "file": "test/e2e/app-dir/params-hooks-compat/index.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app-dir - params hooks compat should only access search params with useSearchParams", + "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page rewrite direct with internal query", "status": "passed" }, { - "name": "app-dir - params hooks compat should only access path params with useParams", - "status": "passed" - } - ] - }, - { - "name": "turbo-resolve-extensions", - "file": "test/e2e/app-dir/resolve-extensions/resolve-extensions.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "turbo-resolve-extensions should SSR", + "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page rewrite param", "status": "passed" }, { - "name": "turbo-resolve-extensions should work using browser", - "status": "passed" - } - ] - }, - { - "name": "root-layout-redirect", - "file": "test/e2e/app-dir/root-layout-redirect/root-layout-redirect.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "root-layout-redirect should work using browser", - "status": "passed" - } - ] - }, - { - "name": "app-dir root layout", - "file": "test/e2e/app-dir/root-layout/root-layout.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "app-dir root layout should skip next deploy", - "status": "passed" - } - ] - }, - { - "name": "router-stuck-dynamic-static-segment", - "file": "test/e2e/app-dir/router-stuck-dynamic-static-segment/router-stuck-dynamic-static-segment.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "router-stuck-dynamic-static-segment should allow navigation between dynamic parameter and static parameter of the same value", - "status": "passed" - } - ] - }, - { - "name": "Basic Module Include Paths Support", - "file": "test/e2e/app-dir/scss/basic-module-include-paths/basic-module-include-paths.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "Basic Module Include Paths Support should render the module", - "status": "passed" - } - ] - }, - { - "name": "Basic Module Prepend Data Support", - "file": "test/e2e/app-dir/scss/basic-module-prepend-data/basic-module-prepend-data.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "Basic Module Prepend Data Support should render the module", - "status": "passed" - } - ] - }, - { - "name": "CSS Module Composes Usage (External)", - "file": "test/e2e/app-dir/scss/composes-external/composes-external.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "CSS Module Composes Usage (External) should render the module", + "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page with query", "status": "passed" - } - ] - }, - { - "name": "SCSS Support loader handling External imports", - "file": "test/e2e/app-dir/scss/external-url/external-url.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "SCSS Support loader handling External imports should include font on the page", + "name": "getServerSideProps should have correct req.url and query for direct visit", "status": "passed" - } - ] - }, - { - "name": "Multi Global Support", - "file": "test/e2e/app-dir/scss/multi-global/multi-global.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Multi Global Support should render the page", + "name": "getServerSideProps should return data correctly", "status": "passed" - } - ] - }, - { - "name": "Valid CSS Module Usage from within node_modules", - "file": "test/e2e/app-dir/scss/nm-module/nm-module.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Valid CSS Module Usage from within node_modules should render the page", + "name": "getServerSideProps should pass query for data request", "status": "passed" - } - ] - }, - { - "name": "Has CSS Module in computed styles in Production", - "file": "test/e2e/app-dir/scss/prod-module/prod-module.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Has CSS Module in computed styles in Production should render the page", + "name": "getServerSideProps should return data correctly for dynamic page", "status": "passed" - } - ] - }, - { - "name": "unused scss", - "file": "test/e2e/app-dir/scss/unused/unused.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "shallow-routing", - "file": "test/e2e/app-dir/shallow-routing/shallow-routing.test.ts", - "passed": 15, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "shallow-routing pushState should support setting data", + "name": "getServerSideProps should return data correctly when props is a promise", "status": "passed" }, { - "name": "shallow-routing pushState should support setting a different pathname reflected on usePathname", + "name": "getServerSideProps should navigate to a normal page and back", "status": "passed" }, { - "name": "shallow-routing pushState should support setting a different searchParam reflected on useSearchParams", + "name": "getServerSideProps should load a fast refresh page", "status": "passed" }, { - "name": "shallow-routing pushState should support setting a different url using a string", + "name": "getServerSideProps should provide correct query value for dynamic page", "status": "passed" }, { - "name": "shallow-routing pushState should work when given a null state value", + "name": "getServerSideProps should parse query values on mount correctly", "status": "passed" }, { - "name": "shallow-routing should work when given an undefined state value", + "name": "getServerSideProps should pass query for data request on navigation", "status": "passed" }, { - "name": "shallow-routing replaceState should support setting data", + "name": "getServerSideProps should reload page on failed data request", "status": "passed" }, { - "name": "shallow-routing replaceState should support setting a different pathname reflected on usePathname", + "name": "getServerSideProps should always call getServerSideProps without caching", "status": "passed" }, { - "name": "shallow-routing replaceState should support setting a different searchParam reflected on useSearchParams", + "name": "getServerSideProps should not re-call getServerSideProps when updating query", "status": "passed" }, { - "name": "shallow-routing replaceState should support setting a different url using a string", + "name": "getServerSideProps should dedupe server data requests", "status": "passed" }, { - "name": "shallow-routing replaceState should work when given a null state value", + "name": "getServerSideProps should not fetch data on mount", "status": "passed" }, { - "name": "shallow-routing replaceState should work when given an undefined state value", + "name": "getServerSideProps should not show error for invalid JSON returned from getServerSideProps", "status": "passed" }, { - "name": "shallow-routing back and forward client-side navigation should support setting a different pathname reflected on usePathname and then still support navigating back and forward", + "name": "getServerSideProps should not show error for invalid JSON returned from getStaticProps on CST", "status": "passed" }, { - "name": "shallow-routing back and forward mpa navigation should support setting data and then still support navigating back and forward", + "name": "getServerSideProps should not show error for accessing res after gssp returns", "status": "passed" }, { - "name": "shallow-routing back and forward mpa navigation should support hash navigations while continuing to work for pushState/replaceState APIs", + "name": "getServerSideProps should not warn for accessing res after gssp returns", "status": "passed" + }, + { + "name": "getServerSideProps should set default caching header", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "getServerSideProps should respect custom caching header", + "status": "skipped", + "reason": "Header whitespace mismatch" } ] }, { - "name": "underscore-ignore-app-paths", - "file": "test/e2e/app-dir/underscore-ignore-app-paths/underscore-ignore-app-paths.test.ts", - "passed": 3, + "name": "Middleware fetches with any HTTP method", + "file": "test/e2e/middleware-fetches-with-any-http-method/index.test.ts", + "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "underscore-ignore-app-paths should not serve app path with underscore", - "status": "passed" - }, - { - "name": "underscore-ignore-app-paths should serve pages path with underscore", + "name": "Middleware fetches with any HTTP method passes the method on a direct fetch request", "status": "passed" }, { - "name": "underscore-ignore-app-paths should serve app path with %5F", + "name": "Middleware fetches with any HTTP method passes the method when providing a Request object", "status": "passed" } ] }, { - "name": "use-params", - "file": "test/e2e/app-dir/use-params/use-params.test.ts", - "passed": 7, - "failed": 0, + "name": "Middleware Responses", + "file": "test/e2e/middleware-responses/test/index.test.ts", + "passed": 12, + "failed": 2, "skipped": 0, + "total": "14", "testCases": [ { - "name": "use-params should work for single dynamic param", + "name": "Middleware Responses responds with multiple cookies", "status": "passed" }, { - "name": "use-params should work for nested dynamic params", + "name": "Middleware Responses should not fail when returning a stream", "status": "passed" }, { - "name": "use-params should work for catch all params", + "name": "Middleware Responses should not fail when returning a text body", "status": "passed" }, { - "name": "use-params should work for single dynamic param client navigating", + "name": "Middleware Responses should respond with a 401 status code", "status": "passed" }, { - "name": "use-params should work for nested dynamic params client navigating", + "name": "Middleware Responses should respond with one header", "status": "passed" }, { - "name": "use-params should work on pages router", + "name": "Middleware Responses should respond with two headers", "status": "passed" }, { - "name": "use-params shouldn't rerender host component when prefetching", + "name": "Middleware Responses should respond appending headers headers", + "status": "failed", + "reason": "Appending set-cookie header in middleware leads to duplicate header", + "link": "https://github.com/netlify/next-runtime-minimal/issues/447" + }, + { + "name": "Middleware Responses /fr responds with multiple cookies", + "status": "passed" + }, + { + "name": "Middleware Responses /fr should not fail when returning a stream", + "status": "passed" + }, + { + "name": "Middleware Responses /fr should not fail when returning a text body", + "status": "passed" + }, + { + "name": "Middleware Responses /fr should respond with a 401 status code", + "status": "passed" + }, + { + "name": "Middleware Responses /fr should respond with one header", + "status": "passed" + }, + { + "name": "Middleware Responses /fr should respond with two headers", "status": "passed" + }, + { + "name": "Middleware Responses /fr should respond appending headers headers", + "status": "failed", + "reason": "Appending set-cookie header in middleware leads to duplicate header", + "link": "https://github.com/netlify/next-runtime-minimal/issues/447" } ] }, { - "name": "browserslist-extends", - "file": "test/e2e/browserslist-extends/index.test.ts", + "name": "New Link Behavior with stitches", + "file": "test/e2e/new-link-behavior/stitches.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "browserslist-extends should work", + "name": "New Link Behavior with stitches should render ", "status": "passed" } ] }, { - "name": "next.config.js schema validating - defaultConfig", - "file": "test/e2e/config-schema-check/index.test.ts", + "name": "next/font", + "file": "test/e2e/next-font/index.test.ts", "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "next.config.js schema validating - defaultConfig should skip next deploy", + "name": "next/font app should skip next deploy for now", "status": "passed" }, { - "name": "next.config.js schema validating - invalid config should skip next deploy", + "name": "next/font app-old should skip next deploy for now", "status": "passed" } ] }, { - "name": "Edge API endpoints can receive body", - "file": "test/e2e/edge-api-endpoints-can-receive-body/index.test.ts", - "passed": 2, + "name": "socket-io", + "file": "test/e2e/socket-io/index.test.js", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "Edge API endpoints can receive body reads the body as text", - "status": "passed" - }, - { - "name": "Edge API endpoints can receive body reads the body from index", + "name": "socket-io should support socket.io without falling back to polling", "status": "passed" } ] }, { - "name": "Edge can read request body", - "file": "test/e2e/edge-can-read-request-body/index.test.ts", - "passed": 5, + "name": "app-dir action handling - next export", + "file": "test/e2e/app-dir/actions/app-action-export.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "Edge can read request body renders the static page", - "status": "passed" - }, - { - "name": "Edge can read request body middleware reads a JSON body", - "status": "passed" - }, - { - "name": "Edge can read request body middleware reads a text body", - "status": "passed" - }, - { - "name": "Edge can read request body middleware reads an URL encoded form data", - "status": "passed" - }, - { - "name": "Edge can read request body middleware reads a multipart form data", + "name": "app-dir action handling - next export should skip next deploy", "status": "passed" } ] }, { - "name": "Configurable runtime for src/pages and API routes", - "file": "test/e2e/edge-configurable-runtime/index.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "edge-runtime uses edge-light import specifier for packages", - "file": "test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/edge-runtime-uses-edge-light-import-specifier-for-packages.test.ts", + "name": "app dir - external dependency", + "file": "test/e2e/app-dir/app-external/app-external.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "edge-runtime uses edge-light import specifier for packages should skip next deploy", + "name": "app dir - external dependency should skip next deploy", "status": "passed" } ] }, { - "name": "hello-world", - "file": "test/e2e/hello-world/hello-world.test.ts", - "passed": 4, + "name": "app-routes-trailing-slash", + "file": "test/e2e/app-dir/app-routes-trailing-slash/app-routes-trailing-slash.test.ts", + "passed": 2, "failed": 0, "skipped": 0, - "testCases": [ - { - "name": "hello-world should work using cheerio", - "status": "passed" - }, - { - "name": "hello-world should work using browser", - "status": "passed" - }, + "total": "2", + "testCases": [ { - "name": "hello-world should work with html", + "name": "app-routes-trailing-slash should handle trailing slash for edge runtime", "status": "passed" }, { - "name": "hello-world should work with fetch", + "name": "app-routes-trailing-slash should handle trailing slash for node runtime", "status": "passed" } ] }, { - "name": "i18n-disallow-multiple-locales", - "file": "test/e2e/i18n-disallow-multiple-locales/i18n-disallow-multiple-locales.test.ts", + "name": "app-dir assetPrefix handling", + "file": "test/e2e/app-dir/asset-prefix/asset-prefix.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "6", "testCases": [ { - "name": "i18n-disallow-multiple-locales should skip next deploy", + "name": "app-dir assetPrefix handling should skip next deploy", "status": "passed" } ] }, { - "name": "i18n-ignore-rewrite-source-locale", - "file": "test/e2e/i18n-ignore-rewrite-source-locale/rewrites.test.ts", - "passed": 4, - "failed": 4, + "name": "app dir - next/dynamic", + "file": "test/e2e/app-dir/dynamic/dynamic.test.ts", + "passed": 1, + "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "i18n-ignore-rewrite-source-locale get public file by skipping locale in rewrite, locale: ", - "status": "failed", - "reason": "Middleware on sites with i18n cannot rewrite to static files", - "link": "https://github.com/netlify/next-runtime-minimal/issues/383" - }, - { - "name": "i18n-ignore-rewrite-source-locale get public file by skipping locale in rewrite, locale: /en", - "status": "failed", - "reason": "Middleware on sites with i18n cannot rewrite to static files", - "link": "https://github.com/netlify/next-runtime-minimal/issues/383" - }, - { - "name": "i18n-ignore-rewrite-source-locale get public file by skipping locale in rewrite, locale: /sv", - "status": "failed", - "reason": "Middleware on sites with i18n cannot rewrite to static files", - "link": "https://github.com/netlify/next-runtime-minimal/issues/383" - }, - { - "name": "i18n-ignore-rewrite-source-locale get public file by skipping locale in rewrite, locale: /nl", - "status": "failed", - "reason": "Middleware on sites with i18n cannot rewrite to static files", - "link": "https://github.com/netlify/next-runtime-minimal/issues/383" - }, - { - "name": "i18n-ignore-rewrite-source-locale call api by skipping locale in rewrite, locale: ", - "status": "passed" - }, - { - "name": "i18n-ignore-rewrite-source-locale call api by skipping locale in rewrite, locale: /en", - "status": "passed" - }, - { - "name": "i18n-ignore-rewrite-source-locale call api by skipping locale in rewrite, locale: /sv", - "status": "passed" - }, - { - "name": "i18n-ignore-rewrite-source-locale call api by skipping locale in rewrite, locale: /nl", + "name": "app dir - next/dynamic should skip next deploy", "status": "passed" } ] }, { - "name": "i18n: Event with stale state - static route previously was dynamic", - "file": "test/e2e/ignore-invalid-popstateevent/with-i18n.test.ts", - "passed": 3, + "name": "app dir - front redirect issue", + "file": "test/e2e/app-dir/front-redirect-issue/front-redirect-issue.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "i18n: Event with stale state - static route previously was dynamic Ignore event without query param", - "status": "passed" - }, - { - "name": "i18n: Event with stale state - static route previously was dynamic Ignore event with query param", - "status": "passed" - }, - { - "name": "i18n: Event with stale state - static route previously was dynamic Don't ignore event with different locale", + "name": "app dir - front redirect issue should redirect", "status": "passed" } ] }, { - "name": "Middleware base tests", - "file": "test/e2e/middleware-base-path/test/index.test.ts", - "passed": 2, + "name": "interception-dynamic-segment", + "file": "test/e2e/app-dir/interception-dynamic-segment/interception-dynamic-segment.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "Middleware base tests should execute from absolute paths", - "status": "passed" - }, - { - "name": "Middleware base tests router.query must exist when Link clicked page routing", + "name": "interception-dynamic-segment should work when interception route is paired with a dynamic segment", "status": "passed" } ] }, { - "name": "Middleware custom matchers", - "file": "test/e2e/middleware-custom-matchers/test/index.test.ts", - "passed": 7, + "name": "app dir - layout params", + "file": "test/e2e/app-dir/layout-params/layout-params.test.ts", + "passed": 6, "failed": 0, "skipped": 0, + "total": "6", "testCases": [ { - "name": "Middleware custom matchers should match missing header correctly", - "status": "passed" - }, - { - "name": "Middleware custom matchers should match missing query correctly", + "name": "app dir - layout params basic params check layout without params get no params", "status": "passed" }, { - "name": "Middleware custom matchers should match source path", + "name": "app dir - layout params basic params check layout renders just it's params", "status": "passed" }, { - "name": "Middleware custom matchers should match has header", + "name": "app dir - layout params basic params check topmost layout renders all params", "status": "passed" }, { - "name": "Middleware custom matchers should match has query", + "name": "app dir - layout params catchall params should give catchall params just to last layout", "status": "passed" }, { - "name": "Middleware custom matchers should match has cookie", + "name": "app dir - layout params catchall params should give optional catchall params just to last layout", "status": "passed" }, { - "name": "Middleware custom matchers should match has header value", + "name": "app dir - layout params catchall params should give empty optional catchall params won't give params to any layout", "status": "passed" } ] }, { - "name": "Middleware fetches with any HTTP method", - "file": "test/e2e/middleware-fetches-with-any-http-method/index.test.ts", - "passed": 2, + "name": "mjs as extension", + "file": "test/e2e/app-dir/mjs-as-extension/mjs-as-extension.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "Middleware fetches with any HTTP method passes the method on a direct fetch request", - "status": "passed" - }, - { - "name": "Middleware fetches with any HTTP method passes the method when providing a Request object", + "name": "mjs as extension should render the page correctly", "status": "passed" } ] }, { - "name": "Middleware fetches with body", - "file": "test/e2e/middleware-fetches-with-body/index.test.ts", - "passed": 9, + "name": "app dir - next-image", + "file": "test/e2e/app-dir/next-image/next-image.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "Middleware fetches with body with default bodyParser sizeLimit (1mb) should return 413 for body greater than 1mb", - "status": "passed" - }, - { - "name": "Middleware fetches with body with default bodyParser sizeLimit (1mb) should be able to send and return body size equal to 1mb", - "status": "passed" - }, - { - "name": "Middleware fetches with body with default bodyParser sizeLimit (1mb) should be able to send and return body greater than default highWaterMark (16KiB)", - "status": "passed" - }, - { - "name": "Middleware fetches with body with custom bodyParser sizeLimit (5kb) should return 413 for body greater than 5kb", - "status": "passed" - }, - { - "name": "Middleware fetches with body with custom bodyParser sizeLimit (5kb) should be able to send and return body size equal to 5kb", - "status": "passed" - }, - { - "name": "Middleware fetches with body with custom bodyParser sizeLimit (5mb) should return 413 for body greater than 5mb", - "status": "passed" - }, - { - "name": "Middleware fetches with body with bodyParser = false should be able to send and return with body size equal to 16KiB", - "status": "passed" - }, - { - "name": "Middleware fetches with body with bodyParser = false should be able to send and return with body greater than 16KiB", - "status": "passed" - }, - { - "name": "Middleware fetches with body should return 413 for body equal to 10mb", + "name": "app dir - next-image should skip next deploy", "status": "passed" } ] }, { - "name": "Middleware Redirect", - "file": "test/e2e/middleware-redirects/test/index.test.ts", - "passed": 15, - "failed": 3, + "name": "parallel-routes-catchall-dynamic-segment", + "file": "test/e2e/app-dir/parallel-routes-catchall-dynamic-segment/parallel-routes-catchall-dynamic-segment.test.ts", + "passed": 1, + "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "Middleware Redirect should redirect correctly with redirect in next.config.js", - "status": "passed" - }, - { - "name": "Middleware Redirect does not include the locale in redirects by default", - "status": "passed" - }, - { - "name": "Middleware Redirect should redirect to data urls with data requests and internal redirects", - "status": "passed" - }, - { - "name": "Middleware Redirect should redirect to external urls with data requests and external redirects", - "status": "passed" - }, - { - "name": "Middleware Redirect should redirect", - "status": "passed" - }, - { - "name": "Middleware Redirect should implement internal redirects", - "status": "failed", - "reason": "Pages router middleware should return 302 status for redirected data requests", - "link": "https://github.com/netlify/next-runtime-minimal/issues/386" - }, - { - "name": "Middleware Redirect should redirect cleanly with the original url param", - "status": "passed" - }, - { - "name": "Middleware Redirect should redirect multiple times", - "status": "passed" - }, - { - "name": "Middleware Redirect should redirect (infinite-loop)", - "status": "passed" - }, - { - "name": "Middleware Redirect should redirect to api route with locale", - "status": "passed" - }, - { - "name": "Middleware Redirect should redirect with a fragment", - "status": "passed" - }, - { - "name": "Middleware Redirect /fr should redirect", - "status": "passed" - }, - { - "name": "Middleware Redirect /fr should implement internal redirects", - "status": "failed", - "reason": "Pages router middleware should return 302 status for redirected data requests", - "link": "https://github.com/netlify/next-runtime-minimal/issues/386" - }, - { - "name": "Middleware Redirect /fr should redirect cleanly with the original url param", - "status": "passed" - }, - { - "name": "Middleware Redirect /fr should redirect multiple times", + "name": "parallel-routes-catchall-dynamic-segment should match default and dynamic segment paths before catch-all", "status": "passed" - }, - { - "name": "Middleware Redirect /fr should redirect (infinite-loop)", - "status": "failed" - }, + } + ] + }, + { + "name": "app-dir - params hooks compat", + "file": "test/e2e/app-dir/params-hooks-compat/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "Middleware Redirect /fr should redirect to api route with locale", + "name": "app-dir - params hooks compat should only access search params with useSearchParams", "status": "passed" }, { - "name": "Middleware Redirect /fr should redirect with a fragment", + "name": "app-dir - params hooks compat should only access path params with useParams", "status": "passed" } ] }, { - "name": "Middleware Responses", - "file": "test/e2e/middleware-responses/test/index.test.ts", - "passed": 12, - "failed": 2, + "name": "router autoscrolling on navigation", + "file": "test/e2e/app-dir/router-autoscroll/router-autoscroll.test.ts", + "passed": 13, + "failed": 0, "skipped": 0, - "testCases": [ - { - "name": "Middleware Responses responds with multiple cookies", - "status": "passed" - }, + "total": "14", + "testCases": [ { - "name": "Middleware Responses should not fail when returning a stream", + "name": "router autoscrolling on navigation vertical scroll should scroll to top of document when navigating between to pages without layout", "status": "passed" }, { - "name": "Middleware Responses should not fail when returning a text body", + "name": "router autoscrolling on navigation vertical scroll should scroll to top of page when scrolling to phe top of the document wouldn't have the page in the viewport", "status": "passed" }, { - "name": "Middleware Responses should respond with a 401 status code", + "name": "router autoscrolling on navigation vertical scroll should scroll down to the navigated page when it's below viewort", "status": "passed" }, { - "name": "Middleware Responses should respond with one header", + "name": "router autoscrolling on navigation vertical scroll should not scroll when the top of the page is in the viewport", "status": "passed" }, { - "name": "Middleware Responses should respond with two headers", + "name": "router autoscrolling on navigation vertical scroll should not scroll to top of document if page in viewport", "status": "passed" }, { - "name": "Middleware Responses should respond appending headers headers", - "status": "failed" + "name": "router autoscrolling on navigation vertical scroll should scroll to top of document if possible while giving focus to page", + "status": "passed" }, { - "name": "Middleware Responses /fr responds with multiple cookies", + "name": "router autoscrolling on navigation horizontal scroll should't scroll horizontally", "status": "passed" }, { - "name": "Middleware Responses /fr should not fail when returning a stream", + "name": "router autoscrolling on navigation router.refresh() should not scroll when called alone", "status": "passed" }, { - "name": "Middleware Responses /fr should not fail when returning a text body", + "name": "router autoscrolling on navigation router.refresh() should not stop router.push() from scrolling", "status": "passed" }, { - "name": "Middleware Responses /fr should respond with a 401 status code", + "name": "router autoscrolling on navigation bugs Should scroll to the top of the layout when the first child is display none", "status": "passed" }, { - "name": "Middleware Responses /fr should respond with one header", + "name": "router autoscrolling on navigation bugs Should scroll to the top of the layout when the first child is position fixed", "status": "passed" }, { - "name": "Middleware Responses /fr should respond with two headers", + "name": "router autoscrolling on navigation bugs Should scroll to the top of the layout when the first child is position sticky", "status": "passed" }, { - "name": "Middleware Responses /fr should respond appending headers headers", - "status": "failed" - } - ] - }, - { - "name": "browser-shallow-navigation", - "file": "test/e2e/middleware-shallow-link/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "browser-shallow-navigation should render the correct page", + "name": "router autoscrolling on navigation bugs Should apply scroll when loading.js is used", "status": "passed" } ] }, { - "name": "multi-zone", - "file": "test/e2e/multi-zone/multi-zone.test.ts", + "name": "Valid Nested CSS Module Usage from within node_modules", + "file": "test/e2e/app-dir/scss/nm-module-nested/nm-module-nested.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "multi-zone should skip next deploy", + "name": "Valid Nested CSS Module Usage from within node_modules should render the page", "status": "passed" } ] }, { - "name": "New Link Behavior with material-ui", - "file": "test/e2e/new-link-behavior/material-ui.test.ts", + "name": "Good CSS Import from node_modules", + "file": "test/e2e/app-dir/scss/npm-import/npm-import.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "New Link Behavior with material-ui should render MuiLink with ", + "name": "Good CSS Import from node_modules should render the page", "status": "passed" } ] }, { - "name": "next/font/google fetch error", - "file": "test/e2e/next-font/google-fetch-error.test.ts", + "name": "Basic Global Support with src/ dir", + "file": "test/e2e/app-dir/scss/single-global-src/single-global-src.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "next/font/google fetch error should skip next deploy for now", + "name": "Basic Global Support with src/ dir should render the page", "status": "passed" } ] }, { - "name": "next/font/google without-preloaded-fonts without _app", - "file": "test/e2e/next-font/without-preloaded-fonts.test.ts", - "passed": 2, + "name": "set-cookies", + "file": "test/e2e/app-dir/set-cookies/set-cookies.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "next/font/google without-preloaded-fonts without _app should skip next deploy for now", - "status": "passed" - }, - { - "name": "next/font/google no preloads with _app should skip next deploy for now", + "name": "set-cookies should skip next deploy", "status": "passed" } ] }, { - "name": "og-api", - "file": "test/e2e/og-api/index.test.ts", - "passed": 4, + "name": "webpack-loader-conditions", + "file": "test/e2e/app-dir/webpack-loader-conditions/webpack-loader-conditions.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "og-api should respond from index", - "status": "passed" - }, - { - "name": "og-api should work in pages/api", - "status": "passed" - }, - { - "name": "og-api should work in app route", - "status": "passed" - }, - { - "name": "og-api should work in app route in node runtime", + "name": "webpack-loader-conditions should only run the test in turbopack", "status": "passed" } ] }, { - "name": "pages performance mark", - "file": "test/e2e/pages-performance-mark/index.test.ts", + "name": "Conflict between app file and pages file", + "file": "test/e2e/conflicting-app-page-error/index.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "pages performance mark should skip next deploy", + "name": "Conflict between app file and pages file should skip next deploy", "status": "passed" } ] }, { - "name": "prerender native module", - "file": "test/e2e/prerender-native-module.test.ts", - "passed": 3, + "name": "New Link Behavior", + "file": "test/e2e/new-link-behavior/index.test.ts", + "passed": 7, "failed": 0, "skipped": 0, + "total": "7", "testCases": [ { - "name": "prerender native module should render index correctly", + "name": "New Link Behavior should render link with ", "status": "passed" }, { - "name": "prerender native module should render /blog/first correctly", + "name": "New Link Behavior should navigate to /about", "status": "passed" }, { - "name": "prerender native module should render /blog/second correctly", + "name": "New Link Behavior should handle onclick", "status": "passed" - } - ] - }, - { - "name": "revalidate-reason", - "file": "test/e2e/revalidate-reason/revalidate-reason.test.ts", - "passed": 0, - "failed": 3, - "skipped": 0, - "testCases": [ - { - "name": "revalidate-reason should support revalidateReason: \"build\"", - "status": "failed" }, { - "name": "revalidate-reason should support revalidateReason: \"on-demand\"", - "status": "failed" + "name": "New Link Behavior should handle preventdefault", + "status": "passed" }, { - "name": "revalidate-reason should support revalidateReason: \"stale\"", - "status": "failed" - } - ] - }, - { - "name": "revalidate-reason", - "file": "test/e2e/revalidate-reason/revalidate-reason.test.ts", - "passed": 0, - "failed": 3, - "skipped": 0, - "testCases": [ - { - "name": "revalidate-reason should support revalidateReason: \"build\"", - "status": "failed" + "name": "New Link Behavior should render link with id", + "status": "passed" }, { - "name": "revalidate-reason should support revalidateReason: \"on-demand\"", - "status": "failed" + "name": "New Link Behavior should render link with classname", + "status": "passed" }, { - "name": "revalidate-reason should support revalidateReason: \"stale\"", - "status": "failed" + "name": "New Link Behavior should render link with multiple children", + "status": "passed" } ] }, { - "name": "React Context", - "file": "test/e2e/ssr-react-context/index.test.ts", + "name": "next/font/google without-preloaded-fonts without _app", + "file": "test/e2e/next-font/without-preloaded-fonts.test.ts", "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "React Context should render a page with context", + "name": "next/font/google without-preloaded-fonts without _app should skip next deploy for now", "status": "passed" }, { - "name": "React Context should render correctly with context consumer", + "name": "next/font/google no preloads with _app should skip next deploy for now", "status": "passed" } ] }, { - "name": "streaming SSR with custom next configs", - "file": "test/e2e/streaming-ssr/index.test.ts", - "passed": 5, - "failed": 0, - "skipped": 0, + "name": "skip-trailing-slash-redirect", + "file": "test/e2e/skip-trailing-slash-redirect/index.test.ts", + "passed": 23, + "failed": 2, + "skipped": 5, + "total": "30", "testCases": [ { - "name": "streaming SSR with custom next configs should match more specific route along with dynamic routes", + "name": "skip-trailing-slash-redirect should parse locale info for data request correctly", "status": "passed" }, { - "name": "streaming SSR with custom next configs should render styled-jsx styles in streaming", - "status": "passed" + "name": "skip-trailing-slash-redirect should be able to redirect locale casing $1", + "status": "failed", + "reason": "does not correctly handle user middleware that redirects to path with canonical locale casing when app enables `skipMiddlewareUrlNormalize` and path contains locale slug with non-canonical casing", + "link": "https://github.com/netlify/next-runtime-minimal/issues/564" }, { - "name": "streaming SSR with custom next configs should redirect paths without trailing-slash and render when slash is appended", - "status": "passed" + "name": "skip-trailing-slash-redirect should be able to redirect locale casing $1", + "status": "failed", + "reason": "does not correctly handle user middleware that redirects to path with canonical locale casing when app enables `skipMiddlewareUrlNormalize` and path contains locale slug with non-canonical casing", + "link": "https://github.com/netlify/next-runtime-minimal/issues/564" }, { - "name": "streaming SSR with custom next configs should render next/router correctly in edge runtime", + "name": "skip-trailing-slash-redirect should handle external rewrite correctly /docs/first", "status": "passed" }, { - "name": "streaming SSR with custom next configs should render multi-byte characters correctly in streaming", - "status": "passed" - } - ] - }, - { - "name": "undici fetch", - "file": "test/e2e/undici-fetch/index.test.ts", - "passed": 4, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "undici fetch undici global fetch should return true when undici is used", + "name": "skip-trailing-slash-redirect should handle external rewrite correctly /docs-auto-static/first", "status": "passed" }, { - "name": "undici fetch undici global Headers should return true when undici is used", + "name": "skip-trailing-slash-redirect should handle external rewrite correctly /docs-ssr/first", "status": "passed" }, { - "name": "undici fetch undici global Request should return true when undici is used", + "name": "skip-trailing-slash-redirect should allow rewriting invalid buildId correctly", "status": "passed" }, { - "name": "undici fetch undici global Response should return true when undici is used", + "name": "skip-trailing-slash-redirect should provide original _next/data URL with skipMiddlewareUrlNormalize", "status": "passed" - } - ] - }, - { - "name": "yarn PnP", - "file": "test/e2e/yarn-pnp/test/with-mdx.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "yarn PnP should not run for next deploy", + "name": "skip-trailing-slash-redirect should allow response body from middleware with flag", "status": "passed" - } - ] - }, - { - "name": "app-dir action disallowed origins", - "file": "test/e2e/app-dir/actions-allowed-origins/app-action-disallowed-origins.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "app-dir action disallowed origins should skip next deploy", + "name": "skip-trailing-slash-redirect should correct skip URL normalizing in middleware", "status": "passed" - } - ] - }, - { - "name": "app-dir action progressive enhancement", - "file": "test/e2e/app-dir/actions/app-action-progressive-enhancement.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "app-dir action progressive enhancement should support formData and redirect without JS", + "name": "skip-trailing-slash-redirect should apply config redirect correctly", "status": "passed" }, { - "name": "app-dir action progressive enhancement should support actions from client without JS", + "name": "skip-trailing-slash-redirect should apply config rewrites correctly", "status": "passed" - } - ] - }, - { - "name": "app-dir alias", - "file": "test/e2e/app-dir/app-alias/app-alias.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "app-dir alias should skip next deploy", + "name": "skip-trailing-slash-redirect should not apply trailing slash on load on client", "status": "passed" - } - ] - }, - { - "name": "app dir client cache semantics", - "file": "test/e2e/app-dir/app-client-cache/client-cache.test.ts", - "passed": 13, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "app dir client cache semantics prefetch={true} should prefetch the full page", + "name": "skip-trailing-slash-redirect pages dir should not apply trailing slash redirect (with slash)", "status": "passed" }, { - "name": "app dir client cache semantics prefetch={true} should re-use the cache for the full page, only for 5 mins", + "name": "skip-trailing-slash-redirect pages dir should not apply trailing slash redirect (without slash)", "status": "passed" }, { - "name": "app dir client cache semantics prefetch={true} should prefetch again after 5 mins if the link is visible again", + "name": "skip-trailing-slash-redirect pages dir should preserve original trailing slashes to links on client", "status": "passed" }, { - "name": "app dir client cache semantics prefetch={false} should not prefetch the page at all", + "name": "skip-trailing-slash-redirect pages dir should respond to index correctly", "status": "passed" }, { - "name": "app dir client cache semantics prefetch={false} should re-use the cache only for 30 seconds", + "name": "skip-trailing-slash-redirect pages dir should respond to dynamic route correctly", "status": "passed" }, { - "name": "app dir client cache semantics prefetch={undefined} - default should prefetch partially a dynamic page", + "name": "skip-trailing-slash-redirect pages dir should navigate client side correctly", "status": "passed" }, { - "name": "app dir client cache semantics prefetch={undefined} - default should re-use the full cache for only 30 seconds", + "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should not apply trailing slash redirect (with slash)", "status": "passed" }, { - "name": "app dir client cache semantics prefetch={undefined} - default should renew the 30s cache once the data is revalidated", + "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should not apply trailing slash redirect (without slash)", "status": "passed" }, { - "name": "app dir client cache semantics prefetch={undefined} - default should refetch below the fold after 30 seconds", + "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should preserve original trailing slashes to links on client", "status": "passed" }, { - "name": "app dir client cache semantics prefetch={undefined} - default should refetch the full page after 5 mins", + "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should respond to index correctly", "status": "passed" }, { - "name": "app dir client cache semantics prefetch={undefined} - default should respect a loading boundary that returns `null`", + "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should respond to dynamic route correctly", "status": "passed" }, { - "name": "app dir client cache semantics should seed the prefetch cache with the fetched page data", + "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should navigate client side correctly", "status": "passed" }, { - "name": "app dir client cache semantics should renew the initial seeded data after expiration time", - "status": "passed" + "name": "skip-trailing-slash-redirect should merge cookies from middleware and API routes correctly", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "skip-trailing-slash-redirect should merge cookies from middleware and edge API routes correctly", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "skip-trailing-slash-redirect should handle external rewrite correctly /chained-rewrite-ssr", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "skip-trailing-slash-redirect should handle external rewrite correctly /chained-rewrite-static", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "skip-trailing-slash-redirect should handle external rewrite correctly /chained-rewrite-ssg", + "status": "skipped", + "reason": "Header whitespace mismatch" } ] }, { - "name": "app dir - crossOrigin config", - "file": "test/e2e/app-dir/app-config-crossorigin/index.test.ts", + "name": "yarn PnP", + "file": "test/e2e/yarn-pnp/test/with-next-sass.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app dir - crossOrigin config should skip next deploy", + "name": "yarn PnP should not run for next deploy", "status": "passed" } ] }, { - "name": "app-dir - custom-cache-handler - cjs", - "file": "test/e2e/app-dir/app-custom-cache-handler/index.test.ts", - "passed": 3, + "name": "app-dir action useFormState", + "file": "test/e2e/app-dir/actions/app-action-form-state.test.ts", + "passed": 4, "failed": 0, "skipped": 0, + "total": "4", "testCases": [ { - "name": "app-dir - custom-cache-handler - cjs should skip next deploy", + "name": "app-dir action useFormState should support submitting form state with JS", "status": "passed" }, { - "name": "app-dir - custom-cache-handler - cjs-default-export should skip next deploy", + "name": "app-dir action useFormState should support submitting form state without JS", "status": "passed" }, { - "name": "app-dir - custom-cache-handler - esm should skip next deploy", + "name": "app-dir action useFormState should support hydrating the app from progressively enhanced form request", + "status": "passed" + }, + { + "name": "app-dir action useFormState should send the action to the provided permalink with form state when JS disabled", "status": "passed" } ] }, { - "name": "app dir - external dependency", - "file": "test/e2e/app-dir/app-external/app-external.test.ts", - "passed": 1, + "name": "app-dir with middleware", + "file": "test/e2e/app-dir/app-middleware/app-middleware.test.ts", + "passed": 3, "failed": 0, "skipped": 0, + "total": "3", "testCases": [ { - "name": "app dir - external dependency should skip next deploy", + "name": "app-dir with middleware should skip next deploy", + "status": "passed" + }, + { + "name": "app dir - middleware without pages dir should skip next deploy", + "status": "passed" + }, + { + "name": "app dir - middleware with middleware in src dir should skip next deploy", "status": "passed" } ] }, { - "name": "app-prefetch-false", - "file": "test/e2e/app-dir/app-prefetch-false/app-prefetch-false.test.ts", - "passed": 1, + "name": "dynamic-requests", + "file": "test/e2e/app-dir/dynamic-requests/dynamic-requests.test.ts", + "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "app-prefetch-false should avoid double-fetching when optimistic navigation fails", + "name": "dynamic-requests should not error for dynamic requests in pages", + "status": "passed" + }, + { + "name": "dynamic-requests should not error for dynamic requests in routes", "status": "passed" } ] }, { - "name": "app-prefetch-static", - "file": "test/e2e/app-dir/app-prefetch-static/app-prefetch-static.test.ts", - "passed": 1, + "name": "edge-route-rewrite", + "file": "test/e2e/app-dir/edge-route-rewrite/edge-route-rewrite.test.ts", + "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "app-prefetch-static should correctly navigate between static & dynamic pages", + "name": "edge-route-rewrite it should support a rewrite to an edge route", + "status": "passed" + }, + { + "name": "edge-route-rewrite it should support a rewrite to a dynamic edge route", "status": "passed" } ] }, { - "name": "app-routes-subrequests", - "file": "test/e2e/app-dir/app-routes-subrequests/app-routes-subrequests.test.ts", + "name": "app dir - global error - with catch-all route", + "file": "test/e2e/app-dir/global-error/catch-all/index.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app-routes-subrequests should skip next deploy", + "name": "app dir - global error - with catch-all route should skip next deploy", "status": "passed" } ] }, { - "name": "app-dir static/dynamic handling", - "file": "test/e2e/app-dir/app-static/app-static.test.ts", - "passed": 70, - "failed": 3, - "skipped": 1, + "name": "interception-routes-root-catchall", + "file": "test/e2e/app-dir/interception-routes-root-catchall/interception-routes-root-catchall.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", "testCases": [ { - "name": "app-dir static/dynamic handling new tags have been specified on subsequent fetch should not fetch from memory cache", - "status": "failed" - }, - { - "name": "app-dir static/dynamic handling new tags have been specified on subsequent fetch should not fetch from memory cache after revalidateTag is used", - "status": "failed" - }, - { - "name": "app-dir static/dynamic handling should correctly include headers instance in cache key", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling unstable-cache should work in pages/unstable-cache-node", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling unstable-cache should work in pages/unstable-cache-edge", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling unstable-cache should work in pages/api/unstable-cache-node", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling unstable-cache should work in pages/api/unstable-cache-edge", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should not have cache tags header for non-minimal mode", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should correctly skip caching POST fetch for POST handler", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should properly revalidate a route handler that triggers dynamic usage with force-static", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling it should revalidate tag correctly with edge route handler", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling it should revalidate tag correctly with node route handler", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should not revalidate / when revalidate is not used", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling it should revalidate correctly with edge route handler", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling it should revalidate correctly with node route handler", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should revalidate all fetches during on-demand revalidate", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should correctly handle fetchCache = \"force-no-store\"", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should revalidate correctly with config and fetch revalidate", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should not cache non-ok statusCode", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should stream properly for /stale-cache-serving/app-page", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should stream properly for /stale-cache-serving/route-handler", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should stream properly for /stale-cache-serving-edge/app-page", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should stream properly for /stale-cache-serving-edge/route-handler", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should correctly handle statusCode with notFound + ISR", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should cache correctly for fetchCache = default-cache", - "status": "passed" - }, - { - "name": "app-dir static/dynamic handling should cache correctly for fetchCache = force-cache", + "name": "interception-routes-root-catchall should support having a root catch-all and a catch-all in a parallel route group", "status": "passed" }, { - "name": "app-dir static/dynamic handling should cache correctly for cache: no-store", + "name": "interception-routes-root-catchall should handle non-intercepted catch-all pages", "status": "passed" - }, + } + ] + }, + { + "name": "app-dir metadata-json-manifest", + "file": "test/e2e/app-dir/metadata-json-manifest/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "app-dir static/dynamic handling should not error with dynamic server usage with force-static", + "name": "app-dir metadata-json-manifest should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - metadata", + "file": "test/e2e/app-dir/metadata/metadata.test.ts", + "passed": 41, + "failed": 0, + "skipped": 5, + "total": "46", + "testCases": [ { - "name": "app-dir static/dynamic handling should produce response with url from fetch", + "name": "app dir - metadata basic should support title and description", "status": "passed" }, { - "name": "app-dir static/dynamic handling should properly error when dynamic = \"error\" page uses dynamic", + "name": "app dir - metadata basic should support title template", "status": "passed" }, { - "name": "app-dir static/dynamic handling should skip cache in draft mode", + "name": "app dir - metadata basic should support stashed title in one layer of page and layout", "status": "passed" }, { - "name": "app-dir static/dynamic handling should handle partial-gen-params with default dynamicParams correctly", + "name": "app dir - metadata basic should use parent layout title when no title is defined in page", "status": "passed" }, { - "name": "app-dir static/dynamic handling should handle partial-gen-params with layout dynamicParams = false correctly", + "name": "app dir - metadata basic should support stashed title in two layers of page and layout", "status": "passed" }, { - "name": "app-dir static/dynamic handling should handle partial-gen-params with page dynamicParams = false correctly", + "name": "app dir - metadata basic should support apple related tags `itunes` and `appWebApp`", "status": "passed" }, { - "name": "app-dir static/dynamic handling should honor fetch cache in generateStaticParams", + "name": "app dir - metadata basic should support alternate tags", "status": "passed" }, { - "name": "app-dir static/dynamic handling should honor fetch cache correctly", + "name": "app dir - metadata basic should relative canonical url", "status": "passed" }, { - "name": "app-dir static/dynamic handling should honor fetch cache correctly (edge)", + "name": "app dir - metadata basic should not contain query in canonical url after client navigation", "status": "passed" }, { - "name": "app-dir static/dynamic handling should cache correctly with authorization header and revalidate", + "name": "app dir - metadata basic should support robots tags", "status": "passed" }, { - "name": "app-dir static/dynamic handling should not cache correctly with POST method request init", + "name": "app dir - metadata basic should support verification tags", "status": "passed" }, { - "name": "app-dir static/dynamic handling should cache correctly with post method and revalidate", + "name": "app dir - metadata basic should support appLinks tags", "status": "passed" }, { - "name": "app-dir static/dynamic handling should cache correctly with post method and revalidate edge", + "name": "app dir - metadata basic should apply metadata when navigating client-side", "status": "passed" }, { - "name": "app-dir static/dynamic handling should cache correctly with POST method and revalidate", + "name": "app dir - metadata basic should support generateMetadata export", "status": "passed" }, { - "name": "app-dir static/dynamic handling should cache correctly with cookie header and revalidate", + "name": "app dir - metadata basic should handle metadataBase for urls resolved as only URL type", "status": "passed" }, { - "name": "app-dir static/dynamic handling should cache correctly with utf8 encoding", + "name": "app dir - metadata opengraph should support opengraph tags", "status": "passed" }, { - "name": "app-dir static/dynamic handling should cache correctly with utf8 encoding edge", + "name": "app dir - metadata opengraph should support opengraph with article type", "status": "passed" }, { - "name": "app-dir static/dynamic handling should cache correctly handle JSON body", + "name": "app dir - metadata opengraph should override file based images when opengraph-image and twitter-image specify images property", "status": "passed" }, { - "name": "app-dir static/dynamic handling should not throw Dynamic Server Usage error when using generateStaticParams with draftMode", + "name": "app dir - metadata navigation should render root not-found with default metadata", "status": "passed" }, { - "name": "app-dir static/dynamic handling should force SSR correctly for headers usage", + "name": "app dir - metadata navigation should support notFound in generateMetadata", "status": "passed" }, { - "name": "app-dir static/dynamic handling should allow dynamic routes to access cookies", + "name": "app dir - metadata navigation should support redirect in generateMetadata", "status": "passed" }, { - "name": "app-dir static/dynamic handling should not error with generateStaticParams and dynamic data", + "name": "app dir - metadata icons should support basic object icons field", "status": "passed" }, { - "name": "app-dir static/dynamic handling should not error with force-dynamic and catch-all routes", + "name": "app dir - metadata icons should support basic string icons field", "status": "passed" }, { - "name": "app-dir static/dynamic handling should not error with generateStaticParams and authed data on revalidate", + "name": "app dir - metadata icons should support basic complex descriptor icons field", "status": "passed" }, { - "name": "app-dir static/dynamic handling should honor dynamic = \"force-static\" correctly", + "name": "app dir - metadata icons should merge icons from layout if no static icons files are specified", "status": "passed" }, { - "name": "app-dir static/dynamic handling should honor dynamic = \"force-static\" correctly (lazy)", + "name": "app dir - metadata icons should not hoist meta[itemProp] to head", "status": "passed" }, { - "name": "app-dir static/dynamic handling should handle dynamicParams: false correctly", + "name": "app dir - metadata icons should support root level of favicon.ico", "status": "passed" }, { - "name": "app-dir static/dynamic handling should work with forced dynamic path", + "name": "app dir - metadata file based icons should render icon and apple touch icon meta if their images are specified", "status": "passed" }, { - "name": "app-dir static/dynamic handling should work with dynamic path no generateStaticParams", + "name": "app dir - metadata file based icons should not render if image file is not specified", "status": "passed" }, { - "name": "app-dir static/dynamic handling should handle dynamicParams: true correctly", + "name": "app dir - metadata twitter should support twitter card summary_large_image when image present", "status": "passed" }, { - "name": "app-dir static/dynamic handling should navigate to static path correctly", + "name": "app dir - metadata twitter should render twitter card summary when image is not present", "status": "passed" }, { - "name": "app-dir static/dynamic handling should ssr dynamically when detected automatically with fetch cache option", + "name": "app dir - metadata twitter should support default twitter player card", "status": "passed" }, { - "name": "app-dir static/dynamic handling should render not found pages correctly and fallback to the default one", + "name": "app dir - metadata twitter should support default twitter app card", "status": "passed" }, { - "name": "app-dir static/dynamic handling should ssr dynamically when forced via config", + "name": "app dir - metadata static routes should support root dir robots.txt", "status": "passed" }, { - "name": "app-dir static/dynamic handling useSearchParams client should bailout to client rendering - with suspense boundary", + "name": "app dir - metadata static routes should support sitemap.xml under every routes", "status": "passed" }, { - "name": "app-dir static/dynamic handling useSearchParams server response should bailout to client rendering - with suspense boundary", + "name": "app dir - metadata static routes should support static manifest.webmanifest", "status": "passed" }, { - "name": "app-dir static/dynamic handling usePathname should have the correct values", + "name": "app dir - metadata viewport should support dynamic viewport export", "status": "passed" }, { - "name": "app-dir static/dynamic handling usePathname should have values from canonical url on rewrite", + "name": "app dir - metadata react cache should have same title and page value on initial load", "status": "passed" }, { - "name": "app-dir static/dynamic handling unstable_noStore should opt-out of static optimization", + "name": "app dir - metadata react cache should have same title and page value when navigating", "status": "passed" }, { - "name": "app-dir static/dynamic handling unstable_noStore should not opt-out of static optimization when used in next/cache", + "name": "app dir - metadata should not effect metadata images convention like files under pages directory", "status": "passed" }, { - "name": "app-dir static/dynamic handling unstable_cache should retrieve the same value on second request", + "name": "app dir - metadata should not crash from error thrown during preloading nested generateMetadata", "status": "passed" }, { - "name": "app-dir static/dynamic handling unstable_cache should bypass cache in draft mode", - "status": "passed" + "name": "app dir - metadata opengraph should pick up opengraph-image and twitter-image as static metadata files", + "status": "skipped", + "reason": "Hard-coded Vercel URL or env var" }, { - "name": "app-dir static/dynamic handling unstable_cache should not error when retrieving the value undefined", - "status": "passed" + "name": "app dir - metadata static routes should have /favicon.ico as route", + "status": "skipped", + "reason": "Hard-coded Vercel URL or env var" }, { - "name": "app-dir static/dynamic handling should keep querystring on static page", - "status": "passed" + "name": "app dir - metadata static routes should have icons as route", + "status": "skipped", + "reason": "Hard-coded Vercel URL or env var" }, { - "name": "app-dir static/dynamic handling should build dynamic param with edge runtime correctly", - "status": "failed" + "name": "app dir - metadata basic should support other basic tags", + "status": "skipped", + "reason": "Hard-coded Vercel URL or env var" }, { - "name": "app-dir static/dynamic handling should warn for too many cache tags", + "name": "app dir - metadata basic should support other basic tags (edge)", "status": "skipped", - "reason": "Uses CLI output" + "reason": "Hard-coded Vercel URL or env var" } ] }, { - "name": "dynamic-data", - "file": "test/e2e/app-dir/dynamic-data/dynamic-data.test.ts", + "name": "parallel-routes-layouts", + "file": "test/e2e/app-dir/parallel-routes-layouts/parallel-routes-layouts.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "dynamic-data should skip next deploy", + "name": "parallel-routes-layouts should properly render layouts for multiple slots", "status": "passed" } ] }, { - "name": "app dir - next/dynamic", - "file": "test/e2e/app-dir/dynamic/dynamic.test.ts", + "name": "app-dir root layout", + "file": "test/e2e/app-dir/root-layout/root-layout.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app dir - next/dynamic should skip next deploy", + "name": "app-dir root layout should skip next deploy", "status": "passed" } ] }, { - "name": "edge runtime node compatibility", - "file": "test/e2e/app-dir/edge-runtime-node-compatibility/edge-runtime-node-compatibility.test.ts", - "passed": 2, + "name": "Catch-all Route CSS Module Usage", + "file": "test/e2e/app-dir/scss/catch-all-module/catch-all-module.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "edge runtime node compatibility [app] supports node:buffer", - "status": "passed" - }, - { - "name": "edge runtime node compatibility [pages/api] supports node:buffer", + "name": "Catch-all Route CSS Module Usage should render the module", "status": "passed" } ] }, { - "name": "app dir - not found navigation", - "file": "test/e2e/app-dir/error-boundary-navigation/index.test.ts", - "passed": 7, + "name": "Invalid CSS Global Module Usage in node_modules", + "file": "test/e2e/app-dir/scss/invalid-global-module/invalid-global-module.test.ts", + "passed": 0, "failed": 0, "skipped": 0, - "testCases": [ - { - "name": "app dir - not found navigation should allow navigation on not-found", - "status": "passed" - }, - { - "name": "app dir - not found navigation should allow navigation on error", - "status": "passed" - }, - { - "name": "app dir - not found navigation should allow navigation to other routes on route that was initially not-found", - "status": "passed" - }, - { - "name": "app dir - not found navigation should allow navigation back to route that was initially not-found", - "status": "passed" - }, - { - "name": "app dir - not found navigation should allow navigating to a page calling notfound", - "status": "passed" - }, - { - "name": "app dir - not found navigation should allow navigating to a non-existent page", - "status": "passed" - }, - { - "name": "app dir - not found navigation should be able to navigate to other page from root not-found page", - "status": "passed" - } - ] + "total": "1", + "testCases": [] }, { - "name": "app dir - global error", - "file": "test/e2e/app-dir/global-error/basic/index.test.ts", - "passed": 6, + "name": "Invalid Global CSS", + "file": "test/e2e/app-dir/scss/invalid-global/invalid-global.test.ts", + "passed": 0, "failed": 0, "skipped": 0, - "testCases": [ - { - "name": "app dir - global error should trigger error component when an error happens during rendering", - "status": "passed" - }, - { - "name": "app dir - global error should render global error for error in server components", - "status": "passed" - }, - { - "name": "app dir - global error should render global error for error in client components", - "status": "passed" - }, - { - "name": "app dir - global error should catch metadata error in error boundary if presented", - "status": "passed" - }, - { - "name": "app dir - global error should catch metadata error in global-error if no error boundary is presented", - "status": "passed" - }, - { - "name": "app dir - global error should catch the client error thrown in the nested routes", - "status": "passed" - } - ] + "total": "1", + "testCases": [] }, { - "name": "app dir - imports", - "file": "test/e2e/app-dir/import/import.test.ts", - "passed": 4, + "name": "Multi Global Support", + "file": "test/e2e/app-dir/scss/multi-global/multi-global.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app dir - imports we can import all components from .js", - "status": "passed" - }, - { - "name": "app dir - imports we can import all components from .jsx", - "status": "passed" - }, - { - "name": "app dir - imports we can import all components from .ts", - "status": "passed" - }, - { - "name": "app dir - imports we can import all components from .tsx", + "name": "Multi Global Support should render the page", "status": "passed" } ] }, { - "name": "interception-route-prefetch-cache", - "file": "test/e2e/app-dir/interception-route-prefetch-cache/interception-route-prefetch-cache.test.ts", - "passed": 2, + "name": "SCSS Support loader handling", + "file": "test/e2e/app-dir/scss/url-global-asset-prefix-1/url-global-asset-prefix-1.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "SCSS Support loader handling", + "file": "test/e2e/app-dir/scss/url-global-partial/url-global-partial.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "interception-route-prefetch-cache runtime = nodejs should render the correct interception when two distinct layouts share the same path structure", - "status": "passed" - }, - { - "name": "interception-route-prefetch-cache runtime = edge should render the correct interception when two distinct layouts share the same path structure", + "name": "SCSS Support loader handling CSS URL via file-loader sass partial should render the page", "status": "passed" } ] }, { - "name": "app dir - Metadata API on the Edge runtime", - "file": "test/e2e/app-dir/metadata-edge/index.test.ts", + "name": "app-dir similar pages paths", + "file": "test/e2e/app-dir/similar-pages-paths/similar-pages-paths.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app dir - Metadata API on the Edge runtime should render OpenGraph image meta tag correctly", + "name": "app-dir similar pages paths should skip next deploy", "status": "passed" } ] }, { - "name": "app-dir metadata-json-manifest", - "file": "test/e2e/app-dir/metadata-json-manifest/index.test.ts", - "passed": 1, + "name": "underscore-ignore-app-paths", + "file": "test/e2e/app-dir/underscore-ignore-app-paths/underscore-ignore-app-paths.test.ts", + "passed": 3, "failed": 0, "skipped": 0, + "total": "3", "testCases": [ { - "name": "app-dir metadata-json-manifest should skip next deploy", + "name": "underscore-ignore-app-paths should not serve app path with underscore", + "status": "passed" + }, + { + "name": "underscore-ignore-app-paths should serve pages path with underscore", + "status": "passed" + }, + { + "name": "underscore-ignore-app-paths should serve app path with %5F", "status": "passed" } ] }, { - "name": "app dir - metadata missing metadataBase", - "file": "test/e2e/app-dir/metadata-warnings/index.test.ts", - "passed": 1, + "name": "children-page", + "file": "test/e2e/children-page/index.test.ts", + "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "app dir - metadata missing metadataBase should skip next deploy", + "name": "children-page with app dir should show the content if you have a page named children", + "status": "passed" + }, + { + "name": "children-page with pages dir should show the content if you have a page named children", "status": "passed" } ] }, { - "name": "app dir - navigation", - "file": "test/e2e/app-dir/navigation/navigation.test.ts", - "passed": 48, + "name": "Edge runtime pages-api route", + "file": "test/e2e/edge-runtime-pages-api-route/edge-runtime-pages-api-route.test.ts", + "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "app dir - navigation query string should set query correctly", + "name": "Edge runtime pages-api route should work edge runtime", "status": "passed" }, { - "name": "app dir - navigation query string should handle unicode search params", + "name": "Edge runtime pages-api route should work with node runtime", "status": "passed" + } + ] + }, + { + "name": "i18n-ignore-rewrite-source-locale", + "file": "test/e2e/i18n-ignore-rewrite-source-locale/rewrites.test.ts", + "passed": 4, + "failed": 4, + "skipped": 0, + "total": "8", + "testCases": [ + { + "name": "i18n-ignore-rewrite-source-locale get public file by skipping locale in rewrite, locale: ", + "status": "failed", + "reason": "Middleware on sites with i18n cannot rewrite to static files", + "link": "https://github.com/netlify/next-runtime-minimal/issues/383" }, { - "name": "app dir - navigation query string should not reset shallow url updates on prefetch", - "status": "passed" + "name": "i18n-ignore-rewrite-source-locale get public file by skipping locale in rewrite, locale: /en", + "status": "failed", + "reason": "Middleware on sites with i18n cannot rewrite to static files", + "link": "https://github.com/netlify/next-runtime-minimal/issues/383" }, { - "name": "app dir - navigation query string useParams identity between renders should be stable in app", - "status": "passed" + "name": "i18n-ignore-rewrite-source-locale get public file by skipping locale in rewrite, locale: /sv", + "status": "failed", + "reason": "Middleware on sites with i18n cannot rewrite to static files", + "link": "https://github.com/netlify/next-runtime-minimal/issues/383" }, { - "name": "app dir - navigation query string useParams identity between renders should be stable in pages", - "status": "passed" + "name": "i18n-ignore-rewrite-source-locale get public file by skipping locale in rewrite, locale: /nl", + "status": "failed", + "reason": "Middleware on sites with i18n cannot rewrite to static files", + "link": "https://github.com/netlify/next-runtime-minimal/issues/383" }, { - "name": "app dir - navigation hash should scroll to the specified hash", + "name": "i18n-ignore-rewrite-source-locale call api by skipping locale in rewrite, locale: ", "status": "passed" }, { - "name": "app dir - navigation hash should not scroll to hash when scroll={false} is set", + "name": "i18n-ignore-rewrite-source-locale call api by skipping locale in rewrite, locale: /en", "status": "passed" }, { - "name": "app dir - navigation hash-with-scroll-offset should scroll to the specified hash", + "name": "i18n-ignore-rewrite-source-locale call api by skipping locale in rewrite, locale: /sv", "status": "passed" }, { - "name": "app dir - navigation hash-link-back-to-same-page should scroll to the specified hash", + "name": "i18n-ignore-rewrite-source-locale call api by skipping locale in rewrite, locale: /nl", "status": "passed" - }, + } + ] + }, + { + "name": "Middleware custom matchers i18n", + "file": "test/e2e/middleware-custom-matchers-i18n/test/index.test.ts", + "passed": 8, + "failed": 1, + "skipped": 0, + "total": "13", + "testCases": [ { - "name": "app dir - navigation relative hashes and queries should work with a hash-only href", + "name": "Middleware custom matchers i18n should match", "status": "passed" }, { - "name": "app dir - navigation relative hashes and queries should work with a hash-only `router.push(...)`", + "name": "Middleware custom matchers i18n should match", "status": "passed" }, { - "name": "app dir - navigation relative hashes and queries should work with a query-only href", + "name": "Middleware custom matchers i18n should match", "status": "passed" }, { - "name": "app dir - navigation relative hashes and queries should work with both relative hashes and queries", + "name": "Middleware custom matchers i18n should match", "status": "passed" }, { - "name": "app dir - navigation not-found should trigger not-found in a server component", - "status": "passed" + "name": "Middleware custom matchers i18n should not match", + "status": "failed", + "reason": "Middleware matching is too broad when using i18n", + "link": "https://github.com/netlify/next-runtime-minimal/issues/453" }, { - "name": "app dir - navigation not-found should trigger not-found in a client component", + "name": "Middleware custom matchers i18n should not match", "status": "passed" }, { - "name": "app dir - navigation not-found should trigger not-found client-side", + "name": "Middleware custom matchers i18n should not match", "status": "passed" }, { - "name": "app dir - navigation not-found should trigger not-found while streaming", + "name": "Middleware custom matchers i18n should not match", "status": "passed" }, { - "name": "app dir - navigation redirect components should redirect in a server component", + "name": "Middleware custom matchers with root should not match", "status": "passed" - }, + } + ] + }, + { + "name": "browser-shallow-navigation", + "file": "test/e2e/middleware-shallow-link/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "app dir - navigation redirect components should redirect in a client component", + "name": "browser-shallow-navigation should render the correct page", "status": "passed" - }, + } + ] + }, + { + "name": "Middleware Runtime trailing slash", + "file": "test/e2e/middleware-trailing-slash/test/index.test.ts", + "passed": 22, + "failed": 1, + "skipped": 0, + "total": "23", + "testCases": [ { - "name": "app dir - navigation redirect components should redirect client-side", + "name": "Middleware Runtime trailing slash with .html extension should work when requesting the page directly", "status": "passed" }, { - "name": "app dir - navigation redirect components should redirect to external url", + "name": "Middleware Runtime trailing slash with .html extension should work using browser", "status": "passed" }, { - "name": "app dir - navigation redirect components should redirect to external url, initiating only once", + "name": "Middleware Runtime trailing slash with .html extension should work when navigating", "status": "passed" }, { - "name": "app dir - navigation redirect components should only trigger the redirect once (/redirect/servercomponent)", + "name": "Middleware Runtime trailing slash without .html extension should work when requesting the page directly", "status": "passed" }, { - "name": "app dir - navigation redirect components should only trigger the redirect once (redirect/redirect-with-loading)", + "name": "Middleware Runtime trailing slash without .html extension should work using browser", "status": "passed" }, { - "name": "app dir - navigation redirect next.config.js redirects should redirect from next.config.js", + "name": "Middleware Runtime trailing slash without .html extension should work when navigating", "status": "passed" }, { - "name": "app dir - navigation redirect next.config.js redirects should redirect from next.config.js with link navigation", + "name": "Middleware Runtime trailing slash should have init header for NextResponse.redirect", "status": "passed" }, { - "name": "app dir - navigation redirect middleware redirects should redirect from middleware", + "name": "Middleware Runtime trailing slash should have correct query values for rewrite to ssg page", "status": "passed" }, { - "name": "app dir - navigation redirect middleware redirects should redirect from middleware with link navigation", + "name": "Middleware Runtime trailing slash should have correct dynamic route params on client-transition to dynamic route", "status": "passed" }, { - "name": "app dir - navigation redirect status code should respond with 307 status code in server component", + "name": "Middleware Runtime trailing slash should have correct dynamic route params for middleware rewrite to dynamic route", "status": "passed" }, { - "name": "app dir - navigation redirect status code should respond with 307 status code in client component", + "name": "Middleware Runtime trailing slash should have correct route params for chained rewrite from middleware to config rewrite", "status": "passed" }, { - "name": "app dir - navigation redirect status code should respond with 308 status code if permanent flag is set", + "name": "Middleware Runtime trailing slash should have correct route params for rewrite from config dynamic route", "status": "passed" }, { - "name": "app dir - navigation external push should push external url without affecting hooks", + "name": "Middleware Runtime trailing slash should have correct route params for rewrite from config non-dynamic route", "status": "passed" }, { - "name": "app dir - navigation navigation between pages and app should not contain _rsc query while navigating from app to pages", + "name": "Middleware Runtime trailing slash should redirect the same for direct visit and client-transition", "status": "passed" }, { - "name": "app dir - navigation navigation between pages and app should not contain _rsc query while navigating from pages to app", + "name": "Middleware Runtime trailing slash should rewrite the same for direct visit and client-transition", "status": "passed" }, { - "name": "app dir - navigation navigation between pages and app should not omit the hash while navigating from app to pages", + "name": "Middleware Runtime trailing slash should rewrite correctly for non-SSG/SSP page", "status": "passed" }, { - "name": "app dir - navigation navigation between pages and app should not continously initiate a mpa navigation to the same URL when router state changes", + "name": "Middleware Runtime trailing slash should respond with 400 on decode failure", "status": "passed" }, { - "name": "app dir - navigation nested navigation should navigate to nested pages", + "name": "Middleware Runtime trailing slash should validate & parse request url from any route", "status": "passed" }, { - "name": "app dir - navigation nested navigation should load chunks correctly without double encoding of url", + "name": "Middleware Runtime trailing slash should trigger middleware for data requests", "status": "passed" }, { - "name": "app dir - navigation SEO should emit noindex meta tag for not found page when streaming", + "name": "Middleware Runtime trailing slash should normalize data requests into page requests", "status": "passed" }, { - "name": "app dir - navigation SEO should emit refresh meta tag for redirect page when streaming", - "status": "passed" + "name": "Middleware Runtime trailing slash should keep non data requests in their original shape", + "status": "failed", + "reason": "Middleware should not add trailing slashes to non-data requests in static dir", + "link": "https://github.com/netlify/next-runtime-minimal/issues/385" }, { - "name": "app dir - navigation SEO should emit refresh meta tag (permanent) for redirect page when streaming", + "name": "Middleware Runtime trailing slash should add a rewrite header on data requests for rewrites", "status": "passed" }, { - "name": "app dir - navigation SEO should contain default meta tags in error page", + "name": "Middleware Runtime trailing slash allows shallow linking with middleware", "status": "passed" - }, + } + ] + }, + { + "name": "beforeInteractive in document Head", + "file": "test/e2e/next-script/index.test.ts", + "passed": 8, + "failed": 0, + "skipped": 0, + "total": "8", + "testCases": [ { - "name": "app dir - navigation SEO should not log 404 errors in ipc server", + "name": "beforeInteractive in document Head Script is injected server-side", "status": "passed" }, { - "name": "app dir - navigation navigations when attaching a Proxy to `window.Promise` should navigate without issue", + "name": "beforeInteractive in document body Script is injected server-side", "status": "passed" }, { - "name": "app dir - navigation scroll restoration should restore original scroll position when navigating back", + "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: false with no Partytown dependency Partytown snippet is not injected to head if not enabled in configuration", "status": "passed" }, { - "name": "app dir - navigation navigating to a page with async metadata should render the final state of the page with correct metadata", + "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with required Partytown dependency for external script Partytown snippets are injected to head if enabled in configuration", "status": "passed" }, { - "name": "app dir - navigation navigating to dynamic params & changing the casing should load the page correctly", + "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with required Partytown dependency for external script Worker scripts are modified by Partytown to execute on a worker thread", "status": "passed" }, { - "name": "app dir - navigation browser back to a revalidated page should load the page", + "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with required Partytown dependency for inline script Inline worker script through children is modified by Partytown to execute on a worker thread", "status": "passed" - } - ] - }, - { - "name": "parallel-routes-and-interception-basepath", - "file": "test/e2e/app-dir/parallel-routes-and-interception-basepath/parallel-routes-and-interception-basepath.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "parallel-routes-and-interception-basepath should show parallel intercepted slot with basepath", + "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with required Partytown dependency for inline script Inline worker script through dangerouslySetInnerHtml is modified by Partytown to execute on a worker thread", "status": "passed" }, { - "name": "parallel-routes-and-interception-basepath should show normal route via direct link with basepath when parallel intercepted slot exist", + "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with config override Partytown config script is overwritten", "status": "passed" } ] }, { - "name": "parallel-routes-catchall-default", - "file": "test/e2e/app-dir/parallel-routes-catchall-default/parallel-routes-catchall-default.test.ts", - "passed": 1, + "name": "app-dir action progressive enhancement", + "file": "test/e2e/app-dir/actions/app-action-progressive-enhancement.test.ts", + "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "parallel-routes-catchall-default should match default paths before catch-all", + "name": "app-dir action progressive enhancement should support formData and redirect without JS", "status": "passed" - } - ] - }, - { - "name": "parallel-routes-catchall-slotted-non-catchalls", - "file": "test/e2e/app-dir/parallel-routes-catchall-slotted-non-catchalls/parallel-routes-catchall-slotted-non-catchalls.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "parallel-routes-catchall-slotted-non-catchalls should match default and dynamic segment paths before catch-all", + "name": "app-dir action progressive enhancement should support actions from client without JS", "status": "passed" } ] }, { - "name": "parallel-routes-catchall", - "file": "test/e2e/app-dir/parallel-routes-catchall/parallel-routes-catchall.test.ts", - "passed": 4, + "name": "app dir client cache semantics (experimental staleTimes)", + "file": "test/e2e/app-dir/app-client-cache/client-cache.experimental.test.ts", + "passed": 7, "failed": 0, - "skipped": 0, + "skipped": 2, + "total": "9", "testCases": [ { - "name": "parallel-routes-catchall should match correctly when defining an explicit page & slot", + "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={true} should re-use the cache for 5 minutes (default \"static\" time)", "status": "passed" }, { - "name": "parallel-routes-catchall should match correctly when defining an explicit page but no slot", + "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={false} should trigger a loading state before fetching the page, followed by fresh data on every subsequent navigation", "status": "passed" }, { - "name": "parallel-routes-catchall should match correctly when defining an explicit slot but no page", + "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={false} without a loading boundary should get fresh data on every subsequent navigation", "status": "passed" }, { - "name": "parallel-routes-catchall should match both the catch-all page & slot", - "status": "passed" - } - ] - }, - { - "name": "parallel-routes-use-selected-layout-segment", - "file": "test/e2e/app-dir/parallel-routes-use-selected-layout-segment/parallel-routes-use-selected-layout-segment.test.ts", - "passed": 4, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "parallel-routes-use-selected-layout-segment hard nav to router page and soft nav around other router pages", + "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={undefined} - default should trigger a loading state before fetching the page, followed by fresh data on every subsequent navigation", "status": "passed" }, { - "name": "parallel-routes-use-selected-layout-segment hard nav to router page and soft nav to parallel routes", + "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={undefined} - default without a loading boundary should get fresh data on every subsequent navigation", "status": "passed" }, { - "name": "parallel-routes-use-selected-layout-segment hard nav to router page and soft nav to parallel route and soft nav back to another router page", + "name": "app dir client cache semantics (experimental staleTimes) static: 180 prefetch={true} should use the custom static override time (3 minutes)", "status": "passed" }, { - "name": "parallel-routes-use-selected-layout-segment hard nav to parallel route", - "status": "passed" - } - ] - }, - { - "name": "scripts", - "file": "test/e2e/app-dir/resource-url-encoding/resource-url-encoding.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "route-page-manifest-bug", - "file": "test/e2e/app-dir/route-page-manifest-bug/route-page-manifest-bug.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "route-page-manifest-bug should work when requesting route handler after page", + "name": "app dir client cache semantics (experimental staleTimes) static: 180 prefetch={undefined} - default should re-use the loading boundary for the custom static override time (3 minutes)", "status": "passed" - } - ] - }, - { - "name": "3rd Party CSS Module Support", - "file": "test/e2e/app-dir/scss/3rd-party-module/3rd-party-module.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "3rd Party CSS Module Support should render the module", - "status": "passed" - } - ] - }, - { - "name": "Basic Module Additional Data Support", - "file": "test/e2e/app-dir/scss/basic-module-additional-data/basic-module-additional-data.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 telemetry should send staleTimes feature usage event", + "status": "skipped", + "reason": "Uses CLI output" + }, { - "name": "Basic Module Additional Data Support should render the module", - "status": "passed" + "name": "app dir client cache semantics (experimental staleTimes) static: 180 telemetry should send staleTimes feature usage event", + "status": "skipped", + "reason": "Uses CLI output" } ] }, { - "name": "Catch-all Route CSS Module Usage", - "file": "test/e2e/app-dir/scss/catch-all-module/catch-all-module.test.ts", - "passed": 1, + "name": "router autoscrolling on navigation with css modules", + "file": "test/e2e/app-dir/autoscroll-with-css-modules/index.test.ts", + "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "Catch-all Route CSS Module Usage should render the module", + "name": "router autoscrolling on navigation with css modules vertical scroll when page imports css modules should scroll to top of document when navigating between to pages without layout when", "status": "passed" - } - ] - }, - { - "name": "Dynamic Route CSS Module Usage", - "file": "test/e2e/app-dir/scss/dynamic-route-module/dynamic-route-module.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Dynamic Route CSS Module Usage should apply styles correctly", + "name": "router autoscrolling on navigation with css modules vertical scroll when page imports css modules should scroll when clicking in JS", "status": "passed" } ] }, { - "name": "(SCSS) Multi Global Support (reversed)", - "file": "test/e2e/app-dir/scss/multi-global-reversed/multi-global-reversed.test.ts", + "name": "app dir - dynamic css", + "file": "test/e2e/app-dir/dynamic-css/index.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "(SCSS) Multi Global Support (reversed) should render the page", + "name": "app dir - dynamic css should skip next deploy", "status": "passed" } ] }, { - "name": "CSS Import from node_modules", - "file": "test/e2e/app-dir/scss/npm-import-bad/npm-import-bad.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "Good Nested CSS Import from node_modules", - "file": "test/e2e/app-dir/scss/npm-import-nested/npm-import-nested.test.ts", + "name": "app-dir - errors", + "file": "test/e2e/app-dir/errors/index.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "Good Nested CSS Import from node_modules should render the page", + "name": "app-dir - errors should skip next deploy", "status": "passed" } ] }, { - "name": "Scss Mixins", - "file": "test/e2e/app-dir/scss/scss-mixins/scss-mixins.test.ts", - "passed": 1, + "name": "app dir - imports", + "file": "test/e2e/app-dir/import/import.test.ts", + "passed": 4, "failed": 0, "skipped": 0, + "total": "4", "testCases": [ { - "name": "Scss Mixins should work using browser", + "name": "app dir - imports we can import all components from .js", + "status": "passed" + }, + { + "name": "app dir - imports we can import all components from .jsx", + "status": "passed" + }, + { + "name": "app dir - imports we can import all components from .ts", + "status": "passed" + }, + { + "name": "app dir - imports we can import all components from .tsx", "status": "passed" } ] }, { - "name": "SCSS Support loader handling", - "file": "test/e2e/app-dir/scss/url-global-asset-prefix-2/url-global-asset-prefix-2.test.ts", - "passed": 0, - "failed": 0, - "skipped": 0, - "testCases": [] - }, - { - "name": "SCSS Support loader handling", - "file": "test/e2e/app-dir/scss/url-global/url-global.test.ts", + "name": "app-dir - logging", + "file": "test/e2e/app-dir/logging/fetch-logging.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "5", "testCases": [ { - "name": "SCSS Support loader handling CSS URL via `file-loader` should render the page", + "name": "app-dir - logging should skip next deploy", "status": "passed" } ] }, { - "name": "server-actions-relative-redirect", - "file": "test/e2e/app-dir/server-actions-relative-redirect/server-actions-relative-redirect.test.ts", - "passed": 2, + "name": "parallel-routes-catchall-children-slot", + "file": "test/e2e/app-dir/parallel-routes-catchall-children-slot/parallel-routes-catchall-children-slot.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "server-actions-relative-redirect should work with relative redirect", - "status": "passed" - }, - { - "name": "server-actions-relative-redirect should work with absolute redirect", + "name": "parallel-routes-catchall-children-slot should match the @children slot for a page before attempting to match the catchall", "status": "passed" } ] }, { - "name": "app-dir - server components externals", - "file": "test/e2e/app-dir/server-components-externals/index.test.ts", - "passed": 2, - "failed": 1, + "name": "parallel-routes-use-selected-layout-segment", + "file": "test/e2e/app-dir/parallel-routes-use-selected-layout-segment/parallel-routes-use-selected-layout-segment.test.ts", + "passed": 4, + "failed": 0, "skipped": 0, + "total": "4", "testCases": [ { - "name": "app-dir - server components externals should have externals for those in config.experimental.serverComponentsExternalPackages", + "name": "parallel-routes-use-selected-layout-segment hard nav to router page and soft nav around other router pages", "status": "passed" }, { - "name": "app-dir - server components externals uses externals for predefined list in server-external-packages.json", + "name": "parallel-routes-use-selected-layout-segment hard nav to router page and soft nav to parallel routes", "status": "passed" }, { - "name": "app-dir - server components externals should externalize serverComponentsExternalPackages for server rendering layer", - "status": "failed" - } - ] - }, - { - "name": "app-dir - server components externals", - "file": "test/e2e/app-dir/server-components-externals/index.test.ts", - "passed": 2, - "failed": 1, - "skipped": 0, - "testCases": [ - { - "name": "app-dir - server components externals should have externals for those in config.experimental.serverComponentsExternalPackages", + "name": "parallel-routes-use-selected-layout-segment hard nav to router page and soft nav to parallel route and soft nav back to another router page", "status": "passed" }, { - "name": "app-dir - server components externals uses externals for predefined list in server-external-packages.json", + "name": "parallel-routes-use-selected-layout-segment hard nav to parallel route", "status": "passed" - }, - { - "name": "app-dir - server components externals should externalize serverComponentsExternalPackages for server rendering layer", - "status": "failed" } ] }, { - "name": "syntax-highlighter-crash", - "file": "test/e2e/app-dir/syntax-highlighter-crash/syntax-highlighter-crash.test.ts", + "name": "router-stuck-dynamic-static-segment", + "file": "test/e2e/app-dir/router-stuck-dynamic-static-segment/router-stuck-dynamic-static-segment.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "syntax-highlighter-crash should render the page", + "name": "router-stuck-dynamic-static-segment should allow navigation between dynamic parameter and static parameter of the same value", "status": "passed" } ] }, { - "name": "app-dir trailingSlash handling", - "file": "test/e2e/app-dir/trailingslash/trailingslash.test.ts", + "name": "CSS Module Composes Usage (Basic)", + "file": "test/e2e/app-dir/scss/composes-basic/composes-basic.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "app-dir trailingSlash handling should skip next deploy", + "name": "CSS Module Composes Usage (Basic) should render the module", "status": "passed" } ] }, { - "name": "webpack-loader-conditions", - "file": "test/e2e/app-dir/webpack-loader-conditions/webpack-loader-conditions.test.ts", + "name": "Valid CSS Module Usage from within node_modules", + "file": "test/e2e/app-dir/scss/nm-module/nm-module.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "webpack-loader-conditions should only run the test in turbopack", + "name": "Valid CSS Module Usage from within node_modules should render the page", "status": "passed" } ] }, { - "name": "Browserslist", - "file": "test/e2e/browserslist/browserslist.test.ts", + "name": "SCSS Support loader handling", + "file": "test/e2e/app-dir/scss/url-global-asset-prefix-2/url-global-asset-prefix-2.test.ts", "passed": 0, "failed": 0, "skipped": 0, + "total": "1", "testCases": [] }, { - "name": "default browserslist target", - "file": "test/e2e/browserslist/default-target.test.ts", + "name": "Valid and Invalid Global CSS with Custom App", + "file": "test/e2e/app-dir/scss/valid-and-invalid-global/valid-and-invalid-global.test.ts", "passed": 0, "failed": 0, "skipped": 0, + "total": "1", "testCases": [] }, { - "name": "children-page", - "file": "test/e2e/children-page/index.test.ts", - "passed": 2, + "name": "app dir - search params keys", + "file": "test/e2e/app-dir/search-params-react-key/layout-params.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "children-page with app dir should show the content if you have a page named children", + "name": "app dir - search params keys should keep the React router instance the same when changing the search params", + "status": "passed" + } + ] + }, + { + "name": "app-dir static-generation-status", + "file": "test/e2e/app-dir/static-generation-status/index.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "app-dir static-generation-status should render the page using notFound with status 404", "status": "passed" }, { - "name": "children-page with pages dir should show the content if you have a page named children", + "name": "app-dir static-generation-status should render the page using redirect with status 307", + "status": "passed" + }, + { + "name": "app-dir static-generation-status should render the non existed route redirect with status 404", "status": "passed" } ] }, { - "name": "Conflict between app file and pages file", - "file": "test/e2e/conflicting-app-page-error/index.test.ts", + "name": "with babel", + "file": "test/e2e/app-dir/with-babel/with-babel.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "Conflict between app file and pages file should skip next deploy", + "name": "with babel with babel should skip next deploy", "status": "passed" } ] }, { - "name": "edge-render-getserversideprops", - "file": "test/e2e/edge-pages-support/index.test.ts", - "passed": 8, + "name": "Edge compiler module exports preference", + "file": "test/e2e/edge-compiler-module-exports-preference/index.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "edge-render-getserversideprops should have correct query for pages/api", - "status": "passed" - }, - { - "name": "edge-render-getserversideprops should have correct query for pages/api dynamic", - "status": "passed" - }, - { - "name": "edge-render-getserversideprops should have correct query/params on index", - "status": "passed" - }, - { - "name": "edge-render-getserversideprops should have correct query/params on /[id]", + "name": "Edge compiler module exports preference favors the browser export", "status": "passed" - }, + } + ] + }, + { + "name": "hello-world", + "file": "test/e2e/hello-world/hello-world.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ { - "name": "edge-render-getserversideprops should have correct query/params on rewrite", + "name": "hello-world should work using cheerio", "status": "passed" }, { - "name": "edge-render-getserversideprops should have correct query/params on dynamic rewrite", + "name": "hello-world should work using browser", "status": "passed" }, { - "name": "edge-render-getserversideprops should respond to _next/data for index correctly", + "name": "hello-world should work with html", "status": "passed" }, { - "name": "edge-render-getserversideprops should respond to _next/data for [id] correctly", + "name": "hello-world should work with fetch", "status": "passed" } ] }, { - "name": "getServerSideProps", - "file": "test/e2e/getserversideprops/test/index.test.ts", - "passed": 43, - "failed": 1, - "skipped": 2, + "name": "i18n: Event with stale state - static route previously was dynamic", + "file": "test/e2e/ignore-invalid-popstateevent/with-i18n.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", "testCases": [ { - "name": "getServerSideProps should navigate between pages successfully", - "status": "passed" - }, - { - "name": "getServerSideProps should work with early request ending", - "status": "passed" - }, - { - "name": "getServerSideProps should allow POST request for getServerSideProps page", - "status": "passed" - }, - { - "name": "getServerSideProps should render correctly when notFound is false (non-dynamic)", + "name": "i18n: Event with stale state - static route previously was dynamic Ignore event without query param", "status": "passed" }, { - "name": "getServerSideProps should render 404 correctly when notFound is returned (non-dynamic)", + "name": "i18n: Event with stale state - static route previously was dynamic Ignore event with query param", "status": "passed" }, { - "name": "getServerSideProps should render 404 correctly when notFound is returned client-transition (non-dynamic)", + "name": "i18n: Event with stale state - static route previously was dynamic Don't ignore event with different locale", "status": "passed" - }, + } + ] + }, + { + "name": "Middleware custom matchers", + "file": "test/e2e/middleware-custom-matchers/test/index.test.ts", + "passed": 7, + "failed": 0, + "skipped": 0, + "total": "10", + "testCases": [ { - "name": "getServerSideProps should render correctly when notFound is false (dynamic)", + "name": "Middleware custom matchers should match missing header correctly", "status": "passed" }, { - "name": "getServerSideProps should render 404 correctly when notFound is returned (dynamic)", + "name": "Middleware custom matchers should match missing query correctly", "status": "passed" }, { - "name": "getServerSideProps should render 404 correctly when notFound is returned client-transition (dynamic)", + "name": "Middleware custom matchers should match source path", "status": "passed" }, { - "name": "getServerSideProps should SSR normal page correctly", + "name": "Middleware custom matchers should match has header", "status": "passed" }, { - "name": "getServerSideProps should SSR getServerSideProps page correctly", + "name": "Middleware custom matchers should match has query", "status": "passed" }, { - "name": "getServerSideProps should handle throw ENOENT correctly", - "status": "failed", - "reason": "Server error pages return encoded data without content-encoding header if accept-encoding is gzip", - "link": "https://github.com/netlify/next-runtime-minimal/issues/387" - }, - { - "name": "getServerSideProps should have gssp in __NEXT_DATA__", + "name": "Middleware custom matchers should match has cookie", "status": "passed" }, { - "name": "getServerSideProps should not have gssp in __NEXT_DATA__ for non-GSSP page", + "name": "Middleware custom matchers should match has header value", "status": "passed" - }, + } + ] + }, + { + "name": "New Link Behavior with child", + "file": "test/e2e/new-link-behavior/child-a-tag-error.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "getServerSideProps should supply query values SSR", + "name": "New Link Behavior with child should throw error with child", "status": "passed" - }, + } + ] + }, + { + "name": "New Link Behavior", + "file": "test/e2e/new-link-behavior/typescript.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "getServerSideProps should supply params values for catchall correctly", + "name": "New Link Behavior should render link with ", "status": "passed" }, { - "name": "getServerSideProps should have original req.url for /_next/data request dynamic page", + "name": "New Link Behavior should apply ref on link", "status": "passed" - }, + } + ] + }, + { + "name": "nonce head manager", + "file": "test/e2e/nonce-head-manager/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "getServerSideProps should have original req.url for /_next/data request dynamic page with query", + "name": "nonce head manager should not re-execute the script when re-rendering", "status": "passed" }, { - "name": "getServerSideProps should have original req.url for /_next/data request", + "name": "nonce head manager should not re-execute the script when re-rendering with CSP header", "status": "passed" - }, + } + ] + }, + { + "name": "react-dnd-compile", + "file": "test/e2e/react-dnd-compile/react-dnd-compile.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "getServerSideProps should have original req.url for /_next/data request with query", + "name": "react-dnd-compile should work", "status": "passed" }, { - "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page", + "name": "react-dnd-compile should work on react-dnd import page", "status": "passed" - }, + } + ] + }, + { + "name": "yarn PnP", + "file": "test/e2e/yarn-pnp/test/with-mdx.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page rewrite direct", + "name": "yarn PnP should not run for next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "app-dir action size limit invalid config", + "file": "test/e2e/app-dir/actions/app-action-size-limit-invalid.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page rewrite direct with internal query", + "name": "app-dir action size limit invalid config should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "app-routes-subrequests", + "file": "test/e2e/app-dir/app-routes-subrequests/app-routes-subrequests.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page rewrite param", + "name": "app-routes-subrequests should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "async-component-preload", + "file": "test/e2e/app-dir/async-component-preload/async-component-preload.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ { - "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page with query", + "name": "async-component-preload should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "app dir - draft mode", + "file": "test/e2e/app-dir/draft-mode/draft-mode.test.ts", + "passed": 21, + "failed": 0, + "skipped": 0, + "total": "21", + "testCases": [ { - "name": "getServerSideProps should have correct req.url and query for direct visit", + "name": "app dir - draft mode in nodejs runtime should use initial rand when draft mode is disabled on /index", "status": "passed" }, { - "name": "getServerSideProps should return data correctly", + "name": "app dir - draft mode in nodejs runtime should use initial rand when draft mode is disabled on /with-cookies", "status": "passed" }, { - "name": "getServerSideProps should pass query for data request", + "name": "app dir - draft mode in nodejs runtime should not generate rand when draft mode disabled during next start", "status": "passed" }, { - "name": "getServerSideProps should return data correctly for dynamic page", + "name": "app dir - draft mode in nodejs runtime should not read other cookies when draft mode disabled during next start", "status": "passed" }, { - "name": "getServerSideProps should return data correctly when props is a promise", + "name": "app dir - draft mode in nodejs runtime should be disabled from api route handler", "status": "passed" }, { - "name": "getServerSideProps should navigate to a normal page and back", + "name": "app dir - draft mode in nodejs runtime should have set-cookie header on enable", "status": "passed" }, { - "name": "getServerSideProps should load a fast refresh page", + "name": "app dir - draft mode in nodejs runtime should have set-cookie header with redirect location", "status": "passed" }, { - "name": "getServerSideProps should provide correct query value for dynamic page", + "name": "app dir - draft mode in nodejs runtime should genenerate rand when draft mode enabled", "status": "passed" }, { - "name": "getServerSideProps should parse query values on mount correctly", + "name": "app dir - draft mode in nodejs runtime should read other cookies when draft mode enabled", "status": "passed" }, { - "name": "getServerSideProps should pass query for data request on navigation", + "name": "app dir - draft mode in nodejs runtime should be enabled from api route handler when draft mode enabled", "status": "passed" }, { - "name": "getServerSideProps should reload page on failed data request", + "name": "app dir - draft mode in nodejs runtime should not perform full page navigation on router.refresh()", "status": "passed" }, { - "name": "getServerSideProps should always call getServerSideProps without caching", + "name": "app dir - draft mode in edge runtime should use initial rand when draft mode is disabled on /with-edge/index", "status": "passed" }, { - "name": "getServerSideProps should not re-call getServerSideProps when updating query", + "name": "app dir - draft mode in edge runtime should use initial rand when draft mode is disabled on /with-edge/with-cookies", "status": "passed" }, { - "name": "getServerSideProps should dedupe server data requests", + "name": "app dir - draft mode in edge runtime should not read other cookies when draft mode disabled during next start", "status": "passed" }, { - "name": "getServerSideProps should not fetch data on mount", + "name": "app dir - draft mode in edge runtime should be disabled from api route handler", "status": "passed" }, { - "name": "getServerSideProps should not show error for invalid JSON returned from getServerSideProps", + "name": "app dir - draft mode in edge runtime should have set-cookie header on enable", "status": "passed" }, { - "name": "getServerSideProps should not show error for invalid JSON returned from getStaticProps on CST", + "name": "app dir - draft mode in edge runtime should have set-cookie header with redirect location", "status": "passed" }, { - "name": "getServerSideProps should not show error for accessing res after gssp returns", + "name": "app dir - draft mode in edge runtime should genenerate rand when draft mode enabled", "status": "passed" }, { - "name": "getServerSideProps should not warn for accessing res after gssp returns", + "name": "app dir - draft mode in edge runtime should read other cookies when draft mode enabled", "status": "passed" }, { - "name": "getServerSideProps should set default caching header", - "status": "skipped", - "reason": "Header whitespace mismatch" + "name": "app dir - draft mode in edge runtime should be enabled from api route handler when draft mode enabled", + "status": "passed" }, { - "name": "getServerSideProps should respect custom caching header", - "status": "skipped", - "reason": "Header whitespace mismatch" + "name": "app dir - draft mode in edge runtime should not perform full page navigation on router.refresh()", + "status": "passed" } ] }, { - "name": "i18n-ignore-redirect-source-locale", - "file": "test/e2e/i18n-ignore-redirect-source-locale/redirects.test.ts", - "passed": 16, + "name": "app dir - not found navigation", + "file": "test/e2e/app-dir/error-boundary-navigation/index.test.ts", + "passed": 7, "failed": 0, "skipped": 0, + "total": "7", "testCases": [ { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: to: sv", - "status": "passed" - }, - { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /en to: sv", - "status": "passed" - }, - { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /sv to: sv", - "status": "passed" - }, - { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /nl to: sv", - "status": "passed" - }, - { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: to: en", - "status": "passed" - }, - { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /en to: en", + "name": "app dir - not found navigation should allow navigation on not-found", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /sv to: en", + "name": "app dir - not found navigation should allow navigation on error", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /nl to: en", + "name": "app dir - not found navigation should allow navigation to other routes on route that was initially not-found", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: to: /", + "name": "app dir - not found navigation should allow navigation back to route that was initially not-found", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /en to: /", + "name": "app dir - not found navigation should allow navigating to a page calling notfound", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /sv to: /", + "name": "app dir - not found navigation should allow navigating to a non-existent page", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /nl to: /", + "name": "app dir - not found navigation should be able to navigate to other page from root not-found page", "status": "passed" - }, + } + ] + }, + { + "name": "hello-world", + "file": "test/e2e/app-dir/hello-world/hello-world.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from and to: ", + "name": "hello-world should work using cheerio", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from and to: /en", + "name": "hello-world should work using browser", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from and to: /sv", + "name": "hello-world should work with html", "status": "passed" }, { - "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from and to: /nl", + "name": "hello-world should work with fetch", "status": "passed" } ] }, { - "name": "instrumentation-hook-rsc", - "file": "test/e2e/instrumentation-hook-src/instrumentation-hook-src.test.ts", - "passed": 1, + "name": "navigation between pages and app dir", + "file": "test/e2e/app-dir/interoperability-with-pages/navigation.test.ts", + "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "instrumentation-hook-rsc instrumentation should skip next deploy", + "name": "navigation between pages and app dir It should be able to navigate app -> pages", + "status": "passed" + }, + { + "name": "navigation between pages and app dir It should be able to navigate pages -> app", "status": "passed" } ] }, { - "name": "link-with-api-rewrite", - "file": "test/e2e/link-with-api-rewrite/index.test.ts", + "name": "modularizeImports", + "file": "test/e2e/app-dir/modularizeimports/modularizeimports.test.ts", "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "link-with-api-rewrite should perform hard navigation for rewritten urls", + "name": "modularizeImports should work", "status": "passed" }, { - "name": "link-with-api-rewrite should perform hard navigation for direct urls", + "name": "modularizeImports should work with MDX", "status": "passed" } ] }, { - "name": "Middleware custom matchers basePath", - "file": "test/e2e/middleware-custom-matchers-basepath/test/index.test.ts", - "passed": 2, + "name": "app dir - not found with default 404 page", + "file": "test/e2e/app-dir/not-found-default/index.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "Middleware custom matchers basePath should not match", - "status": "passed" - }, - { - "name": "Middleware custom matchers basePath should not match", + "name": "app dir - not found with default 404 page should skip next deploy", "status": "passed" } ] }, { - "name": "Middleware custom matchers basePath", - "file": "test/e2e/middleware-dynamic-basepath-matcher/test/index.test.ts", + "name": "parallel-route-not-found", + "file": "test/e2e/app-dir/parallel-route-not-found-params/parallel-route-not-found-params.test.ts", "passed": 2, "failed": 0, "skipped": 0, + "total": "2", "testCases": [ { - "name": "Middleware custom matchers basePath should not match", + "name": "parallel-route-not-found should behave correctly without any errors", "status": "passed" }, { - "name": "Middleware custom matchers basePath should not match", + "name": "parallel-route-not-found should handle the not found case correctly without any errors", "status": "passed" } ] }, { - "name": "Middleware Runtime trailing slash", - "file": "test/e2e/middleware-trailing-slash/test/index.test.ts", - "passed": 22, - "failed": 1, + "name": "parallel-routes-catchall", + "file": "test/e2e/app-dir/parallel-routes-catchall/parallel-routes-catchall.test.ts", + "passed": 4, + "failed": 0, "skipped": 0, + "total": "4", "testCases": [ { - "name": "Middleware Runtime trailing slash with .html extension should work when requesting the page directly", + "name": "parallel-routes-catchall should match correctly when defining an explicit page & slot", "status": "passed" }, { - "name": "Middleware Runtime trailing slash with .html extension should work using browser", + "name": "parallel-routes-catchall should match correctly when defining an explicit page but no slot", "status": "passed" }, { - "name": "Middleware Runtime trailing slash with .html extension should work when navigating", + "name": "parallel-routes-catchall should match correctly when defining an explicit slot but no page", "status": "passed" }, { - "name": "Middleware Runtime trailing slash without .html extension should work when requesting the page directly", + "name": "parallel-routes-catchall should match both the catch-all page & slot", "status": "passed" - }, + } + ] + }, + { + "name": "app-dir revalidate-dynamic", + "file": "test/e2e/app-dir/revalidate-dynamic/revalidate-dynamic.test.ts", + "passed": 0, + "failed": 0, + "skipped": 2, + "total": "2", + "testCases": [ { - "name": "Middleware Runtime trailing slash without .html extension should work using browser", - "status": "passed" + "name": "app-dir revalidate-dynamic should revalidate the data with /api/revalidate-path", + "status": "skipped", + "reason": "Race condition when testing revalidation" }, { - "name": "Middleware Runtime trailing slash without .html extension should work when navigating", - "status": "passed" - }, + "name": "app-dir revalidate-dynamic should revalidate the data with /api/revalidate-tag", + "status": "skipped", + "reason": "Race condition when testing revalidation" + } + ] + }, + { + "name": "app dir - rsc basics", + "file": "test/e2e/app-dir/rsc-basic/rsc-basic.test.ts", + "passed": 33, + "failed": 0, + "skipped": 2, + "total": "36", + "testCases": [ { - "name": "Middleware Runtime trailing slash should have init header for NextResponse.redirect", + "name": "app dir - rsc basics should correctly render page returning null", "status": "passed" }, { - "name": "Middleware Runtime trailing slash should have correct query values for rewrite to ssg page", + "name": "app dir - rsc basics should correctly render component returning null", "status": "passed" }, { - "name": "Middleware Runtime trailing slash should have correct dynamic route params on client-transition to dynamic route", + "name": "app dir - rsc basics should correctly render layout returning null", "status": "passed" }, { - "name": "Middleware Runtime trailing slash should have correct dynamic route params for middleware rewrite to dynamic route", + "name": "app dir - rsc basics should correctly render page returning undefined", "status": "passed" }, { - "name": "Middleware Runtime trailing slash should have correct route params for chained rewrite from middleware to config rewrite", + "name": "app dir - rsc basics should correctly render component returning undefined", "status": "passed" }, { - "name": "Middleware Runtime trailing slash should have correct route params for rewrite from config dynamic route", + "name": "app dir - rsc basics should correctly render layout returning undefined", "status": "passed" }, { - "name": "Middleware Runtime trailing slash should have correct route params for rewrite from config non-dynamic route", + "name": "app dir - rsc basics should render server components correctly", "status": "passed" }, { - "name": "Middleware Runtime trailing slash should redirect the same for direct visit and client-transition", + "name": "app dir - rsc basics should reuse the inline flight response without sending extra requests", "status": "passed" }, { - "name": "Middleware Runtime trailing slash should rewrite the same for direct visit and client-transition", + "name": "app dir - rsc basics should support multi-level server component imports", "status": "passed" }, { - "name": "Middleware Runtime trailing slash should rewrite correctly for non-SSG/SSP page", + "name": "app dir - rsc basics should create client reference successfully for all file conventions", "status": "passed" }, { - "name": "Middleware Runtime trailing slash should respond with 400 on decode failure", + "name": "app dir - rsc basics should be able to navigate between rsc routes", "status": "passed" }, { - "name": "Middleware Runtime trailing slash should validate & parse request url from any route", + "name": "app dir - rsc basics should handle streaming server components correctly", "status": "passed" }, { - "name": "Middleware Runtime trailing slash should trigger middleware for data requests", + "name": "app dir - rsc basics should track client components in dynamic imports", "status": "passed" }, { - "name": "Middleware Runtime trailing slash should normalize data requests into page requests", + "name": "app dir - rsc basics should support next/link in server components", "status": "passed" }, { - "name": "Middleware Runtime trailing slash should keep non data requests in their original shape", - "status": "failed", - "reason": "Middleware should not add trailing slashes to non-data requests in static dir", - "link": "https://github.com/netlify/next-runtime-minimal/issues/385" - }, - { - "name": "Middleware Runtime trailing slash should add a rewrite header on data requests for rewrites", + "name": "app dir - rsc basics should link correctly with next/link without mpa navigation to the page", "status": "passed" }, { - "name": "Middleware Runtime trailing slash allows shallow linking with middleware", - "status": "passed" - } - ] - }, - { - "name": "New Link Behavior", - "file": "test/e2e/new-link-behavior/index.test.ts", - "passed": 7, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "New Link Behavior should render link with ", + "name": "app dir - rsc basics should escape streaming data correctly", "status": "passed" }, { - "name": "New Link Behavior should navigate to /about", + "name": "app dir - rsc basics should render built-in 404 page for missing route if pagesDir is not presented", "status": "passed" }, { - "name": "New Link Behavior should handle onclick", + "name": "app dir - rsc basics should suspense next/legacy/image in server components", "status": "passed" }, { - "name": "New Link Behavior should handle preventdefault", + "name": "app dir - rsc basics should suspense next/image in server components", "status": "passed" }, { - "name": "New Link Behavior should render link with id", + "name": "app dir - rsc basics should handle various kinds of exports correctly", "status": "passed" }, { - "name": "New Link Behavior should render link with classname", + "name": "app dir - rsc basics should support native modules in server component", "status": "passed" }, { - "name": "New Link Behavior should render link with multiple children", - "status": "passed" - } - ] - }, - { - "name": "next/font", - "file": "test/e2e/next-font/index.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "next/font app should skip next deploy for now", + "name": "app dir - rsc basics should resolve different kinds of components correctly", "status": "passed" }, { - "name": "next/font app-old should skip next deploy for now", - "status": "passed" - } - ] - }, - { - "name": "next-image-forward-ref", - "file": "test/e2e/next-image-forward-ref/index.test.ts", - "passed": 1, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "next-image-forward-ref allows framer-motion to animate opacity", - "status": "passed" - } - ] - }, - { - "name": "nonce head manager", - "file": "test/e2e/nonce-head-manager/index.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ - { - "name": "nonce head manager should not re-execute the script when re-rendering", + "name": "app dir - rsc basics should render initial styles of css-in-js in nodejs SSR correctly", "status": "passed" }, { - "name": "nonce head manager should not re-execute the script when re-rendering with CSP header", + "name": "app dir - rsc basics should render initial styles of css-in-js in edge SSR correctly", "status": "passed" - } - ] - }, - { - "name": "opentelemetry", - "file": "test/e2e/opentelemetry/opentelemetry.test.ts", - "passed": 2, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "opentelemetry should skip next deploy", + "name": "app dir - rsc basics should render css-in-js suspense boundary correctly", "status": "passed" }, { - "name": "opentelemetry with disabled fetch tracing should skip next deploy", + "name": "app dir - rsc basics should stick to the url without trailing /page suffix", "status": "passed" - } - ] - }, - { - "name": "Optimized loading", - "file": "test/e2e/optimized-loading/test/index.test.ts", - "passed": 6, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Optimized loading page / should render the page /", + "name": "app dir - rsc basics should support streaming for flight response", "status": "passed" }, { - "name": "Optimized loading page / should not have JS preload links", + "name": "app dir - rsc basics should support partial hydration with inlined server data", "status": "passed" }, { - "name": "Optimized loading page / should load scripts with defer in head", + "name": "app dir - rsc basics should not apply rsc syntax checks in pages/api", "status": "passed" }, { - "name": "Optimized loading page /page1 should render the page /page1", + "name": "app dir - rsc basics should not use bundled react for pages with app", "status": "passed" }, { - "name": "Optimized loading page /page1 should not have JS preload links", + "name": "app dir - rsc basics should use canary react for app", "status": "passed" }, { - "name": "Optimized loading page /page1 should load scripts with defer in head", + "name": "app dir - rsc basics should be able to call legacy react-dom/server APIs in client components", "status": "passed" - } - ] - }, - { - "name": "Prerender crawler handling", - "file": "test/e2e/prerender-crawler.test.ts", - "passed": 3, - "failed": 0, - "skipped": 0, - "testCases": [ + }, { - "name": "Prerender crawler handling should return prerendered page for correctly", + "name": "app dir - rsc basics should support webpack loader rules", "status": "passed" }, { - "name": "Prerender crawler handling should return fallback for non-crawler correctly", - "status": "passed" + "name": "app dir - rsc basics react@experimental should opt into the react@experimental when enabling ppr", + "status": "skipped", + "reason": "Tries to patch deployed files" }, { - "name": "Prerender crawler handling should block for crawler correctly", - "status": "passed" + "name": "app dir - rsc basics react@experimental should opt into the react@experimental when enabling taint", + "status": "skipped", + "reason": "Tries to patch deployed files" } ] }, { - "name": "react-dnd-compile", - "file": "test/e2e/react-dnd-compile/react-dnd-compile.test.ts", - "passed": 2, + "name": "Ordering with styled-jsx", + "file": "test/e2e/app-dir/scss/with-styled-jsx/with-styled-jsx.test.ts", + "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "react-dnd-compile should work", - "status": "passed" - }, - { - "name": "react-dnd-compile should work on react-dnd import page", + "name": "Ordering with styled-jsx should have the correct color (css ordering)", "status": "passed" } ] }, { - "name": "skip-trailing-slash-redirect", - "file": "test/e2e/skip-trailing-slash-redirect/index.test.ts", - "passed": 25, + "name": "use-params", + "file": "test/e2e/app-dir/use-params/use-params.test.ts", + "passed": 7, "failed": 0, - "skipped": 5, + "skipped": 0, + "total": "7", "testCases": [ { - "name": "skip-trailing-slash-redirect should parse locale info for data request correctly", - "status": "passed" - }, - { - "name": "skip-trailing-slash-redirect should be able to redirect locale casing $1", - "status": "passed" - }, - { - "name": "skip-trailing-slash-redirect should be able to redirect locale casing $1", - "status": "passed" - }, - { - "name": "skip-trailing-slash-redirect should handle external rewrite correctly /docs/first", - "status": "passed" - }, - { - "name": "skip-trailing-slash-redirect should handle external rewrite correctly /docs-auto-static/first", + "name": "use-params should work for single dynamic param", "status": "passed" }, { - "name": "skip-trailing-slash-redirect should handle external rewrite correctly /docs-ssr/first", + "name": "use-params should work for nested dynamic params", "status": "passed" }, { - "name": "skip-trailing-slash-redirect should allow rewriting invalid buildId correctly", + "name": "use-params should work for catch all params", "status": "passed" }, { - "name": "skip-trailing-slash-redirect should provide original _next/data URL with skipMiddlewareUrlNormalize", + "name": "use-params should work for single dynamic param client navigating", "status": "passed" }, { - "name": "skip-trailing-slash-redirect should allow response body from middleware with flag", + "name": "use-params should work for nested dynamic params client navigating", "status": "passed" }, { - "name": "skip-trailing-slash-redirect should correct skip URL normalizing in middleware", + "name": "use-params should work on pages router", "status": "passed" }, { - "name": "skip-trailing-slash-redirect should apply config redirect correctly", + "name": "use-params shouldn't rerender host component when prefetching", "status": "passed" - }, + } + ] + }, + { + "name": "default browserslist target", + "file": "test/e2e/browserslist/default-target.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "next.config.js schema validating - defaultConfig", + "file": "test/e2e/config-schema-check/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "skip-trailing-slash-redirect should apply config rewrites correctly", + "name": "next.config.js schema validating - defaultConfig should skip next deploy", "status": "passed" }, { - "name": "skip-trailing-slash-redirect should not apply trailing slash on load on client", + "name": "next.config.js schema validating - invalid config should skip next deploy", "status": "passed" - }, + } + ] + }, + { + "name": "Dynamic Route Interpolation", + "file": "test/e2e/dynamic-route-interpolation/index.test.ts", + "passed": 7, + "failed": 0, + "skipped": 0, + "total": "7", + "testCases": [ { - "name": "skip-trailing-slash-redirect pages dir should not apply trailing slash redirect (with slash)", + "name": "Dynamic Route Interpolation should work", "status": "passed" }, { - "name": "skip-trailing-slash-redirect pages dir should not apply trailing slash redirect (without slash)", + "name": "Dynamic Route Interpolation should work with parameter itself", "status": "passed" }, { - "name": "skip-trailing-slash-redirect pages dir should preserve original trailing slashes to links on client", + "name": "Dynamic Route Interpolation should work with brackets", "status": "passed" }, { - "name": "skip-trailing-slash-redirect pages dir should respond to index correctly", + "name": "Dynamic Route Interpolation should work with parameter itself in API routes", "status": "passed" }, { - "name": "skip-trailing-slash-redirect pages dir should respond to dynamic route correctly", + "name": "Dynamic Route Interpolation should work with brackets in API routes", "status": "passed" }, { - "name": "skip-trailing-slash-redirect pages dir should navigate client side correctly", + "name": "Dynamic Route Interpolation should bust data cache", "status": "passed" }, { - "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should not apply trailing slash redirect (with slash)", + "name": "Dynamic Route Interpolation should bust data cache with symbol", "status": "passed" - }, + } + ] + }, + { + "name": "i18n API support", + "file": "test/e2e/i18n-api-support/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ { - "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should not apply trailing slash redirect (without slash)", + "name": "i18n API support should respond to normal API request", "status": "passed" }, { - "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should preserve original trailing slashes to links on client", + "name": "i18n API support should respond to normal dynamic API request", "status": "passed" - }, + } + ] + }, + { + "name": "Instrumentation Hook", + "file": "test/e2e/instrumentation-hook/instrumentation-hook.test.ts", + "passed": 8, + "failed": 0, + "skipped": 0, + "total": "8", + "testCases": [ { - "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should respond to index correctly", + "name": "Instrumentation Hook with-middleware should skip next deploy", "status": "passed" }, { - "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should respond to dynamic route correctly", + "name": "Instrumentation Hook with-edge-api should skip next deploy", "status": "passed" }, { - "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should navigate client side correctly", + "name": "Instrumentation Hook with-edge-page should skip next deploy", "status": "passed" }, { - "name": "skip-trailing-slash-redirect should merge cookies from middleware and API routes correctly", - "status": "skipped", - "reason": "Header whitespace mismatch" + "name": "Instrumentation Hook with-node-api should skip next deploy", + "status": "passed" }, { - "name": "skip-trailing-slash-redirect should merge cookies from middleware and edge API routes correctly", - "status": "skipped", - "reason": "Header whitespace mismatch" + "name": "Instrumentation Hook with-node-page should skip next deploy", + "status": "passed" }, { - "name": "skip-trailing-slash-redirect should handle external rewrite correctly /chained-rewrite-ssr", - "status": "skipped", - "reason": "Header whitespace mismatch" + "name": "Instrumentation Hook with-async-node-page should skip next deploy", + "status": "passed" }, { - "name": "skip-trailing-slash-redirect should handle external rewrite correctly /chained-rewrite-static", - "status": "skipped", - "reason": "Header whitespace mismatch" + "name": "Instrumentation Hook with-async-edge-page should skip next deploy", + "status": "passed" }, { - "name": "skip-trailing-slash-redirect should handle external rewrite correctly /chained-rewrite-ssg", - "status": "skipped", - "reason": "Header whitespace mismatch" + "name": "Instrumentation Hook general should skip next deploy", + "status": "passed" } ] }, { - "name": "testmode", - "file": "test/e2e/testmode/testmode.test.ts", + "name": "next/font/google with proxy", + "file": "test/e2e/next-font/with-proxy.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "testmode should skip next deploy", + "name": "next/font/google with proxy should skip next deploy", "status": "passed" } ] }, { - "name": "tsconfig module: preserve", - "file": "test/e2e/tsconfig-module-preserve/index.test.ts", - "passed": 0, - "failed": 1, + "name": "next/head", + "file": "test/e2e/next-head/index.test.ts", + "passed": 5, + "failed": 0, "skipped": 0, + "total": "5", "testCases": [ { - "name": "tsconfig module: preserve allows you to skip moduleResolution, esModuleInterop and resolveJsonModule when using \"module: preserve\"", - "status": "failed" - } - ] - }, - { - "name": "tsconfig module: preserve", - "file": "test/e2e/tsconfig-module-preserve/index.test.ts", - "passed": 0, - "failed": 1, - "skipped": 0, - "testCases": [ + "name": "next/head should place charset element at the top of ", + "status": "passed" + }, { - "name": "tsconfig module: preserve allows you to skip moduleResolution, esModuleInterop and resolveJsonModule when using \"module: preserve\"", - "status": "failed" + "name": "next/head should have correct head tags in initial document", + "status": "passed" + }, + { + "name": "next/head should have correct head tags from a fragment", + "status": "passed" + }, + { + "name": "next/head should have correct head tags after hydration", + "status": "passed" + }, + { + "name": "next/head should have current head tags from a _document getInitialProps", + "status": "passed" } ] }, { - "name": "useSelectedLayoutSegment(s) in Pages Router", - "file": "test/e2e/useselectedlayoutsegment-s-in-pages-router/useselectedlayoutsegment-s-in-pages-router.test.ts", - "passed": 1, + "name": "prerender native module", + "file": "test/e2e/prerender-native-module.test.ts", + "passed": 3, "failed": 0, "skipped": 0, + "total": "3", "testCases": [ { - "name": "useSelectedLayoutSegment(s) in Pages Router Should render with `useSelectedLayoutSegment(s) hooks", + "name": "prerender native module should render index correctly", + "status": "passed" + }, + { + "name": "prerender native module should render /blog/first correctly", + "status": "passed" + }, + { + "name": "prerender native module should render /blog/second correctly", "status": "passed" } ] }, { - "name": "yarn PnP", - "file": "test/e2e/yarn-pnp/test/with-next-sass.test.ts", + "name": "styled-jsx", + "file": "test/e2e/styled-jsx/index.test.ts", "passed": 1, "failed": 0, "skipped": 0, + "total": "1", "testCases": [ { - "name": "yarn PnP should not run for next deploy", + "name": "styled-jsx should skip next deploy", "status": "passed" } ] @@ -10116,6 +9206,16 @@ "reason": "npm install doesn't work in this repo", "skipped": true }, + { + "file": "test/e2e/next-phase/index.test.ts", + "reason": "Uses CLI output", + "skipped": true + }, + { + "file": "test/e2e/tsconfig-module-preserve/index.test.ts", + "reason": "Uses CLI output", + "skipped": true + }, { "file": "test/e2e/swc-warnings/index.test.ts", "reason": "Uses CLI output", @@ -10187,88 +9287,13 @@ "skipped": true }, { - "file": "test/e2e/app-dir/app-static/app-static.test.ts", - "reason": "Uses CLI output", - "skipped": true - }, - { - "file": "test/e2e/app-dir/parallel-routes-and-interception/parallel-routes-and-interception.test.ts", - "reason": "Tries to patch deployed files", - "skipped": true - }, - { - "file": "test/e2e/app-dir/rsc-basic/rsc-basic.test.ts", - "reason": "Tries to patch deployed files", - "skipped": true - }, - { - "file": "test/e2e/skip-trailing-slash-redirect/index.test.ts", - "reason": "Header whitespace mismatch", - "skipped": true - }, - { - "file": "test/e2e/module-layer/index.test.ts", + "file": "test/e2e/app-dir/next-after-app/index.test.ts", "reason": "Tries to patch deployed files", "skipped": true }, { - "file": "test/e2e/getserversideprops/test/index.test.ts", - "reason": "Header whitespace mismatch", - "skipped": true - }, - { - "file": "test/e2e/app-dir/metadata-dynamic-routes/index.test.ts", - "reason": "Header whitespace mismatch", - "skipped": true - }, - { - "file": "test/e2e/app-dir/metadata/metadata.test.ts", - "reason": "Hard-coded Vercel URL", - "skipped": true - }, - { - "file": "test/e2e/basepath.test.ts", - "reason": "Hard-coded Vercel error message", - "skipped": true - }, - { - "file": "test/e2e/app-dir/app/index.test.ts", - "reason": "Whitespace mismatch", - "skipped": true - }, - { - "file": "test/e2e/app-dir/conflicting-page-segments/conflicting-page-segments.test.ts", - "reason": "Uses CLI output", - "skipped": true - }, - { - "file": "test/e2e/app-dir/actions-navigation/index.test.ts", - "reason": "Uses CLI output", - "skipped": true - }, - { - "file": "test/e2e/middleware-general/test/index.test.ts", - "reason": "Uses CLI output", - "skipped": true - }, - { - "file": "test/e2e/prerender.test.ts", - "reason": "Header whitespace mismatch", - "skipped": true - }, - { - "file": "test/e2e/app-dir/app-routes/app-custom-route-base-path.test.ts", - "reason": "Uses CLI output", - "skipped": true - }, - { - "file": "test/e2e/app-dir/app-routes/app-custom-routes.test.ts", - "reason": "Uses CLI output", - "skipped": true - }, - { - "file": "test/e2e/app-dir/actions/app-action.test.ts", - "reason": "Uses CLI output", + "file": "test/e2e/edge-async-local-storage/index.test.ts", + "reason": "Test is incompatible with serverless because it relies on shared state between requests", "skipped": true } ] diff --git a/e2e-report/public/arrow-up-right-from-square-solid.svg b/e2e-report/public/arrow-up-right-from-square-solid.svg new file mode 100644 index 0000000000..894e9b42ff --- /dev/null +++ b/e2e-report/public/arrow-up-right-from-square-solid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/edge-runtime/middleware.ts b/edge-runtime/middleware.ts index 3efb528794..f0170b912d 100644 --- a/edge-runtime/middleware.ts +++ b/edge-runtime/middleware.ts @@ -1,7 +1,7 @@ import type { Context } from '@netlify/edge-functions' -import matchers from './matchers.json' assert { type: 'json' } -import nextConfig from './next.config.json' assert { type: 'json' } +import matchers from './matchers.json' with { type: 'json' } +import nextConfig from './next.config.json' with { type: 'json' } import { InternalHeaders } from './lib/headers.ts' import { logger, LogLevel } from './lib/logging.ts' diff --git a/report/test-results.json b/report/test-results.json new file mode 100644 index 0000000000..066ae4148d --- /dev/null +++ b/report/test-results.json @@ -0,0 +1,9258 @@ +{ + "failed": 22, + "skipped": 47, + "passed": 1519, + "total": 1588, + "passRate": "98.57%", + "testDate": "2024-06-03", + "nextVersion": "v14.2.3", + "results": [ + { + "name": "app-dir edge runtime config", + "file": "test/e2e/app-dir-legacy-edge-runtime-config/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir edge runtime config should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - basepath", + "file": "test/e2e/app-dir/app-basepath/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - basepath should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-dir - custom-cache-handler - cjs", + "file": "test/e2e/app-dir/app-custom-cache-handler/index.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "app-dir - custom-cache-handler - cjs should skip next deploy", + "status": "passed" + }, + { + "name": "app-dir - custom-cache-handler - cjs-default-export should skip next deploy", + "status": "passed" + }, + { + "name": "app-dir - custom-cache-handler - esm should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-prefetch-false", + "file": "test/e2e/app-dir/app-prefetch-false/app-prefetch-false.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-prefetch-false should avoid double-fetching when optimistic navigation fails", + "status": "passed" + } + ] + }, + { + "name": "app-custom-routes", + "file": "test/e2e/app-dir/app-routes/app-custom-routes.test.ts", + "passed": 62, + "failed": 0, + "skipped": 2, + "total": "65", + "testCases": [ + { + "name": "app-custom-routes works with api prefix correctly statically generates correctly with no dynamic usage", + "status": "passed" + }, + { + "name": "app-custom-routes works with api prefix correctly does not statically generate with dynamic usage", + "status": "passed" + }, + { + "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/first/data.json", + "status": "passed" + }, + { + "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/second/data.json", + "status": "passed" + }, + { + "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/three/data.json", + "status": "passed" + }, + { + "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/first/data.json", + "status": "passed" + }, + { + "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/second/data.json", + "status": "passed" + }, + { + "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/three/data.json", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a GET request responds correctly on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a GET request responds correctly on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a POST request responds correctly on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a POST request responds correctly on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a PUT request responds correctly on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a PUT request responds correctly on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a DELETE request responds correctly on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a DELETE request responds correctly on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a PATCH request responds correctly on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a PATCH request responds correctly on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a GET request aborts without error on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a GET request aborts without error on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a POST request aborts without error on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a POST request aborts without error on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a PUT request aborts without error on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a PUT request aborts without error on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a DELETE request aborts without error on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a DELETE request aborts without error on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a PATCH request aborts without error on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a PATCH request aborts without error on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response route groups routes to the correct handler", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response request can read query parameters", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response request can read query parameters (edge)", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response response supports the NextResponse.redirect() helper", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response response supports the NextResponse.json() helper", + "status": "passed" + }, + { + "name": "app-custom-routes body can handle handle a streaming request and streaming response (edge)", + "status": "passed" + }, + { + "name": "app-custom-routes body can read a JSON encoded body", + "status": "passed" + }, + { + "name": "app-custom-routes body can read a JSON encoded body (edge)", + "status": "passed" + }, + { + "name": "app-custom-routes body can read a JSON encoded body for DELETE requests", + "status": "passed" + }, + { + "name": "app-custom-routes body can read a JSON encoded body for OPTIONS requests", + "status": "passed" + }, + { + "name": "app-custom-routes body can read a streamed JSON encoded body (edge)", + "status": "passed" + }, + { + "name": "app-custom-routes body can read the text body", + "status": "passed" + }, + { + "name": "app-custom-routes body can read the text body (edge)", + "status": "passed" + }, + { + "name": "app-custom-routes context provides params to routes with dynamic parameters", + "status": "passed" + }, + { + "name": "app-custom-routes context provides params to routes with catch-all routes", + "status": "passed" + }, + { + "name": "app-custom-routes context does not provide params to routes without dynamic parameters", + "status": "passed" + }, + { + "name": "app-custom-routes hooks headers gets the correct values", + "status": "passed" + }, + { + "name": "app-custom-routes hooks cookies gets the correct values", + "status": "passed" + }, + { + "name": "app-custom-routes hooks req.cookies gets the correct values", + "status": "passed" + }, + { + "name": "app-custom-routes hooks cookies().has() gets the correct values", + "status": "passed" + }, + { + "name": "app-custom-routes hooks redirect can respond correctly", + "status": "passed" + }, + { + "name": "app-custom-routes hooks permanentRedirect can respond correctly", + "status": "passed" + }, + { + "name": "app-custom-routes hooks notFound can respond correctly in nodejs", + "status": "passed" + }, + { + "name": "app-custom-routes hooks notFound can respond correctly in edge", + "status": "passed" + }, + { + "name": "app-custom-routes error conditions responds with 405 (Method Not Allowed) when method is not implemented", + "status": "passed" + }, + { + "name": "app-custom-routes error conditions responds with 500 (Internal Server Error) when the handler throws an error", + "status": "passed" + }, + { + "name": "app-custom-routes error conditions responds with 500 (Internal Server Error) when the handler calls NextResponse.next()", + "status": "passed" + }, + { + "name": "app-custom-routes automatic implementations implements HEAD on routes with GET already implemented", + "status": "passed" + }, + { + "name": "app-custom-routes automatic implementations implements OPTIONS on routes", + "status": "passed" + }, + { + "name": "app-custom-routes edge functions returns response using edge runtime", + "status": "passed" + }, + { + "name": "app-custom-routes edge functions returns a response when headers are accessed", + "status": "passed" + }, + { + "name": "app-custom-routes dynamic = \"force-static\" strips search, headers, and domain from request", + "status": "passed" + }, + { + "name": "app-custom-routes customized metadata routes should work if conflict with metadata routes convention", + "status": "passed" + }, + { + "name": "app-custom-routes no bundle error should not print bundling warning about React", + "status": "passed" + }, + { + "name": "app-custom-routes no response returned should print an error when no response is returned", + "status": "skipped", + "reason": "Uses CLI output" + }, + { + "name": "app-custom-routes error conditions responds with 400 (Bad Request) when the requested method is not a valid HTTP method", + "status": "skipped", + "reason": "Uses CLI output" + } + ] + }, + { + "name": "app dir - not found navigation", + "file": "test/e2e/app-dir/error-boundary-navigation/override-node-env.test.ts", + "passed": 14, + "failed": 0, + "skipped": 0, + "total": "14", + "testCases": [ + { + "name": "app dir - not found navigation should allow navigation on not-found", + "status": "passed" + }, + { + "name": "app dir - not found navigation should allow navigation on error", + "status": "passed" + }, + { + "name": "app dir - not found navigation should allow navigation to other routes on route that was initially not-found", + "status": "passed" + }, + { + "name": "app dir - not found navigation should allow navigation back to route that was initially not-found", + "status": "passed" + }, + { + "name": "app dir - not found navigation should allow navigating to a page calling notfound", + "status": "passed" + }, + { + "name": "app dir - not found navigation should allow navigating to a non-existent page", + "status": "passed" + }, + { + "name": "app dir - not found navigation should be able to navigate to other page from root not-found page", + "status": "passed" + }, + { + "name": "app dir - not found navigation - with overridden node env should allow navigation on not-found", + "status": "passed" + }, + { + "name": "app dir - not found navigation - with overridden node env should allow navigation on error", + "status": "passed" + }, + { + "name": "app dir - not found navigation - with overridden node env should allow navigation to other routes on route that was initially not-found", + "status": "passed" + }, + { + "name": "app dir - not found navigation - with overridden node env should allow navigation back to route that was initially not-found", + "status": "passed" + }, + { + "name": "app dir - not found navigation - with overridden node env should allow navigating to a page calling notfound", + "status": "passed" + }, + { + "name": "app dir - not found navigation - with overridden node env should allow navigating to a non-existent page", + "status": "passed" + }, + { + "name": "app dir - not found navigation - with overridden node env should be able to navigate to other page from root not-found page", + "status": "passed" + } + ] + }, + { + "name": "app dir - metadata dynamic routes suspense", + "file": "test/e2e/app-dir/metadata-suspense/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - metadata dynamic routes suspense should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - metadata missing metadataBase", + "file": "test/e2e/app-dir/metadata-warnings/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - metadata missing metadataBase should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - navigation", + "file": "test/e2e/app-dir/navigation/navigation.test.ts", + "passed": 48, + "failed": 0, + "skipped": 0, + "total": "48", + "testCases": [ + { + "name": "app dir - navigation query string should set query correctly", + "status": "passed" + }, + { + "name": "app dir - navigation query string should handle unicode search params", + "status": "passed" + }, + { + "name": "app dir - navigation query string should not reset shallow url updates on prefetch", + "status": "passed" + }, + { + "name": "app dir - navigation query string useParams identity between renders should be stable in app", + "status": "passed" + }, + { + "name": "app dir - navigation query string useParams identity between renders should be stable in pages", + "status": "passed" + }, + { + "name": "app dir - navigation hash should scroll to the specified hash", + "status": "passed" + }, + { + "name": "app dir - navigation hash should not scroll to hash when scroll={false} is set", + "status": "passed" + }, + { + "name": "app dir - navigation hash-with-scroll-offset should scroll to the specified hash", + "status": "passed" + }, + { + "name": "app dir - navigation hash-link-back-to-same-page should scroll to the specified hash", + "status": "passed" + }, + { + "name": "app dir - navigation relative hashes and queries should work with a hash-only href", + "status": "passed" + }, + { + "name": "app dir - navigation relative hashes and queries should work with a hash-only `router.push(...)`", + "status": "passed" + }, + { + "name": "app dir - navigation relative hashes and queries should work with a query-only href", + "status": "passed" + }, + { + "name": "app dir - navigation relative hashes and queries should work with both relative hashes and queries", + "status": "passed" + }, + { + "name": "app dir - navigation not-found should trigger not-found in a server component", + "status": "passed" + }, + { + "name": "app dir - navigation not-found should trigger not-found in a client component", + "status": "passed" + }, + { + "name": "app dir - navigation not-found should trigger not-found client-side", + "status": "passed" + }, + { + "name": "app dir - navigation not-found should trigger not-found while streaming", + "status": "passed" + }, + { + "name": "app dir - navigation redirect components should redirect in a server component", + "status": "passed" + }, + { + "name": "app dir - navigation redirect components should redirect in a client component", + "status": "passed" + }, + { + "name": "app dir - navigation redirect components should redirect client-side", + "status": "passed" + }, + { + "name": "app dir - navigation redirect components should redirect to external url", + "status": "passed" + }, + { + "name": "app dir - navigation redirect components should redirect to external url, initiating only once", + "status": "passed" + }, + { + "name": "app dir - navigation redirect components should only trigger the redirect once (/redirect/servercomponent)", + "status": "passed" + }, + { + "name": "app dir - navigation redirect components should only trigger the redirect once (redirect/redirect-with-loading)", + "status": "passed" + }, + { + "name": "app dir - navigation redirect next.config.js redirects should redirect from next.config.js", + "status": "passed" + }, + { + "name": "app dir - navigation redirect next.config.js redirects should redirect from next.config.js with link navigation", + "status": "passed" + }, + { + "name": "app dir - navigation redirect middleware redirects should redirect from middleware", + "status": "passed" + }, + { + "name": "app dir - navigation redirect middleware redirects should redirect from middleware with link navigation", + "status": "passed" + }, + { + "name": "app dir - navigation redirect status code should respond with 307 status code in server component", + "status": "passed" + }, + { + "name": "app dir - navigation redirect status code should respond with 307 status code in client component", + "status": "passed" + }, + { + "name": "app dir - navigation redirect status code should respond with 308 status code if permanent flag is set", + "status": "passed" + }, + { + "name": "app dir - navigation external push should push external url without affecting hooks", + "status": "passed" + }, + { + "name": "app dir - navigation navigation between pages and app should not contain _rsc query while navigating from app to pages", + "status": "passed" + }, + { + "name": "app dir - navigation navigation between pages and app should not contain _rsc query while navigating from pages to app", + "status": "passed" + }, + { + "name": "app dir - navigation navigation between pages and app should not omit the hash while navigating from app to pages", + "status": "passed" + }, + { + "name": "app dir - navigation navigation between pages and app should not continously initiate a mpa navigation to the same URL when router state changes", + "status": "passed" + }, + { + "name": "app dir - navigation nested navigation should navigate to nested pages", + "status": "passed" + }, + { + "name": "app dir - navigation nested navigation should load chunks correctly without double encoding of url", + "status": "passed" + }, + { + "name": "app dir - navigation SEO should emit noindex meta tag for not found page when streaming", + "status": "passed" + }, + { + "name": "app dir - navigation SEO should emit refresh meta tag for redirect page when streaming", + "status": "passed" + }, + { + "name": "app dir - navigation SEO should emit refresh meta tag (permanent) for redirect page when streaming", + "status": "passed" + }, + { + "name": "app dir - navigation SEO should contain default meta tags in error page", + "status": "passed" + }, + { + "name": "app dir - navigation SEO should not log 404 errors in ipc server", + "status": "passed" + }, + { + "name": "app dir - navigation navigations when attaching a Proxy to `window.Promise` should navigate without issue", + "status": "passed" + }, + { + "name": "app dir - navigation scroll restoration should restore original scroll position when navigating back", + "status": "passed" + }, + { + "name": "app dir - navigation navigating to a page with async metadata should render the final state of the page with correct metadata", + "status": "passed" + }, + { + "name": "app dir - navigation navigating to dynamic params & changing the casing should load the page correctly", + "status": "passed" + }, + { + "name": "app dir - navigation browser back to a revalidated page should load the page", + "status": "passed" + } + ] + }, + { + "name": "SCSS Support loader handling External imports", + "file": "test/e2e/app-dir/scss/external-url/external-url.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "SCSS Support loader handling External imports should include font on the page", + "status": "passed" + } + ] + }, + { + "name": "Nested @import() Global Support", + "file": "test/e2e/app-dir/scss/nested-global/nested-global.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Nested @import() Global Support should render the page", + "status": "passed" + } + ] + }, + { + "name": "SCSS Support loader handling", + "file": "test/e2e/app-dir/scss/url-global/url-global.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "SCSS Support loader handling CSS URL via `file-loader` should render the page", + "status": "passed" + } + ] + }, + { + "name": "syntax-highlighter-crash", + "file": "test/e2e/app-dir/syntax-highlighter-crash/syntax-highlighter-crash.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "syntax-highlighter-crash should render the page", + "status": "passed" + } + ] + }, + { + "name": "disabled JS preloads", + "file": "test/e2e/disable-js-preload/test/index.test.js", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "disabled JS preloads should render the page", + "status": "passed" + }, + { + "name": "disabled JS preloads should not have JS preload links", + "status": "passed" + } + ] + }, + { + "name": "handle-non-hoisted-swc-helpers", + "file": "test/e2e/handle-non-hoisted-swc-helpers/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "handle-non-hoisted-swc-helpers should work", + "status": "passed" + } + ] + }, + { + "name": "link-with-api-rewrite", + "file": "test/e2e/link-with-api-rewrite/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "link-with-api-rewrite should perform hard navigation for rewritten urls", + "status": "passed" + }, + { + "name": "link-with-api-rewrite should perform hard navigation for direct urls", + "status": "passed" + } + ] + }, + { + "name": "Prerender crawler handling", + "file": "test/e2e/prerender-crawler.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "Prerender crawler handling should return prerendered page for correctly", + "status": "passed" + }, + { + "name": "Prerender crawler handling should return fallback for non-crawler correctly", + "status": "passed" + }, + { + "name": "Prerender crawler handling should block for crawler correctly", + "status": "passed" + } + ] + }, + { + "name": "Type module interop", + "file": "test/e2e/type-module-interop/index.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ + { + "name": "Type module interop should render server-side", + "status": "passed" + }, + { + "name": "Type module interop should render client-side", + "status": "passed" + }, + { + "name": "Type module interop should render server-side with modules", + "status": "passed" + }, + { + "name": "Type module interop should render client-side with modules", + "status": "passed" + } + ] + }, + { + "name": "app-dir action handling", + "file": "test/e2e/app-dir/actions/app-action.test.ts", + "passed": 57, + "failed": 1, + "skipped": 2, + "total": "62", + "testCases": [ + { + "name": "app-dir action handling should handle basic actions correctly", + "status": "passed" + }, + { + "name": "app-dir action handling should report errors with bad inputs correctly", + "status": "passed" + }, + { + "name": "app-dir action handling should support headers and cookies", + "status": "passed" + }, + { + "name": "app-dir action handling should push new route when redirecting", + "status": "passed" + }, + { + "name": "app-dir action handling should support headers in client imported actions", + "status": "passed" + }, + { + "name": "app-dir action handling should not log errors for non-action form POSTs", + "status": "passed" + }, + { + "name": "app-dir action handling should support setting cookies in route handlers with the correct overrides", + "status": "passed" + }, + { + "name": "app-dir action handling should support formData and redirect", + "status": "passed" + }, + { + "name": "app-dir action handling should support .bind", + "status": "passed" + }, + { + "name": "app-dir action handling should support chained .bind", + "status": "passed" + }, + { + "name": "app-dir action handling should support notFound (javascript disabled)", + "status": "passed" + }, + { + "name": "app-dir action handling should support notFound", + "status": "passed" + }, + { + "name": "app-dir action handling should support uploading files", + "status": "passed" + }, + { + "name": "app-dir action handling should support hoc auth wrappers", + "status": "passed" + }, + { + "name": "app-dir action handling should support importing actions in client components", + "status": "passed" + }, + { + "name": "app-dir action handling should support importing the same action module instance in both server and action layers", + "status": "passed" + }, + { + "name": "app-dir action handling should not block navigation events while a server action is in flight", + "status": "passed" + }, + { + "name": "app-dir action handling should not block router.back() while a server action is in flight", + "status": "passed" + }, + { + "name": "app-dir action handling should trigger a refresh for a server action that gets discarded due to a navigation", + "status": "passed" + }, + { + "name": "app-dir action handling should trigger a refresh for a server action that also dispatches a navigation event", + "status": "passed" + }, + { + "name": "app-dir action handling should support next/dynamic with ssr: false", + "status": "passed" + }, + { + "name": "app-dir action handling should support next/dynamic with ssr: false (edge)", + "status": "passed" + }, + { + "name": "app-dir action handling should only submit action once when resubmitting an action after navigation", + "status": "passed" + }, + { + "name": "app-dir action handling should handle actions executed in quick succession", + "status": "passed" + }, + { + "name": "app-dir action handling should 404 when POSTing an invalid server action", + "status": "passed" + }, + { + "name": "app-dir action handling should be possible to catch network errors", + "status": "passed" + }, + { + "name": "app-dir action handling should be possible to catch regular errors", + "status": "passed" + }, + { + "name": "app-dir action handling should forward action request to a worker that contains the action handler (node)", + "status": "passed" + }, + { + "name": "app-dir action handling should forward action request to a worker that contains the action handler (edge)", + "status": "passed" + }, + { + "name": "app-dir action handling Edge SSR should handle basic actions correctly", + "status": "passed" + }, + { + "name": "app-dir action handling Edge SSR should return error response for hoc auth wrappers in edge runtime", + "status": "passed" + }, + { + "name": "app-dir action handling Edge SSR should handle redirect to a relative URL in a single pass", + "status": "passed" + }, + { + "name": "app-dir action handling Edge SSR should handle regular redirects", + "status": "passed" + }, + { + "name": "app-dir action handling Edge SSR should allow cookie and header async storages", + "status": "passed" + }, + { + "name": "app-dir action handling Edge SSR should handle unicode search params", + "status": "passed" + }, + { + "name": "app-dir action handling fetch actions should handle a fetch action initiated from a static page", + "status": "passed" + }, + { + "name": "app-dir action handling fetch actions should handle redirect to a relative URL in a single pass", + "status": "passed" + }, + { + "name": "app-dir action handling fetch actions should handle regular redirects", + "status": "passed" + }, + { + "name": "app-dir action handling fetch actions should handle redirects to routes that provide an invalid RSC response", + "status": "passed" + }, + { + "name": "app-dir action handling fetch actions should handle revalidatePath", + "status": "passed" + }, + { + "name": "app-dir action handling fetch actions should handle revalidateTag", + "status": "passed" + }, + { + "name": "app-dir action handling fetch actions should store revalidation data in the prefetch cache", + "status": "failed" + }, + { + "name": "app-dir action handling fetch actions should revalidate when cookies.set is called", + "status": "passed" + }, + { + "name": "app-dir action handling fetch actions should invalidate client cache on other routes when cookies.set is called", + "status": "passed" + }, + { + "name": "app-dir action handling fetch actions should revalidate when cookies.set is called in a client action", + "status": "passed" + }, + { + "name": "app-dir action handling fetch actions should invalidate client cache when tag is revalidated", + "status": "passed" + }, + { + "name": "app-dir action handling fetch actions should invalidate client cache when path is revalidated", + "status": "passed" + }, + { + "name": "app-dir action handling encryption should send encrypted values from the closed over closure", + "status": "passed" + }, + { + "name": "app-dir action handling redirects redirects properly when server action handler uses `redirect`", + "status": "passed" + }, + { + "name": "app-dir action handling redirects redirects properly when server action handler uses `permanentRedirect`", + "status": "passed" + }, + { + "name": "app-dir action handling redirects displays searchParams correctly when redirecting with SearchParams", + "status": "passed" + }, + { + "name": "app-dir action handling redirects merges cookies correctly when redirecting", + "status": "passed" + }, + { + "name": "app-dir action handling redirects redirects properly when server action handler redirects with a 307 status code", + "status": "passed" + }, + { + "name": "app-dir action handling redirects redirects properly when server action handler redirects with a 308 status code", + "status": "passed" + }, + { + "name": "app-dir action handling server actions render client components server component imported action should support importing client components from actions", + "status": "passed" + }, + { + "name": "app-dir action handling caching disabled by default should use no-store as default for server action", + "status": "passed" + }, + { + "name": "app-dir action handling caching disabled by default should not override force-cache in server action", + "status": "passed" + }, + { + "name": "app-dir action handling caching disabled by default should not override revalidate in server action", + "status": "passed" + }, + { + "name": "app-dir action handling should log a warning when a server action is not found but an id is provided", + "status": "skipped", + "reason": "Uses CLI output" + }, + { + "name": "app-dir action handling should work with interception routes", + "status": "skipped", + "reason": "Uses CLI output" + } + ] + }, + { + "name": "dynamic-data", + "file": "test/e2e/app-dir/dynamic-data/dynamic-data.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "dynamic-data should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "i18n-hybrid", + "file": "test/e2e/app-dir/i18n-hybrid/i18n-hybrid.test.js", + "passed": 9, + "failed": 0, + "skipped": 0, + "total": "9", + "testCases": [ + { + "name": "i18n-hybrid does not resolve /en-CA/blog/first-post", + "status": "passed" + }, + { + "name": "i18n-hybrid does not resolve /en-US/blog/first-post", + "status": "passed" + }, + { + "name": "i18n-hybrid does not resolve /fr-CA/blog/first-post", + "status": "passed" + }, + { + "name": "i18n-hybrid does not resolve /fr-FR/blog/first-post", + "status": "passed" + }, + { + "name": "i18n-hybrid does resolve /about", + "status": "passed" + }, + { + "name": "i18n-hybrid does resolve /en-CA/about", + "status": "passed" + }, + { + "name": "i18n-hybrid does resolve /en-US/about", + "status": "passed" + }, + { + "name": "i18n-hybrid does resolve /fr-CA/about", + "status": "passed" + }, + { + "name": "i18n-hybrid does resolve /fr-FR/about", + "status": "passed" + } + ] + }, + { + "name": "Error test if the loader file export a named function", + "file": "test/e2e/app-dir/loader-file-named-export-custom-loader-error/loader-file-named-export-custom-loader-error.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "5", + "testCases": [ + { + "name": "Error test if the loader file export a named function in Development should skip next deploy", + "status": "passed" + }, + { + "name": "Error test if the loader file export a named function in Build and Start should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-dir - fetch warnings", + "file": "test/e2e/app-dir/logging/fetch-warning.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir - fetch warnings should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - next-image (with https)", + "file": "test/e2e/app-dir/next-image/next-image-https.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - next-image (with https) should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "pages-to-app-routing", + "file": "test/e2e/app-dir/pages-to-app-routing/pages-to-app-routing.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "pages-to-app-routing should work using browser", + "status": "passed" + } + ] + }, + { + "name": "parallel-routes-catchall-default", + "file": "test/e2e/app-dir/parallel-routes-catchall-default/parallel-routes-catchall-default.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "parallel-routes-catchall-default should match default paths before catch-all", + "status": "passed" + } + ] + }, + { + "name": "prefetching-not-found", + "file": "test/e2e/app-dir/prefetching-not-found/prefetching-not-found.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "prefetching-not-found should correctly navigate to/from a global 404 page when following links with prefetch=auto", + "status": "passed" + } + ] + }, + { + "name": "app-dir root layout render once", + "file": "test/e2e/app-dir/root-layout-render-once/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir root layout render once should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "Basic Module Include Paths Support", + "file": "test/e2e/app-dir/scss/basic-module-include-paths/basic-module-include-paths.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Basic Module Include Paths Support should render the module", + "status": "passed" + } + ] + }, + { + "name": "CSS Module Composes Usage (External)", + "file": "test/e2e/app-dir/scss/composes-external/composes-external.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "CSS Module Composes Usage (External) should render the module", + "status": "passed" + } + ] + }, + { + "name": "Invalid SCSS in _document", + "file": "test/e2e/app-dir/scss/invalid-module-document/invalid-module-document.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "SCSS Support loader handling Preprocessor loader order", + "file": "test/e2e/app-dir/scss/loader-order/loader-order.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "SCSS Support loader handling Preprocessor loader order should render the module", + "status": "passed" + } + ] + }, + { + "name": "Has CSS Module in computed styles in Production", + "file": "test/e2e/app-dir/scss/prod-module/prod-module.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Has CSS Module in computed styles in Production should render the page", + "status": "passed" + } + ] + }, + { + "name": "app-dir trailingSlash handling", + "file": "test/e2e/app-dir/trailingslash/trailingslash.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir trailingSlash handling should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "basePath", + "file": "test/e2e/basepath.test.ts", + "passed": 60, + "failed": 0, + "skipped": 3, + "total": "65", + "testCases": [ + { + "name": "basePath should navigate to /404 correctly client-side", + "status": "passed" + }, + { + "name": "basePath should navigate to /_error correctly client-side", + "status": "passed" + }, + { + "name": "basePath should navigate to external site and back", + "status": "passed" + }, + { + "name": "basePath should handle query/hash correctly during query updating #hello? $search", + "status": "passed" + }, + { + "name": "basePath should handle query/hash correctly during query updating #? $search", + "status": "passed" + }, + { + "name": "basePath should handle query/hash correctly during query updating ## $search", + "status": "passed" + }, + { + "name": "basePath should handle query/hash correctly during query updating ##? $search", + "status": "passed" + }, + { + "name": "basePath should handle query/hash correctly during query updating ##hello? $search", + "status": "passed" + }, + { + "name": "basePath should handle query/hash correctly during query updating ##hello $search", + "status": "passed" + }, + { + "name": "basePath should handle query/hash correctly during query updating #hello?world $search", + "status": "passed" + }, + { + "name": "basePath should handle query/hash correctly during query updating #a ?hello=world", + "status": "passed" + }, + { + "name": "basePath should handle query/hash correctly during query updating #a ?hello", + "status": "passed" + }, + { + "name": "basePath should handle query/hash correctly during query updating #a ?hello=", + "status": "passed" + }, + { + "name": "basePath should navigate back correctly to a dynamic route", + "status": "passed" + }, + { + "name": "basePath should respect basePath in amphtml link rel", + "status": "passed" + }, + { + "name": "basePath should prefetch pages correctly when manually called", + "status": "passed" + }, + { + "name": "basePath should prefetch pages correctly in viewport with ", + "status": "passed" + }, + { + "name": "basePath should 404 for public file without basePath", + "status": "passed" + }, + { + "name": "basePath should serve public file with basePath correctly", + "status": "passed" + }, + { + "name": "basePath should rewrite with basePath by default", + "status": "passed" + }, + { + "name": "basePath should not rewrite without basePath without disabling", + "status": "passed" + }, + { + "name": "basePath should not rewrite with basePath when set to false", + "status": "passed" + }, + { + "name": "basePath should rewrite without basePath when set to false", + "status": "passed" + }, + { + "name": "basePath should redirect with basePath by default", + "status": "passed" + }, + { + "name": "basePath should not redirect without basePath without disabling", + "status": "passed" + }, + { + "name": "basePath should not redirect with basePath when set to false", + "status": "passed" + }, + { + "name": "basePath should redirect without basePath when set to false", + "status": "passed" + }, + { + "name": "basePath should add header with basePath by default", + "status": "passed" + }, + { + "name": "basePath should not add header without basePath without disabling", + "status": "passed" + }, + { + "name": "basePath should not add header with basePath when set to false", + "status": "passed" + }, + { + "name": "basePath should add header without basePath when set to false", + "status": "passed" + }, + { + "name": "basePath should update dynamic params after mount correctly", + "status": "passed" + }, + { + "name": "basePath should navigate to index page with getStaticProps", + "status": "passed" + }, + { + "name": "basePath should work with nested folder with same name as basePath", + "status": "passed" + }, + { + "name": "basePath should work with normal dynamic page", + "status": "passed" + }, + { + "name": "basePath should work with hash links", + "status": "passed" + }, + { + "name": "basePath should work with catch-all page", + "status": "passed" + }, + { + "name": "basePath should redirect trailing slash correctly", + "status": "passed" + }, + { + "name": "basePath should redirect trailing slash on root correctly", + "status": "passed" + }, + { + "name": "basePath should navigate an absolute url", + "status": "passed" + }, + { + "name": "basePath should 404 when manually adding basePath with ", + "status": "passed" + }, + { + "name": "basePath should 404 when manually adding basePath with router.push", + "status": "passed" + }, + { + "name": "basePath should 404 when manually adding basePath with router.replace", + "status": "passed" + }, + { + "name": "basePath should show the hello page under the /docs prefix", + "status": "passed" + }, + { + "name": "basePath should have correct router paths on first load of /", + "status": "passed" + }, + { + "name": "basePath should have correct router paths on first load of /hello", + "status": "passed" + }, + { + "name": "basePath should fetch data for getStaticProps without reloading", + "status": "passed" + }, + { + "name": "basePath should fetch data for getServerSideProps without reloading", + "status": "passed" + }, + { + "name": "basePath should have correct href for a link", + "status": "passed" + }, + { + "name": "basePath should have correct href for a link to /", + "status": "passed" + }, + { + "name": "basePath should show the other-page page under the /docs prefix", + "status": "passed" + }, + { + "name": "basePath should have basePath field on Router", + "status": "passed" + }, + { + "name": "basePath should navigate to the page without refresh", + "status": "passed" + }, + { + "name": "basePath should use urls with basepath in router events", + "status": "passed" + }, + { + "name": "basePath should use urls with basepath in router events for hash changes", + "status": "passed" + }, + { + "name": "basePath should use urls with basepath in router events for cancelled routes", + "status": "passed" + }, + { + "name": "basePath should use urls with basepath in router events for failed route change", + "status": "passed" + }, + { + "name": "basePath should allow URL query strings without refresh", + "status": "passed" + }, + { + "name": "basePath should allow URL query strings on index without refresh", + "status": "passed" + }, + { + "name": "basePath should correctly replace state when same asPath but different url", + "status": "passed" + }, + { + "name": "basePath should not update URL for a 404", + "status": "skipped", + "reason": "Hard-coded Vercel error message" + }, + { + "name": "basePath should handle 404 urls that start with basePath", + "status": "skipped", + "reason": "Hard-coded Vercel error message" + }, + { + "name": "basePath should show 404 for page not under the /docs prefix", + "status": "skipped", + "reason": "Hard-coded Vercel error message" + } + ] + }, + { + "name": "Middleware custom matchers basePath", + "file": "test/e2e/middleware-custom-matchers-basepath/test/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ + { + "name": "Middleware custom matchers basePath should not match", + "status": "passed" + }, + { + "name": "Middleware custom matchers basePath should not match", + "status": "passed" + } + ] + }, + { + "name": "multi-zone", + "file": "test/e2e/multi-zone/multi-zone.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "multi-zone should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "og-api", + "file": "test/e2e/og-api/index.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ + { + "name": "og-api should respond from index", + "status": "passed" + }, + { + "name": "og-api should work in pages/api", + "status": "passed" + }, + { + "name": "og-api should work in app route", + "status": "passed" + }, + { + "name": "og-api should work in app route in node runtime", + "status": "passed" + } + ] + }, + { + "name": "useSelectedLayoutSegment(s) in Pages Router", + "file": "test/e2e/useselectedlayoutsegment-s-in-pages-router/useselectedlayoutsegment-s-in-pages-router.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "useSelectedLayoutSegment(s) in Pages Router Should render with `useSelectedLayoutSegment(s) hooks", + "status": "passed" + } + ] + }, + { + "name": "app a11y features", + "file": "test/e2e/app-dir/app-a11y/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app a11y features should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-dir edge SSR", + "file": "test/e2e/app-dir/app-edge/app-edge.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir edge SSR should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-prefetch-static", + "file": "test/e2e/app-dir/app-prefetch-static/app-prefetch-static.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-prefetch-static should correctly navigate between static & dynamic pages", + "status": "passed" + } + ] + }, + { + "name": "app-custom-routes", + "file": "test/e2e/app-dir/app-routes/app-custom-route-base-path.test.ts", + "passed": 62, + "failed": 0, + "skipped": 2, + "total": "65", + "testCases": [ + { + "name": "app-custom-routes works with api prefix correctly statically generates correctly with no dynamic usage", + "status": "passed" + }, + { + "name": "app-custom-routes works with api prefix correctly does not statically generate with dynamic usage", + "status": "passed" + }, + { + "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/first/data.json", + "status": "passed" + }, + { + "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/second/data.json", + "status": "passed" + }, + { + "name": "app-custom-routes works with generateStaticParams correctly responds correctly on /static/three/data.json", + "status": "passed" + }, + { + "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/first/data.json", + "status": "passed" + }, + { + "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/second/data.json", + "status": "passed" + }, + { + "name": "app-custom-routes works with generateStaticParams correctly revalidates correctly on /revalidate-1/three/data.json", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a GET request responds correctly on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a GET request responds correctly on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a POST request responds correctly on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a POST request responds correctly on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a PUT request responds correctly on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a PUT request responds correctly on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a DELETE request responds correctly on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a DELETE request responds correctly on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a PATCH request responds correctly on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response made via a PATCH request responds correctly on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a GET request aborts without error on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a GET request aborts without error on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a POST request aborts without error on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a POST request aborts without error on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a PUT request aborts without error on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a PUT request aborts without error on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a DELETE request aborts without error on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a DELETE request aborts without error on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a PATCH request aborts without error on /basic/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response abort via a PATCH request aborts without error on /basic/vercel/endpoint", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response route groups routes to the correct handler", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response request can read query parameters", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response request can read query parameters (edge)", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response response supports the NextResponse.redirect() helper", + "status": "passed" + }, + { + "name": "app-custom-routes basic fetch request with a response response supports the NextResponse.json() helper", + "status": "passed" + }, + { + "name": "app-custom-routes body can handle handle a streaming request and streaming response (edge)", + "status": "passed" + }, + { + "name": "app-custom-routes body can read a JSON encoded body", + "status": "passed" + }, + { + "name": "app-custom-routes body can read a JSON encoded body (edge)", + "status": "passed" + }, + { + "name": "app-custom-routes body can read a JSON encoded body for DELETE requests", + "status": "passed" + }, + { + "name": "app-custom-routes body can read a JSON encoded body for OPTIONS requests", + "status": "passed" + }, + { + "name": "app-custom-routes body can read a streamed JSON encoded body (edge)", + "status": "passed" + }, + { + "name": "app-custom-routes body can read the text body", + "status": "passed" + }, + { + "name": "app-custom-routes body can read the text body (edge)", + "status": "passed" + }, + { + "name": "app-custom-routes context provides params to routes with dynamic parameters", + "status": "passed" + }, + { + "name": "app-custom-routes context provides params to routes with catch-all routes", + "status": "passed" + }, + { + "name": "app-custom-routes context does not provide params to routes without dynamic parameters", + "status": "passed" + }, + { + "name": "app-custom-routes hooks headers gets the correct values", + "status": "passed" + }, + { + "name": "app-custom-routes hooks cookies gets the correct values", + "status": "passed" + }, + { + "name": "app-custom-routes hooks req.cookies gets the correct values", + "status": "passed" + }, + { + "name": "app-custom-routes hooks cookies().has() gets the correct values", + "status": "passed" + }, + { + "name": "app-custom-routes hooks redirect can respond correctly", + "status": "passed" + }, + { + "name": "app-custom-routes hooks permanentRedirect can respond correctly", + "status": "passed" + }, + { + "name": "app-custom-routes hooks notFound can respond correctly in nodejs", + "status": "passed" + }, + { + "name": "app-custom-routes hooks notFound can respond correctly in edge", + "status": "passed" + }, + { + "name": "app-custom-routes error conditions responds with 405 (Method Not Allowed) when method is not implemented", + "status": "passed" + }, + { + "name": "app-custom-routes error conditions responds with 500 (Internal Server Error) when the handler throws an error", + "status": "passed" + }, + { + "name": "app-custom-routes error conditions responds with 500 (Internal Server Error) when the handler calls NextResponse.next()", + "status": "passed" + }, + { + "name": "app-custom-routes automatic implementations implements HEAD on routes with GET already implemented", + "status": "passed" + }, + { + "name": "app-custom-routes automatic implementations implements OPTIONS on routes", + "status": "passed" + }, + { + "name": "app-custom-routes edge functions returns response using edge runtime", + "status": "passed" + }, + { + "name": "app-custom-routes edge functions returns a response when headers are accessed", + "status": "passed" + }, + { + "name": "app-custom-routes dynamic = \"force-static\" strips search, headers, and domain from request", + "status": "passed" + }, + { + "name": "app-custom-routes customized metadata routes should work if conflict with metadata routes convention", + "status": "passed" + }, + { + "name": "app-custom-routes no bundle error should not print bundling warning about React", + "status": "passed" + }, + { + "name": "app-custom-routes no response returned should print an error when no response is returned", + "status": "skipped", + "reason": "Uses CLI output" + }, + { + "name": "app-custom-routes error conditions responds with 400 (Bad Request) when the requested method is not a valid HTTP method", + "status": "skipped", + "reason": "Uses CLI output" + } + ] + }, + { + "name": "dynamic-interception-route-revalidate", + "file": "test/e2e/app-dir/dynamic-interception-route-revalidate/dynamic-interception-route-revalidate.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "dynamic-interception-route-revalidate should refresh the dynamic intercepted route when the interception route is revalidated", + "status": "passed" + } + ] + }, + { + "name": "app dir - global error", + "file": "test/e2e/app-dir/global-error/basic/index.test.ts", + "passed": 6, + "failed": 0, + "skipped": 0, + "total": "6", + "testCases": [ + { + "name": "app dir - global error should trigger error component when an error happens during rendering", + "status": "passed" + }, + { + "name": "app dir - global error should render global error for error in server components", + "status": "passed" + }, + { + "name": "app dir - global error should render global error for error in client components", + "status": "passed" + }, + { + "name": "app dir - global error should catch metadata error in error boundary if presented", + "status": "passed" + }, + { + "name": "app dir - global error should catch metadata error in global-error if no error boundary is presented", + "status": "passed" + }, + { + "name": "app dir - global error should catch the client error thrown in the nested routes", + "status": "passed" + } + ] + }, + { + "name": "app dir - metadata dynamic routes", + "file": "test/e2e/app-dir/metadata-dynamic-routes/index.test.ts", + "passed": 10, + "failed": 0, + "skipped": 12, + "total": "19", + "testCases": [ + { + "name": "app dir - metadata dynamic routes text routes should not throw if client components are imported but not used", + "status": "passed" + }, + { + "name": "app dir - metadata dynamic routes text routes should support alternate.languages in sitemap", + "status": "passed" + }, + { + "name": "app dir - metadata dynamic routes social image routes should support generate multi images with generateImageMetadata", + "status": "passed" + }, + { + "name": "app dir - metadata dynamic routes social image routes should support generate multi sitemaps with generateSitemaps", + "status": "passed" + }, + { + "name": "app dir - metadata dynamic routes social image routes should fill params into dynamic routes url of metadata images", + "status": "passed" + }, + { + "name": "app dir - metadata dynamic routes social image routes should support params as argument in dynamic routes", + "status": "passed" + }, + { + "name": "app dir - metadata dynamic routes social image routes should fill params into routes groups url of static images", + "status": "passed" + }, + { + "name": "app dir - metadata dynamic routes social image routes should handle custom fonts in both edge and nodejs runtime", + "status": "passed" + }, + { + "name": "app dir - metadata dynamic routes should generate unique path for image routes under group routes", + "status": "passed" + }, + { + "name": "app dir - metadata dynamic routes should pick configured metadataBase instead of deployment url for canonical url", + "status": "passed" + }, + { + "name": "app dir - metadata dynamic routes text routes should handle robots.[ext] dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "app dir - metadata dynamic routes text routes should handle sitemap.[ext] dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "app dir - metadata dynamic routes robots.txt should handle robots.[ext] dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "app dir - metadata dynamic routes sitemap should handle sitemap.[ext] dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "app dir - metadata dynamic routes robots.txt should handle sitemap.[ext] dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "app dir - metadata dynamic routes social image routes should handle manifest.[ext] dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "app dir - metadata dynamic routes social image routes should render og image with opengraph-image dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "app dir - metadata dynamic routes social image routes should render og image with twitter-image dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "app dir - metadata dynamic routes icon image routes should render icon with dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "app dir - metadata dynamic routes icon image routes should render apple icon with dynamic routes", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "app dir - metadata dynamic routes should inject dynamic metadata properly to head", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "app dir - metadata dynamic routes should use localhost for local prod and fallback to deployment url when metadataBase is falsy", + "status": "skipped", + "reason": "Header whitespace mismatch" + } + ] + }, + { + "name": "app dir - next config", + "file": "test/e2e/app-dir/next-config/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - next config should support importing webpack in next.config", + "status": "passed" + } + ] + }, + { + "name": "app dir - not-found - group route", + "file": "test/e2e/app-dir/not-found/group-route/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - not-found - group route should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "parallel-routes-and-interception", + "file": "test/e2e/app-dir/parallel-routes-and-interception/parallel-routes-and-interception.test.ts", + "passed": 24, + "failed": 0, + "skipped": 2, + "total": "25", + "testCases": [ + { + "name": "parallel-routes-and-interception parallel routes should support parallel route tab bars", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception parallel routes should match parallel routes", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception parallel routes should match parallel routes in route groups", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception parallel routes should throw a 404 when no matching parallel route is found", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception parallel routes should render nested parallel routes", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception parallel routes should support layout files in parallel routes", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception parallel routes should only scroll to the parallel route that was navigated to", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception parallel routes should apply the catch-all route to the parallel route if no matching route is found", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception parallel routes should match the catch-all routes of the more specific path, if there is more than one catch-all route", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception parallel routes should navigate with a link with prefetch=false", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception parallel routes should display all parallel route params with useParams", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception parallel routes should load CSS for a default page that exports another page", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception parallel routes should handle a loading state", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception route intercepting with dynamic routes should render intercepted route", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception route intercepting with dynamic optional catch-all routes should render intercepted route", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception route intercepting with dynamic catch-all routes should render intercepted route", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception route intercepting should render intercepted route", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception route intercepting should render an intercepted route from a slot", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception route intercepting should render an intercepted route at the top level from a nested path", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception route intercepting should render intercepted route from a nested route", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception route intercepting should re-render the layout on the server when it had a default child route", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception route intercepting should render modal when paired with parallel routes", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception route intercepting should support intercepting with beforeFiles rewrites", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception route intercepting should support intercepting local dynamic sibling routes", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception parallel routes should gracefully handle when two page segments match the `children` parallel slot", + "status": "skipped", + "reason": "Tries to patch deployed files" + }, + { + "name": "parallel-routes-and-interception with patching should gracefully handle when two page segments match the `children` parallel slot", + "status": "skipped", + "reason": "Tries to patch deployed files" + } + ] + }, + { + "name": "Dynamic Route CSS Module Usage", + "file": "test/e2e/app-dir/scss/dynamic-route-module/dynamic-route-module.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Dynamic Route CSS Module Usage should apply styles correctly", + "status": "passed" + } + ] + }, + { + "name": "CSS Import from node_modules", + "file": "test/e2e/app-dir/scss/npm-import-bad/npm-import-bad.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "Basic Global Support scss", + "file": "test/e2e/app-dir/scss/single-global/single-global.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Basic Global Support scss should render the page", + "status": "passed" + } + ] + }, + { + "name": "app dir - taint", + "file": "test/e2e/app-dir/taint/process-taint.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - taint should error when passing process env to client component", + "status": "passed" + } + ] + }, + { + "name": "basePath + trailingSlash", + "file": "test/e2e/basepath-trailing-slash.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "basePath + trailingSlash should allow URL query strings without refresh", + "status": "passed" + }, + { + "name": "basePath + trailingSlash should allow URL query strings on index without refresh", + "status": "passed" + }, + { + "name": "basePath + trailingSlash should correctly replace state when same asPath but different url", + "status": "passed" + } + ] + }, + { + "name": "Configurable runtime for src/pages and API routes", + "file": "test/e2e/edge-configurable-runtime/index.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [] + }, + { + "name": "edge-render-getserversideprops", + "file": "test/e2e/edge-pages-support/index.test.ts", + "passed": 8, + "failed": 0, + "skipped": 0, + "total": "8", + "testCases": [ + { + "name": "edge-render-getserversideprops should have correct query for pages/api", + "status": "passed" + }, + { + "name": "edge-render-getserversideprops should have correct query for pages/api dynamic", + "status": "passed" + }, + { + "name": "edge-render-getserversideprops should have correct query/params on index", + "status": "passed" + }, + { + "name": "edge-render-getserversideprops should have correct query/params on /[id]", + "status": "passed" + }, + { + "name": "edge-render-getserversideprops should have correct query/params on rewrite", + "status": "passed" + }, + { + "name": "edge-render-getserversideprops should have correct query/params on dynamic rewrite", + "status": "passed" + }, + { + "name": "edge-render-getserversideprops should respond to _next/data for index correctly", + "status": "passed" + }, + { + "name": "edge-render-getserversideprops should respond to _next/data for [id] correctly", + "status": "passed" + } + ] + }, + { + "name": "i18n-disallow-multiple-locales", + "file": "test/e2e/i18n-disallow-multiple-locales/i18n-disallow-multiple-locales.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "i18n-disallow-multiple-locales should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "i18n-ignore-redirect-source-locale", + "file": "test/e2e/i18n-ignore-redirect-source-locale/redirects.test.ts", + "passed": 16, + "failed": 0, + "skipped": 0, + "total": "16", + "testCases": [ + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: to: sv", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /en to: sv", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /sv to: sv", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /nl to: sv", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: to: en", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /en to: en", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /sv to: en", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /nl to: en", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: to: /", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /en to: /", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /sv to: /", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from: /nl to: /", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from and to: ", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from and to: /en", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from and to: /sv", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale get redirected to the new page, from and to: /nl", + "status": "passed" + } + ] + }, + { + "name": "Middleware custom matchers basePath", + "file": "test/e2e/middleware-dynamic-basepath-matcher/test/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ + { + "name": "Middleware custom matchers basePath should not match", + "status": "passed" + }, + { + "name": "Middleware custom matchers basePath should not match", + "status": "passed" + } + ] + }, + { + "name": "New Link Behavior with material-ui", + "file": "test/e2e/new-link-behavior/material-ui.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "New Link Behavior with material-ui should render MuiLink with ", + "status": "passed" + } + ] + }, + { + "name": "next/font/google fetch error", + "file": "test/e2e/next-font/google-fetch-error.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "next/font/google fetch error should skip next deploy for now", + "status": "passed" + } + ] + }, + { + "name": "next-image-forward-ref", + "file": "test/e2e/next-image-forward-ref/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "next-image-forward-ref allows framer-motion to animate opacity", + "status": "passed" + } + ] + }, + { + "name": "reload-scroll-back-restoration", + "file": "test/e2e/reload-scroll-backforward-restoration/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "reload-scroll-back-restoration should restore the scroll position on navigating back", + "status": "passed" + }, + { + "name": "reload-scroll-back-restoration should restore the scroll position on navigating forward", + "status": "passed" + } + ] + }, + { + "name": "testmode", + "file": "test/e2e/testmode/testmode.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "testmode should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-dir alias", + "file": "test/e2e/app-dir/app-alias/app-alias.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir alias should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-dir edge runtime root layout", + "file": "test/e2e/app-dir/app-edge-root-layout/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir edge runtime root layout should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "referencing a client component in an app route", + "file": "test/e2e/app-dir/app-routes-client-component/app-routes-client-component.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "referencing a client component in an app route responds without error", + "status": "passed" + } + ] + }, + { + "name": "app dir - not-found - basic", + "file": "test/e2e/app-dir/not-found/basic/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - not-found - basic should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "parallel-routes-and-interception", + "file": "test/e2e/app-dir/parallel-routes-not-found/parallel-routes-not-found.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "parallel-routes-and-interception should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "route-page-manifest-bug", + "file": "test/e2e/app-dir/route-page-manifest-bug/route-page-manifest-bug.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "route-page-manifest-bug should work when requesting route handler after page", + "status": "passed" + } + ] + }, + { + "name": "Basic Module Prepend Data Support", + "file": "test/e2e/app-dir/scss/basic-module-prepend-data/basic-module-prepend-data.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Basic Module Prepend Data Support should render the module", + "status": "passed" + } + ] + }, + { + "name": "SCSS Support", + "file": "test/e2e/app-dir/scss/compilation-and-prefixing/compilation-and-prefixing.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "SCSS Support Production only CSS Compilation and Prefixing should've compiled and prefixed", + "status": "passed" + }, + { + "name": "SCSS Support Production only CSS Compilation and Prefixing should've emitted a source map", + "status": "passed" + } + ] + }, + { + "name": "Invalid CSS Module Usage in node_modules", + "file": "test/e2e/app-dir/scss/invalid-module/invalid-module.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "(SCSS) Multi Global Support (reversed)", + "file": "test/e2e/app-dir/scss/multi-global-reversed/multi-global-reversed.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "(SCSS) Multi Global Support (reversed) should render the page", + "status": "passed" + } + ] + }, + { + "name": "Scss Mixins", + "file": "test/e2e/app-dir/scss/scss-mixins/scss-mixins.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Scss Mixins should work using browser", + "status": "passed" + } + ] + }, + { + "name": "server-actions-relative-redirect", + "file": "test/e2e/app-dir/server-actions-relative-redirect/server-actions-relative-redirect.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "server-actions-relative-redirect should work with relative redirect", + "status": "passed" + }, + { + "name": "server-actions-relative-redirect should work with absolute redirect", + "status": "passed" + } + ] + }, + { + "name": "turbopack-reports", + "file": "test/e2e/app-dir/turbopack-reports/turbopack-reports.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "turbopack-reports should render page importing sqlite3", + "status": "passed" + } + ] + }, + { + "name": "promise export", + "file": "test/e2e/config-promise-export/promise.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "promise export should work", + "status": "passed" + } + ] + }, + { + "name": "fetch failures have good stack traces in edge runtime", + "file": "test/e2e/fetch-failures-have-good-stack-traces-in-edge-runtime/fetch-failures-have-good-stack-traces-in-edge-runtime.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "fetch failures have good stack traces in edge runtime should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "i18n-ignore-rewrite-source-locale with basepath", + "file": "test/e2e/i18n-ignore-rewrite-source-locale/rewrites-with-basepath.test.ts", + "passed": 4, + "failed": 4, + "skipped": 0, + "total": "8", + "testCases": [ + { + "name": "i18n-ignore-rewrite-source-locale with basepath get public file by skipping locale in rewrite, locale: ", + "status": "failed" + }, + { + "name": "i18n-ignore-rewrite-source-locale with basepath get public file by skipping locale in rewrite, locale: /en", + "status": "failed" + }, + { + "name": "i18n-ignore-rewrite-source-locale with basepath get public file by skipping locale in rewrite, locale: /sv", + "status": "failed" + }, + { + "name": "i18n-ignore-rewrite-source-locale with basepath get public file by skipping locale in rewrite, locale: /nl", + "status": "failed" + }, + { + "name": "i18n-ignore-rewrite-source-locale with basepath call api by skipping locale in rewrite, locale: ", + "status": "passed" + }, + { + "name": "i18n-ignore-rewrite-source-locale with basepath call api by skipping locale in rewrite, locale: /en", + "status": "passed" + }, + { + "name": "i18n-ignore-rewrite-source-locale with basepath call api by skipping locale in rewrite, locale: /sv", + "status": "passed" + }, + { + "name": "i18n-ignore-rewrite-source-locale with basepath call api by skipping locale in rewrite, locale: /nl", + "status": "passed" + } + ] + }, + { + "name": "instrumentation-hook-rsc", + "file": "test/e2e/instrumentation-hook-src/instrumentation-hook-src.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "instrumentation-hook-rsc instrumentation should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "Middleware Redirect", + "file": "test/e2e/middleware-redirects/test/index.test.ts", + "passed": 18, + "failed": 0, + "skipped": 0, + "total": "18", + "testCases": [ + { + "name": "Middleware Redirect should redirect correctly with redirect in next.config.js", + "status": "passed" + }, + { + "name": "Middleware Redirect does not include the locale in redirects by default", + "status": "passed" + }, + { + "name": "Middleware Redirect should redirect to data urls with data requests and internal redirects", + "status": "passed" + }, + { + "name": "Middleware Redirect should redirect to external urls with data requests and external redirects", + "status": "passed" + }, + { + "name": "Middleware Redirect should redirect", + "status": "passed" + }, + { + "name": "Middleware Redirect should implement internal redirects", + "status": "passed" + }, + { + "name": "Middleware Redirect should redirect cleanly with the original url param", + "status": "passed" + }, + { + "name": "Middleware Redirect should redirect multiple times", + "status": "passed" + }, + { + "name": "Middleware Redirect should redirect (infinite-loop)", + "status": "passed" + }, + { + "name": "Middleware Redirect should redirect to api route with locale", + "status": "passed" + }, + { + "name": "Middleware Redirect should redirect with a fragment", + "status": "passed" + }, + { + "name": "Middleware Redirect /fr should redirect", + "status": "passed" + }, + { + "name": "Middleware Redirect /fr should implement internal redirects", + "status": "passed" + }, + { + "name": "Middleware Redirect /fr should redirect cleanly with the original url param", + "status": "passed" + }, + { + "name": "Middleware Redirect /fr should redirect multiple times", + "status": "passed" + }, + { + "name": "Middleware Redirect /fr should redirect (infinite-loop)", + "status": "passed" + }, + { + "name": "Middleware Redirect /fr should redirect to api route with locale", + "status": "passed" + }, + { + "name": "Middleware Redirect /fr should redirect with a fragment", + "status": "passed" + } + ] + }, + { + "name": "next/font/google with-font-declarations-file", + "file": "test/e2e/next-font/with-font-declarations-file.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "next/font/google with-font-declarations-file should skip next deploy for now", + "status": "passed" + } + ] + }, + { + "name": "_allow-underscored-root-directory", + "file": "test/e2e/app-dir/_allow-underscored-root-directory/_allow-underscored-root-directory.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "_allow-underscored-root-directory should not serve app path with underscore", + "status": "passed" + }, + { + "name": "_allow-underscored-root-directory should pages path with a underscore at the root", + "status": "passed" + }, + { + "name": "_allow-underscored-root-directory should serve app path with %5F", + "status": "passed" + } + ] + }, + { + "name": "custom-app-server-action-redirect", + "file": "test/e2e/app-dir/app-basepath-custom-server/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "custom-app-server-action-redirect should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - css", + "file": "test/e2e/app-dir/app-css/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - css should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-dir assetPrefix with basePath handling", + "file": "test/e2e/app-dir/asset-prefix-with-basepath/asset-prefix-with-basepath.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "6", + "testCases": [ + { + "name": "app-dir assetPrefix with basePath handling should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "dynamic-href", + "file": "test/e2e/app-dir/dynamic-href/dynamic-href.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "dynamic-href should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - emotion-js", + "file": "test/e2e/app-dir/emotion-js/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - emotion-js should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - hooks", + "file": "test/e2e/app-dir/hooks/hooks.test.ts", + "passed": 25, + "failed": 0, + "skipped": 0, + "total": "25", + "testCases": [ + { + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/static", + "status": "passed" + }, + { + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/1", + "status": "passed" + }, + { + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/2", + "status": "passed" + }, + { + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/1/account", + "status": "passed" + }, + { + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/static", + "status": "passed" + }, + { + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/1", + "status": "passed" + }, + { + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/2", + "status": "passed" + }, + { + "name": "app dir - hooks from pages should have the correct hooks at /adapter-hooks/1/account", + "status": "passed" + }, + { + "name": "app dir - hooks usePathname should have the correct pathname", + "status": "passed" + }, + { + "name": "app dir - hooks usePathname should have the canonical url pathname on rewrite", + "status": "passed" + }, + { + "name": "app dir - hooks useSearchParams should have the correct search params", + "status": "passed" + }, + { + "name": "app dir - hooks useDraftMode should use initial rand when draft mode be disabled", + "status": "passed" + }, + { + "name": "app dir - hooks useDraftMode should generate rand when draft mode enabled", + "status": "passed" + }, + { + "name": "app dir - hooks useRouter should allow access to the router", + "status": "passed" + }, + { + "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/first", + "status": "passed" + }, + { + "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/first/slug1", + "status": "passed" + }, + { + "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/first/slug2/second", + "status": "passed" + }, + { + "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/first/slug2/second/a/b", + "status": "passed" + }, + { + "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/rewritten", + "status": "passed" + }, + { + "name": "app dir - hooks useSelectedLayoutSegments should have the correct layout segments at /hooks/use-selected-layout-segment/rewritten-middleware", + "status": "passed" + }, + { + "name": "app dir - hooks useSelectedLayoutSegments should return an empty array in pages", + "status": "passed" + }, + { + "name": "app dir - hooks useSelectedLayoutSegment should have the correct layout segment at /hooks/use-selected-layout-segment/first", + "status": "passed" + }, + { + "name": "app dir - hooks useSelectedLayoutSegment should have the correct layout segment at /hooks/use-selected-layout-segment/first/slug1", + "status": "passed" + }, + { + "name": "app dir - hooks useSelectedLayoutSegment should have the correct layout segment at /hooks/use-selected-layout-segment/first/slug2/second/a/b", + "status": "passed" + }, + { + "name": "app dir - hooks useSelectedLayoutSegment should return null in pages", + "status": "passed" + } + ] + }, + { + "name": "app dir - Metadata API on the Edge runtime", + "file": "test/e2e/app-dir/metadata-edge/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - Metadata API on the Edge runtime should render OpenGraph image meta tag correctly", + "status": "passed" + } + ] + }, + { + "name": "app dir - next/font", + "file": "test/e2e/app-dir/next-font/next-font.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "app dir - next/font app app dir - next-font should skip next deploy", + "status": "passed" + }, + { + "name": "app dir - next/font app-old app dir - next-font should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - group routes with root not-found", + "file": "test/e2e/app-dir/not-found/group-route-root-not-found/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - group routes with root not-found should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "parallel-routes-and-interception-basepath", + "file": "test/e2e/app-dir/parallel-routes-and-interception-basepath/parallel-routes-and-interception-basepath.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "parallel-routes-and-interception-basepath should show parallel intercepted slot with basepath", + "status": "passed" + }, + { + "name": "parallel-routes-and-interception-basepath should show normal route via direct link with basepath when parallel intercepted slot exist", + "status": "passed" + } + ] + }, + { + "name": "parallel-routes-catchall-slotted-non-catchalls", + "file": "test/e2e/app-dir/parallel-routes-catchall-slotted-non-catchalls/parallel-routes-catchall-slotted-non-catchalls.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "parallel-routes-catchall-slotted-non-catchalls should match default and dynamic segment paths before catch-all", + "status": "passed" + } + ] + }, + { + "name": "scripts", + "file": "test/e2e/app-dir/resource-url-encoding/resource-url-encoding.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [] + }, + { + "name": "root-layout-redirect", + "file": "test/e2e/app-dir/root-layout-redirect/root-layout-redirect.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "root-layout-redirect should work using browser", + "status": "passed" + } + ] + }, + { + "name": "3rd Party CSS Module Support", + "file": "test/e2e/app-dir/scss/3rd-party-module/3rd-party-module.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "3rd Party CSS Module Support should render the module", + "status": "passed" + } + ] + }, + { + "name": "Basic SCSS Module Support", + "file": "test/e2e/app-dir/scss/basic-module/basic-module.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Basic SCSS Module Support should render the module", + "status": "passed" + } + ] + }, + { + "name": "SCSS Support loader handling Data Urls", + "file": "test/e2e/app-dir/scss/data-url/data-url.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "SCSS Support loader handling Data Urls should render the module", + "status": "passed" + } + ] + }, + { + "name": "Can hot reload CSS Module without losing state", + "file": "test/e2e/app-dir/scss/hmr-module/hmr-module.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "Invalid Global CSS with Custom App", + "file": "test/e2e/app-dir/scss/invalid-global-with-app/invalid-global-with-app.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "SCSS Support", + "file": "test/e2e/app-dir/scss/multi-page/multi-page.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "SCSS Support Has CSS in computed styles in Production should have CSS for page", + "status": "passed" + }, + { + "name": "SCSS Support Has CSS in computed styles in Development should have CSS for page", + "status": "passed" + } + ] + }, + { + "name": "SCSS Support", + "file": "test/e2e/app-dir/scss/webpack-error/webpack-error.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "searchparams-static-bailout", + "file": "test/e2e/app-dir/searchparams-static-bailout/searchparams-static-bailout.test.ts", + "passed": 5, + "failed": 0, + "skipped": 0, + "total": "5", + "testCases": [ + { + "name": "searchparams-static-bailout server component should bailout when using searchParams", + "status": "passed" + }, + { + "name": "searchparams-static-bailout server component should not bailout when not using searchParams", + "status": "passed" + }, + { + "name": "searchparams-static-bailout client component should bailout when using searchParams", + "status": "passed" + }, + { + "name": "searchparams-static-bailout client component should bailout when using searchParams is passed to client component", + "status": "passed" + }, + { + "name": "searchparams-static-bailout client component should not bailout when not using searchParams", + "status": "passed" + } + ] + }, + { + "name": "useSelectedLayoutSegment(s)", + "file": "test/e2e/app-dir/use-selected-layout-segment-s/use-selected-layout-segment-s.test.ts", + "passed": 8, + "failed": 0, + "skipped": 0, + "total": "8", + "testCases": [ + { + "name": "useSelectedLayoutSegment(s) should return correct values for root layout", + "status": "passed" + }, + { + "name": "useSelectedLayoutSegment(s) should return correct values in layout before static segment", + "status": "passed" + }, + { + "name": "useSelectedLayoutSegment(s) should return correct values in layout before param segment", + "status": "passed" + }, + { + "name": "useSelectedLayoutSegment(s) should return correct values in layout before catchall segment", + "status": "passed" + }, + { + "name": "useSelectedLayoutSegment(s) should return correct values in layout after last segment", + "status": "passed" + }, + { + "name": "useSelectedLayoutSegment(s) should correctly update when changing static segment", + "status": "passed" + }, + { + "name": "useSelectedLayoutSegment(s) should correctly update when changing param segment", + "status": "passed" + }, + { + "name": "useSelectedLayoutSegment(s) should correctly update when changing catchall segment", + "status": "passed" + } + ] + }, + { + "name": "Edge API endpoints can receive body", + "file": "test/e2e/edge-api-endpoints-can-receive-body/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "Edge API endpoints can receive body reads the body as text", + "status": "passed" + }, + { + "name": "Edge API endpoints can receive body reads the body from index", + "status": "passed" + } + ] + }, + { + "name": "i18-default-locale-redirect", + "file": "test/e2e/i18n-default-locale-redirect/i18n-default-locale-redirect.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "i18-default-locale-redirect should not request a path prefixed with default locale", + "status": "passed" + }, + { + "name": "i18-default-locale-redirect should request a path prefixed with non-default locale", + "status": "passed" + } + ] + }, + { + "name": "Event with stale state - static route previously was dynamic", + "file": "test/e2e/ignore-invalid-popstateevent/without-i18n.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "Event with stale state - static route previously was dynamic Ignore event without query param", + "status": "passed" + }, + { + "name": "Event with stale state - static route previously was dynamic Ignore event with query param", + "status": "passed" + } + ] + }, + { + "name": "Middleware can set the matcher in its config", + "file": "test/e2e/middleware-matcher/index.test.ts", + "passed": 33, + "failed": 2, + "skipped": 0, + "total": "35", + "testCases": [ + { + "name": "Middleware can set the matcher in its config does add the header for root request", + "status": "passed" + }, + { + "name": "Middleware can set the matcher in its config adds the header for a matched path", + "status": "passed" + }, + { + "name": "Middleware can set the matcher in its config adds the header for a matched data path (with header)", + "status": "passed" + }, + { + "name": "Middleware can set the matcher in its config adds the header for a matched data path (without header)", + "status": "passed" + }, + { + "name": "Middleware can set the matcher in its config adds the header for another matched path", + "status": "passed" + }, + { + "name": "Middleware can set the matcher in its config adds the header for another matched data path", + "status": "passed" + }, + { + "name": "Middleware can set the matcher in its config does add the header for root data request", + "status": "passed" + }, + { + "name": "Middleware can set the matcher in its config should load matches in client matchers correctly", + "status": "passed" + }, + { + "name": "Middleware can set the matcher in its config should navigate correctly with matchers", + "status": "passed" + }, + { + "name": "using a single matcher does not add the header for root request", + "status": "passed" + }, + { + "name": "using a single matcher does not add the header for root data request", + "status": "passed" + }, + { + "name": "using a single matcher adds the header for a matched path", + "status": "passed" + }, + { + "name": "using a single matcher adds the headers for a matched data path (with header)", + "status": "passed" + }, + { + "name": "using a single matcher adds the header for a matched data path (without header)", + "status": "passed" + }, + { + "name": "using a single matcher does not add the header for an unmatched path", + "status": "passed" + }, + { + "name": "using root matcher adds the header to the /", + "status": "passed" + }, + { + "name": "using root matcher adds the header to the /index", + "status": "passed" + }, + { + "name": "using root matcher adds the header for a matched data path (with header)", + "status": "passed" + }, + { + "name": "using root matcher adds the header for a matched data path (without header)", + "status": "passed" + }, + { + "name": "using a single matcher with i18n adds the header for a matched path", + "status": "passed" + }, + { + "name": "using a single matcher with i18n adds the header for a mathed root path with /index", + "status": "passed" + }, + { + "name": "using a single matcher with i18n adds the headers for a matched data path", + "status": "passed" + }, + { + "name": "using a single matcher with i18n does not add the header for an unmatched path", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and trailingSlash adds the header for a matched path", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and trailingSlash adds the header for a mathed root path with /index", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and trailingSlash adds the headers for a matched data path", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and trailingSlash does not add the header for an unmatched path", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and basePath adds the header for a matched path", + "status": "failed" + }, + { + "name": "using a single matcher with i18n and basePath adds the header for a mathed root path with /index", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and basePath adds the headers for a matched data path", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and basePath does not add the header for an unmatched path", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and basePath and trailingSlash adds the header for a matched path", + "status": "failed" + }, + { + "name": "using a single matcher with i18n and basePath and trailingSlash adds the header for a mathed root path with /index", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and basePath and trailingSlash adds the headers for a matched data path", + "status": "passed" + }, + { + "name": "using a single matcher with i18n and basePath and trailingSlash does not add the header for an unmatched path", + "status": "passed" + } + ] + }, + { + "name": "postcss-config-cjs", + "file": "test/e2e/postcss-config-cjs/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "postcss-config-cjs works with postcss.config.cjs files", + "status": "passed" + } + ] + }, + { + "name": "undici fetch", + "file": "test/e2e/undici-fetch/index.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ + { + "name": "undici fetch undici global fetch should return true when undici is used", + "status": "passed" + }, + { + "name": "undici fetch undici global Headers should return true when undici is used", + "status": "passed" + }, + { + "name": "undici fetch undici global Request should return true when undici is used", + "status": "passed" + }, + { + "name": "undici fetch undici global Response should return true when undici is used", + "status": "passed" + } + ] + }, + { + "name": "app-dir action allowed origins", + "file": "test/e2e/app-dir/actions-allowed-origins/app-action-allowed-origins.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir action allowed origins should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - crossOrigin config", + "file": "test/e2e/app-dir/app-config-crossorigin/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - crossOrigin config should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir rendering", + "file": "test/e2e/app-dir/app-rendering/rendering.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir rendering should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - basic", + "file": "test/e2e/app-dir/app/index.test.ts", + "passed": 90, + "failed": 2, + "skipped": 2, + "total": "100", + "testCases": [ + { + "name": "app dir - basic should work for catch-all edge page", + "status": "passed" + }, + { + "name": "app dir - basic should return normalized dynamic route params for catch-all edge page", + "status": "passed" + }, + { + "name": "app dir - basic should have correct searchParams and params (server)", + "status": "passed" + }, + { + "name": "app dir - basic should have correct searchParams and params (client)", + "status": "passed" + }, + { + "name": "app dir - basic should successfully detect app route during prefetch", + "status": "passed" + }, + { + "name": "app dir - basic should encode chunk path correctly", + "status": "passed" + }, + { + "name": "app dir - basic should match redirects in pages correctly $path", + "status": "passed" + }, + { + "name": "app dir - basic should match redirects in pages correctly $path", + "status": "passed" + }, + { + "name": "app dir - basic should match redirects in pages correctly $path", + "status": "passed" + }, + { + "name": "app dir - basic should match redirects in pages correctly $path", + "status": "passed" + }, + { + "name": "app dir - basic should match redirects in pages correctly $path", + "status": "passed" + }, + { + "name": "app dir - basic should not apply client router filter on shallow", + "status": "passed" + }, + { + "name": "app dir - basic should use text/x-component for flight", + "status": "passed" + }, + { + "name": "app dir - basic should use text/x-component for flight with edge runtime", + "status": "passed" + }, + { + "name": "app dir - basic should pass props from getServerSideProps in root layout", + "status": "passed" + }, + { + "name": "app dir - basic should serve from pages", + "status": "passed" + }, + { + "name": "app dir - basic should serve dynamic route from pages", + "status": "passed" + }, + { + "name": "app dir - basic should serve from public", + "status": "passed" + }, + { + "name": "app dir - basic should serve from app", + "status": "passed" + }, + { + "name": "app dir - basic should ensure the suffix is at the end of the stream", + "status": "passed" + }, + { + "name": "app dir - basic should include layouts when no direct parent layout", + "status": "passed" + }, + { + "name": "app dir - basic should use new root layout when provided", + "status": "passed" + }, + { + "name": "app dir - basic should not create new root layout when nested (optional)", + "status": "passed" + }, + { + "name": "app dir - basic should include parent document when no direct parent layout", + "status": "passed" + }, + { + "name": "app dir - basic should not include parent when not in parent directory", + "status": "passed" + }, + { + "name": "app dir - basic should serve nested parent", + "status": "passed" + }, + { + "name": "app dir - basic should serve dynamic parameter", + "status": "passed" + }, + { + "name": "app dir - basic should include document html and body", + "status": "passed" + }, + { + "name": "app dir - basic should not serve when layout is provided but no folder index", + "status": "passed" + }, + { + "name": "app dir - basic rewrites should support rewrites on initial load", + "status": "passed" + }, + { + "name": "app dir - basic rewrites should support rewrites on client-side navigation from pages to app with existing pages path", + "status": "passed" + }, + { + "name": "app dir - basic rewrites should support rewrites on client-side navigation", + "status": "passed" + }, + { + "name": "app dir - basic should not rerender layout when navigating between routes in the same layout", + "status": "passed" + }, + { + "name": "app dir - basic should handle hash in initial url", + "status": "passed" + }, + { + "name": "app dir - basic should hard push", + "status": "passed" + }, + { + "name": "app dir - basic should hard replace", + "status": "passed" + }, + { + "name": "app dir - basic should soft push", + "status": "passed" + }, + { + "name": "app dir - basic should be soft for back navigation", + "status": "passed" + }, + { + "name": "app dir - basic should be soft for forward navigation", + "status": "passed" + }, + { + "name": "app dir - basic should allow linking from app page to pages page", + "status": "passed" + }, + { + "name": "app dir - basic should navigate to pages dynamic route from pages page if it overlaps with an app page", + "status": "passed" + }, + { + "name": "app dir - basic should push to external url", + "status": "passed" + }, + { + "name": "app dir - basic should replace to external url", + "status": "passed" + }, + { + "name": "app dir - basic server components should not serve .server.js as a path", + "status": "passed" + }, + { + "name": "app dir - basic server components should not serve .client.js as a path", + "status": "passed" + }, + { + "name": "app dir - basic server components should serve shared component", + "status": "passed" + }, + { + "name": "app dir - basic server components dynamic routes should only pass params that apply to the layout", + "status": "passed" + }, + { + "name": "app dir - basic server components catch-all routes should handle optional segments", + "status": "passed" + }, + { + "name": "app dir - basic server components catch-all routes should handle optional segments root", + "status": "passed" + }, + { + "name": "app dir - basic server components catch-all routes should handle optional catch-all segments link", + "status": "passed" + }, + { + "name": "app dir - basic server components catch-all routes should handle required segments", + "status": "passed" + }, + { + "name": "app dir - basic server components catch-all routes should handle required segments root as not found", + "status": "passed" + }, + { + "name": "app dir - basic server components catch-all routes should handle catch-all segments link", + "status": "passed" + }, + { + "name": "app dir - basic server components should serve client component should serve server-side", + "status": "passed" + }, + { + "name": "app dir - basic server components should serve client component should serve client-side", + "status": "passed" + }, + { + "name": "app dir - basic server components should include client component layout with server component route should include it server-side", + "status": "passed" + }, + { + "name": "app dir - basic server components should include client component layout with server component route should include it client-side", + "status": "passed" + }, + { + "name": "app dir - basic server components Loading should render loading.js in initial html for slow page", + "status": "passed" + }, + { + "name": "app dir - basic server components Loading should render loading.js in browser for slow page", + "status": "passed" + }, + { + "name": "app dir - basic server components Loading should render loading.js in initial html for slow layout", + "status": "passed" + }, + { + "name": "app dir - basic server components Loading should render loading.js in browser for slow layout", + "status": "passed" + }, + { + "name": "app dir - basic server components Loading should render loading.js in initial html for slow layout and page", + "status": "passed" + }, + { + "name": "app dir - basic server components Loading should render loading.js in browser for slow layout and page", + "status": "passed" + }, + { + "name": "app dir - basic server components middleware should strip internal query parameters from requests to middleware for rewrite", + "status": "passed" + }, + { + "name": "app dir - basic server components middleware should strip internal query parameters from requests to middleware for redirect", + "status": "passed" + }, + { + "name": "app dir - basic server components next/router should support router.back and router.forward", + "status": "passed" + }, + { + "name": "app dir - basic searchParams prop client component should have the correct search params", + "status": "passed" + }, + { + "name": "app dir - basic searchParams prop client component should have the correct search params on rewrite", + "status": "passed" + }, + { + "name": "app dir - basic searchParams prop client component should have the correct search params on middleware rewrite", + "status": "passed" + }, + { + "name": "app dir - basic searchParams prop server component should have the correct search params", + "status": "passed" + }, + { + "name": "app dir - basic searchParams prop server component should have the correct search params on rewrite", + "status": "passed" + }, + { + "name": "app dir - basic searchParams prop server component should have the correct search params on middleware rewrite", + "status": "passed" + }, + { + "name": "app dir - basic template component should render the template that holds state in a client component and reset on navigation", + "status": "passed" + }, + { + "name": "app dir - basic template component should render the template that is a server component and rerender on navigation", + "status": "passed" + }, + { + "name": "app dir - basic known bugs should support React cache server component", + "status": "passed" + }, + { + "name": "app dir - basic known bugs should support React cache server component client-navigation", + "status": "passed" + }, + { + "name": "app dir - basic known bugs should support React cache client component", + "status": "passed" + }, + { + "name": "app dir - basic known bugs should support React cache client component client-navigation", + "status": "passed" + }, + { + "name": "app dir - basic known bugs should support React cache middleware overriding headers", + "status": "passed" + }, + { + "name": "app dir - basic known bugs should support React fetch instrumentation server component", + "status": "passed" + }, + { + "name": "app dir - basic known bugs should support React fetch instrumentation server component client-navigation", + "status": "passed" + }, + { + "name": "app dir - basic known bugs should not share flight data between requests", + "status": "passed" + }, + { + "name": "app dir - basic known bugs should handle router.refresh without resetting state", + "status": "passed" + }, + { + "name": "app dir - basic known bugs should handle as on next/link", + "status": "passed" + }, + { + "name": "app dir - basic known bugs should handle next/link back to initially loaded page", + "status": "passed" + }, + { + "name": "app dir - basic known bugs should not do additional pushState when already on the page", + "status": "passed" + }, + { + "name": "app dir - basic next/script should insert preload tags for beforeInteractive and afterInteractive scripts", + "status": "passed" + }, + { + "name": "app dir - basic next/script should load stylesheets for next/scripts", + "status": "passed" + }, + { + "name": "app dir - basic next/script should pass `nonce`", + "status": "failed" + }, + { + "name": "app dir - basic data fetch with response over 16KB with chunked encoding should load page when fetching a large amount of data", + "status": "passed" + }, + { + "name": "app dir - basic bootstrap scripts should only bootstrap with one script, prinitializing the rest", + "status": "passed" + }, + { + "name": "app dir - basic bootstrap scripts should successfully bootstrap even when using CSP", + "status": "failed" + }, + { + "name": "app dir - basic should return the `vary` header from edge runtime", + "status": "skipped", + "reason": "Whitespace mismatch" + }, + { + "name": "app dir - basic should return the `vary` header from pages for flight requests", + "status": "skipped", + "reason": "Whitespace mismatch" + } + ] + }, + { + "name": "mdx with-mdx-rs", + "file": "test/e2e/app-dir/mdx/mdx.test.ts", + "passed": 24, + "failed": 0, + "skipped": 0, + "total": "24", + "testCases": [ + { + "name": "mdx with-mdx-rs app directory should work in initial html", + "status": "passed" + }, + { + "name": "mdx with-mdx-rs app directory should work using browser", + "status": "passed" + }, + { + "name": "mdx with-mdx-rs app directory should work in initial html with mdx import", + "status": "passed" + }, + { + "name": "mdx with-mdx-rs app directory should work using browser with mdx import", + "status": "passed" + }, + { + "name": "mdx with-mdx-rs app directory should allow overriding components", + "status": "passed" + }, + { + "name": "mdx with-mdx-rs app directory should allow importing client components", + "status": "passed" + }, + { + "name": "mdx with-mdx-rs app directory should work with next/image", + "status": "passed" + }, + { + "name": "mdx with-mdx-rs pages directory should work in initial html", + "status": "passed" + }, + { + "name": "mdx with-mdx-rs pages directory should work using browser", + "status": "passed" + }, + { + "name": "mdx with-mdx-rs pages directory should work in initial html with mdx import", + "status": "passed" + }, + { + "name": "mdx with-mdx-rs pages directory should work using browser with mdx import", + "status": "passed" + }, + { + "name": "mdx with-mdx-rs pages directory should allow overriding components", + "status": "passed" + }, + { + "name": "mdx without-mdx-rs app directory should work in initial html", + "status": "passed" + }, + { + "name": "mdx without-mdx-rs app directory should work using browser", + "status": "passed" + }, + { + "name": "mdx without-mdx-rs app directory should work in initial html with mdx import", + "status": "passed" + }, + { + "name": "mdx without-mdx-rs app directory should work using browser with mdx import", + "status": "passed" + }, + { + "name": "mdx without-mdx-rs app directory should allow overriding components", + "status": "passed" + }, + { + "name": "mdx without-mdx-rs app directory should allow importing client components", + "status": "passed" + }, + { + "name": "mdx without-mdx-rs app directory should work with next/image", + "status": "passed" + }, + { + "name": "mdx without-mdx-rs pages directory should work in initial html", + "status": "passed" + }, + { + "name": "mdx without-mdx-rs pages directory should work using browser", + "status": "passed" + }, + { + "name": "mdx without-mdx-rs pages directory should work in initial html with mdx import", + "status": "passed" + }, + { + "name": "mdx without-mdx-rs pages directory should work using browser with mdx import", + "status": "passed" + }, + { + "name": "mdx without-mdx-rs pages directory should allow overriding components", + "status": "passed" + } + ] + }, + { + "name": "not-found app dir css", + "file": "test/e2e/app-dir/not-found/css-precedence/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "not-found app dir css should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "parallel-route-not-found", + "file": "test/e2e/app-dir/parallel-route-not-found/parallel-route-not-found.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "parallel-route-not-found should handle a layout that attempts to render a missing parallel route", + "status": "passed" + }, + { + "name": "parallel-route-not-found should handle multiple missing parallel routes", + "status": "passed" + }, + { + "name": "parallel-route-not-found should render the page & slots if all parallel routes are found", + "status": "passed" + } + ] + }, + { + "name": "parallel-routes-catchall-groups", + "file": "test/e2e/app-dir/parallel-routes-catchall-groups/parallel-routes-catchall-groups.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "parallel-routes-catchall-groups should work without throwing any errors about conflicting paths", + "status": "passed" + } + ] + }, + { + "name": "parallel-routes-revalidation", + "file": "test/e2e/app-dir/parallel-routes-revalidation/parallel-routes-revalidation.test.ts", + "passed": 16, + "failed": 1, + "skipped": 2, + "total": "18", + "testCases": [ + { + "name": "parallel-routes-revalidation should submit the action and revalidate the page data", + "status": "failed" + }, + { + "name": "parallel-routes-revalidation should handle router.refresh() when called in a slot", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation should handle a redirect action when called in a slot", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation should not trigger interception when calling router.refresh() on an intercepted route (/detail-page)", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation should not trigger interception when calling router.refresh() on an intercepted route (/dynamic/foobar)", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation should not trigger interception when calling router.refresh() on an intercepted route (/catchall/foobar)", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation should not trigger full page when calling router.refresh() on an intercepted route", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation should not trigger the intercepted route when lazy-fetching missing data", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation router.refresh (regular) - searchParams: false should correctly refresh data for the intercepted route and previously active page slot", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation router.refresh (regular) - searchParams: false should correctly refresh data for previously intercepted modal and active page slot", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation router.refresh (regular) - searchParams: true should correctly refresh data for the intercepted route and previously active page slot", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation router.refresh (regular) - searchParams: true should correctly refresh data for previously intercepted modal and active page slot", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation router.refresh (dynamic) - searchParams: false should correctly refresh data for the intercepted route and previously active page slot", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation router.refresh (dynamic) - searchParams: false should correctly refresh data for previously intercepted modal and active page slot", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation router.refresh (dynamic) - searchParams: true should correctly refresh data for the intercepted route and previously active page slot", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation router.refresh (dynamic) - searchParams: true should correctly refresh data for previously intercepted modal and active page slot", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation server action revalidation handles refreshing when multiple parallel slots are active", + "status": "passed" + }, + { + "name": "parallel-routes-revalidation should refresh the correct page when a server action triggers a redirect", + "status": "skipped", + "reason": "Test is incompatible with serverless because it relies on shared state between requests" + }, + { + "name": "parallel-routes-revalidation should submit the action and revalidate the page data", + "status": "skipped", + "reason": "Test is incompatible with serverless because it relies on shared state between requests" + } + ] + }, + { + "name": "Good CSS Import from node_modules with tilde", + "file": "test/e2e/app-dir/scss/npm-import-tilde/npm-import-tilde.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Good CSS Import from node_modules with tilde should render the page", + "status": "passed" + } + ] + }, + { + "name": "shallow-routing", + "file": "test/e2e/app-dir/shallow-routing/shallow-routing.test.ts", + "passed": 15, + "failed": 0, + "skipped": 0, + "total": "15", + "testCases": [ + { + "name": "shallow-routing pushState should support setting data", + "status": "passed" + }, + { + "name": "shallow-routing pushState should support setting a different pathname reflected on usePathname", + "status": "passed" + }, + { + "name": "shallow-routing pushState should support setting a different searchParam reflected on useSearchParams", + "status": "passed" + }, + { + "name": "shallow-routing pushState should support setting a different url using a string", + "status": "passed" + }, + { + "name": "shallow-routing pushState should work when given a null state value", + "status": "passed" + }, + { + "name": "shallow-routing should work when given an undefined state value", + "status": "passed" + }, + { + "name": "shallow-routing replaceState should support setting data", + "status": "passed" + }, + { + "name": "shallow-routing replaceState should support setting a different pathname reflected on usePathname", + "status": "passed" + }, + { + "name": "shallow-routing replaceState should support setting a different searchParam reflected on useSearchParams", + "status": "passed" + }, + { + "name": "shallow-routing replaceState should support setting a different url using a string", + "status": "passed" + }, + { + "name": "shallow-routing replaceState should work when given a null state value", + "status": "passed" + }, + { + "name": "shallow-routing replaceState should work when given an undefined state value", + "status": "passed" + }, + { + "name": "shallow-routing back and forward client-side navigation should support setting a different pathname reflected on usePathname and then still support navigating back and forward", + "status": "passed" + }, + { + "name": "shallow-routing back and forward mpa navigation should support setting data and then still support navigating back and forward", + "status": "passed" + }, + { + "name": "shallow-routing back and forward mpa navigation should support hash navigations while continuing to work for pushState/replaceState APIs", + "status": "passed" + } + ] + }, + { + "name": "browserslist-extends", + "file": "test/e2e/browserslist-extends/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "browserslist-extends should work", + "status": "passed" + } + ] + }, + { + "name": "Edge can read request body", + "file": "test/e2e/edge-can-read-request-body/index.test.ts", + "passed": 5, + "failed": 0, + "skipped": 0, + "total": "5", + "testCases": [ + { + "name": "Edge can read request body renders the static page", + "status": "passed" + }, + { + "name": "Edge can read request body middleware reads a JSON body", + "status": "passed" + }, + { + "name": "Edge can read request body middleware reads a text body", + "status": "passed" + }, + { + "name": "Edge can read request body middleware reads an URL encoded form data", + "status": "passed" + }, + { + "name": "Edge can read request body middleware reads a multipart form data", + "status": "passed" + } + ] + }, + { + "name": "esm-externals", + "file": "test/e2e/esm-externals/esm-externals.test.ts", + "passed": 10, + "failed": 0, + "skipped": 0, + "total": "10", + "testCases": [ + { + "name": "esm-externals should return the correct SSR HTML for /static", + "status": "passed" + }, + { + "name": "esm-externals should render the correct page for /static", + "status": "passed" + }, + { + "name": "esm-externals should return the correct SSR HTML for /ssr", + "status": "passed" + }, + { + "name": "esm-externals should render the correct page for /ssr", + "status": "passed" + }, + { + "name": "esm-externals should return the correct SSR HTML for /ssg", + "status": "passed" + }, + { + "name": "esm-externals should render the correct page for /ssg", + "status": "passed" + }, + { + "name": "esm-externals should return the correct SSR HTML for /server", + "status": "passed" + }, + { + "name": "esm-externals should render the correct page for /server", + "status": "passed" + }, + { + "name": "esm-externals should return the correct SSR HTML for /client", + "status": "passed" + }, + { + "name": "esm-externals should render the correct page for /client", + "status": "passed" + } + ] + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath", + "file": "test/e2e/i18n-ignore-redirect-source-locale/redirects-with-basepath.test.ts", + "passed": 16, + "failed": 0, + "skipped": 0, + "total": "16", + "testCases": [ + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: to: sv", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /en to: sv", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /sv to: sv", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /nl to: sv", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: to: en", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /en to: en", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /sv to: en", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /nl to: en", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: to: /", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /en to: /", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /sv to: /", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from: /nl to: /", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from and to: ", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from and to: /en", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from and to: /sv", + "status": "passed" + }, + { + "name": "i18n-ignore-redirect-source-locale with basepath get redirected to the new page, from and to: /nl", + "status": "passed" + } + ] + }, + { + "name": "Middleware fetches with body", + "file": "test/e2e/middleware-fetches-with-body/index.test.ts", + "passed": 9, + "failed": 0, + "skipped": 0, + "total": "9", + "testCases": [ + { + "name": "Middleware fetches with body with default bodyParser sizeLimit (1mb) should return 413 for body greater than 1mb", + "status": "passed" + }, + { + "name": "Middleware fetches with body with default bodyParser sizeLimit (1mb) should be able to send and return body size equal to 1mb", + "status": "passed" + }, + { + "name": "Middleware fetches with body with default bodyParser sizeLimit (1mb) should be able to send and return body greater than default highWaterMark (16KiB)", + "status": "passed" + }, + { + "name": "Middleware fetches with body with custom bodyParser sizeLimit (5kb) should return 413 for body greater than 5kb", + "status": "passed" + }, + { + "name": "Middleware fetches with body with custom bodyParser sizeLimit (5kb) should be able to send and return body size equal to 5kb", + "status": "passed" + }, + { + "name": "Middleware fetches with body with custom bodyParser sizeLimit (5mb) should return 413 for body greater than 5mb", + "status": "passed" + }, + { + "name": "Middleware fetches with body with bodyParser = false should be able to send and return with body size equal to 16KiB", + "status": "passed" + }, + { + "name": "Middleware fetches with body with bodyParser = false should be able to send and return with body greater than 16KiB", + "status": "passed" + }, + { + "name": "Middleware fetches with body should return 413 for body equal to 10mb", + "status": "passed" + } + ] + }, + { + "name": "Middleware Request Headers Overrides", + "file": "test/e2e/middleware-request-header-overrides/test/index.test.ts", + "passed": 9, + "failed": 0, + "skipped": 0, + "total": "9", + "testCases": [ + { + "name": "Middleware Request Headers Overrides Serverless Functions Backend Adds new headers", + "status": "passed" + }, + { + "name": "Middleware Request Headers Overrides Serverless Functions Backend Deletes headers", + "status": "passed" + }, + { + "name": "Middleware Request Headers Overrides Serverless Functions Backend Updates headers", + "status": "passed" + }, + { + "name": "Middleware Request Headers Overrides Edge Functions Backend Adds new headers", + "status": "passed" + }, + { + "name": "Middleware Request Headers Overrides Edge Functions Backend Deletes headers", + "status": "passed" + }, + { + "name": "Middleware Request Headers Overrides Edge Functions Backend Updates headers", + "status": "passed" + }, + { + "name": "Middleware Request Headers Overrides getServerSideProps Backend Adds new headers", + "status": "passed" + }, + { + "name": "Middleware Request Headers Overrides getServerSideProps Backend Deletes headers", + "status": "passed" + }, + { + "name": "Middleware Request Headers Overrides getServerSideProps Backend Updates headers", + "status": "passed" + } + ] + }, + { + "name": "next/font/google basepath", + "file": "test/e2e/next-font/basepath.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "next/font/google basepath should skip next deploy for now", + "status": "passed" + } + ] + }, + { + "name": "instrumentation pages", + "file": "test/e2e/opentelemetry/instrumentation-pages-app-only.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "8", + "testCases": [ + { + "name": "instrumentation pages should skip next deploy", + "status": "passed" + }, + { + "name": "instrumentation pages src/ should skip next deploy", + "status": "passed" + }, + { + "name": "instrumentation app should skip next deploy", + "status": "passed" + }, + { + "name": "instrumentation app src/ should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "opentelemetry", + "file": "test/e2e/opentelemetry/opentelemetry.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "opentelemetry should skip next deploy", + "status": "passed" + }, + { + "name": "opentelemetry with disabled fetch tracing should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "Optimized loading", + "file": "test/e2e/optimized-loading/test/index.test.ts", + "passed": 6, + "failed": 0, + "skipped": 0, + "total": "6", + "testCases": [ + { + "name": "Optimized loading page / should render the page /", + "status": "passed" + }, + { + "name": "Optimized loading page / should not have JS preload links", + "status": "passed" + }, + { + "name": "Optimized loading page / should load scripts with defer in head", + "status": "passed" + }, + { + "name": "Optimized loading page /page1 should render the page /page1", + "status": "passed" + }, + { + "name": "Optimized loading page /page1 should not have JS preload links", + "status": "passed" + }, + { + "name": "Optimized loading page /page1 should load scripts with defer in head", + "status": "passed" + } + ] + }, + { + "name": "React Context", + "file": "test/e2e/ssr-react-context/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "React Context should render a page with context", + "status": "passed" + }, + { + "name": "React Context should render correctly with context consumer", + "status": "passed" + } + ] + }, + { + "name": "nextTestSetup", + "file": "test/e2e/test-utils-tests/basic/basic.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "nextTestSetup should work", + "status": "passed" + } + ] + }, + { + "name": "yarn PnP", + "file": "test/e2e/yarn-pnp/test/with-eslint.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "yarn PnP should not run for next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-dir action disallowed origins", + "file": "test/e2e/app-dir/actions-allowed-origins/app-action-disallowed-origins.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir action disallowed origins should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir client cache semantics", + "file": "test/e2e/app-dir/app-client-cache/client-cache.test.ts", + "passed": 13, + "failed": 0, + "skipped": 0, + "total": "13", + "testCases": [ + { + "name": "app dir client cache semantics prefetch={true} should prefetch the full page", + "status": "passed" + }, + { + "name": "app dir client cache semantics prefetch={true} should re-use the cache for the full page, only for 5 mins", + "status": "passed" + }, + { + "name": "app dir client cache semantics prefetch={true} should prefetch again after 5 mins if the link is visible again", + "status": "passed" + }, + { + "name": "app dir client cache semantics prefetch={false} should not prefetch the page at all", + "status": "passed" + }, + { + "name": "app dir client cache semantics prefetch={false} should re-use the cache only for 30 seconds", + "status": "passed" + }, + { + "name": "app dir client cache semantics prefetch={undefined} - default should prefetch partially a dynamic page", + "status": "passed" + }, + { + "name": "app dir client cache semantics prefetch={undefined} - default should re-use the full cache for only 30 seconds", + "status": "passed" + }, + { + "name": "app dir client cache semantics prefetch={undefined} - default should renew the 30s cache once the data is revalidated", + "status": "passed" + }, + { + "name": "app dir client cache semantics prefetch={undefined} - default should refetch below the fold after 30 seconds", + "status": "passed" + }, + { + "name": "app dir client cache semantics prefetch={undefined} - default should refetch the full page after 5 mins", + "status": "passed" + }, + { + "name": "app dir client cache semantics prefetch={undefined} - default should respect a loading boundary that returns `null`", + "status": "passed" + }, + { + "name": "app dir client cache semantics should seed the prefetch cache with the fetched page data", + "status": "passed" + }, + { + "name": "app dir client cache semantics should renew the initial seeded data after expiration time", + "status": "passed" + } + ] + }, + { + "name": "app dir - css with pageextensions", + "file": "test/e2e/app-dir/app-css-pageextensions/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - css with pageextensions should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - prefetching", + "file": "test/e2e/app-dir/app-prefetch/prefetching.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - prefetching should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "Web Crypto API is available globally", + "file": "test/e2e/app-dir/crypto-globally-available/crypto-globally-available.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "Web Crypto API is available globally should be available in Server Components", + "status": "passed" + }, + { + "name": "Web Crypto API is available globally should be available in Route Handlers", + "status": "passed" + } + ] + }, + { + "name": "app-dir - dynamic in generate params", + "file": "test/e2e/app-dir/dynamic-in-generate-params/index.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "app-dir - dynamic in generate params should render sitemap with generateSitemaps in force-dynamic config dynamically", + "status": "passed" + }, + { + "name": "app-dir - dynamic in generate params should be able to call while generating multiple dynamic sitemaps", + "status": "passed" + }, + { + "name": "app-dir - dynamic in generate params should be able to call fetch while generating multiple dynamic pages", + "status": "passed" + } + ] + }, + { + "name": "edge-route-catchall", + "file": "test/e2e/app-dir/edge-route-catchall/edge-route-catchall.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "edge-route-catchall should correctly normalize edge route catch-all with a single param", + "status": "passed" + }, + { + "name": "edge-route-catchall should correctly normalize edge route catch-all with multiple params", + "status": "passed" + } + ] + }, + { + "name": "edge runtime node compatibility", + "file": "test/e2e/app-dir/edge-runtime-node-compatibility/edge-runtime-node-compatibility.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "edge runtime node compatibility [app] supports node:buffer", + "status": "passed" + }, + { + "name": "edge runtime node compatibility [pages/api] supports node:buffer", + "status": "passed" + } + ] + }, + { + "name": "app dir - global error - layout error", + "file": "test/e2e/app-dir/global-error/layout-error/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - global error - layout error should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "interception-route-prefetch-cache", + "file": "test/e2e/app-dir/interception-route-prefetch-cache/interception-route-prefetch-cache.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "interception-route-prefetch-cache runtime = nodejs should render the correct interception when two distinct layouts share the same path structure", + "status": "passed" + }, + { + "name": "interception-route-prefetch-cache runtime = edge should render the correct interception when two distinct layouts share the same path structure", + "status": "passed" + } + ] + }, + { + "name": "app dir - not-found - conflict route", + "file": "test/e2e/app-dir/not-found/conflict-route/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - not-found - conflict route should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "parallel-routes-catchall-specificity", + "file": "test/e2e/app-dir/parallel-routes-catchall-specificity/parallel-routes-catchall-specificity.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "parallel-routes-catchall-specificity should match the catch-all route when navigating from a page with a similar path depth as the previously matched slot", + "status": "passed" + } + ] + }, + { + "name": "turbo-resolve-extensions", + "file": "test/e2e/app-dir/resolve-extensions/resolve-extensions.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "turbo-resolve-extensions should SSR", + "status": "passed" + }, + { + "name": "turbo-resolve-extensions should work using browser", + "status": "passed" + } + ] + }, + { + "name": "Basic Module Additional Data Support", + "file": "test/e2e/app-dir/scss/basic-module-additional-data/basic-module-additional-data.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Basic Module Additional Data Support should render the module", + "status": "passed" + } + ] + }, + { + "name": "Has CSS Module in computed styles in Development", + "file": "test/e2e/app-dir/scss/dev-module/dev-module.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Has CSS Module in computed styles in Development should have CSS for page", + "status": "passed" + } + ] + }, + { + "name": "Good Nested CSS Import from node_modules", + "file": "test/e2e/app-dir/scss/npm-import-nested/npm-import-nested.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Good Nested CSS Import from node_modules should render the page", + "status": "passed" + } + ] + }, + { + "name": "unused scss", + "file": "test/e2e/app-dir/scss/unused/unused.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [] + }, + { + "name": "{{name}}", + "file": "test/e2e/app-dir/test-template/{{ toFileName name }}/{{ toFileName name }}.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ + { + "name": "{{name}} should work using cheerio", + "status": "passed" + }, + { + "name": "{{name}} should work using browser", + "status": "passed" + }, + { + "name": "{{name}} should work with html", + "status": "passed" + }, + { + "name": "{{name}} should work with fetch", + "status": "passed" + } + ] + }, + { + "name": "Browserslist", + "file": "test/e2e/browserslist/browserslist.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "async export", + "file": "test/e2e/config-promise-export/async-function.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "async export should work", + "status": "passed" + } + ] + }, + { + "name": "edge-runtime uses edge-light import specifier for packages", + "file": "test/e2e/edge-runtime-uses-edge-light-import-specifier-for-packages/edge-runtime-uses-edge-light-import-specifier-for-packages.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "edge-runtime uses edge-light import specifier for packages should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "i18-preferred-locale-redirect", + "file": "test/e2e/i18n-preferred-locale-detection/i18n-preferred-locale-detection.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "i18-preferred-locale-redirect should request a path prefixed with my preferred detected locale when accessing index", + "status": "passed" + }, + { + "name": "i18-preferred-locale-redirect should not request a path prefixed with my preferred detected locale when clicking link to index from a non-locale-prefixed path", + "status": "passed" + }, + { + "name": "i18-preferred-locale-redirect should request a path prefixed with my preferred detected locale when clicking link to index from a locale-prefixed path", + "status": "passed" + } + ] + }, + { + "name": "Middleware base tests", + "file": "test/e2e/middleware-base-path/test/index.test.ts", + "passed": 1, + "failed": 1, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "Middleware base tests should execute from absolute paths", + "status": "passed" + }, + { + "name": "Middleware base tests router.query must exist when Link clicked page routing", + "status": "failed" + } + ] + }, + { + "name": "Middleware Rewrite", + "file": "test/e2e/middleware-rewrites/test/index.test.ts", + "passed": 55, + "failed": 0, + "skipped": 0, + "total": "56", + "testCases": [ + { + "name": "Middleware Rewrite should handle catch-all rewrite correctly", + "status": "passed" + }, + { + "name": "Middleware Rewrite should handle next.config.js rewrite with body correctly", + "status": "passed" + }, + { + "name": "Middleware Rewrite should handle middleware rewrite with body correctly", + "status": "passed" + }, + { + "name": "Middleware Rewrite should handle static dynamic rewrite from middleware correctly", + "status": "passed" + }, + { + "name": "Middleware Rewrite should handle static rewrite from next.config.js correctly", + "status": "passed" + }, + { + "name": "Middleware Rewrite should not have un-necessary data request on rewrite", + "status": "passed" + }, + { + "name": "Middleware Rewrite should not mix component cache when navigating between dynamic routes", + "status": "passed" + }, + { + "name": "Middleware Rewrite should have props for afterFiles rewrite to SSG page", + "status": "passed" + }, + { + "name": "Middleware Rewrite should hard navigate on 404 for data request", + "status": "passed" + }, + { + "name": "Middleware Rewrite should rewrite correctly when navigating via history", + "status": "passed" + }, + { + "name": "Middleware Rewrite should rewrite correctly when navigating via history after query update", + "status": "passed" + }, + { + "name": "Middleware Rewrite should return HTML/data correctly for pre-rendered page", + "status": "passed" + }, + { + "name": "Middleware Rewrite should override with rewrite internally correctly", + "status": "passed" + }, + { + "name": "Middleware Rewrite should rewrite to data urls for incoming data request internally rewritten", + "status": "passed" + }, + { + "name": "Middleware Rewrite should override with rewrite externally correctly", + "status": "passed" + }, + { + "name": "Middleware Rewrite should rewrite to the external url for incoming data request externally rewritten", + "status": "passed" + }, + { + "name": "Middleware Rewrite should rewrite to fallback: true page successfully", + "status": "passed" + }, + { + "name": "Middleware Rewrite should allow to opt-out prefetch caching", + "status": "passed" + }, + { + "name": "Middleware Rewrite should not prefetch non-SSG routes", + "status": "passed" + }, + { + "name": "Middleware Rewrite should allow to rewrite keeping the locale in pathname", + "status": "passed" + }, + { + "name": "Middleware Rewrite should allow to rewrite to a different locale", + "status": "passed" + }, + { + "name": "Middleware Rewrite should behave consistently on recursive rewrites", + "status": "passed" + }, + { + "name": "Middleware Rewrite should allow to switch locales", + "status": "passed" + }, + { + "name": "Middleware Rewrite should allow to rewrite to a `beforeFiles` rewrite config", + "status": "passed" + }, + { + "name": "Middleware Rewrite should allow to rewrite to a `afterFiles` rewrite config", + "status": "passed" + }, + { + "name": "Middleware Rewrite should have correct query info for dynamic route after query hydration", + "status": "passed" + }, + { + "name": "Middleware Rewrite should handle shallow navigation correctly (non-dynamic page)", + "status": "passed" + }, + { + "name": "Middleware Rewrite should handle shallow navigation correctly (dynamic page)", + "status": "passed" + }, + { + "name": "Middleware Rewrite should resolve dynamic route after rewrite correctly", + "status": "passed" + }, + { + "name": "Middleware Rewrite should add a cookie and rewrite to a/b test", + "status": "passed" + }, + { + "name": "Middleware Rewrite should clear query parameters", + "status": "passed" + }, + { + "name": "Middleware Rewrite should rewrite to about page", + "status": "passed" + }, + { + "name": "Middleware Rewrite support colons in path", + "status": "passed" + }, + { + "name": "Middleware Rewrite can rewrite to path with colon", + "status": "passed" + }, + { + "name": "Middleware Rewrite can rewrite from path with colon", + "status": "passed" + }, + { + "name": "Middleware Rewrite can rewrite from path with colon and retain query parameter", + "status": "passed" + }, + { + "name": "Middleware Rewrite can rewrite to path with colon and retain query parameter", + "status": "passed" + }, + { + "name": "Middleware Rewrite should rewrite to Vercel", + "status": "passed" + }, + { + "name": "Middleware Rewrite should rewrite without hard navigation", + "status": "passed" + }, + { + "name": "Middleware Rewrite should not call middleware with shallow push", + "status": "passed" + }, + { + "name": "Middleware Rewrite should correctly rewriting to a different dynamic path", + "status": "passed" + }, + { + "name": "Middleware Rewrite should not have unexpected errors", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr should add a cookie and rewrite to a/b test", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr should clear query parameters", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr should rewrite to about page", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr support colons in path", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr can rewrite to path with colon", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr can rewrite from path with colon", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr can rewrite from path with colon and retain query parameter", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr can rewrite to path with colon and retain query parameter", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr should rewrite to Vercel", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr should rewrite without hard navigation", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr should not call middleware with shallow push", + "status": "passed" + }, + { + "name": "Middleware Rewrite /fr should correctly rewriting to a different dynamic path", + "status": "passed" + }, + { + "name": "Middleware Rewrite should not have unexpected errors", + "status": "passed" + } + ] + }, + { + "name": "pages performance mark", + "file": "test/e2e/pages-performance-mark/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "pages performance mark should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "streaming SSR with custom next configs", + "file": "test/e2e/streaming-ssr/index.test.ts", + "passed": 5, + "failed": 0, + "skipped": 0, + "total": "5", + "testCases": [ + { + "name": "streaming SSR with custom next configs should match more specific route along with dynamic routes", + "status": "passed" + }, + { + "name": "streaming SSR with custom next configs should render styled-jsx styles in streaming", + "status": "passed" + }, + { + "name": "streaming SSR with custom next configs should redirect paths without trailing-slash and render when slash is appended", + "status": "passed" + }, + { + "name": "streaming SSR with custom next configs should render next/router correctly in edge runtime", + "status": "passed" + }, + { + "name": "streaming SSR with custom next configs should render multi-byte characters correctly in streaming", + "status": "passed" + } + ] + }, + { + "name": "app-dir action handling", + "file": "test/e2e/app-dir/actions-navigation/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 1, + "total": "2", + "testCases": [ + { + "name": "app-dir action handling should handle actions correctly after navigation / redirection events", + "status": "passed" + }, + { + "name": "app-dir action handling should handle actions correctly after following a relative link", + "status": "skipped", + "reason": "Uses CLI output" + } + ] + }, + { + "name": "app-dir - esm js extension", + "file": "test/e2e/app-dir/app-esm-js/index.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "app-dir - esm js extension should be able to render nextjs api in app router", + "status": "passed" + }, + { + "name": "app-dir - esm js extension should be able to use nextjs api in pages router", + "status": "passed" + }, + { + "name": "app-dir - esm js extension should support next/og image", + "status": "passed" + } + ] + }, + { + "name": "app-invalid-revalidate", + "file": "test/e2e/app-dir/app-invalid-revalidate/app-invalid-revalidate.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-invalid-revalidate should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-simple-routes", + "file": "test/e2e/app-dir/app-simple-routes/app-simple-routes.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "app-simple-routes works with simple routes renders a node route", + "status": "passed" + }, + { + "name": "app-simple-routes works with simple routes renders a edge route", + "status": "passed" + } + ] + }, + { + "name": "app-dir back button download bug", + "file": "test/e2e/app-dir/back-button-download-bug/back-button-download-bug.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "conflicting-page-segments", + "file": "test/e2e/app-dir/conflicting-page-segments/conflicting-page-segments.test.ts", + "passed": 0, + "failed": 0, + "skipped": 1, + "total": "1", + "testCases": [ + { + "name": "conflicting-page-segments should throw an error when a route groups causes a conflict with a parallel segment", + "status": "skipped", + "reason": "Uses CLI output" + } + ] + }, + { + "name": "css-order strict", + "file": "test/e2e/app-dir/css-order/css-order.test.ts", + "passed": 176, + "failed": 0, + "skipped": 0, + "total": "176", + "testCases": [ + { + "name": "css-order strict should load correct styles navigating back again first -> second -> first -> second", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again first -> third -> first -> third", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again first -> first-client -> first -> first-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again first -> second-client -> first -> second-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again second -> first -> second -> first", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again second -> third -> second -> third", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again second -> first-client -> second -> first-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again second -> second-client -> second -> second-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again third -> first -> third -> first", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again third -> second -> third -> second", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again third -> first-client -> third -> first-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again third -> second-client -> third -> second-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again first-client -> first -> first-client -> first", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again first-client -> second -> first-client -> second", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again first-client -> third -> first-client -> third", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again first-client -> second-client -> first-client -> second-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again second-client -> first -> second-client -> first", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again second-client -> second -> second-client -> second", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again second-client -> third -> second-client -> third", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again second-client -> first-client -> second-client -> first-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again interleaved-a -> interleaved-b -> interleaved-a -> interleaved-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again interleaved-b -> interleaved-a -> interleaved-b -> interleaved-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again big-interleaved-a -> big-interleaved-b -> big-interleaved-a -> big-interleaved-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again big-interleaved-b -> big-interleaved-a -> big-interleaved-b -> big-interleaved-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again pages-first -> pages-second -> pages-first -> pages-second", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again pages-first -> pages-third -> pages-first -> pages-third", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again pages-second -> pages-first -> pages-second -> pages-first", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again pages-second -> pages-third -> pages-second -> pages-third", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again pages-third -> pages-first -> pages-third -> pages-first", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again pages-third -> pages-second -> pages-third -> pages-second", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again pages-reversed-a -> pages-reversed-b -> pages-reversed-a -> pages-reversed-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again pages-reversed-b -> pages-reversed-a -> pages-reversed-b -> pages-reversed-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating back again pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again first -> second -> first -> second", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again first -> third -> first -> third", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again first -> first-client -> first -> first-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again first -> second-client -> first -> second-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again second -> first -> second -> first", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again second -> third -> second -> third", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again second -> first-client -> second -> first-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again second -> second-client -> second -> second-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again third -> first -> third -> first", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again third -> second -> third -> second", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again third -> first-client -> third -> first-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again third -> second-client -> third -> second-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again first-client -> first -> first-client -> first", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again first-client -> second -> first-client -> second", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again first-client -> third -> first-client -> third", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again first-client -> second-client -> first-client -> second-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again second-client -> first -> second-client -> first", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again second-client -> second -> second-client -> second", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again second-client -> third -> second-client -> third", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again second-client -> first-client -> second-client -> first-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again interleaved-a -> interleaved-b -> interleaved-a -> interleaved-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again interleaved-b -> interleaved-a -> interleaved-b -> interleaved-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again big-interleaved-a -> big-interleaved-b -> big-interleaved-a -> big-interleaved-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again big-interleaved-b -> big-interleaved-a -> big-interleaved-b -> big-interleaved-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again pages-first -> pages-second -> pages-first -> pages-second", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again pages-first -> pages-third -> pages-first -> pages-third", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again pages-second -> pages-first -> pages-second -> pages-first", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again pages-second -> pages-third -> pages-second -> pages-third", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again pages-third -> pages-first -> pages-third -> pages-first", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again pages-third -> pages-second -> pages-third -> pages-second", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again pages-interleaved-b -> pages-interleaved-a -> pages-interleaved-b -> pages-interleaved-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again pages-reversed-a -> pages-reversed-b -> pages-reversed-a -> pages-reversed-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again pages-reversed-b -> pages-reversed-a -> pages-reversed-b -> pages-reversed-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating back again pages-partial-reversed-b -> pages-partial-reversed-a -> pages-partial-reversed-b -> pages-partial-reversed-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating first -> second", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating first -> third", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating first -> first-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating first -> second-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating second -> first", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating second -> third", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating second -> first-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating second -> second-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating third -> first", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating third -> second", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating third -> first-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating third -> second-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating first-client -> first", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating first-client -> second", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating first-client -> third", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating first-client -> second-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating second-client -> first", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating second-client -> second", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating second-client -> third", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating second-client -> first-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating interleaved-a -> interleaved-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating interleaved-b -> interleaved-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating big-interleaved-a -> big-interleaved-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating big-interleaved-b -> big-interleaved-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating pages-first -> pages-second", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating pages-first -> pages-third", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating pages-second -> pages-first", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating pages-second -> pages-third", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating pages-third -> pages-first", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating pages-third -> pages-second", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating pages-interleaved-a -> pages-interleaved-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating pages-interleaved-b -> pages-interleaved-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating pages-reversed-a -> pages-reversed-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating pages-reversed-b -> pages-reversed-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating pages-partial-reversed-a -> pages-partial-reversed-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles navigating pages-partial-reversed-b -> pages-partial-reversed-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating first -> second", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating first -> third", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating first -> first-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating first -> second-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating second -> first", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating second -> third", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating second -> first-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating second -> second-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating third -> first", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating third -> second", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating third -> first-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating third -> second-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating first-client -> first", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating first-client -> second", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating first-client -> third", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating first-client -> second-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating second-client -> first", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating second-client -> second", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating second-client -> third", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating second-client -> first-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating interleaved-a -> interleaved-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating interleaved-b -> interleaved-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating big-interleaved-a -> big-interleaved-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating big-interleaved-b -> big-interleaved-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating pages-first -> pages-second", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating pages-first -> pages-third", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating pages-second -> pages-first", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating pages-second -> pages-third", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating pages-third -> pages-first", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating pages-third -> pages-second", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating pages-interleaved-a -> pages-interleaved-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating pages-interleaved-b -> pages-interleaved-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating pages-reversed-a -> pages-reversed-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating pages-reversed-b -> pages-reversed-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating pages-partial-reversed-a -> pages-partial-reversed-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles navigating pages-partial-reversed-b -> pages-partial-reversed-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on first", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on second", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on third", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on first-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on second-client", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on interleaved-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on interleaved-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on big-interleaved-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on big-interleaved-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on reversed-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on reversed-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on partial-reversed-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on partial-reversed-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on pages-first", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on pages-second", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on pages-third", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on pages-interleaved-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on pages-interleaved-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on pages-reversed-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on pages-reversed-b", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on pages-partial-reversed-a", + "status": "passed" + }, + { + "name": "css-order strict should load correct styles on pages-partial-reversed-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on first", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on second", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on third", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on first-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on second-client", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on interleaved-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on interleaved-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on big-interleaved-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on big-interleaved-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on pages-first", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on pages-second", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on pages-third", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on pages-interleaved-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on pages-interleaved-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on pages-reversed-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on pages-reversed-b", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on pages-partial-reversed-a", + "status": "passed" + }, + { + "name": "css-order loose should load correct styles on pages-partial-reversed-b", + "status": "passed" + } + ] + }, + { + "name": "custom-app-render", + "file": "test/e2e/custom-app-render/custom-app-render.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "custom-app-render should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "getServerSideProps", + "file": "test/e2e/getserversideprops/test/index.test.ts", + "passed": 43, + "failed": 1, + "skipped": 2, + "total": "46", + "testCases": [ + { + "name": "getServerSideProps should navigate between pages successfully", + "status": "passed" + }, + { + "name": "getServerSideProps should work with early request ending", + "status": "passed" + }, + { + "name": "getServerSideProps should allow POST request for getServerSideProps page", + "status": "passed" + }, + { + "name": "getServerSideProps should render correctly when notFound is false (non-dynamic)", + "status": "passed" + }, + { + "name": "getServerSideProps should render 404 correctly when notFound is returned (non-dynamic)", + "status": "passed" + }, + { + "name": "getServerSideProps should render 404 correctly when notFound is returned client-transition (non-dynamic)", + "status": "passed" + }, + { + "name": "getServerSideProps should render correctly when notFound is false (dynamic)", + "status": "passed" + }, + { + "name": "getServerSideProps should render 404 correctly when notFound is returned (dynamic)", + "status": "passed" + }, + { + "name": "getServerSideProps should render 404 correctly when notFound is returned client-transition (dynamic)", + "status": "passed" + }, + { + "name": "getServerSideProps should SSR normal page correctly", + "status": "passed" + }, + { + "name": "getServerSideProps should SSR getServerSideProps page correctly", + "status": "passed" + }, + { + "name": "getServerSideProps should handle throw ENOENT correctly", + "status": "failed" + }, + { + "name": "getServerSideProps should have gssp in __NEXT_DATA__", + "status": "passed" + }, + { + "name": "getServerSideProps should not have gssp in __NEXT_DATA__ for non-GSSP page", + "status": "passed" + }, + { + "name": "getServerSideProps should supply query values SSR", + "status": "passed" + }, + { + "name": "getServerSideProps should supply params values for catchall correctly", + "status": "passed" + }, + { + "name": "getServerSideProps should have original req.url for /_next/data request dynamic page", + "status": "passed" + }, + { + "name": "getServerSideProps should have original req.url for /_next/data request dynamic page with query", + "status": "passed" + }, + { + "name": "getServerSideProps should have original req.url for /_next/data request", + "status": "passed" + }, + { + "name": "getServerSideProps should have original req.url for /_next/data request with query", + "status": "passed" + }, + { + "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page", + "status": "passed" + }, + { + "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page rewrite direct", + "status": "passed" + }, + { + "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page rewrite direct with internal query", + "status": "passed" + }, + { + "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page rewrite param", + "status": "passed" + }, + { + "name": "getServerSideProps should have correct req.url and query for direct visit dynamic page with query", + "status": "passed" + }, + { + "name": "getServerSideProps should have correct req.url and query for direct visit", + "status": "passed" + }, + { + "name": "getServerSideProps should return data correctly", + "status": "passed" + }, + { + "name": "getServerSideProps should pass query for data request", + "status": "passed" + }, + { + "name": "getServerSideProps should return data correctly for dynamic page", + "status": "passed" + }, + { + "name": "getServerSideProps should return data correctly when props is a promise", + "status": "passed" + }, + { + "name": "getServerSideProps should navigate to a normal page and back", + "status": "passed" + }, + { + "name": "getServerSideProps should load a fast refresh page", + "status": "passed" + }, + { + "name": "getServerSideProps should provide correct query value for dynamic page", + "status": "passed" + }, + { + "name": "getServerSideProps should parse query values on mount correctly", + "status": "passed" + }, + { + "name": "getServerSideProps should pass query for data request on navigation", + "status": "passed" + }, + { + "name": "getServerSideProps should reload page on failed data request", + "status": "passed" + }, + { + "name": "getServerSideProps should always call getServerSideProps without caching", + "status": "passed" + }, + { + "name": "getServerSideProps should not re-call getServerSideProps when updating query", + "status": "passed" + }, + { + "name": "getServerSideProps should dedupe server data requests", + "status": "passed" + }, + { + "name": "getServerSideProps should not fetch data on mount", + "status": "passed" + }, + { + "name": "getServerSideProps should not show error for invalid JSON returned from getServerSideProps", + "status": "passed" + }, + { + "name": "getServerSideProps should not show error for invalid JSON returned from getStaticProps on CST", + "status": "passed" + }, + { + "name": "getServerSideProps should not show error for accessing res after gssp returns", + "status": "passed" + }, + { + "name": "getServerSideProps should not warn for accessing res after gssp returns", + "status": "passed" + }, + { + "name": "getServerSideProps should set default caching header", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "getServerSideProps should respect custom caching header", + "status": "skipped", + "reason": "Header whitespace mismatch" + } + ] + }, + { + "name": "Middleware fetches with any HTTP method", + "file": "test/e2e/middleware-fetches-with-any-http-method/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "Middleware fetches with any HTTP method passes the method on a direct fetch request", + "status": "passed" + }, + { + "name": "Middleware fetches with any HTTP method passes the method when providing a Request object", + "status": "passed" + } + ] + }, + { + "name": "Middleware Responses", + "file": "test/e2e/middleware-responses/test/index.test.ts", + "passed": 12, + "failed": 2, + "skipped": 0, + "total": "14", + "testCases": [ + { + "name": "Middleware Responses responds with multiple cookies", + "status": "passed" + }, + { + "name": "Middleware Responses should not fail when returning a stream", + "status": "passed" + }, + { + "name": "Middleware Responses should not fail when returning a text body", + "status": "passed" + }, + { + "name": "Middleware Responses should respond with a 401 status code", + "status": "passed" + }, + { + "name": "Middleware Responses should respond with one header", + "status": "passed" + }, + { + "name": "Middleware Responses should respond with two headers", + "status": "passed" + }, + { + "name": "Middleware Responses should respond appending headers headers", + "status": "failed" + }, + { + "name": "Middleware Responses /fr responds with multiple cookies", + "status": "passed" + }, + { + "name": "Middleware Responses /fr should not fail when returning a stream", + "status": "passed" + }, + { + "name": "Middleware Responses /fr should not fail when returning a text body", + "status": "passed" + }, + { + "name": "Middleware Responses /fr should respond with a 401 status code", + "status": "passed" + }, + { + "name": "Middleware Responses /fr should respond with one header", + "status": "passed" + }, + { + "name": "Middleware Responses /fr should respond with two headers", + "status": "passed" + }, + { + "name": "Middleware Responses /fr should respond appending headers headers", + "status": "failed" + } + ] + }, + { + "name": "New Link Behavior with stitches", + "file": "test/e2e/new-link-behavior/stitches.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "New Link Behavior with stitches should render ", + "status": "passed" + } + ] + }, + { + "name": "next/font", + "file": "test/e2e/next-font/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "next/font app should skip next deploy for now", + "status": "passed" + }, + { + "name": "next/font app-old should skip next deploy for now", + "status": "passed" + } + ] + }, + { + "name": "socket-io", + "file": "test/e2e/socket-io/index.test.js", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "socket-io should support socket.io without falling back to polling", + "status": "passed" + } + ] + }, + { + "name": "app-dir action handling - next export", + "file": "test/e2e/app-dir/actions/app-action-export.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir action handling - next export should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - external dependency", + "file": "test/e2e/app-dir/app-external/app-external.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - external dependency should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-routes-trailing-slash", + "file": "test/e2e/app-dir/app-routes-trailing-slash/app-routes-trailing-slash.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "app-routes-trailing-slash should handle trailing slash for edge runtime", + "status": "passed" + }, + { + "name": "app-routes-trailing-slash should handle trailing slash for node runtime", + "status": "passed" + } + ] + }, + { + "name": "app-dir assetPrefix handling", + "file": "test/e2e/app-dir/asset-prefix/asset-prefix.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "6", + "testCases": [ + { + "name": "app-dir assetPrefix handling should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - next/dynamic", + "file": "test/e2e/app-dir/dynamic/dynamic.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - next/dynamic should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - front redirect issue", + "file": "test/e2e/app-dir/front-redirect-issue/front-redirect-issue.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - front redirect issue should redirect", + "status": "passed" + } + ] + }, + { + "name": "interception-dynamic-segment", + "file": "test/e2e/app-dir/interception-dynamic-segment/interception-dynamic-segment.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "interception-dynamic-segment should work when interception route is paired with a dynamic segment", + "status": "passed" + } + ] + }, + { + "name": "app dir - layout params", + "file": "test/e2e/app-dir/layout-params/layout-params.test.ts", + "passed": 6, + "failed": 0, + "skipped": 0, + "total": "6", + "testCases": [ + { + "name": "app dir - layout params basic params check layout without params get no params", + "status": "passed" + }, + { + "name": "app dir - layout params basic params check layout renders just it's params", + "status": "passed" + }, + { + "name": "app dir - layout params basic params check topmost layout renders all params", + "status": "passed" + }, + { + "name": "app dir - layout params catchall params should give catchall params just to last layout", + "status": "passed" + }, + { + "name": "app dir - layout params catchall params should give optional catchall params just to last layout", + "status": "passed" + }, + { + "name": "app dir - layout params catchall params should give empty optional catchall params won't give params to any layout", + "status": "passed" + } + ] + }, + { + "name": "mjs as extension", + "file": "test/e2e/app-dir/mjs-as-extension/mjs-as-extension.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "mjs as extension should render the page correctly", + "status": "passed" + } + ] + }, + { + "name": "app dir - next-image", + "file": "test/e2e/app-dir/next-image/next-image.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - next-image should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "parallel-routes-catchall-dynamic-segment", + "file": "test/e2e/app-dir/parallel-routes-catchall-dynamic-segment/parallel-routes-catchall-dynamic-segment.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "parallel-routes-catchall-dynamic-segment should match default and dynamic segment paths before catch-all", + "status": "passed" + } + ] + }, + { + "name": "app-dir - params hooks compat", + "file": "test/e2e/app-dir/params-hooks-compat/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "app-dir - params hooks compat should only access search params with useSearchParams", + "status": "passed" + }, + { + "name": "app-dir - params hooks compat should only access path params with useParams", + "status": "passed" + } + ] + }, + { + "name": "router autoscrolling on navigation", + "file": "test/e2e/app-dir/router-autoscroll/router-autoscroll.test.ts", + "passed": 13, + "failed": 0, + "skipped": 0, + "total": "14", + "testCases": [ + { + "name": "router autoscrolling on navigation vertical scroll should scroll to top of document when navigating between to pages without layout", + "status": "passed" + }, + { + "name": "router autoscrolling on navigation vertical scroll should scroll to top of page when scrolling to phe top of the document wouldn't have the page in the viewport", + "status": "passed" + }, + { + "name": "router autoscrolling on navigation vertical scroll should scroll down to the navigated page when it's below viewort", + "status": "passed" + }, + { + "name": "router autoscrolling on navigation vertical scroll should not scroll when the top of the page is in the viewport", + "status": "passed" + }, + { + "name": "router autoscrolling on navigation vertical scroll should not scroll to top of document if page in viewport", + "status": "passed" + }, + { + "name": "router autoscrolling on navigation vertical scroll should scroll to top of document if possible while giving focus to page", + "status": "passed" + }, + { + "name": "router autoscrolling on navigation horizontal scroll should't scroll horizontally", + "status": "passed" + }, + { + "name": "router autoscrolling on navigation router.refresh() should not scroll when called alone", + "status": "passed" + }, + { + "name": "router autoscrolling on navigation router.refresh() should not stop router.push() from scrolling", + "status": "passed" + }, + { + "name": "router autoscrolling on navigation bugs Should scroll to the top of the layout when the first child is display none", + "status": "passed" + }, + { + "name": "router autoscrolling on navigation bugs Should scroll to the top of the layout when the first child is position fixed", + "status": "passed" + }, + { + "name": "router autoscrolling on navigation bugs Should scroll to the top of the layout when the first child is position sticky", + "status": "passed" + }, + { + "name": "router autoscrolling on navigation bugs Should apply scroll when loading.js is used", + "status": "passed" + } + ] + }, + { + "name": "Valid Nested CSS Module Usage from within node_modules", + "file": "test/e2e/app-dir/scss/nm-module-nested/nm-module-nested.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Valid Nested CSS Module Usage from within node_modules should render the page", + "status": "passed" + } + ] + }, + { + "name": "Good CSS Import from node_modules", + "file": "test/e2e/app-dir/scss/npm-import/npm-import.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Good CSS Import from node_modules should render the page", + "status": "passed" + } + ] + }, + { + "name": "Basic Global Support with src/ dir", + "file": "test/e2e/app-dir/scss/single-global-src/single-global-src.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Basic Global Support with src/ dir should render the page", + "status": "passed" + } + ] + }, + { + "name": "set-cookies", + "file": "test/e2e/app-dir/set-cookies/set-cookies.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "set-cookies should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "webpack-loader-conditions", + "file": "test/e2e/app-dir/webpack-loader-conditions/webpack-loader-conditions.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "webpack-loader-conditions should only run the test in turbopack", + "status": "passed" + } + ] + }, + { + "name": "Conflict between app file and pages file", + "file": "test/e2e/conflicting-app-page-error/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Conflict between app file and pages file should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "New Link Behavior", + "file": "test/e2e/new-link-behavior/index.test.ts", + "passed": 7, + "failed": 0, + "skipped": 0, + "total": "7", + "testCases": [ + { + "name": "New Link Behavior should render link with ", + "status": "passed" + }, + { + "name": "New Link Behavior should navigate to /about", + "status": "passed" + }, + { + "name": "New Link Behavior should handle onclick", + "status": "passed" + }, + { + "name": "New Link Behavior should handle preventdefault", + "status": "passed" + }, + { + "name": "New Link Behavior should render link with id", + "status": "passed" + }, + { + "name": "New Link Behavior should render link with classname", + "status": "passed" + }, + { + "name": "New Link Behavior should render link with multiple children", + "status": "passed" + } + ] + }, + { + "name": "next/font/google without-preloaded-fonts without _app", + "file": "test/e2e/next-font/without-preloaded-fonts.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "next/font/google without-preloaded-fonts without _app should skip next deploy for now", + "status": "passed" + }, + { + "name": "next/font/google no preloads with _app should skip next deploy for now", + "status": "passed" + } + ] + }, + { + "name": "skip-trailing-slash-redirect", + "file": "test/e2e/skip-trailing-slash-redirect/index.test.ts", + "passed": 23, + "failed": 2, + "skipped": 5, + "total": "30", + "testCases": [ + { + "name": "skip-trailing-slash-redirect should parse locale info for data request correctly", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect should be able to redirect locale casing $1", + "status": "failed" + }, + { + "name": "skip-trailing-slash-redirect should be able to redirect locale casing $1", + "status": "failed" + }, + { + "name": "skip-trailing-slash-redirect should handle external rewrite correctly /docs/first", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect should handle external rewrite correctly /docs-auto-static/first", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect should handle external rewrite correctly /docs-ssr/first", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect should allow rewriting invalid buildId correctly", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect should provide original _next/data URL with skipMiddlewareUrlNormalize", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect should allow response body from middleware with flag", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect should correct skip URL normalizing in middleware", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect should apply config redirect correctly", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect should apply config rewrites correctly", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect should not apply trailing slash on load on client", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect pages dir should not apply trailing slash redirect (with slash)", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect pages dir should not apply trailing slash redirect (without slash)", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect pages dir should preserve original trailing slashes to links on client", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect pages dir should respond to index correctly", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect pages dir should respond to dynamic route correctly", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect pages dir should navigate client side correctly", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should not apply trailing slash redirect (with slash)", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should not apply trailing slash redirect (without slash)", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should preserve original trailing slashes to links on client", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should respond to index correctly", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should respond to dynamic route correctly", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect app dir - skip trailing slash redirect should navigate client side correctly", + "status": "passed" + }, + { + "name": "skip-trailing-slash-redirect should merge cookies from middleware and API routes correctly", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "skip-trailing-slash-redirect should merge cookies from middleware and edge API routes correctly", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "skip-trailing-slash-redirect should handle external rewrite correctly /chained-rewrite-ssr", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "skip-trailing-slash-redirect should handle external rewrite correctly /chained-rewrite-static", + "status": "skipped", + "reason": "Header whitespace mismatch" + }, + { + "name": "skip-trailing-slash-redirect should handle external rewrite correctly /chained-rewrite-ssg", + "status": "skipped", + "reason": "Header whitespace mismatch" + } + ] + }, + { + "name": "yarn PnP", + "file": "test/e2e/yarn-pnp/test/with-next-sass.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "yarn PnP should not run for next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-dir action useFormState", + "file": "test/e2e/app-dir/actions/app-action-form-state.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ + { + "name": "app-dir action useFormState should support submitting form state with JS", + "status": "passed" + }, + { + "name": "app-dir action useFormState should support submitting form state without JS", + "status": "passed" + }, + { + "name": "app-dir action useFormState should support hydrating the app from progressively enhanced form request", + "status": "passed" + }, + { + "name": "app-dir action useFormState should send the action to the provided permalink with form state when JS disabled", + "status": "passed" + } + ] + }, + { + "name": "app-dir with middleware", + "file": "test/e2e/app-dir/app-middleware/app-middleware.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "app-dir with middleware should skip next deploy", + "status": "passed" + }, + { + "name": "app dir - middleware without pages dir should skip next deploy", + "status": "passed" + }, + { + "name": "app dir - middleware with middleware in src dir should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "dynamic-requests", + "file": "test/e2e/app-dir/dynamic-requests/dynamic-requests.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "dynamic-requests should not error for dynamic requests in pages", + "status": "passed" + }, + { + "name": "dynamic-requests should not error for dynamic requests in routes", + "status": "passed" + } + ] + }, + { + "name": "edge-route-rewrite", + "file": "test/e2e/app-dir/edge-route-rewrite/edge-route-rewrite.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "edge-route-rewrite it should support a rewrite to an edge route", + "status": "passed" + }, + { + "name": "edge-route-rewrite it should support a rewrite to a dynamic edge route", + "status": "passed" + } + ] + }, + { + "name": "app dir - global error - with catch-all route", + "file": "test/e2e/app-dir/global-error/catch-all/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - global error - with catch-all route should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "interception-routes-root-catchall", + "file": "test/e2e/app-dir/interception-routes-root-catchall/interception-routes-root-catchall.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "interception-routes-root-catchall should support having a root catch-all and a catch-all in a parallel route group", + "status": "passed" + }, + { + "name": "interception-routes-root-catchall should handle non-intercepted catch-all pages", + "status": "passed" + } + ] + }, + { + "name": "app-dir metadata-json-manifest", + "file": "test/e2e/app-dir/metadata-json-manifest/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir metadata-json-manifest should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - metadata", + "file": "test/e2e/app-dir/metadata/metadata.test.ts", + "passed": 41, + "failed": 0, + "skipped": 5, + "total": "46", + "testCases": [ + { + "name": "app dir - metadata basic should support title and description", + "status": "passed" + }, + { + "name": "app dir - metadata basic should support title template", + "status": "passed" + }, + { + "name": "app dir - metadata basic should support stashed title in one layer of page and layout", + "status": "passed" + }, + { + "name": "app dir - metadata basic should use parent layout title when no title is defined in page", + "status": "passed" + }, + { + "name": "app dir - metadata basic should support stashed title in two layers of page and layout", + "status": "passed" + }, + { + "name": "app dir - metadata basic should support apple related tags `itunes` and `appWebApp`", + "status": "passed" + }, + { + "name": "app dir - metadata basic should support alternate tags", + "status": "passed" + }, + { + "name": "app dir - metadata basic should relative canonical url", + "status": "passed" + }, + { + "name": "app dir - metadata basic should not contain query in canonical url after client navigation", + "status": "passed" + }, + { + "name": "app dir - metadata basic should support robots tags", + "status": "passed" + }, + { + "name": "app dir - metadata basic should support verification tags", + "status": "passed" + }, + { + "name": "app dir - metadata basic should support appLinks tags", + "status": "passed" + }, + { + "name": "app dir - metadata basic should apply metadata when navigating client-side", + "status": "passed" + }, + { + "name": "app dir - metadata basic should support generateMetadata export", + "status": "passed" + }, + { + "name": "app dir - metadata basic should handle metadataBase for urls resolved as only URL type", + "status": "passed" + }, + { + "name": "app dir - metadata opengraph should support opengraph tags", + "status": "passed" + }, + { + "name": "app dir - metadata opengraph should support opengraph with article type", + "status": "passed" + }, + { + "name": "app dir - metadata opengraph should override file based images when opengraph-image and twitter-image specify images property", + "status": "passed" + }, + { + "name": "app dir - metadata navigation should render root not-found with default metadata", + "status": "passed" + }, + { + "name": "app dir - metadata navigation should support notFound in generateMetadata", + "status": "passed" + }, + { + "name": "app dir - metadata navigation should support redirect in generateMetadata", + "status": "passed" + }, + { + "name": "app dir - metadata icons should support basic object icons field", + "status": "passed" + }, + { + "name": "app dir - metadata icons should support basic string icons field", + "status": "passed" + }, + { + "name": "app dir - metadata icons should support basic complex descriptor icons field", + "status": "passed" + }, + { + "name": "app dir - metadata icons should merge icons from layout if no static icons files are specified", + "status": "passed" + }, + { + "name": "app dir - metadata icons should not hoist meta[itemProp] to head", + "status": "passed" + }, + { + "name": "app dir - metadata icons should support root level of favicon.ico", + "status": "passed" + }, + { + "name": "app dir - metadata file based icons should render icon and apple touch icon meta if their images are specified", + "status": "passed" + }, + { + "name": "app dir - metadata file based icons should not render if image file is not specified", + "status": "passed" + }, + { + "name": "app dir - metadata twitter should support twitter card summary_large_image when image present", + "status": "passed" + }, + { + "name": "app dir - metadata twitter should render twitter card summary when image is not present", + "status": "passed" + }, + { + "name": "app dir - metadata twitter should support default twitter player card", + "status": "passed" + }, + { + "name": "app dir - metadata twitter should support default twitter app card", + "status": "passed" + }, + { + "name": "app dir - metadata static routes should support root dir robots.txt", + "status": "passed" + }, + { + "name": "app dir - metadata static routes should support sitemap.xml under every routes", + "status": "passed" + }, + { + "name": "app dir - metadata static routes should support static manifest.webmanifest", + "status": "passed" + }, + { + "name": "app dir - metadata viewport should support dynamic viewport export", + "status": "passed" + }, + { + "name": "app dir - metadata react cache should have same title and page value on initial load", + "status": "passed" + }, + { + "name": "app dir - metadata react cache should have same title and page value when navigating", + "status": "passed" + }, + { + "name": "app dir - metadata should not effect metadata images convention like files under pages directory", + "status": "passed" + }, + { + "name": "app dir - metadata should not crash from error thrown during preloading nested generateMetadata", + "status": "passed" + }, + { + "name": "app dir - metadata opengraph should pick up opengraph-image and twitter-image as static metadata files", + "status": "skipped", + "reason": "Hard-coded Vercel URL or env var" + }, + { + "name": "app dir - metadata static routes should have /favicon.ico as route", + "status": "skipped", + "reason": "Hard-coded Vercel URL or env var" + }, + { + "name": "app dir - metadata static routes should have icons as route", + "status": "skipped", + "reason": "Hard-coded Vercel URL or env var" + }, + { + "name": "app dir - metadata basic should support other basic tags", + "status": "skipped", + "reason": "Hard-coded Vercel URL or env var" + }, + { + "name": "app dir - metadata basic should support other basic tags (edge)", + "status": "skipped", + "reason": "Hard-coded Vercel URL or env var" + } + ] + }, + { + "name": "parallel-routes-layouts", + "file": "test/e2e/app-dir/parallel-routes-layouts/parallel-routes-layouts.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "parallel-routes-layouts should properly render layouts for multiple slots", + "status": "passed" + } + ] + }, + { + "name": "app-dir root layout", + "file": "test/e2e/app-dir/root-layout/root-layout.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir root layout should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "Catch-all Route CSS Module Usage", + "file": "test/e2e/app-dir/scss/catch-all-module/catch-all-module.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Catch-all Route CSS Module Usage should render the module", + "status": "passed" + } + ] + }, + { + "name": "Invalid CSS Global Module Usage in node_modules", + "file": "test/e2e/app-dir/scss/invalid-global-module/invalid-global-module.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "Invalid Global CSS", + "file": "test/e2e/app-dir/scss/invalid-global/invalid-global.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "Multi Global Support", + "file": "test/e2e/app-dir/scss/multi-global/multi-global.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Multi Global Support should render the page", + "status": "passed" + } + ] + }, + { + "name": "SCSS Support loader handling", + "file": "test/e2e/app-dir/scss/url-global-asset-prefix-1/url-global-asset-prefix-1.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "SCSS Support loader handling", + "file": "test/e2e/app-dir/scss/url-global-partial/url-global-partial.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "SCSS Support loader handling CSS URL via file-loader sass partial should render the page", + "status": "passed" + } + ] + }, + { + "name": "app-dir similar pages paths", + "file": "test/e2e/app-dir/similar-pages-paths/similar-pages-paths.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir similar pages paths should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "underscore-ignore-app-paths", + "file": "test/e2e/app-dir/underscore-ignore-app-paths/underscore-ignore-app-paths.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "underscore-ignore-app-paths should not serve app path with underscore", + "status": "passed" + }, + { + "name": "underscore-ignore-app-paths should serve pages path with underscore", + "status": "passed" + }, + { + "name": "underscore-ignore-app-paths should serve app path with %5F", + "status": "passed" + } + ] + }, + { + "name": "children-page", + "file": "test/e2e/children-page/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "children-page with app dir should show the content if you have a page named children", + "status": "passed" + }, + { + "name": "children-page with pages dir should show the content if you have a page named children", + "status": "passed" + } + ] + }, + { + "name": "Edge runtime pages-api route", + "file": "test/e2e/edge-runtime-pages-api-route/edge-runtime-pages-api-route.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "Edge runtime pages-api route should work edge runtime", + "status": "passed" + }, + { + "name": "Edge runtime pages-api route should work with node runtime", + "status": "passed" + } + ] + }, + { + "name": "i18n-ignore-rewrite-source-locale", + "file": "test/e2e/i18n-ignore-rewrite-source-locale/rewrites.test.ts", + "passed": 4, + "failed": 4, + "skipped": 0, + "total": "8", + "testCases": [ + { + "name": "i18n-ignore-rewrite-source-locale get public file by skipping locale in rewrite, locale: ", + "status": "failed" + }, + { + "name": "i18n-ignore-rewrite-source-locale get public file by skipping locale in rewrite, locale: /en", + "status": "failed" + }, + { + "name": "i18n-ignore-rewrite-source-locale get public file by skipping locale in rewrite, locale: /sv", + "status": "failed" + }, + { + "name": "i18n-ignore-rewrite-source-locale get public file by skipping locale in rewrite, locale: /nl", + "status": "failed" + }, + { + "name": "i18n-ignore-rewrite-source-locale call api by skipping locale in rewrite, locale: ", + "status": "passed" + }, + { + "name": "i18n-ignore-rewrite-source-locale call api by skipping locale in rewrite, locale: /en", + "status": "passed" + }, + { + "name": "i18n-ignore-rewrite-source-locale call api by skipping locale in rewrite, locale: /sv", + "status": "passed" + }, + { + "name": "i18n-ignore-rewrite-source-locale call api by skipping locale in rewrite, locale: /nl", + "status": "passed" + } + ] + }, + { + "name": "Middleware custom matchers i18n", + "file": "test/e2e/middleware-custom-matchers-i18n/test/index.test.ts", + "passed": 8, + "failed": 1, + "skipped": 0, + "total": "13", + "testCases": [ + { + "name": "Middleware custom matchers i18n should match", + "status": "passed" + }, + { + "name": "Middleware custom matchers i18n should match", + "status": "passed" + }, + { + "name": "Middleware custom matchers i18n should match", + "status": "passed" + }, + { + "name": "Middleware custom matchers i18n should match", + "status": "passed" + }, + { + "name": "Middleware custom matchers i18n should not match", + "status": "failed" + }, + { + "name": "Middleware custom matchers i18n should not match", + "status": "passed" + }, + { + "name": "Middleware custom matchers i18n should not match", + "status": "passed" + }, + { + "name": "Middleware custom matchers i18n should not match", + "status": "passed" + }, + { + "name": "Middleware custom matchers with root should not match", + "status": "passed" + } + ] + }, + { + "name": "browser-shallow-navigation", + "file": "test/e2e/middleware-shallow-link/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "browser-shallow-navigation should render the correct page", + "status": "passed" + } + ] + }, + { + "name": "Middleware Runtime trailing slash", + "file": "test/e2e/middleware-trailing-slash/test/index.test.ts", + "passed": 22, + "failed": 1, + "skipped": 0, + "total": "23", + "testCases": [ + { + "name": "Middleware Runtime trailing slash with .html extension should work when requesting the page directly", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash with .html extension should work using browser", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash with .html extension should work when navigating", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash without .html extension should work when requesting the page directly", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash without .html extension should work using browser", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash without .html extension should work when navigating", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should have init header for NextResponse.redirect", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should have correct query values for rewrite to ssg page", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should have correct dynamic route params on client-transition to dynamic route", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should have correct dynamic route params for middleware rewrite to dynamic route", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should have correct route params for chained rewrite from middleware to config rewrite", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should have correct route params for rewrite from config dynamic route", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should have correct route params for rewrite from config non-dynamic route", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should redirect the same for direct visit and client-transition", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should rewrite the same for direct visit and client-transition", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should rewrite correctly for non-SSG/SSP page", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should respond with 400 on decode failure", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should validate & parse request url from any route", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should trigger middleware for data requests", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should normalize data requests into page requests", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash should keep non data requests in their original shape", + "status": "failed" + }, + { + "name": "Middleware Runtime trailing slash should add a rewrite header on data requests for rewrites", + "status": "passed" + }, + { + "name": "Middleware Runtime trailing slash allows shallow linking with middleware", + "status": "passed" + } + ] + }, + { + "name": "beforeInteractive in document Head", + "file": "test/e2e/next-script/index.test.ts", + "passed": 8, + "failed": 0, + "skipped": 0, + "total": "8", + "testCases": [ + { + "name": "beforeInteractive in document Head Script is injected server-side", + "status": "passed" + }, + { + "name": "beforeInteractive in document body Script is injected server-side", + "status": "passed" + }, + { + "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: false with no Partytown dependency Partytown snippet is not injected to head if not enabled in configuration", + "status": "passed" + }, + { + "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with required Partytown dependency for external script Partytown snippets are injected to head if enabled in configuration", + "status": "passed" + }, + { + "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with required Partytown dependency for external script Worker scripts are modified by Partytown to execute on a worker thread", + "status": "passed" + }, + { + "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with required Partytown dependency for inline script Inline worker script through children is modified by Partytown to execute on a worker thread", + "status": "passed" + }, + { + "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with required Partytown dependency for inline script Inline worker script through dangerouslySetInnerHtml is modified by Partytown to execute on a worker thread", + "status": "passed" + }, + { + "name": "experimental.nextScriptWorkers experimental.nextScriptWorkers: true with config override Partytown config script is overwritten", + "status": "passed" + } + ] + }, + { + "name": "app-dir action progressive enhancement", + "file": "test/e2e/app-dir/actions/app-action-progressive-enhancement.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "app-dir action progressive enhancement should support formData and redirect without JS", + "status": "passed" + }, + { + "name": "app-dir action progressive enhancement should support actions from client without JS", + "status": "passed" + } + ] + }, + { + "name": "app dir client cache semantics (experimental staleTimes)", + "file": "test/e2e/app-dir/app-client-cache/client-cache.experimental.test.ts", + "passed": 7, + "failed": 0, + "skipped": 2, + "total": "9", + "testCases": [ + { + "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={true} should re-use the cache for 5 minutes (default \"static\" time)", + "status": "passed" + }, + { + "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={false} should trigger a loading state before fetching the page, followed by fresh data on every subsequent navigation", + "status": "passed" + }, + { + "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={false} without a loading boundary should get fresh data on every subsequent navigation", + "status": "passed" + }, + { + "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={undefined} - default should trigger a loading state before fetching the page, followed by fresh data on every subsequent navigation", + "status": "passed" + }, + { + "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 prefetch={undefined} - default without a loading boundary should get fresh data on every subsequent navigation", + "status": "passed" + }, + { + "name": "app dir client cache semantics (experimental staleTimes) static: 180 prefetch={true} should use the custom static override time (3 minutes)", + "status": "passed" + }, + { + "name": "app dir client cache semantics (experimental staleTimes) static: 180 prefetch={undefined} - default should re-use the loading boundary for the custom static override time (3 minutes)", + "status": "passed" + }, + { + "name": "app dir client cache semantics (experimental staleTimes) dynamic: 0 telemetry should send staleTimes feature usage event", + "status": "skipped", + "reason": "Uses CLI output" + }, + { + "name": "app dir client cache semantics (experimental staleTimes) static: 180 telemetry should send staleTimes feature usage event", + "status": "skipped", + "reason": "Uses CLI output" + } + ] + }, + { + "name": "router autoscrolling on navigation with css modules", + "file": "test/e2e/app-dir/autoscroll-with-css-modules/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "router autoscrolling on navigation with css modules vertical scroll when page imports css modules should scroll to top of document when navigating between to pages without layout when", + "status": "passed" + }, + { + "name": "router autoscrolling on navigation with css modules vertical scroll when page imports css modules should scroll when clicking in JS", + "status": "passed" + } + ] + }, + { + "name": "app dir - dynamic css", + "file": "test/e2e/app-dir/dynamic-css/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - dynamic css should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-dir - errors", + "file": "test/e2e/app-dir/errors/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir - errors should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - imports", + "file": "test/e2e/app-dir/import/import.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ + { + "name": "app dir - imports we can import all components from .js", + "status": "passed" + }, + { + "name": "app dir - imports we can import all components from .jsx", + "status": "passed" + }, + { + "name": "app dir - imports we can import all components from .ts", + "status": "passed" + }, + { + "name": "app dir - imports we can import all components from .tsx", + "status": "passed" + } + ] + }, + { + "name": "app-dir - logging", + "file": "test/e2e/app-dir/logging/fetch-logging.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "5", + "testCases": [ + { + "name": "app-dir - logging should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "parallel-routes-catchall-children-slot", + "file": "test/e2e/app-dir/parallel-routes-catchall-children-slot/parallel-routes-catchall-children-slot.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "parallel-routes-catchall-children-slot should match the @children slot for a page before attempting to match the catchall", + "status": "passed" + } + ] + }, + { + "name": "parallel-routes-use-selected-layout-segment", + "file": "test/e2e/app-dir/parallel-routes-use-selected-layout-segment/parallel-routes-use-selected-layout-segment.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ + { + "name": "parallel-routes-use-selected-layout-segment hard nav to router page and soft nav around other router pages", + "status": "passed" + }, + { + "name": "parallel-routes-use-selected-layout-segment hard nav to router page and soft nav to parallel routes", + "status": "passed" + }, + { + "name": "parallel-routes-use-selected-layout-segment hard nav to router page and soft nav to parallel route and soft nav back to another router page", + "status": "passed" + }, + { + "name": "parallel-routes-use-selected-layout-segment hard nav to parallel route", + "status": "passed" + } + ] + }, + { + "name": "router-stuck-dynamic-static-segment", + "file": "test/e2e/app-dir/router-stuck-dynamic-static-segment/router-stuck-dynamic-static-segment.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "router-stuck-dynamic-static-segment should allow navigation between dynamic parameter and static parameter of the same value", + "status": "passed" + } + ] + }, + { + "name": "CSS Module Composes Usage (Basic)", + "file": "test/e2e/app-dir/scss/composes-basic/composes-basic.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "CSS Module Composes Usage (Basic) should render the module", + "status": "passed" + } + ] + }, + { + "name": "Valid CSS Module Usage from within node_modules", + "file": "test/e2e/app-dir/scss/nm-module/nm-module.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Valid CSS Module Usage from within node_modules should render the page", + "status": "passed" + } + ] + }, + { + "name": "SCSS Support loader handling", + "file": "test/e2e/app-dir/scss/url-global-asset-prefix-2/url-global-asset-prefix-2.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "Valid and Invalid Global CSS with Custom App", + "file": "test/e2e/app-dir/scss/valid-and-invalid-global/valid-and-invalid-global.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "app dir - search params keys", + "file": "test/e2e/app-dir/search-params-react-key/layout-params.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - search params keys should keep the React router instance the same when changing the search params", + "status": "passed" + } + ] + }, + { + "name": "app-dir static-generation-status", + "file": "test/e2e/app-dir/static-generation-status/index.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "app-dir static-generation-status should render the page using notFound with status 404", + "status": "passed" + }, + { + "name": "app-dir static-generation-status should render the page using redirect with status 307", + "status": "passed" + }, + { + "name": "app-dir static-generation-status should render the non existed route redirect with status 404", + "status": "passed" + } + ] + }, + { + "name": "with babel", + "file": "test/e2e/app-dir/with-babel/with-babel.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "with babel with babel should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "Edge compiler module exports preference", + "file": "test/e2e/edge-compiler-module-exports-preference/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Edge compiler module exports preference favors the browser export", + "status": "passed" + } + ] + }, + { + "name": "hello-world", + "file": "test/e2e/hello-world/hello-world.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ + { + "name": "hello-world should work using cheerio", + "status": "passed" + }, + { + "name": "hello-world should work using browser", + "status": "passed" + }, + { + "name": "hello-world should work with html", + "status": "passed" + }, + { + "name": "hello-world should work with fetch", + "status": "passed" + } + ] + }, + { + "name": "i18n: Event with stale state - static route previously was dynamic", + "file": "test/e2e/ignore-invalid-popstateevent/with-i18n.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "i18n: Event with stale state - static route previously was dynamic Ignore event without query param", + "status": "passed" + }, + { + "name": "i18n: Event with stale state - static route previously was dynamic Ignore event with query param", + "status": "passed" + }, + { + "name": "i18n: Event with stale state - static route previously was dynamic Don't ignore event with different locale", + "status": "passed" + } + ] + }, + { + "name": "Middleware custom matchers", + "file": "test/e2e/middleware-custom-matchers/test/index.test.ts", + "passed": 7, + "failed": 0, + "skipped": 0, + "total": "10", + "testCases": [ + { + "name": "Middleware custom matchers should match missing header correctly", + "status": "passed" + }, + { + "name": "Middleware custom matchers should match missing query correctly", + "status": "passed" + }, + { + "name": "Middleware custom matchers should match source path", + "status": "passed" + }, + { + "name": "Middleware custom matchers should match has header", + "status": "passed" + }, + { + "name": "Middleware custom matchers should match has query", + "status": "passed" + }, + { + "name": "Middleware custom matchers should match has cookie", + "status": "passed" + }, + { + "name": "Middleware custom matchers should match has header value", + "status": "passed" + } + ] + }, + { + "name": "New Link Behavior with child", + "file": "test/e2e/new-link-behavior/child-a-tag-error.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "New Link Behavior with child should throw error with child", + "status": "passed" + } + ] + }, + { + "name": "New Link Behavior", + "file": "test/e2e/new-link-behavior/typescript.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "New Link Behavior should render link with ", + "status": "passed" + }, + { + "name": "New Link Behavior should apply ref on link", + "status": "passed" + } + ] + }, + { + "name": "nonce head manager", + "file": "test/e2e/nonce-head-manager/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "nonce head manager should not re-execute the script when re-rendering", + "status": "passed" + }, + { + "name": "nonce head manager should not re-execute the script when re-rendering with CSP header", + "status": "passed" + } + ] + }, + { + "name": "react-dnd-compile", + "file": "test/e2e/react-dnd-compile/react-dnd-compile.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "react-dnd-compile should work", + "status": "passed" + }, + { + "name": "react-dnd-compile should work on react-dnd import page", + "status": "passed" + } + ] + }, + { + "name": "yarn PnP", + "file": "test/e2e/yarn-pnp/test/with-mdx.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "yarn PnP should not run for next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-dir action size limit invalid config", + "file": "test/e2e/app-dir/actions/app-action-size-limit-invalid.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-dir action size limit invalid config should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app-routes-subrequests", + "file": "test/e2e/app-dir/app-routes-subrequests/app-routes-subrequests.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app-routes-subrequests should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "async-component-preload", + "file": "test/e2e/app-dir/async-component-preload/async-component-preload.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "async-component-preload should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "app dir - draft mode", + "file": "test/e2e/app-dir/draft-mode/draft-mode.test.ts", + "passed": 21, + "failed": 0, + "skipped": 0, + "total": "21", + "testCases": [ + { + "name": "app dir - draft mode in nodejs runtime should use initial rand when draft mode is disabled on /index", + "status": "passed" + }, + { + "name": "app dir - draft mode in nodejs runtime should use initial rand when draft mode is disabled on /with-cookies", + "status": "passed" + }, + { + "name": "app dir - draft mode in nodejs runtime should not generate rand when draft mode disabled during next start", + "status": "passed" + }, + { + "name": "app dir - draft mode in nodejs runtime should not read other cookies when draft mode disabled during next start", + "status": "passed" + }, + { + "name": "app dir - draft mode in nodejs runtime should be disabled from api route handler", + "status": "passed" + }, + { + "name": "app dir - draft mode in nodejs runtime should have set-cookie header on enable", + "status": "passed" + }, + { + "name": "app dir - draft mode in nodejs runtime should have set-cookie header with redirect location", + "status": "passed" + }, + { + "name": "app dir - draft mode in nodejs runtime should genenerate rand when draft mode enabled", + "status": "passed" + }, + { + "name": "app dir - draft mode in nodejs runtime should read other cookies when draft mode enabled", + "status": "passed" + }, + { + "name": "app dir - draft mode in nodejs runtime should be enabled from api route handler when draft mode enabled", + "status": "passed" + }, + { + "name": "app dir - draft mode in nodejs runtime should not perform full page navigation on router.refresh()", + "status": "passed" + }, + { + "name": "app dir - draft mode in edge runtime should use initial rand when draft mode is disabled on /with-edge/index", + "status": "passed" + }, + { + "name": "app dir - draft mode in edge runtime should use initial rand when draft mode is disabled on /with-edge/with-cookies", + "status": "passed" + }, + { + "name": "app dir - draft mode in edge runtime should not read other cookies when draft mode disabled during next start", + "status": "passed" + }, + { + "name": "app dir - draft mode in edge runtime should be disabled from api route handler", + "status": "passed" + }, + { + "name": "app dir - draft mode in edge runtime should have set-cookie header on enable", + "status": "passed" + }, + { + "name": "app dir - draft mode in edge runtime should have set-cookie header with redirect location", + "status": "passed" + }, + { + "name": "app dir - draft mode in edge runtime should genenerate rand when draft mode enabled", + "status": "passed" + }, + { + "name": "app dir - draft mode in edge runtime should read other cookies when draft mode enabled", + "status": "passed" + }, + { + "name": "app dir - draft mode in edge runtime should be enabled from api route handler when draft mode enabled", + "status": "passed" + }, + { + "name": "app dir - draft mode in edge runtime should not perform full page navigation on router.refresh()", + "status": "passed" + } + ] + }, + { + "name": "app dir - not found navigation", + "file": "test/e2e/app-dir/error-boundary-navigation/index.test.ts", + "passed": 7, + "failed": 0, + "skipped": 0, + "total": "7", + "testCases": [ + { + "name": "app dir - not found navigation should allow navigation on not-found", + "status": "passed" + }, + { + "name": "app dir - not found navigation should allow navigation on error", + "status": "passed" + }, + { + "name": "app dir - not found navigation should allow navigation to other routes on route that was initially not-found", + "status": "passed" + }, + { + "name": "app dir - not found navigation should allow navigation back to route that was initially not-found", + "status": "passed" + }, + { + "name": "app dir - not found navigation should allow navigating to a page calling notfound", + "status": "passed" + }, + { + "name": "app dir - not found navigation should allow navigating to a non-existent page", + "status": "passed" + }, + { + "name": "app dir - not found navigation should be able to navigate to other page from root not-found page", + "status": "passed" + } + ] + }, + { + "name": "hello-world", + "file": "test/e2e/app-dir/hello-world/hello-world.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ + { + "name": "hello-world should work using cheerio", + "status": "passed" + }, + { + "name": "hello-world should work using browser", + "status": "passed" + }, + { + "name": "hello-world should work with html", + "status": "passed" + }, + { + "name": "hello-world should work with fetch", + "status": "passed" + } + ] + }, + { + "name": "navigation between pages and app dir", + "file": "test/e2e/app-dir/interoperability-with-pages/navigation.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "navigation between pages and app dir It should be able to navigate app -> pages", + "status": "passed" + }, + { + "name": "navigation between pages and app dir It should be able to navigate pages -> app", + "status": "passed" + } + ] + }, + { + "name": "modularizeImports", + "file": "test/e2e/app-dir/modularizeimports/modularizeimports.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "modularizeImports should work", + "status": "passed" + }, + { + "name": "modularizeImports should work with MDX", + "status": "passed" + } + ] + }, + { + "name": "app dir - not found with default 404 page", + "file": "test/e2e/app-dir/not-found-default/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "app dir - not found with default 404 page should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "parallel-route-not-found", + "file": "test/e2e/app-dir/parallel-route-not-found-params/parallel-route-not-found-params.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "parallel-route-not-found should behave correctly without any errors", + "status": "passed" + }, + { + "name": "parallel-route-not-found should handle the not found case correctly without any errors", + "status": "passed" + } + ] + }, + { + "name": "parallel-routes-catchall", + "file": "test/e2e/app-dir/parallel-routes-catchall/parallel-routes-catchall.test.ts", + "passed": 4, + "failed": 0, + "skipped": 0, + "total": "4", + "testCases": [ + { + "name": "parallel-routes-catchall should match correctly when defining an explicit page & slot", + "status": "passed" + }, + { + "name": "parallel-routes-catchall should match correctly when defining an explicit page but no slot", + "status": "passed" + }, + { + "name": "parallel-routes-catchall should match correctly when defining an explicit slot but no page", + "status": "passed" + }, + { + "name": "parallel-routes-catchall should match both the catch-all page & slot", + "status": "passed" + } + ] + }, + { + "name": "app-dir revalidate-dynamic", + "file": "test/e2e/app-dir/revalidate-dynamic/revalidate-dynamic.test.ts", + "passed": 0, + "failed": 0, + "skipped": 2, + "total": "2", + "testCases": [ + { + "name": "app-dir revalidate-dynamic should revalidate the data with /api/revalidate-path", + "status": "skipped", + "reason": "Race condition when testing revalidation" + }, + { + "name": "app-dir revalidate-dynamic should revalidate the data with /api/revalidate-tag", + "status": "skipped", + "reason": "Race condition when testing revalidation" + } + ] + }, + { + "name": "app dir - rsc basics", + "file": "test/e2e/app-dir/rsc-basic/rsc-basic.test.ts", + "passed": 33, + "failed": 0, + "skipped": 2, + "total": "36", + "testCases": [ + { + "name": "app dir - rsc basics should correctly render page returning null", + "status": "passed" + }, + { + "name": "app dir - rsc basics should correctly render component returning null", + "status": "passed" + }, + { + "name": "app dir - rsc basics should correctly render layout returning null", + "status": "passed" + }, + { + "name": "app dir - rsc basics should correctly render page returning undefined", + "status": "passed" + }, + { + "name": "app dir - rsc basics should correctly render component returning undefined", + "status": "passed" + }, + { + "name": "app dir - rsc basics should correctly render layout returning undefined", + "status": "passed" + }, + { + "name": "app dir - rsc basics should render server components correctly", + "status": "passed" + }, + { + "name": "app dir - rsc basics should reuse the inline flight response without sending extra requests", + "status": "passed" + }, + { + "name": "app dir - rsc basics should support multi-level server component imports", + "status": "passed" + }, + { + "name": "app dir - rsc basics should create client reference successfully for all file conventions", + "status": "passed" + }, + { + "name": "app dir - rsc basics should be able to navigate between rsc routes", + "status": "passed" + }, + { + "name": "app dir - rsc basics should handle streaming server components correctly", + "status": "passed" + }, + { + "name": "app dir - rsc basics should track client components in dynamic imports", + "status": "passed" + }, + { + "name": "app dir - rsc basics should support next/link in server components", + "status": "passed" + }, + { + "name": "app dir - rsc basics should link correctly with next/link without mpa navigation to the page", + "status": "passed" + }, + { + "name": "app dir - rsc basics should escape streaming data correctly", + "status": "passed" + }, + { + "name": "app dir - rsc basics should render built-in 404 page for missing route if pagesDir is not presented", + "status": "passed" + }, + { + "name": "app dir - rsc basics should suspense next/legacy/image in server components", + "status": "passed" + }, + { + "name": "app dir - rsc basics should suspense next/image in server components", + "status": "passed" + }, + { + "name": "app dir - rsc basics should handle various kinds of exports correctly", + "status": "passed" + }, + { + "name": "app dir - rsc basics should support native modules in server component", + "status": "passed" + }, + { + "name": "app dir - rsc basics should resolve different kinds of components correctly", + "status": "passed" + }, + { + "name": "app dir - rsc basics should render initial styles of css-in-js in nodejs SSR correctly", + "status": "passed" + }, + { + "name": "app dir - rsc basics should render initial styles of css-in-js in edge SSR correctly", + "status": "passed" + }, + { + "name": "app dir - rsc basics should render css-in-js suspense boundary correctly", + "status": "passed" + }, + { + "name": "app dir - rsc basics should stick to the url without trailing /page suffix", + "status": "passed" + }, + { + "name": "app dir - rsc basics should support streaming for flight response", + "status": "passed" + }, + { + "name": "app dir - rsc basics should support partial hydration with inlined server data", + "status": "passed" + }, + { + "name": "app dir - rsc basics should not apply rsc syntax checks in pages/api", + "status": "passed" + }, + { + "name": "app dir - rsc basics should not use bundled react for pages with app", + "status": "passed" + }, + { + "name": "app dir - rsc basics should use canary react for app", + "status": "passed" + }, + { + "name": "app dir - rsc basics should be able to call legacy react-dom/server APIs in client components", + "status": "passed" + }, + { + "name": "app dir - rsc basics should support webpack loader rules", + "status": "passed" + }, + { + "name": "app dir - rsc basics react@experimental should opt into the react@experimental when enabling ppr", + "status": "skipped", + "reason": "Tries to patch deployed files" + }, + { + "name": "app dir - rsc basics react@experimental should opt into the react@experimental when enabling taint", + "status": "skipped", + "reason": "Tries to patch deployed files" + } + ] + }, + { + "name": "Ordering with styled-jsx", + "file": "test/e2e/app-dir/scss/with-styled-jsx/with-styled-jsx.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "Ordering with styled-jsx should have the correct color (css ordering)", + "status": "passed" + } + ] + }, + { + "name": "use-params", + "file": "test/e2e/app-dir/use-params/use-params.test.ts", + "passed": 7, + "failed": 0, + "skipped": 0, + "total": "7", + "testCases": [ + { + "name": "use-params should work for single dynamic param", + "status": "passed" + }, + { + "name": "use-params should work for nested dynamic params", + "status": "passed" + }, + { + "name": "use-params should work for catch all params", + "status": "passed" + }, + { + "name": "use-params should work for single dynamic param client navigating", + "status": "passed" + }, + { + "name": "use-params should work for nested dynamic params client navigating", + "status": "passed" + }, + { + "name": "use-params should work on pages router", + "status": "passed" + }, + { + "name": "use-params shouldn't rerender host component when prefetching", + "status": "passed" + } + ] + }, + { + "name": "default browserslist target", + "file": "test/e2e/browserslist/default-target.test.ts", + "passed": 0, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [] + }, + { + "name": "next.config.js schema validating - defaultConfig", + "file": "test/e2e/config-schema-check/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "next.config.js schema validating - defaultConfig should skip next deploy", + "status": "passed" + }, + { + "name": "next.config.js schema validating - invalid config should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "Dynamic Route Interpolation", + "file": "test/e2e/dynamic-route-interpolation/index.test.ts", + "passed": 7, + "failed": 0, + "skipped": 0, + "total": "7", + "testCases": [ + { + "name": "Dynamic Route Interpolation should work", + "status": "passed" + }, + { + "name": "Dynamic Route Interpolation should work with parameter itself", + "status": "passed" + }, + { + "name": "Dynamic Route Interpolation should work with brackets", + "status": "passed" + }, + { + "name": "Dynamic Route Interpolation should work with parameter itself in API routes", + "status": "passed" + }, + { + "name": "Dynamic Route Interpolation should work with brackets in API routes", + "status": "passed" + }, + { + "name": "Dynamic Route Interpolation should bust data cache", + "status": "passed" + }, + { + "name": "Dynamic Route Interpolation should bust data cache with symbol", + "status": "passed" + } + ] + }, + { + "name": "i18n API support", + "file": "test/e2e/i18n-api-support/index.test.ts", + "passed": 2, + "failed": 0, + "skipped": 0, + "total": "2", + "testCases": [ + { + "name": "i18n API support should respond to normal API request", + "status": "passed" + }, + { + "name": "i18n API support should respond to normal dynamic API request", + "status": "passed" + } + ] + }, + { + "name": "Instrumentation Hook", + "file": "test/e2e/instrumentation-hook/instrumentation-hook.test.ts", + "passed": 8, + "failed": 0, + "skipped": 0, + "total": "8", + "testCases": [ + { + "name": "Instrumentation Hook with-middleware should skip next deploy", + "status": "passed" + }, + { + "name": "Instrumentation Hook with-edge-api should skip next deploy", + "status": "passed" + }, + { + "name": "Instrumentation Hook with-edge-page should skip next deploy", + "status": "passed" + }, + { + "name": "Instrumentation Hook with-node-api should skip next deploy", + "status": "passed" + }, + { + "name": "Instrumentation Hook with-node-page should skip next deploy", + "status": "passed" + }, + { + "name": "Instrumentation Hook with-async-node-page should skip next deploy", + "status": "passed" + }, + { + "name": "Instrumentation Hook with-async-edge-page should skip next deploy", + "status": "passed" + }, + { + "name": "Instrumentation Hook general should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "next/font/google with proxy", + "file": "test/e2e/next-font/with-proxy.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "next/font/google with proxy should skip next deploy", + "status": "passed" + } + ] + }, + { + "name": "next/head", + "file": "test/e2e/next-head/index.test.ts", + "passed": 5, + "failed": 0, + "skipped": 0, + "total": "5", + "testCases": [ + { + "name": "next/head should place charset element at the top of ", + "status": "passed" + }, + { + "name": "next/head should have correct head tags in initial document", + "status": "passed" + }, + { + "name": "next/head should have correct head tags from a fragment", + "status": "passed" + }, + { + "name": "next/head should have correct head tags after hydration", + "status": "passed" + }, + { + "name": "next/head should have current head tags from a _document getInitialProps", + "status": "passed" + } + ] + }, + { + "name": "prerender native module", + "file": "test/e2e/prerender-native-module.test.ts", + "passed": 3, + "failed": 0, + "skipped": 0, + "total": "3", + "testCases": [ + { + "name": "prerender native module should render index correctly", + "status": "passed" + }, + { + "name": "prerender native module should render /blog/first correctly", + "status": "passed" + }, + { + "name": "prerender native module should render /blog/second correctly", + "status": "passed" + } + ] + }, + { + "name": "styled-jsx", + "file": "test/e2e/styled-jsx/index.test.ts", + "passed": 1, + "failed": 0, + "skipped": 0, + "total": "1", + "testCases": [ + { + "name": "styled-jsx should skip next deploy", + "status": "passed" + } + ] + }, + { + "file": "test/e2e/proxy-request-with-middleware/test/index.test.ts", + "reason": "Hard-coded localhost URL", + "skipped": true + }, + { + "file": "test/e2e/app-dir/ppr/**/*", + "reason": "Relies on local test server", + "skipped": true + }, + { + "file": "test/e2e/app-dir/ppr-*/**/*", + "reason": "Relies on local test server", + "skipped": true + }, + { + "file": "test/e2e/app-dir/app-prefetch-false-loading/app-prefetch-false-loading.test.ts", + "reason": "Uses CLI output", + "skipped": true + }, + { + "file": "test/e2e/cancel-request/stream-cancel.test.ts", + "reason": "Doesn't work for HTTPS URLs", + "skipped": true + }, + { + "file": "test/e2e/edge-pages-support/edge-document.test.ts", + "reason": "Tries to patch deployed files", + "skipped": true + }, + { + "file": "test/e2e/third-parties/index.test.ts", + "reason": "npm install doesn't work in this repo", + "skipped": true + }, + { + "file": "test/e2e/next-phase/index.test.ts", + "reason": "Uses CLI output", + "skipped": true + }, + { + "file": "test/e2e/tsconfig-module-preserve/index.test.ts", + "reason": "Uses CLI output", + "skipped": true + }, + { + "file": "test/e2e/swc-warnings/index.test.ts", + "reason": "Uses CLI output", + "skipped": true + }, + { + "file": "test/e2e/repeated-forward-slashes-error/repeated-forward-slashes-error.test.ts", + "reason": "Uses CLI output", + "skipped": true + }, + { + "file": "test/e2e/app-dir/x-forwarded-headers/x-forwarded-headers.test.ts", + "reason": "Whitespace mismatch", + "skipped": true + }, + { + "file": "test/e2e/app-dir/third-parties/basic.test.ts", + "reason": "npm install doesn't work in this repo", + "skipped": true + }, + { + "file": "test/e2e/app-dir/app/vercel-speed-insights.test.ts", + "reason": "Vercel-specific", + "skipped": true + }, + { + "file": "test/e2e/app-dir/headers-static-bailout/headers-static-bailout.test.ts", + "reason": "Tries to patch deployed files", + "skipped": true + }, + { + "file": "test/e2e/app-dir/app/useReportWebVitals.test.ts", + "reason": "Vercel-specific", + "skipped": true + }, + { + "file": "test/e2e/app-dir/app-static/app-static-custom-handler.test.ts", + "reason": "Test not compatible", + "skipped": true + }, + { + "file": "test/e2e/app-dir/missing-suspense-with-csr-bailout/missing-suspense-with-csr-bailout.test.ts", + "reason": "Tries to patch deployed files", + "skipped": true + }, + { + "file": "test/e2e/module-layer/module-layer.test.ts", + "reason": "Tries to patch deployed files", + "skipped": true + }, + { + "file": "test/e2e/next-image/next-image-proxy.test.ts", + "reason": "Hard-coded localhost URL", + "skipped": true + }, + { + "file": "test/e2e/app-dir/next-image/next-image-proxy.test.ts", + "reason": "Hard-coded localhost URL", + "skipped": true + }, + { + "file": "test/e2e/edge-can-use-wasm-files/index.test.ts", + "reason": "Uses invalid WASM syntax", + "skipped": true + }, + { + "file": "test/e2e/i18n-data-route/i18n-data-route.test.ts", + "reason": "Expected behaviour does not match next start", + "skipped": true + }, + { + "file": "test/e2e/app-dir/next-after-app/index.test.ts", + "reason": "Tries to patch deployed files", + "skipped": true + }, + { + "file": "test/e2e/edge-async-local-storage/index.test.ts", + "reason": "Test is incompatible with serverless because it relies on shared state between requests", + "skipped": true + } + ] +} diff --git a/tests/e2e-skip-retry.json b/tests/e2e-skip-retry.json index 37eef95570..efb6f6a83d 100644 --- a/tests/e2e-skip-retry.json +++ b/tests/e2e-skip-retry.json @@ -15,6 +15,9 @@ "test/e2e/app-dir/app-alias/app-alias.test.ts", "test/e2e/app-dir/app-basepath-custom-server/index.test.ts", "test/e2e/app-dir/app-basepath/index.test.ts", + "test/e2e/app-dir/app-client-cache/client-cache.defaults.test.ts", + "test/e2e/app-dir/app-client-cache/client-cache.experimental.test.ts", + "test/e2e/app-dir/app-client-cache/client-cache.original.test.ts", "test/e2e/app-dir/app-client-cache/client-cache.test.ts", "test/e2e/app-dir/app-compilation/index.test.ts", "test/e2e/app-dir/app-config-crossorigin/index.test.ts", @@ -56,6 +59,7 @@ "test/e2e/app-dir/crypto-globally-available/crypto-globally-available.test.ts", "test/e2e/app-dir/draft-mode/draft-mode.test.ts", "test/e2e/app-dir/dynamic-href/dynamic-href.test.ts", + "test/e2e/app-dir/dynamic-interception-route-revalidate/dynamic-interception-route-revalidate.test.ts", "test/e2e/app-dir/dynamic/dynamic.test.ts", "test/e2e/app-dir/edge-route-catchall/edge-route-catchall.test.ts", "test/e2e/app-dir/edge-route-rewrite/edge-route-rewrite.test.ts", diff --git a/tests/test-config.json b/tests/test-config.json index 348686652d..b7a8942293 100644 --- a/tests/test-config.json +++ b/tests/test-config.json @@ -173,6 +173,8 @@ "file": "test/e2e/app-dir/metadata-dynamic-routes/index.test.ts", "reason": "Header whitespace mismatch", "tests": [ + "app dir - metadata dynamic routes text routes should handle robots.[ext] dynamic routes", + "app dir - metadata dynamic routes text routes should handle sitemap.[ext] dynamic routes", "app dir - metadata dynamic routes robots.txt should handle robots.[ext] dynamic routes", "app dir - metadata dynamic routes sitemap should handle sitemap.[ext] dynamic routes", "app dir - metadata dynamic routes robots.txt should handle sitemap.[ext] dynamic routes", @@ -336,7 +338,25 @@ { "file": "test/e2e/app-dir/parallel-routes-revalidation/parallel-routes-revalidation.test.ts", "reason": "Test is incompatible with serverless because it relies on shared state between requests", - "tests": ["should refresh the correct page when a server action triggers a redirect"] + "tests": [ + "parallel-routes-revalidation should refresh the correct page when a server action triggers a redirect", + "parallel-routes-revalidation should submit the action and revalidate the page data" + ] + }, + { + "file": "test/e2e/app-dir/revalidate-dynamic/revalidate-dynamic.test.ts", + "reason": "Race condition when testing revalidation", + "tests": [ + "app-dir revalidate-dynamic should revalidate the data with /api/revalidate-path", + "app-dir revalidate-dynamic should revalidate the data with /api/revalidate-tag" + ] + } + ], + "failures": [ + { + "name": "This is an example for the json import to infer the right type", + "reason": "(This is because for some reason we inject the `failures` key at runtime)", + "link": "https://example.com" } ] } diff --git a/tools/deno/eszip.ts b/tools/deno/eszip.ts index 5d2cb29179..5ef11cdc95 100644 --- a/tools/deno/eszip.ts +++ b/tools/deno/eszip.ts @@ -2,7 +2,6 @@ import { build, Parser } from 'https://deno.land/x/eszip@v0.55.4/mod.ts' import { dirname, join } from 'https://deno.land/std@0.127.0/path/mod.ts' -import { assertStrictEquals } from 'https://deno.land/std@0.127.0/testing/asserts.ts' interface ESZIP { extract(dest: string): Promise diff --git a/tools/deno/junit2json.ts b/tools/deno/junit2json.ts index d0d534b36b..16aba3ec8d 100644 --- a/tools/deno/junit2json.ts +++ b/tools/deno/junit2json.ts @@ -43,7 +43,8 @@ interface TestSuite { interface SkippedTestSuite { file: string - reason: string + /** reason is required either on the suite or on all tests */ + reason?: string skipped: true } @@ -92,11 +93,13 @@ function junitToJson(xmlData: { total: tests, testCases: [], } - const skippedTests = testConfig.skipped.find( + const skippedTestsForFile = testConfig.skipped.find( (skippedTest) => skippedTest.file === testSuite.file, ) - testSuite.skipped = skippedTests?.tests?.length ?? 0 + // If the skipped file has no `tests`, all tests in the file are skipped + testSuite.skipped = + skippedTestsForFile != null ? (skippedTestsForFile.tests ?? testCases).length : 0 for (const testCase of testCases) { if ('skipped' in testCase) { @@ -120,15 +123,15 @@ function junitToJson(xmlData: { testSuite.testCases.push(test) } - if (skippedTests?.tests) { - testCount.skipped += skippedTests.tests.length + if (skippedTestsForFile?.tests) { + testCount.skipped += skippedTestsForFile.tests.length testSuite.testCases.push( - ...skippedTests.tests.map((test): TestCase => { + ...skippedTestsForFile.tests.map((test): TestCase => { if (typeof test === 'string') { return { name: test, status: 'skipped', - reason: skippedTests.reason, + reason: skippedTestsForFile.reason, } } return { @@ -138,6 +141,9 @@ function junitToJson(xmlData: { } }), ) + } else if (skippedTestsForFile != null) { + // If `tests` is omitted, all tests in the file are skipped + testCount.skipped += testSuite.total } return testSuite }) @@ -146,21 +152,26 @@ function junitToJson(xmlData: { async function processJUnitFiles( directoryPath: string, ): Promise> { - const results = [] + const results: (TestSuite | SkippedTestSuite)[] = [] for await (const file of expandGlob(`${directoryPath}/**/*.xml`)) { const xmlData = await parseXMLFile(file.path) results.push(...junitToJson(xmlData)) } - const skippedSuites = testConfig.skipped.map( - ({ file, reason }): SkippedTestSuite => ({ - file, - reason, - skipped: true, - }), - ) - - testCount.skipped += skippedSuites.length + + // We've configured the Next.js e2e test runner to *actually* skip entire test + // suites that are marked as skipped in `test-config.json`, so this appends those + // to the results (but NOT partially skipped suites, as these are already included). + const skippedSuites = testConfig.skipped + .filter(({ tests }) => tests == null) + .map( + ({ file, reason }): SkippedTestSuite => ({ + file, + reason, + skipped: true, + }), + ) results.push(...skippedSuites) + return results } diff --git a/tools/deno/junit2md.ts b/tools/deno/junit2md.ts deleted file mode 100644 index 591da86ac3..0000000000 --- a/tools/deno/junit2md.ts +++ /dev/null @@ -1,160 +0,0 @@ -import { expandGlob } from 'https://deno.land/std@0.223.0/fs/mod.ts' -import { parse } from 'https://deno.land/x/xml@2.1.3/mod.ts' - -interface TestCase { - '@classname': string - '@name': string - '@time': number - '@file': string - failure?: string -} - -interface TestSuite { - '@name': string - '@errors': number - '@failures': number - '@skipped': number - '@timestamp': string - '@time': number - '@tests': number - testcase: TestCase[] -} - -interface TestSuites { - '@name': string - '@tests': number - '@failures': number - '@errors': number - '@time': number - testsuite: TestSuite[] -} - -async function parseXMLFile(filePath: string): Promise<{ testsuites: TestSuites }> { - const xmlContent = await Deno.readTextFile(filePath) - return parse(xmlContent) as unknown as { testsuites: TestSuites } -} - -const suites: Array<{ - name: string - tests: number - failures: number - skipped: number - time: number -}> = [] - -const testCount = { - '❌': 0, - '⏭️': 0, - '✅': 0, -} - -function junitToMarkdown(xmlData: { testsuites: TestSuites }) { - if (!xmlData.testsuites) { - return '' - } - let markdown = `` - - const testSuites = Array.isArray(xmlData.testsuites.testsuite) - ? xmlData.testsuites.testsuite - : [xmlData.testsuites.testsuite] - - for (const suite of testSuites) { - const { - '@tests': tests, - '@failures': failures, - '@skipped': skipped, - '@name': name, - '@time': time, - } = suite - - suites.push({ - name, - tests, - failures, - skipped, - time, - }) - - const passed = tests - failures - skipped - - const testCases = Array.isArray(suite.testcase) ? suite.testcase : [suite.testcase] - - const testCasesDetails = testCases - .map((testCase) => { - const status = testCase.failure ? '❌' : 'skipped' in testCase ? '⏭️' : '✅' - - testCount[status]++ - return `
  • ${status} ${testCase['@name'].slice(name.length)} (${testCase['@time'].toFixed( - 2, - )}s)
  • ` - }) - .join('') - - markdown += `|
    ${name}
      ${testCasesDetails}
    | ✅ ${passed} | ❌ ${failures} | ⏭️ ${skipped} | ${Math.round( - time, - )}s |\n` - } - - return markdown -} - -async function processJUnitFiles(directoryPath: string) { - let markdown = `| Suite | Passed | Failed | Skipped | Time |\n| ------- | ------ | ------ | ------- | ---- |\n` - for await (const file of expandGlob(`${directoryPath}/**/*.xml`)) { - const xmlData = await parseXMLFile(file.path) - markdown += junitToMarkdown(xmlData) - } - return markdown -} - -// Get the directory path from the command-line arguments -const directoryPath = Deno.args[0] - -// Check if the directory path is provided -if (!directoryPath) { - console.error('Please provide a directory path.') - Deno.exit(1) -} - -// Process the JUnit files in the provided directory -const details = await processJUnitFiles(directoryPath) - -let passedSuites = 0 -let failedSuites = 0 -let skippedSuites = 0 -let partialSuites = 0 - -suites.forEach(({ tests, failures, skipped }) => { - const unskipped = tests - skipped - const pass = unskipped - failures - if (skipped === tests) { - skippedSuites++ - } else if (failures === unskipped) { - failedSuites++ - } else if (pass === unskipped) { - passedSuites++ - } else { - partialSuites++ - } -}) - -console.log('## Test results') -console.log(`| | Suites | Tests |`) -console.log(`| --- | --- | --- |`) -console.log(`| ✅ Passed | ${passedSuites} | ${testCount['✅']} |`) -console.log(`| ❌ Failed | ${failedSuites} | ${testCount['❌']} |`) -console.log(`| ⏭️ Skipped | ${skippedSuites} | ${testCount['⏭️']} |`) -console.log(`| 🌗 Partial | ${partialSuites} | |`) -console.log( - `| **Total** | ${passedSuites + failedSuites + skippedSuites + partialSuites} | ${ - testCount['✅'] + testCount['❌'] + testCount['⏭️'] - } |`, -) - -console.log( - `Pass rate: ${((testCount['✅'] / (testCount['✅'] + testCount['❌'])) * 100).toFixed(2)}%`, -) - -console.log('## Test cases') - -console.log(details) diff --git a/tools/deno/test-failures.ts b/tools/deno/test-failures.ts deleted file mode 100644 index 1cbc4b01f3..0000000000 --- a/tools/deno/test-failures.ts +++ /dev/null @@ -1,23 +0,0 @@ -import results from '../../report/test-results.json' with { type: 'json' } - -let withReason = 0 -let withoutReason = 0 - -for (const suite of results.results) { - for (const testcase of suite.testCases ?? []) { - if (testcase.status !== 'failed') { - continue - } - - if (testcase.reason) { - withReason++ - } else { - console.log( - `${' '.repeat(90 - suite.file.length)}${suite.file.slice(9, -8)}: ${testcase.name}`, - ) - withoutReason++ - } - } -} - -console.log(`\n${withReason} tests have reasons, ${withoutReason} do not.`) diff --git a/tools/e2e/cleanup-deploys.ts b/tools/e2e/cleanup-deploys.ts index 3fe5b03740..9bf6214cfb 100644 --- a/tools/e2e/cleanup-deploys.ts +++ b/tools/e2e/cleanup-deploys.ts @@ -1,4 +1,4 @@ -import { exec } from 'child_process' +import { exec } from 'node:child_process' import { SITE_ID, deleteDeploy } from '../../tests/utils/create-e2e-fixture.js' const runCommand = (cmd: string) =>