From 652fc2caf9e3e8e488ff47332d924ac93197cbb7 Mon Sep 17 00:00:00 2001 From: eps1lon Date: Thu, 21 Nov 2024 13:47:06 +0100 Subject: [PATCH] Track errors where frames are not sourcemapped properly in the Redbox --- .../ReactRefreshLogBox-builtins.test.ts | 2 +- .../ReactRefreshRegression.test.ts | 4 +- .../acceptance-app/app-hmr-changes.test.ts | 2 +- .../acceptance-app/dynamic-error.test.ts | 4 +- .../acceptance-app/rsc-runtime-errors.test.ts | 20 +++- .../acceptance-app/server-components.test.ts | 2 +- .../undefined-default-export.test.ts | 18 +++- .../ReactRefreshLogBox-app-doc.test.ts | 16 ++- .../ReactRefreshLogBox-builtins.test.ts | 2 +- .../acceptance/ReactRefreshLogBox.test.ts | 8 +- .../acceptance/ReactRefreshRegression.test.ts | 6 +- .../app-dir/dynamic-error-trace/index.test.ts | 4 +- .../dynamic-io-dev-errors.test.ts | 2 +- .../index.test.ts | 2 +- .../invalid-element-type.test.ts | 8 +- .../owner-stack-invalid-element-type.test.ts | 8 +- .../app-dir/owner-stack/owner-stack.test.ts | 2 +- .../serialize-circular-error.test.ts | 2 +- ...r-component-next-dynamic-ssr-false.test.ts | 2 +- .../app-dir/ssr-in-rsc/ssr-in-rsc.test.ts | 12 +-- .../test/index.test.ts | 6 +- .../middleware-errors/index.test.ts | 10 +- .../client-navigation/rendering.test.ts | 12 +-- .../app-dir/dynamic-href/dynamic-href.test.ts | 6 +- .../dynamic-io-segment-configs.test.ts | 4 +- .../error-on-next-codemod-comment.test.ts | 8 +- test/e2e/app-dir/errors/index.test.ts | 2 +- .../global-error/layout-error/index.test.ts | 10 +- .../with-style-import/index.test.ts | 8 +- ...e-named-export-custom-loader-error.test.ts | 11 +- .../app-dir/next-after-pages/index.test.ts | 2 +- test/integration/app-dir-export/test/utils.ts | 5 +- .../config-output-export/test/index.test.ts | 8 +- .../dynamic-routing/test/index.test.js | 2 +- .../invalid-href/test/index.test.js | 2 +- .../base-path/test/index.test.ts | 10 +- .../default/test/index.test.ts | 30 +++++- .../app-dir-localpatterns/test/index.test.ts | 2 +- .../next-image-new/app-dir/test/index.test.ts | 52 ++++++--- .../base-path/test/index.test.js | 12 ++- .../next-image-new/default/test/index.test.ts | 65 ++++++++--- .../export-config/test/index.test.ts | 5 +- .../invalid-image-import/test/index.test.ts | 2 +- .../server-side-dev-errors/test/index.test.js | 16 +-- test/lib/development-sandbox.ts | 10 +- test/lib/next-test-utils.ts | 101 +++++++++++++++++- 46 files changed, 382 insertions(+), 145 deletions(-) diff --git a/test/development/acceptance-app/ReactRefreshLogBox-builtins.test.ts b/test/development/acceptance-app/ReactRefreshLogBox-builtins.test.ts index d3330e063c3d8..8faea46882e64 100644 --- a/test/development/acceptance-app/ReactRefreshLogBox-builtins.test.ts +++ b/test/development/acceptance-app/ReactRefreshLogBox-builtins.test.ts @@ -194,7 +194,7 @@ describe.each(['default', 'turbo'])('ReactRefreshLogBox app %s', () => { ]) ) const { session } = sandbox - await session.assertHasRedbox() + await session.assertHasRedbox({ pageResponseCode: 500 }) const source = await session.getRedboxSource() if (process.env.TURBOPACK) { diff --git a/test/development/acceptance-app/ReactRefreshRegression.test.ts b/test/development/acceptance-app/ReactRefreshRegression.test.ts index 74b0263d0ef62..9ecd110ad319d 100644 --- a/test/development/acceptance-app/ReactRefreshRegression.test.ts +++ b/test/development/acceptance-app/ReactRefreshRegression.test.ts @@ -295,7 +295,7 @@ describe('ReactRefreshRegression app', () => { `export default function Page() { throw new Error('boom'); }` ) - await session.assertHasRedbox() + await session.assertHasRedbox({ pageResponseCode: 500 }) const source = await session.getRedboxSource() expect(source.split(/\r?\n/g).slice(2).join('\n')).toMatchInlineSnapshot(` @@ -316,7 +316,7 @@ describe('ReactRefreshRegression app', () => { ` ) - await session.assertHasRedbox() + await session.assertHasRedbox({ pageResponseCode: 500 }) const source = await session.getRedboxSource() expect(source.split(/\r?\n/g).slice(2).join('\n')).toMatchInlineSnapshot(` diff --git a/test/development/acceptance-app/app-hmr-changes.test.ts b/test/development/acceptance-app/app-hmr-changes.test.ts index f4f44f7aa7196..c1349853bea5d 100644 --- a/test/development/acceptance-app/app-hmr-changes.test.ts +++ b/test/development/acceptance-app/app-hmr-changes.test.ts @@ -51,7 +51,7 @@ describe('Error overlay - RSC build errors', () => { await session.patch(pagePath, break2.replace('break 3', '')) await session.patch(pagePath, break2) - await session.assertHasRedbox() + await session.assertHasRedbox({ pageResponseCode: 500 }) await session.patch(pagePath, break1) diff --git a/test/development/acceptance-app/dynamic-error.test.ts b/test/development/acceptance-app/dynamic-error.test.ts index b1217f3708fb0..b5ff2d98aed93 100644 --- a/test/development/acceptance-app/dynamic-error.test.ts +++ b/test/development/acceptance-app/dynamic-error.test.ts @@ -30,7 +30,9 @@ describe('dynamic = "error" in devmode', () => { '/server' ) const { session } = sandbox - await session.assertHasRedbox() + await session.assertHasRedbox({ + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await session.getRedboxDescription()).toMatchInlineSnapshot( `"[ Server ] Error: Route /server with \`dynamic = "error"\` couldn't be rendered statically because it used \`cookies\`. See more info here: https://nextjs.org/docs/app/building-your-application/rendering/static-and-dynamic#dynamic-rendering"` ) diff --git a/test/development/acceptance-app/rsc-runtime-errors.test.ts b/test/development/acceptance-app/rsc-runtime-errors.test.ts index 6967135a3b7ee..63b1eb7989495 100644 --- a/test/development/acceptance-app/rsc-runtime-errors.test.ts +++ b/test/development/acceptance-app/rsc-runtime-errors.test.ts @@ -27,7 +27,9 @@ describe('Error overlay - RSC runtime errors', () => { const browser = await next.browser('/server') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) const errorDescription = await getRedboxDescription(browser) expect(errorDescription).toContain( @@ -69,7 +71,9 @@ describe('Error overlay - RSC runtime errors', () => { ) const browser = await next.browser('/server') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) const errorDescription = await getRedboxDescription(browser) @@ -87,7 +91,9 @@ describe('Error overlay - RSC runtime errors', () => { ` ) const browser = await next.browser('/server') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) const source = await getRedboxSource(browser) // Can show the original source code @@ -106,7 +112,9 @@ describe('Error overlay - RSC runtime errors', () => { ) const browser = await next.browser('/server') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) const versionText = await getVersionCheckerText(browser) expect(versionText).toMatch(/Next.js \([\w.-]+\)/) }) @@ -122,7 +130,9 @@ describe('Error overlay - RSC runtime errors', () => { ) const browser = await next.browser('/server') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) const source = await getRedboxSource(browser) expect(source).toContain('app/server/page.js') expect(source).not.toContain('//app/server/page.js') diff --git a/test/development/acceptance-app/server-components.test.ts b/test/development/acceptance-app/server-components.test.ts index 651742284b245..c99a3598d6f84 100644 --- a/test/development/acceptance-app/server-components.test.ts +++ b/test/development/acceptance-app/server-components.test.ts @@ -520,7 +520,7 @@ describe('Error Overlay for server components', () => { ]) ) const { session } = sandbox - await session.assertHasRedbox() + await session.assertHasRedbox({ pageResponseCode: 500 }) // In webpack when the message too long it gets truncated with ` | ` with new lines. // So we need to check for the first part of the message. const normalizedSource = await session.getRedboxSource() diff --git a/test/development/acceptance-app/undefined-default-export.test.ts b/test/development/acceptance-app/undefined-default-export.test.ts index a4e2382c23431..2dd36a87d9dcf 100644 --- a/test/development/acceptance-app/undefined-default-export.test.ts +++ b/test/development/acceptance-app/undefined-default-export.test.ts @@ -17,7 +17,10 @@ describe('Undefined default export', () => { '/specific-path/server' ) const { session } = sandbox - await session.assertHasRedbox() + await session.assertHasRedbox({ + // TODO: Unclear why the test is navigating to the page twice + pageResponseCode: [500, 500], + }) expect(await session.getRedboxDescription()).toInclude( 'The default export is not a React Component in "/specific-path/server/page"' ) @@ -39,7 +42,9 @@ describe('Undefined default export', () => { '/will-not-found' ) const { session } = sandbox - await session.assertHasRedbox() + await session.assertHasRedbox({ + pageResponseCode: 500, + }) expect(await session.getRedboxDescription()).toInclude( 'The default export is not a React Component in "/will-not-found/not-found"' ) @@ -55,7 +60,10 @@ describe('Undefined default export', () => { // Wait for the DOM node #__next to be present await browser.waitForElementByCss('#__next') - await session.assertHasRedbox() + await session.assertHasRedbox({ + // TODO: really? + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await session.getRedboxDescription()).toInclude( 'The default export is not a React Component in "/page"' ) @@ -73,7 +81,9 @@ describe('Undefined default export', () => { '/server-with-errors/page-export-initial-error' ) const { session } = sandbox - await session.assertHasRedbox() + await session.assertHasRedbox({ + pageResponseCode: 500, + }) expect(await session.getRedboxDescription()).toInclude( 'The default export is not a React Component in "/server-with-errors/page-export-initial-error/page"' ) diff --git a/test/development/acceptance/ReactRefreshLogBox-app-doc.test.ts b/test/development/acceptance/ReactRefreshLogBox-app-doc.test.ts index 4ef70e4735856..066c7f6e7ad56 100644 --- a/test/development/acceptance/ReactRefreshLogBox-app-doc.test.ts +++ b/test/development/acceptance/ReactRefreshLogBox-app-doc.test.ts @@ -18,7 +18,9 @@ describe.each(['default', 'turbo'])( new Map([['pages/_app.js', ``]]) ) const { session } = sandbox - await session.assertHasRedbox() + await session.assertHasRedbox({ + pageResponseCode: 500, + }) expect(await session.getRedboxDescription()).toMatchInlineSnapshot( `"Error: The default export is not a React Component in page: "/_app""` ) @@ -41,7 +43,9 @@ describe.each(['default', 'turbo'])( new Map([['pages/_document.js', ``]]) ) const { session } = sandbox - await session.assertHasRedbox() + await session.assertHasRedbox({ + pageResponseCode: 500, + }) expect(await session.getRedboxDescription()).toMatchInlineSnapshot( `"Error: The default export is not a React Component in page: "/_document""` ) @@ -92,7 +96,9 @@ describe.each(['default', 'turbo'])( ]) ) const { session } = sandbox - await session.assertHasRedbox() + await session.assertHasRedbox({ + pageResponseCode: 500, + }) const content = await session.getRedboxSource() const source = next.normalizeTestDirContent(content) if (process.env.TURBOPACK) { @@ -178,7 +184,9 @@ describe.each(['default', 'turbo'])( ]) ) const { session } = sandbox - await session.assertHasRedbox() + await session.assertHasRedbox({ + pageResponseCode: 500, + }) const source = next.normalizeTestDirContent( await session.getRedboxSource() ) diff --git a/test/development/acceptance/ReactRefreshLogBox-builtins.test.ts b/test/development/acceptance/ReactRefreshLogBox-builtins.test.ts index 0d6da34e0550a..ca5f1a70b8c20 100644 --- a/test/development/acceptance/ReactRefreshLogBox-builtins.test.ts +++ b/test/development/acceptance/ReactRefreshLogBox-builtins.test.ts @@ -198,7 +198,7 @@ describe.each(['default', 'turbo'])('ReactRefreshLogBox %s', () => { ]) ) const { session } = sandbox - await session.assertHasRedbox() + await session.assertHasRedbox({ pageResponseCode: 500 }) const source = await session.getRedboxSource() if (process.env.TURBOPACK) { diff --git a/test/development/acceptance/ReactRefreshLogBox.test.ts b/test/development/acceptance/ReactRefreshLogBox.test.ts index 5fd619a9611c6..cdcd495a9d29a 100644 --- a/test/development/acceptance/ReactRefreshLogBox.test.ts +++ b/test/development/acceptance/ReactRefreshLogBox.test.ts @@ -80,7 +80,7 @@ describe.each(['default', 'turbo'])('ReactRefreshLogBox %s', () => { ` ) - await session.assertHasRedbox() + await session.assertHasRedbox({ pageResponseCode: 500 }) expect(await session.getRedboxSource()).toMatchSnapshot() }) @@ -644,7 +644,7 @@ describe.each(['default', 'turbo'])('ReactRefreshLogBox %s', () => { ` ) - await session.assertHasRedbox() + await session.assertHasRedbox({ pageResponseCode: 500 }) expect(await session.getRedboxDescription()).toMatchInlineSnapshot( `"Error: {"a":1,"b":"x"}"` ) @@ -792,7 +792,7 @@ describe.each(['default', 'turbo'])('ReactRefreshLogBox %s', () => { ]) ) const { session, browser } = sandbox - await session.assertHasRedbox() + await session.assertHasRedbox({ pageResponseCode: 500 }) let callStackFrames = await browser.elementsByCss( '[data-nextjs-call-stack-frame]' ) @@ -820,7 +820,7 @@ describe.each(['default', 'turbo'])('ReactRefreshLogBox %s', () => { ]) ) const { session, browser } = sandbox - await session.assertHasRedbox() + await session.assertHasRedbox({ pageResponseCode: 500 }) // Should still show the errored line in source code const source = await session.getRedboxSource() diff --git a/test/development/acceptance/ReactRefreshRegression.test.ts b/test/development/acceptance/ReactRefreshRegression.test.ts index 14f8ffa70f375..157276152be12 100644 --- a/test/development/acceptance/ReactRefreshRegression.test.ts +++ b/test/development/acceptance/ReactRefreshRegression.test.ts @@ -281,7 +281,11 @@ describe('ReactRefreshRegression', () => { ) expect(didNotReload).toBe(false) - await session.assertHasRedbox() + await session.assertHasRedbox({ + pageResponseCode: + // TODO: Unclear why the test is navigating to the page twice + [500, 500], + }) const source = await session.getRedboxSource() expect(source.split(/\r?\n/g).slice(2).join('\n')).toMatchInlineSnapshot(` diff --git a/test/development/app-dir/dynamic-error-trace/index.test.ts b/test/development/app-dir/dynamic-error-trace/index.test.ts index 7208f5dcc521f..6d35c95d0275e 100644 --- a/test/development/app-dir/dynamic-error-trace/index.test.ts +++ b/test/development/app-dir/dynamic-error-trace/index.test.ts @@ -18,7 +18,9 @@ describe('app dir - dynamic error trace', () => { it('should show the error trace', async () => { const browser = await next.browser('/') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) await expect( browser.hasElementByCssSelector( diff --git a/test/development/app-dir/dynamic-io-dev-errors/dynamic-io-dev-errors.test.ts b/test/development/app-dir/dynamic-io-dev-errors/dynamic-io-dev-errors.test.ts index 6f4a86bae411b..955801591f0bc 100644 --- a/test/development/app-dir/dynamic-io-dev-errors/dynamic-io-dev-errors.test.ts +++ b/test/development/app-dir/dynamic-io-dev-errors/dynamic-io-dev-errors.test.ts @@ -94,7 +94,7 @@ describe('Dynamic IO Dev Errors', () => { ]) ) const { browser, session } = sandbox - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const redbox = { description: await getRedboxDescription(browser), source: await getRedboxSource(browser), diff --git a/test/development/app-dir/next-after-app-invalid-usage/index.test.ts b/test/development/app-dir/next-after-app-invalid-usage/index.test.ts index 18f9cfd634f44..68a112b9d4eca 100644 --- a/test/development/app-dir/next-after-app-invalid-usage/index.test.ts +++ b/test/development/app-dir/next-after-app-invalid-usage/index.test.ts @@ -29,7 +29,7 @@ describe('unstable_after() - invalid usages', () => { it('errors at compile time when used in a client module', async () => { const session = await next.browser('/invalid-in-client') - await assertHasRedbox(session) + await assertHasRedbox(session, { pageResponseCode: 500 }) expect(await getRedboxSource(session)).toMatch( /You're importing a component that needs "?unstable_after"?\. That only works in a Server Component but one of its parents is marked with "use client", so it's a Client Component\./ ) diff --git a/test/development/app-dir/owner-stack-invalid-element-type/invalid-element-type.test.ts b/test/development/app-dir/owner-stack-invalid-element-type/invalid-element-type.test.ts index 0368a1d958fae..3aad381c91485 100644 --- a/test/development/app-dir/owner-stack-invalid-element-type/invalid-element-type.test.ts +++ b/test/development/app-dir/owner-stack-invalid-element-type/invalid-element-type.test.ts @@ -59,7 +59,9 @@ const isOwnerStackEnabled = it('should catch invalid element from a rsc component', async () => { const browser = await next.browser('/rsc') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + pageResponseCode: 500, + }) const stackFramesContent = await getStackFramesContent(browser) const source = await getRedboxSource(browser) @@ -96,7 +98,9 @@ const isOwnerStackEnabled = it('should catch invalid element from on ssr client component', async () => { const browser = await next.browser('/ssr') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + pageResponseCode: 500, + }) const stackFramesContent = await getStackFramesContent(browser) const source = await getRedboxSource(browser) diff --git a/test/development/app-dir/owner-stack-invalid-element-type/owner-stack-invalid-element-type.test.ts b/test/development/app-dir/owner-stack-invalid-element-type/owner-stack-invalid-element-type.test.ts index 83778742851a2..968769f71b589 100644 --- a/test/development/app-dir/owner-stack-invalid-element-type/owner-stack-invalid-element-type.test.ts +++ b/test/development/app-dir/owner-stack-invalid-element-type/owner-stack-invalid-element-type.test.ts @@ -64,7 +64,9 @@ const isOwnerStackEnabled = it('should catch invalid element from a rsc component', async () => { const browser = await next.browser('/rsc') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) const stackFramesContent = await getStackFramesContent(browser) const source = await getRedboxSource(browser) @@ -106,7 +108,9 @@ const isOwnerStackEnabled = it('should catch invalid element from on ssr client component', async () => { const browser = await next.browser('/ssr') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) const stackFramesContent = await getStackFramesContent(browser) const source = await getRedboxSource(browser) diff --git a/test/development/app-dir/owner-stack/owner-stack.test.ts b/test/development/app-dir/owner-stack/owner-stack.test.ts index 40ed60a7b4901..0eac39c40c0e1 100644 --- a/test/development/app-dir/owner-stack/owner-stack.test.ts +++ b/test/development/app-dir/owner-stack/owner-stack.test.ts @@ -166,7 +166,7 @@ describe('app-dir - owner-stack', () => { it('should log stitched error for SSR errors', async () => { const browser = await next.browser('/ssr') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const stackFramesContent = await getStackFramesContent(browser) if (process.env.TURBOPACK) { diff --git a/test/development/app-dir/serialize-circular-error/serialize-circular-error.test.ts b/test/development/app-dir/serialize-circular-error/serialize-circular-error.test.ts index d284ed60dc620..88789c86bbdca 100644 --- a/test/development/app-dir/serialize-circular-error/serialize-circular-error.test.ts +++ b/test/development/app-dir/serialize-circular-error/serialize-circular-error.test.ts @@ -12,7 +12,7 @@ describe('serialize-circular-error', () => { it('should serialize the object from server component in console correctly', async () => { const browser = await next.browser('/') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const description = await getRedboxDescription(browser) // React cannot serialize thrown objects with circular references diff --git a/test/development/app-dir/server-component-next-dynamic-ssr-false/server-component-next-dynamic-ssr-false.test.ts b/test/development/app-dir/server-component-next-dynamic-ssr-false/server-component-next-dynamic-ssr-false.test.ts index 39418cc33f11e..ebf92a8674d86 100644 --- a/test/development/app-dir/server-component-next-dynamic-ssr-false/server-component-next-dynamic-ssr-false.test.ts +++ b/test/development/app-dir/server-component-next-dynamic-ssr-false/server-component-next-dynamic-ssr-false.test.ts @@ -12,7 +12,7 @@ describe('app-dir - server-component-next-dynamic-ssr-false', () => { it('should error when use dynamic ssr:false in server component', async () => { const browser = await next.browser('/') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const redbox = { description: await getRedboxDescription(browser), source: await getRedboxSource(browser), diff --git a/test/development/app-dir/ssr-in-rsc/ssr-in-rsc.test.ts b/test/development/app-dir/ssr-in-rsc/ssr-in-rsc.test.ts index 360b1b920b286..e045fe49c4d74 100644 --- a/test/development/app-dir/ssr-in-rsc/ssr-in-rsc.test.ts +++ b/test/development/app-dir/ssr-in-rsc/ssr-in-rsc.test.ts @@ -265,7 +265,7 @@ describe('react-dom/server in React Server environment', () => { ) if (isTurbopack) { - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) } else { // FIXME: why no redbox when there is an error? await assertNoRedbox(browser) @@ -312,7 +312,7 @@ describe('react-dom/server in React Server environment', () => { '/exports/app-code/react-dom-server-node-explicit' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const redbox = { description: await getRedboxDescription(browser), source: await getRedboxSource(browser), @@ -369,7 +369,7 @@ describe('react-dom/server in React Server environment', () => { '/exports/app-code/react-dom-server-node-implicit' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const redbox = { description: await getRedboxDescription(browser), source: await getRedboxSource(browser), @@ -425,7 +425,7 @@ describe('react-dom/server in React Server environment', () => { '/exports/library-code/react-dom-server-browser-explicit' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const redbox = { description: await getRedboxDescription(browser), source: await getRedboxSource(browser), @@ -723,7 +723,7 @@ describe('react-dom/server in React Server environment', () => { '/exports/library-code/react-dom-server-node-explicit' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const redbox = { description: await getRedboxDescription(browser), source: await getRedboxSource(browser), @@ -780,7 +780,7 @@ describe('react-dom/server in React Server environment', () => { '/exports/library-code/react-dom-server-node-implicit' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const redbox = { description: await getRedboxDescription(browser), source: await getRedboxSource(browser), diff --git a/test/development/basic/gssp-ssr-change-reloading/test/index.test.ts b/test/development/basic/gssp-ssr-change-reloading/test/index.test.ts index 59fbac9c3094b..1e222197d02b9 100644 --- a/test/development/basic/gssp-ssr-change-reloading/test/index.test.ts +++ b/test/development/basic/gssp-ssr-change-reloading/test/index.test.ts @@ -276,7 +276,8 @@ describe('GS(S)P Server-Side Change Reloading', () => { try { await next.patchFile(page, originalContent.replace('props:', 'propss:')) - await assertHasRedbox(browser) + // TODO: Unclear why two page navigations are triggered + await assertHasRedbox(browser, { pageResponseCode: [500, 500] }) expect(await getRedboxHeader(browser)).toContain( 'Additional keys were returned from' ) @@ -306,7 +307,8 @@ describe('GS(S)P Server-Side Change Reloading', () => { 'throw new Error("custom oops"); const count' ) ) - await assertHasRedbox(browser) + // TODO: Unclear why two page navigations are triggered + await assertHasRedbox(browser, { pageResponseCode: [500, 500] }) expect(await getRedboxHeader(browser)).toContain('custom oops') await next.patchFile(page, originalContent) diff --git a/test/development/middleware-errors/index.test.ts b/test/development/middleware-errors/index.test.ts index 678d9f13c5cfa..128657abd6739 100644 --- a/test/development/middleware-errors/index.test.ts +++ b/test/development/middleware-errors/index.test.ts @@ -54,7 +54,7 @@ describe('middleware - development errors', () => { it('renders the error correctly and recovers', async () => { const browser = await next.browser('/') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) await next.patchFile('middleware.js', `export default function () {}`) await assertNoRedbox(browser) }) @@ -158,7 +158,7 @@ describe('middleware - development errors', () => { it('renders the error correctly and recovers', async () => { const browser = await next.browser('/') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const lengthOfLogs = next.cliOutput.length @@ -210,7 +210,7 @@ describe('middleware - development errors', () => { it('renders the error correctly and recovers', async () => { const browser = await next.browser('/') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const source = await getRedboxSource(browser) expect(source).toContain(`throw new Error('booooom!')`) expect(source).toContain('middleware.js') @@ -315,7 +315,7 @@ describe('middleware - development errors', () => { it('renders the error correctly and recovers', async () => { const browser = await next.browser('/') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect( await browser.elementByCss('#nextjs__container_errors_desc').text() ).toEqual('Failed to compile') @@ -345,7 +345,7 @@ describe('middleware - development errors', () => { }, 'success') }) - it('renders the error correctly and recovers', async () => { + fit('renders the error correctly and recovers', async () => { const browser = await next.browser('/') await assertNoRedbox(browser) await next.patchFile('middleware.js', `export default function () }`) diff --git a/test/development/pages-dir/client-navigation/rendering.test.ts b/test/development/pages-dir/client-navigation/rendering.test.ts index c6325a8bd727f..72aedaa112241 100644 --- a/test/development/pages-dir/client-navigation/rendering.test.ts +++ b/test/development/pages-dir/client-navigation/rendering.test.ts @@ -135,7 +135,7 @@ describe('Client Navigation rendering', () => { const expectedErrorMessage = 'Circular structure in "getInitialProps" result of page "/circular-json-error".' - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const text = await getRedboxHeader(browser) expect(text).toContain(expectedErrorMessage) }) @@ -149,7 +149,7 @@ describe('Client Navigation rendering', () => { const expectedErrorMessage = '"InstanceInitialPropsPage.getInitialProps()" is defined as an instance method - visit https://nextjs.org/docs/messages/get-initial-props-as-an-instance-method for more information.' - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const text = await getRedboxHeader(browser) expect(text).toContain(expectedErrorMessage) }) @@ -195,14 +195,14 @@ describe('Client Navigation rendering', () => { test('default export is not a React Component', async () => { const browser = await webdriver(next.appPort, '/no-default-export') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const text = await getRedboxHeader(browser) expect(text).toMatch(/The default export is not a React Component/) }) test('error-inside-page', async () => { const browser = await webdriver(next.appPort, '/error-inside-page') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const text = await getRedboxHeader(browser) expect(text).toMatch(/This is an expected error/) // Sourcemaps are applied by react-error-overlay, so we can't check them on SSR. @@ -213,7 +213,7 @@ describe('Client Navigation rendering', () => { next.appPort, '/error-in-the-global-scope' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const text = await getRedboxHeader(browser) expect(text).toMatch(/aa is not defined/) // Sourcemaps are applied by react-error-overlay, so we can't check them on SSR. @@ -313,7 +313,7 @@ describe('Client Navigation rendering', () => { it('should show a valid error when undefined is thrown', async () => { const browser = await webdriver(next.appPort, '/throw-undefined') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const text = await getRedboxHeader(browser) expect(text).toContain( diff --git a/test/e2e/app-dir/dynamic-href/dynamic-href.test.ts b/test/e2e/app-dir/dynamic-href/dynamic-href.test.ts index 3bed1ca336d72..60501b9b10a70 100644 --- a/test/e2e/app-dir/dynamic-href/dynamic-href.test.ts +++ b/test/e2e/app-dir/dynamic-href/dynamic-href.test.ts @@ -19,8 +19,7 @@ describe('dynamic-href', () => { it('should error when using dynamic href.pathname in app dir', async () => { const browser = await next.browser('/object') - // Error should show up - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxDescription(browser)).toMatchInlineSnapshot( `"Error: Dynamic href \`/object/[slug]\` found in while using the \`/app\` router, this is not supported. Read more: https://nextjs.org/docs/messages/app-dir-dynamic-href"` ) @@ -47,8 +46,7 @@ describe('dynamic-href', () => { it('should error when using dynamic href in app dir', async () => { const browser = await next.browser('/string') - // Error should show up - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxDescription(browser)).toMatchInlineSnapshot( `"Error: Dynamic href \`/object/[slug]\` found in while using the \`/app\` router, this is not supported. Read more: https://nextjs.org/docs/messages/app-dir-dynamic-href"` ) diff --git a/test/e2e/app-dir/dynamic-io-segment-configs/dynamic-io-segment-configs.test.ts b/test/e2e/app-dir/dynamic-io-segment-configs/dynamic-io-segment-configs.test.ts index e4e43262d6b61..7fd5d989f79e5 100644 --- a/test/e2e/app-dir/dynamic-io-segment-configs/dynamic-io-segment-configs.test.ts +++ b/test/e2e/app-dir/dynamic-io-segment-configs/dynamic-io-segment-configs.test.ts @@ -26,7 +26,7 @@ describe('dynamic-io-segment-configs', () => { if (isNextDev) { const browser = await next.browser('/revalidate') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const redbox = { description: await getRedboxDescription(browser), source: await getRedboxSource(browser), @@ -79,7 +79,7 @@ describe('dynamic-io-segment-configs', () => { if (isNextDev) { const browser = await next.browser('/revalidate') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const redbox = { description: await getRedboxDescription(browser), source: await getRedboxSource(browser), diff --git a/test/e2e/app-dir/error-on-next-codemod-comment/error-on-next-codemod-comment.test.ts b/test/e2e/app-dir/error-on-next-codemod-comment/error-on-next-codemod-comment.test.ts index bbe993fd141aa..649f9bd6d5e93 100644 --- a/test/e2e/app-dir/error-on-next-codemod-comment/error-on-next-codemod-comment.test.ts +++ b/test/e2e/app-dir/error-on-next-codemod-comment/error-on-next-codemod-comment.test.ts @@ -21,7 +21,7 @@ describe('app-dir - error-on-next-codemod-comment', () => { it('should error with swc if you have codemod comments left', async () => { const browser = await next.browser('/') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) if (process.env.TURBOPACK) { expect(await getRedboxSource(browser)).toMatchInlineSnapshot(` @@ -67,7 +67,7 @@ describe('app-dir - error-on-next-codemod-comment', () => { const browser = await next.browser('/') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) // Recover the original file content await next.patchFile('app/page.tsx', originFileContent) @@ -76,7 +76,7 @@ describe('app-dir - error-on-next-codemod-comment', () => { it('should disappear the error when you rre the codemod comment', async () => { const browser = await next.browser('/') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) let originFileContent await next.patchFile('app/page.tsx', (code) => { @@ -98,7 +98,7 @@ describe('app-dir - error-on-next-codemod-comment', () => { it('should disappear the error when you replace with bypass comment', async () => { const browser = await next.browser('/') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) let originFileContent await next.patchFile('app/page.tsx', (code) => { diff --git a/test/e2e/app-dir/errors/index.test.ts b/test/e2e/app-dir/errors/index.test.ts index 6bf778b31fd98..9d25d8e1b795c 100644 --- a/test/e2e/app-dir/errors/index.test.ts +++ b/test/e2e/app-dir/errors/index.test.ts @@ -162,7 +162,7 @@ describe('app-dir - errors', () => { const browser = await next.browser('/global-error-boundary/server') if (isNextDev) { - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxHeader(browser)).toMatch(/custom server error/) } else { expect( diff --git a/test/e2e/app-dir/global-error/layout-error/index.test.ts b/test/e2e/app-dir/global-error/layout-error/index.test.ts index e042b84e8bced..32fa9143107fc 100644 --- a/test/e2e/app-dir/global-error/layout-error/index.test.ts +++ b/test/e2e/app-dir/global-error/layout-error/index.test.ts @@ -1,11 +1,6 @@ import { assertHasRedbox, getRedboxHeader } from 'next-test-utils' import { nextTestSetup } from 'e2e-utils' -async function testDev(browser, errorRegex) { - await assertHasRedbox(browser) - expect(await getRedboxHeader(browser)).toMatch(errorRegex) -} - describe('app dir - global error - layout error', () => { const { next, isNextDev, skipped } = nextTestSetup({ files: __dirname, @@ -20,7 +15,10 @@ describe('app dir - global error - layout error', () => { const browser = await next.browser('/') if (isNextDev) { - await testDev(browser, /Global error: layout error/) + await assertHasRedbox(browser, { pageResponseCode: 500 }) + expect(await getRedboxHeader(browser)).toMatch( + /Global error: layout error/ + ) } else { expect(await browser.elementByCss('h1').text()).toBe('Global Error') expect(await browser.elementByCss('#error').text()).toBe( diff --git a/test/e2e/app-dir/global-error/with-style-import/index.test.ts b/test/e2e/app-dir/global-error/with-style-import/index.test.ts index 22ef8abf6dea6..3c9ad4331cb7c 100644 --- a/test/e2e/app-dir/global-error/with-style-import/index.test.ts +++ b/test/e2e/app-dir/global-error/with-style-import/index.test.ts @@ -1,11 +1,6 @@ import { assertHasRedbox, getRedboxHeader } from 'next-test-utils' import { nextTestSetup } from 'e2e-utils' -async function testDev(browser, errorRegex) { - await assertHasRedbox(browser) - expect(await getRedboxHeader(browser)).toMatch(errorRegex) -} - describe('app dir - global error - with style import', () => { const { next, isNextDev, skipped } = nextTestSetup({ files: __dirname, @@ -20,7 +15,8 @@ describe('app dir - global error - with style import', () => { const browser = await next.browser('/') if (isNextDev) { - await testDev(browser, /Root Layout Error/) + await assertHasRedbox(browser, { pageResponseCode: 500 }) + expect(await getRedboxHeader(browser)).toMatch(/Root Layout Error/) return } diff --git a/test/e2e/app-dir/loader-file-named-export-custom-loader-error/loader-file-named-export-custom-loader-error.test.ts b/test/e2e/app-dir/loader-file-named-export-custom-loader-error/loader-file-named-export-custom-loader-error.test.ts index 7c72ff6a0217e..19ce7e09c7648 100644 --- a/test/e2e/app-dir/loader-file-named-export-custom-loader-error/loader-file-named-export-custom-loader-error.test.ts +++ b/test/e2e/app-dir/loader-file-named-export-custom-loader-error/loader-file-named-export-custom-loader-error.test.ts @@ -4,11 +4,6 @@ import { assertHasRedbox, getRedboxHeader } from 'next-test-utils' const errorMessage = 'images.loaderFile detected but the file is missing default export.\nRead more: https://nextjs.org/docs/messages/invalid-images-config' -async function testDev(browser, errorRegex) { - await assertHasRedbox(browser) - expect(await getRedboxHeader(browser)).toMatch(errorRegex) -} - describe('Error test if the loader file export a named function', () => { describe('in Development', () => { const { next, isNextDev } = nextTestSetup({ @@ -19,12 +14,14 @@ describe('Error test if the loader file export a named function', () => { ;(isNextDev ? describe : describe.skip)('development only', () => { it('should show the error when using `Image` component', async () => { const browser = await next.browser('/') - await testDev(browser, errorMessage) + await assertHasRedbox(browser, { pageResponseCode: 500 }) + expect(await getRedboxHeader(browser)).toMatch(errorMessage) }) it('should show the error when using `getImageProps` method', async () => { const browser = await next.browser('/get-img-props') - await testDev(browser, errorMessage) + await assertHasRedbox(browser, { pageResponseCode: 500 }) + expect(await getRedboxHeader(browser)).toMatch(errorMessage) }) }) }) diff --git a/test/e2e/app-dir/next-after-pages/index.test.ts b/test/e2e/app-dir/next-after-pages/index.test.ts index 960656a036abc..353ff749b05d0 100644 --- a/test/e2e/app-dir/next-after-pages/index.test.ts +++ b/test/e2e/app-dir/next-after-pages/index.test.ts @@ -60,7 +60,7 @@ _describe('unstable_after() - pages', () => { ])('$title', async ({ path }) => { const browser = await next.browser(path) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxSource(browser)).toMatch( /You're importing a component that needs "?unstable_after"?\. That only works in a Server Component which is not supported in the pages\/ directory\./ ) diff --git a/test/integration/app-dir-export/test/utils.ts b/test/integration/app-dir-export/test/utils.ts index 82b4e6c08f840..8d0b31ddc9fa0 100644 --- a/test/integration/app-dir-export/test/utils.ts +++ b/test/integration/app-dir-export/test/utils.ts @@ -176,7 +176,10 @@ export async function runTests({ if (isDev) { const url = dynamicPage ? '/another/first' : '/api/json' const browser = await webdriver(port, url) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + // Main issue here that a local run hits a Node.js bug: https://linear.app/vercel/issue/NDX-505 + fixmeStackFramesHaveBrokenSourcemaps: true, + }) const header = await getRedboxHeader(browser) const source = await getRedboxSource(browser) expect(`${header}\n${source}`).toContain(expectedErrMsg) diff --git a/test/integration/config-output-export/test/index.test.ts b/test/integration/config-output-export/test/index.test.ts index 38575c1b70b11..bda5a8e931d27 100644 --- a/test/integration/config-output-export/test/index.test.ts +++ b/test/integration/config-output-export/test/index.test.ts @@ -221,7 +221,7 @@ describe('config-output-export', () => { await killApp(app).catch(() => {}) fs.rmSync(blog) } - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxHeader(browser)).toContain( 'ISR cannot be used with "output: export".' ) @@ -312,7 +312,7 @@ describe('config-output-export', () => { await killApp(app).catch(() => {}) fs.rmSync(blog) } - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxHeader(browser)).toContain( 'getServerSideProps cannot be used with "output: export".' ) @@ -352,7 +352,7 @@ describe('config-output-export', () => { output: 'export', }) browser = await webdriver(result.port, '/posts/one') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxHeader(browser)).toContain( 'getStaticPaths with "fallback: true" cannot be used with "output: export".' ) @@ -396,7 +396,7 @@ describe('config-output-export', () => { output: 'export', }) browser = await webdriver(result.port, '/posts/one') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxHeader(browser)).toContain( 'getStaticPaths with "fallback: blocking" cannot be used with "output: export".' ) diff --git a/test/integration/dynamic-routing/test/index.test.js b/test/integration/dynamic-routing/test/index.test.js index 69c61598122b7..76ecca2666f6e 100644 --- a/test/integration/dynamic-routing/test/index.test.js +++ b/test/integration/dynamic-routing/test/index.test.js @@ -1200,7 +1200,7 @@ function runTests({ dev }) { await browser .elementByCss('#view-post-1-interpolated-incorrectly') .click() - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const header = await getRedboxHeader(browser) expect(header).toContain( 'The provided `href` (/[name]?another=value) value is missing query values (name) to be interpolated properly.' diff --git a/test/integration/invalid-href/test/index.test.js b/test/integration/invalid-href/test/index.test.js index a8976ab9aeb7a..93ee428e583c8 100644 --- a/test/integration/invalid-href/test/index.test.js +++ b/test/integration/invalid-href/test/index.test.js @@ -49,7 +49,7 @@ const showsError = async (pathname, regex, click = false, isWarn = false) => { return warnLogs.join('\n') }, regex) } else { - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) const errorContent = await getRedboxHeader(browser) expect(errorContent).toMatch(regex) } diff --git a/test/integration/next-image-legacy/base-path/test/index.test.ts b/test/integration/next-image-legacy/base-path/test/index.test.ts index 15d9cee09cf29..d9c20e93e01dc 100644 --- a/test/integration/next-image-legacy/base-path/test/index.test.ts +++ b/test/integration/next-image-legacy/base-path/test/index.test.ts @@ -386,7 +386,10 @@ function runTests(mode) { it('should show invalid src error', async () => { const browser = await webdriver(appPort, '/docs/invalid-src') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + // Main issue here that a local run hits a Node.js bug: https://linear.app/vercel/issue/NDX-505 + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( 'Invalid src prop (https://google.com/test.png) on `next/image`, hostname "google.com" is not configured under images in your `next.config.js`' ) @@ -398,7 +401,10 @@ function runTests(mode) { '/docs/invalid-src-proto-relative' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + // Main issue here that a local run hits a Node.js bug: https://linear.app/vercel/issue/NDX-505 + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( 'Failed to parse src "//assets.example.com/img.jpg" on `next/image`, protocol-relative URL (//) must be changed to an absolute URL (http:// or https://)' ) diff --git a/test/integration/next-image-legacy/default/test/index.test.ts b/test/integration/next-image-legacy/default/test/index.test.ts index a7578f60c0a9d..a3e04cdc36194 100644 --- a/test/integration/next-image-legacy/default/test/index.test.ts +++ b/test/integration/next-image-legacy/default/test/index.test.ts @@ -824,7 +824,11 @@ function runTests(mode) { it('should show invalid src error', async () => { const browser = await webdriver(appPort, '/invalid-src') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + pageResponseCode: 500, + // Main issue here that a local run hits a Node.js bug: https://linear.app/vercel/issue/NDX-505 + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( 'Invalid src prop (https://google.com/test.png) on `next/image`, hostname "google.com" is not configured under images in your `next.config.js`' ) @@ -833,7 +837,11 @@ function runTests(mode) { it('should show invalid src error when protocol-relative', async () => { const browser = await webdriver(appPort, '/invalid-src-proto-relative') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + pageResponseCode: 500, + // Main issue here that a local run hits a Node.js bug: https://linear.app/vercel/issue/NDX-505 + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( 'Failed to parse src "//assets.example.com/img.jpg" on `next/image`, protocol-relative URL (//) must be changed to an absolute URL (http:// or https://)' ) @@ -842,7 +850,11 @@ function runTests(mode) { it('should show error when string src and placeholder=blur and blurDataURL is missing', async () => { const browser = await webdriver(appPort, '/invalid-placeholder-blur') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + pageResponseCode: 500, + // Main issue here that a local run hits a Node.js bug: https://linear.app/vercel/issue/NDX-505 + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/test.png" has "placeholder='blur'" property but is missing the "blurDataURL" property.` ) @@ -851,7 +863,11 @@ function runTests(mode) { it('should show error when not numeric string width or height', async () => { const browser = await webdriver(appPort, '/invalid-width-or-height') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + pageResponseCode: 500, + // Main issue here that a local run hits a Node.js bug: https://linear.app/vercel/issue/NDX-505 + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/test.jpg" has invalid "width" or "height" property. These should be numeric values.` ) @@ -863,7 +879,11 @@ function runTests(mode) { '/invalid-placeholder-blur-static' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + pageResponseCode: 500, + // Main issue here that a local run hits a Node.js bug: https://linear.app/vercel/issue/NDX-505 + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toMatch( /Image with src "(.*)bmp" has "placeholder='blur'" property but is missing the "blurDataURL" property/ ) diff --git a/test/integration/next-image-new/app-dir-localpatterns/test/index.test.ts b/test/integration/next-image-new/app-dir-localpatterns/test/index.test.ts index 008f4c2b41030..2c5efe68556b2 100644 --- a/test/integration/next-image-new/app-dir-localpatterns/test/index.test.ts +++ b/test/integration/next-image-new/app-dir-localpatterns/test/index.test.ts @@ -55,7 +55,7 @@ function runTests(mode: 'dev' | 'server') { const page = '/' + id const browser = await webdriver(appPort, page) if (mode === 'dev') { - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxHeader(browser)).toMatch( /Invalid src prop (.+) on `next\/image` does not match `images.localPatterns` configured/g ) diff --git a/test/integration/next-image-new/app-dir/test/index.test.ts b/test/integration/next-image-new/app-dir/test/index.test.ts index 46fbaa676e91d..8b8a6e3385910 100644 --- a/test/integration/next-image-new/app-dir/test/index.test.ts +++ b/test/integration/next-image-new/app-dir/test/index.test.ts @@ -915,7 +915,9 @@ function runTests(mode: 'dev' | 'server') { it('should show invalid src error', async () => { const browser = await webdriver(appPort, '/invalid-src') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( 'Invalid src prop (https://google.com/test.png) on `next/image`, hostname "google.com" is not configured under images in your `next.config.js`' ) @@ -924,7 +926,9 @@ function runTests(mode: 'dev' | 'server') { it('should show invalid src error when protocol-relative', async () => { const browser = await webdriver(appPort, '/invalid-src-proto-relative') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( 'Failed to parse src "//assets.example.com/img.jpg" on `next/image`, protocol-relative URL (//) must be changed to an absolute URL (http:// or https://)' ) @@ -932,7 +936,9 @@ function runTests(mode: 'dev' | 'server') { it('should show invalid src with leading space', async () => { const browser = await webdriver(appPort, '/invalid-src-leading-space') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( 'Image with src " /test.jpg" cannot start with a space or control character.' ) @@ -940,7 +946,9 @@ function runTests(mode: 'dev' | 'server') { it('should show invalid src with trailing space', async () => { const browser = await webdriver(appPort, '/invalid-src-trailing-space') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( 'Image with src "/test.png " cannot end with a space or control character.' ) @@ -949,7 +957,9 @@ function runTests(mode: 'dev' | 'server') { it('should show error when string src and placeholder=blur and blurDataURL is missing', async () => { const browser = await webdriver(appPort, '/invalid-placeholder-blur') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/test.png" has "placeholder='blur'" property but is missing the "blurDataURL" property.` ) @@ -958,7 +968,9 @@ function runTests(mode: 'dev' | 'server') { it('should show error when invalid width prop', async () => { const browser = await webdriver(appPort, '/invalid-width') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/test.jpg" has invalid "width" property. Expected a numeric value in pixels but received "100%".` ) @@ -967,7 +979,9 @@ function runTests(mode: 'dev' | 'server') { it('should show error when invalid Infinity width prop', async () => { const browser = await webdriver(appPort, '/invalid-Infinity-width') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/test.jpg" has invalid "width" property. Expected a numeric value in pixels but received "Infinity".` ) @@ -976,7 +990,9 @@ function runTests(mode: 'dev' | 'server') { it('should show error when invalid height prop', async () => { const browser = await webdriver(appPort, '/invalid-height') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/test.jpg" has invalid "height" property. Expected a numeric value in pixels but received "50vh".` ) @@ -995,7 +1011,9 @@ function runTests(mode: 'dev' | 'server') { it('should show error when missing width prop', async () => { const browser = await webdriver(appPort, '/missing-width') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/test.jpg" is missing required "width" property.` ) @@ -1004,7 +1022,9 @@ function runTests(mode: 'dev' | 'server') { it('should show error when missing height prop', async () => { const browser = await webdriver(appPort, '/missing-height') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/test.jpg" is missing required "height" property.` ) @@ -1013,7 +1033,9 @@ function runTests(mode: 'dev' | 'server') { it('should show error when width prop on fill image', async () => { const browser = await webdriver(appPort, '/invalid-fill-width') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/wide.png" has both "width" and "fill" properties.` ) @@ -1022,7 +1044,9 @@ function runTests(mode: 'dev' | 'server') { it('should show error when CSS position changed on fill image', async () => { const browser = await webdriver(appPort, '/invalid-fill-position') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/wide.png" has both "fill" and "style.position" properties. Images with "fill" always use position absolute - it cannot be modified.` ) @@ -1034,7 +1058,9 @@ function runTests(mode: 'dev' | 'server') { '/invalid-placeholder-blur-static' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toMatch( /Image with src "(.*)bmp" has "placeholder='blur'" property but is missing the "blurDataURL" property/ ) diff --git a/test/integration/next-image-new/base-path/test/index.test.js b/test/integration/next-image-new/base-path/test/index.test.js index b99165da979ee..97552d0cd3ca4 100644 --- a/test/integration/next-image-new/base-path/test/index.test.js +++ b/test/integration/next-image-new/base-path/test/index.test.js @@ -141,7 +141,11 @@ function runTests(mode) { it('should show invalid src error', async () => { const browser = await webdriver(appPort, '/docs/invalid-src') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + pageResponseCode: 500, + // Main issue here that a local run hits a Node.js bug: https://linear.app/vercel/issue/NDX-505 + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( 'Invalid src prop (https://google.com/test.png) on `next/image`, hostname "google.com" is not configured under images in your `next.config.js`' ) @@ -153,7 +157,11 @@ function runTests(mode) { '/docs/invalid-src-proto-relative' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + pageResponseCode: 500, + // Main issue here that a local run hits a Node.js bug: https://linear.app/vercel/issue/NDX-505 + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain( 'Failed to parse src "//assets.example.com/img.jpg" on `next/image`, protocol-relative URL (//) must be changed to an absolute URL (http:// or https://)' ) diff --git a/test/integration/next-image-new/default/test/index.test.ts b/test/integration/next-image-new/default/test/index.test.ts index a43a08fb98c16..a46b6cd82caee 100644 --- a/test/integration/next-image-new/default/test/index.test.ts +++ b/test/integration/next-image-new/default/test/index.test.ts @@ -917,7 +917,10 @@ function runTests(mode) { it('should show invalid src error', async () => { const browser = await webdriver(appPort, '/invalid-src') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + pageResponseCode: 500, + }) expect(await getRedboxHeader(browser)).toContain( 'Invalid src prop (https://google.com/test.png) on `next/image`, hostname "google.com" is not configured under images in your `next.config.js`' ) @@ -926,7 +929,10 @@ function runTests(mode) { it('should show invalid src error when protocol-relative', async () => { const browser = await webdriver(appPort, '/invalid-src-proto-relative') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + pageResponseCode: 500, + }) expect(await getRedboxHeader(browser)).toContain( 'Failed to parse src "//assets.example.com/img.jpg" on `next/image`, protocol-relative URL (//) must be changed to an absolute URL (http:// or https://)' ) @@ -934,7 +940,10 @@ function runTests(mode) { it('should show invalid src with leading space', async () => { const browser = await webdriver(appPort, '/invalid-src-leading-space') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + pageResponseCode: 500, + }) expect(await getRedboxHeader(browser)).toContain( 'Image with src " /test.jpg" cannot start with a space or control character.' ) @@ -942,7 +951,10 @@ function runTests(mode) { it('should show invalid src with trailing space', async () => { const browser = await webdriver(appPort, '/invalid-src-trailing-space') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + pageResponseCode: 500, + }) expect(await getRedboxHeader(browser)).toContain( 'Image with src "/test.png " cannot end with a space or control character.' ) @@ -951,7 +963,10 @@ function runTests(mode) { it('should show error when string src and placeholder=blur and blurDataURL is missing', async () => { const browser = await webdriver(appPort, '/invalid-placeholder-blur') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + pageResponseCode: 500, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/test.png" has "placeholder='blur'" property but is missing the "blurDataURL" property.` ) @@ -960,7 +975,10 @@ function runTests(mode) { it('should show error when invalid width prop', async () => { const browser = await webdriver(appPort, '/invalid-width') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + pageResponseCode: 500, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/test.jpg" has invalid "width" property. Expected a numeric value in pixels but received "100%".` ) @@ -969,7 +987,10 @@ function runTests(mode) { it('should show error when invalid Infinity width prop', async () => { const browser = await webdriver(appPort, '/invalid-Infinity-width') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + pageResponseCode: 500, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/test.jpg" has invalid "width" property. Expected a numeric value in pixels but received "Infinity".` ) @@ -978,7 +999,10 @@ function runTests(mode) { it('should show error when invalid height prop', async () => { const browser = await webdriver(appPort, '/invalid-height') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + pageResponseCode: 500, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/test.jpg" has invalid "height" property. Expected a numeric value in pixels but received "50vh".` ) @@ -997,7 +1021,10 @@ function runTests(mode) { it('should show error when missing width prop', async () => { const browser = await webdriver(appPort, '/missing-width') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + pageResponseCode: 500, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/test.jpg" is missing required "width" property.` ) @@ -1006,7 +1033,10 @@ function runTests(mode) { it('should show error when missing height prop', async () => { const browser = await webdriver(appPort, '/missing-height') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + pageResponseCode: 500, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/test.jpg" is missing required "height" property.` ) @@ -1015,7 +1045,10 @@ function runTests(mode) { it('should show error when width prop on fill image', async () => { const browser = await webdriver(appPort, '/invalid-fill-width') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + pageResponseCode: 500, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/wide.png" has both "width" and "fill" properties.` ) @@ -1024,7 +1057,10 @@ function runTests(mode) { it('should show error when CSS position changed on fill image', async () => { const browser = await webdriver(appPort, '/invalid-fill-position') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + pageResponseCode: 500, + }) expect(await getRedboxHeader(browser)).toContain( `Image with src "/wide.png" has both "fill" and "style.position" properties. Images with "fill" always use position absolute - it cannot be modified.` ) @@ -1036,7 +1072,10 @@ function runTests(mode) { '/invalid-placeholder-blur-static' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + fixmeStackFramesHaveBrokenSourcemaps: true, + pageResponseCode: 500, + }) expect(await getRedboxHeader(browser)).toMatch( /Image with src "(.*)bmp" has "placeholder='blur'" property but is missing the "blurDataURL" property/ ) diff --git a/test/integration/next-image-new/export-config/test/index.test.ts b/test/integration/next-image-new/export-config/test/index.test.ts index 50601d9e6710f..900226518ee2c 100644 --- a/test/integration/next-image-new/export-config/test/index.test.ts +++ b/test/integration/next-image-new/export-config/test/index.test.ts @@ -35,7 +35,10 @@ describe('next/image with output export config', () => { const browser = await webdriver(appPort, '/') const msg = "Image Optimization using the default loader is not compatible with `{ output: 'export' }`." - await assertHasRedbox(browser) + await assertHasRedbox(browser, { + // Main issue here that a local run hits a Node.js bug: https://linear.app/vercel/issue/NDX-505 + fixmeStackFramesHaveBrokenSourcemaps: true, + }) expect(await getRedboxHeader(browser)).toContain(msg) expect(stderr).toContain(msg) }) diff --git a/test/integration/next-image-new/invalid-image-import/test/index.test.ts b/test/integration/next-image-new/invalid-image-import/test/index.test.ts index 17c0dde443917..ad6f5707daf3b 100644 --- a/test/integration/next-image-new/invalid-image-import/test/index.test.ts +++ b/test/integration/next-image-new/invalid-image-import/test/index.test.ts @@ -22,7 +22,7 @@ function runTests({ isDev }) { it('should show error', async () => { if (isDev) { const browser = await webdriver(appPort, '/') - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxHeader(browser)).toMatch('Failed to compile') const source = await getRedboxSource(browser) if (process.env.TURBOPACK) { diff --git a/test/integration/server-side-dev-errors/test/index.test.js b/test/integration/server-side-dev-errors/test/index.test.js index 536259c7e3699..9554ecabd3efb 100644 --- a/test/integration/server-side-dev-errors/test/index.test.js +++ b/test/integration/server-side-dev-errors/test/index.test.js @@ -90,7 +90,7 @@ describe('server-side dev errors', () => { '\n> 6 | missingVar;return {' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxSource(browser)).toContain('missingVar') await fs.writeFile(gspPage, content, { flush: true }) @@ -143,7 +143,7 @@ describe('server-side dev errors', () => { '\n> 6 | missingVar;return {' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxSource(browser)).toContain('missingVar') await fs.writeFile(gsspPage, content) @@ -196,11 +196,11 @@ describe('server-side dev errors', () => { '\n> 6 | missingVar;return {' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxSource(browser)).toContain('missingVar') await fs.writeFile(dynamicGsspPage, content) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) } finally { await fs.writeFile(dynamicGsspPage, content) } @@ -249,11 +249,11 @@ describe('server-side dev errors', () => { "\n> 2 | missingVar;res.status(200).json({ hello: 'world' })" ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxSource(browser)).toContain('missingVar') await fs.writeFile(apiPage, content) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) } finally { await fs.writeFile(apiPage, content) } @@ -305,11 +305,11 @@ describe('server-side dev errors', () => { '\n> 2 | missingVar;res.status(200).json({ slug: req.query.slug })' ) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) expect(await getRedboxSource(browser)).toContain('missingVar') await fs.writeFile(dynamicApiPage, content) - await assertHasRedbox(browser) + await assertHasRedbox(browser, { pageResponseCode: 500 }) } finally { await fs.writeFile(dynamicApiPage, content) } diff --git a/test/lib/development-sandbox.ts b/test/lib/development-sandbox.ts index 803e1804fd3cf..ad56f7c520059 100644 --- a/test/lib/development-sandbox.ts +++ b/test/lib/development-sandbox.ts @@ -5,9 +5,11 @@ import { getRedboxHeader, getRedboxSource, getVersionCheckerText, + type AssertHasRedboxOptions, assertHasRedbox, assertNoRedbox, waitFor, + type OpenRedboxOptions, openRedbox, getRedboxDescriptionWarning, toggleCollapseComponentStack, @@ -118,14 +120,14 @@ export async function createSandbox( ) } }, - async assertHasRedbox() { - return assertHasRedbox(browser) + async assertHasRedbox(options?: AssertHasRedboxOptions) { + return assertHasRedbox(browser, options) }, async assertNoRedbox() { return assertNoRedbox(browser) }, - async openRedbox() { - return openRedbox(browser) + async openRedbox(options?: OpenRedboxOptions) { + return openRedbox(browser, options) }, async hasErrorToast() { return Boolean(await hasErrorToast(browser)) diff --git a/test/lib/next-test-utils.ts b/test/lib/next-test-utils.ts index 38d005d312853..173b1fe157f9b 100644 --- a/test/lib/next-test-utils.ts +++ b/test/lib/next-test-utils.ts @@ -821,7 +821,22 @@ export async function retry( } } -export async function assertHasRedbox(browser: BrowserInterface) { +export interface AssertHasRedboxOptions { + /** + * Set to true, if any stackframe in the Redbox causes the middleware to return 500. + * This is always a bug that should be fixed. + */ + fixmeStackFramesHaveBrokenSourcemaps?: boolean + /** + * Set to 500 if the page is expected to return a 500 + * Can be an array representing each response recorded in this test. + */ + pageResponseCode?: number | number[] +} +export async function assertHasRedbox( + browser: BrowserInterface, + options: AssertHasRedboxOptions = {} +) { try { await retry( async () => { @@ -846,6 +861,82 @@ export async function assertHasRedbox(browser: BrowserInterface) { Error.captureStackTrace(error, assertHasRedbox) throw error } + + const logs = await browser.log() + const internalServerErrorLogs = logs.filter((log) => { + return ( + log.source === 'error' && + log.message.includes( + 'Failed to load resource: the server responded with a status of 500 (Internal Server Error)' + ) + ) + }) + + if ( + options.pageResponseCode === 500 && + internalServerErrorLogs.length === 0 + ) { + const error = new Error( + 'Expected the page to return a 500 (Internal Server Error) but found no message indicating this error occured: ' + + logs + .filter((log) => log.source === 'error') + .map((log) => log.message) + .join('\n') + ) + Error.captureStackTrace(error, assertHasRedbox) + throw error + } + + const expectedInternalServerError = + options.pageResponseCode === 500 + ? 1 + : Array.isArray(options.pageResponseCode) + ? options.pageResponseCode.filter( + (responseCode) => responseCode === 500 + ).length + : 0 + const stackFramesWithBrokenSourceMaps = + internalServerErrorLogs.length - expectedInternalServerError + const stackFramesHaveBrokenSourcemapsActualExpected = + options.fixmeStackFramesHaveBrokenSourcemaps + if ( + stackFramesWithBrokenSourceMaps > 0 && + !stackFramesHaveBrokenSourcemapsActualExpected + ) { + let error: Error + if (stackFramesWithBrokenSourceMaps === 1) { + error = new Error( + 'Expected no 500 but found one. ' + + 'This is likely due to the page returning a 500. ' + + 'Pass the `pageResponseCode: 500` if this is expected.' + ) + } else { + // Ensures that tests are automatically updated when the bug is fixed. + error = new Error( + `'Expected no broken sourcemaps but found ${stackFramesWithBrokenSourceMaps}. ` + + 'Check the callstack to find the frames that are not sourcemapped. ' + + 'Pass the `fixmeStackFramesHaveBrokenSourcemaps` option to silence this error. ' + + 'Though keep in mind that this is a legit bug. ' + + `Alternatively, if the page actually triggerd ${stackFramesWithBrokenSourceMaps} ` + + `navigations, pass \`pageResponseCode: [${Array.from({ length: stackFramesWithBrokenSourceMaps }, () => 500).join(', ')}]\`.` + ) + } + + Error.captureStackTrace(error, assertHasRedbox) + throw error + } else if ( + stackFramesWithBrokenSourceMaps === 0 && + stackFramesHaveBrokenSourcemapsActualExpected + ) { + // Ensures that tests are automatically updated when the bug is fixed. + const error = new Error( + 'Expected broken sourcemaps but found none. ' + + 'Seems like this bug was fixed. ' + + 'You can safely remove the `fixmeStackFramesHaveBrokenSourcemaps` option.' + ) + Error.captureStackTrace(error, assertHasRedbox) + throw error + } } export async function assertNoRedbox(browser: BrowserInterface) { @@ -892,11 +983,15 @@ export async function hasErrorToast( }) } +export interface OpenRedboxOptions extends AssertHasRedboxOptions {} /** * Has retried version of {@link hasErrorToast} built-in. * Success implies {@link assertHasRedbox}. */ -export async function openRedbox(browser: BrowserInterface): Promise { +export async function openRedbox( + browser: BrowserInterface, + options: OpenRedboxOptions = {} +): Promise { try { browser.waitForElementByCss('[data-nextjs-toast]', 5000).click() } catch (cause) { @@ -904,7 +999,7 @@ export async function openRedbox(browser: BrowserInterface): Promise { Error.captureStackTrace(error, openRedbox) throw error } - await assertHasRedbox(browser) + await assertHasRedbox(browser, options) } export function getRedboxHeader(browser: BrowserInterface) {