From 11b1b97f87e3f2bfec780daaf6521324af0fb822 Mon Sep 17 00:00:00 2001 From: Abdelrahman Awad Date: Tue, 21 Jul 2026 11:11:38 -0400 Subject: [PATCH] test(nextjs): Drop Next.js 13 e2e tests Next.js 13 support is being dropped in v11. Removes the dedicated nextjs-13 e2e test app, the next@13 build variant from the shared nextjs-app-dir and nextjs-pages-dir suites (and its canary matrix entry), and the now-dead isNext13 guards those variants exercised. --- .github/workflows/canary.yml | 3 - .../test-applications/nextjs-13/.gitignore | 43 ----- .../nextjs-13/app/layout.tsx | 7 - .../app/pageload-transaction/page.tsx | 3 - .../parameterized/[one]/beep/[two]/page.tsx | 3 - .../app/parameterized/[one]/beep/page.tsx | 3 - .../app/parameterized/[one]/page.tsx | 3 - .../app/parameterized/static/page.tsx | 3 - .../nextjs-13/app/rsc-error/page.tsx | 6 - .../test-applications/nextjs-13/globals.d.ts | 4 - .../nextjs-13/instrumentation-client.ts | 11 -- .../nextjs-13/instrumentation.ts | 19 -- .../test-applications/nextjs-13/middleware.ts | 6 - .../test-applications/nextjs-13/next-env.d.ts | 6 - .../nextjs-13/next.config.js | 17 -- .../test-applications/nextjs-13/package.json | 39 ---- .../nextjs-13/pages/[param]/click-error.tsx | 12 -- .../[param]/customPageExtension.page.tsx | 12 -- .../[param]/error-getServerSideProps.tsx | 7 - .../pages/[param]/navigation-start-page.tsx | 9 - .../pages/[param]/navigation-target-page.tsx | 3 - .../pages/[param]/pages-pageload.tsx | 3 - .../pages/[param]/withInitialProps.tsx | 7 - .../pages/[param]/withServerSideProps.tsx | 7 - .../nextjs-13/pages/_app.tsx | 19 -- .../pages/api/[param]/failure-api-route.ts | 5 - .../nextjs-13/pages/api/[param]/index.ts | 5 - .../pages/api/[param]/success-api-route.ts | 5 - .../api/cjs-api-endpoint-with-require.ts | 14 -- .../nextjs-13/pages/api/cjs-api-endpoint.ts | 7 - .../pages/api/endpoint-excluded-with-regex.ts | 5 - .../api/endpoint-excluded-with-string.ts | 5 - .../nextjs-13/pages/api/no-params.ts | 5 - .../pages/api/params/[...pathParts].ts | 5 - .../nextjs-13/pages/crashed-session-page.tsx | 13 -- .../nextjs-13/pages/fetch.tsx | 12 -- .../nextjs-13/pages/healthy-session-page.tsx | 3 - .../misconfigured-_app-getInitialProps.tsx | 5 - .../nextjs-13/pages/reportDialog.tsx | 15 -- ...unmatchedCustomPageExtension.someExtension | 3 - .../nextjs-13/playwright.config.ts | 19 -- .../nextjs-13/start-event-proxy.mjs | 14 -- .../tests/client/app-dir-pageloads.test.ts | 52 ----- .../tests/client/click-error.test.ts | 58 ------ ...ltyAppGetInitialPropsConfiguration.test.ts | 13 -- .../nextjs-13/tests/client/fetch.test.ts | 59 ------ .../tests/client/pages-dir-navigation.test.ts | 59 ------ .../tests/client/pages-dir-pageload.test.ts | 89 --------- .../tests/client/parameterized-routes.test.ts | 161 ---------------- .../tests/client/reportDialog.test.ts | 17 -- .../nextjs-13/tests/client/sessions.test.ts | 26 --- .../tests/isomorphic/getInitialProps.test.ts | 60 ------ .../isomorphic/getServerSideProps.test.ts | 60 ------ .../nextjs-13/tests/server/404.test.ts | 23 --- .../tests/server/cjs-api-endpoints.test.ts | 132 ------------- .../server/excluded-api-endpoints.test.ts | 38 ---- .../tests/server/getServerSideProps.test.ts | 180 ------------------ .../server/pages-router-api-endpoints.test.ts | 123 ------------ .../server/server-component-error.test.ts | 40 ---- .../tests/server/server-components.test.ts | 48 ----- .../nextjs-13/tests/server/utils/throw.js | 1 - .../server/wrapApiHandlerWithSentry.test.ts | 63 ------ .../test-applications/nextjs-13/tsconfig.json | 25 --- .../nextjs-app-dir/package.json | 5 - .../connected-servercomponent-trace.test.ts | 37 ++-- .../nextjs-app-dir/tests/nextjsVersion.ts | 6 - .../tests/server-components.test.ts | 47 ++--- .../nextjs-pages-dir/package.json | 5 - .../tests/error-page-lasteventid.test.ts | 3 - .../nextjs-pages-dir/tests/nextjsVersion.ts | 5 - 70 files changed, 35 insertions(+), 1795 deletions(-) delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/.gitignore delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/app/layout.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/app/pageload-transaction/page.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/beep/[two]/page.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/beep/page.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/page.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/static/page.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/app/rsc-error/page.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/globals.d.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/instrumentation-client.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/instrumentation.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/middleware.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/next-env.d.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/next.config.js delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/package.json delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/click-error.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/customPageExtension.page.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/error-getServerSideProps.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/navigation-start-page.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/navigation-target-page.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/pages-pageload.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/withInitialProps.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/withServerSideProps.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/_app.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/failure-api-route.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/index.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/success-api-route.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/cjs-api-endpoint-with-require.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/cjs-api-endpoint.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/endpoint-excluded-with-regex.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/endpoint-excluded-with-string.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/no-params.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/params/[...pathParts].ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/crashed-session-page.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/fetch.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/healthy-session-page.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/misconfigured-_app-getInitialProps.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/reportDialog.tsx delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/pages/unmatchedCustomPageExtension.someExtension delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/playwright.config.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/start-event-proxy.mjs delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/app-dir-pageloads.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/click-error.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/faultyAppGetInitialPropsConfiguration.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/fetch.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/pages-dir-navigation.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/pages-dir-pageload.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/parameterized-routes.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/reportDialog.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/sessions.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/isomorphic/getInitialProps.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/isomorphic/getServerSideProps.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/404.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/cjs-api-endpoints.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/excluded-api-endpoints.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/getServerSideProps.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/pages-router-api-endpoints.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/server-component-error.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/server-components.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/utils/throw.js delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/wrapApiHandlerWithSentry.test.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-13/tsconfig.json delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/nextjsVersion.ts delete mode 100644 dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/nextjsVersion.ts diff --git a/.github/workflows/canary.yml b/.github/workflows/canary.yml index 40a44df083d7..414cd48d9245 100644 --- a/.github/workflows/canary.yml +++ b/.github/workflows/canary.yml @@ -78,9 +78,6 @@ jobs: - test-application: 'nextjs-app-dir' build-command: 'test:build-15' label: 'nextjs-app-dir (next@15)' - - test-application: 'nextjs-13' - build-command: 'test:build-latest' - label: 'nextjs-13 (latest)' - test-application: 'nextjs-14' build-command: 'test:build-canary' label: 'nextjs-14 (canary)' diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/.gitignore b/dev-packages/e2e-tests/test-applications/nextjs-13/.gitignore deleted file mode 100644 index 68d4c4a9cbf2..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/.gitignore +++ /dev/null @@ -1,43 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# local env files -.env*.local - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts - -!*.d.ts - -test-results -event-dumps - -.vscode diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/app/layout.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/app/layout.tsx deleted file mode 100644 index c8f9cee0b787..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/app/layout.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default function Layout({ children }: { children: React.ReactNode }) { - return ( - - {children} - - ); -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/app/pageload-transaction/page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/app/pageload-transaction/page.tsx deleted file mode 100644 index b8109689f986..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/app/pageload-transaction/page.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function PageloadTransactionPage() { - return

Pageload Transaction Page

; -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/beep/[two]/page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/beep/[two]/page.tsx deleted file mode 100644 index f34461c2bb07..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/beep/[two]/page.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function ParameterizedPage() { - return
Dynamic page two
; -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/beep/page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/beep/page.tsx deleted file mode 100644 index a7d9164c8c03..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/beep/page.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function BeepPage() { - return
Beep
; -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/page.tsx deleted file mode 100644 index 9fa617a22381..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/[one]/page.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function ParameterizedPage() { - return
Dynamic page one
; -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/static/page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/static/page.tsx deleted file mode 100644 index 16ef0482d53b..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/app/parameterized/static/page.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function StaticPage() { - return
Static page
; -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/app/rsc-error/page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/app/rsc-error/page.tsx deleted file mode 100644 index 9328f85142a8..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/app/rsc-error/page.tsx +++ /dev/null @@ -1,6 +0,0 @@ -export const dynamic = 'force-dynamic'; - -export default async function Page() { - throw new Error('RSC error'); - return

Hello World

; -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/globals.d.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/globals.d.ts deleted file mode 100644 index 109dbcd55648..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/globals.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -interface Window { - recordedTransactions?: string[]; - capturedExceptionId?: string; -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/instrumentation-client.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/instrumentation-client.ts deleted file mode 100644 index 57415e4094e2..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/instrumentation-client.ts +++ /dev/null @@ -1,11 +0,0 @@ -import * as Sentry from '@sentry/nextjs'; - -Sentry.init({ - environment: 'qa', // dynamic sampling bias to keep transactions - dsn: process.env.NEXT_PUBLIC_E2E_TEST_DSN, - tunnel: `http://localhost:3031/`, // proxy server - tracesSampleRate: 1.0, - dataCollection: { userInfo: true }, -}); - -export const onRouterTransitionStart = Sentry.captureRouterTransitionStart; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/instrumentation.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/instrumentation.ts deleted file mode 100644 index 979e0f0abedb..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/instrumentation.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as Sentry from '@sentry/nextjs'; - -export function register() { - if (process.env.NEXT_RUNTIME === 'nodejs' || process.env.NEXT_RUNTIME === 'edge') { - Sentry.init({ - environment: 'qa', // dynamic sampling bias to keep transactions - dsn: process.env.NEXT_PUBLIC_E2E_TEST_DSN, - tunnel: `http://localhost:3031/`, // proxy server - tracesSampleRate: 1, - dataCollection: { userInfo: true }, - transportOptions: { - // We are doing a lot of events at once in this test app - bufferSize: 1000, - }, - }); - } -} - -export const onRequestError = Sentry.captureRequestError; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/middleware.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/middleware.ts deleted file mode 100644 index b2117419c10f..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/middleware.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { NextResponse } from 'next/server'; - -export function middleware() { - // Basic middleware to ensure that the build works with edge runtime - return NextResponse.next(); -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/next-env.d.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/next-env.d.ts deleted file mode 100644 index fd36f9494e2c..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/next-env.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -/// -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/next.config.js b/dev-packages/e2e-tests/test-applications/nextjs-13/next.config.js deleted file mode 100644 index a08502723262..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/next.config.js +++ /dev/null @@ -1,17 +0,0 @@ -const { withSentryConfig } = require('@sentry/nextjs'); - -/** @type {import('next').NextConfig} */ -const moduleExports = { - typescript: { - ignoreBuildErrors: true, // TODO: Remove this - }, - experimental: { - appDir: true, - }, - pageExtensions: ['jsx', 'js', 'tsx', 'ts', 'page.tsx'], -}; - -module.exports = withSentryConfig(moduleExports, { - silent: true, - excludeServerRoutes: ['/api/endpoint-excluded-with-string', /\/api\/endpoint-excluded-with-regex/], -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/package.json b/dev-packages/e2e-tests/test-applications/nextjs-13/package.json deleted file mode 100644 index f6137db6843c..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "create-next-app", - "version": "0.1.0", - "private": true, - "scripts": { - "build": "next build > .tmp_build_stdout 2> .tmp_build_stderr || (cat .tmp_build_stdout && cat .tmp_build_stderr && exit 1)", - "clean": "npx rimraf node_modules pnpm-lock.yaml .next", - "test:prod": "TEST_ENV=production playwright test", - "test:dev": "TEST_ENV=development playwright test", - "test:build": "pnpm install && pnpm build", - "test:build-latest": "pnpm install && pnpm add next@next-13 && pnpm build", - "test:assert": "pnpm test:prod && pnpm test:dev" - }, - "dependencies": { - "@sentry/nextjs": "file:../../packed/sentry-nextjs-packed.tgz", - "@types/node": "^18.19.1", - "@types/react": "18.0.26", - "@types/react-dom": "18.0.9", - "next": "13.5.9", - "react": "18.2.0", - "react-dom": "18.2.0", - "typescript": "~5.0.0" - }, - "devDependencies": { - "@playwright/test": "~1.56.0", - "@sentry-internal/test-utils": "link:../../../test-utils" - }, - "volta": { - "extends": "../../package.json" - }, - "sentryTest": { - "optionalVariants": [ - { - "build-command": "pnpm test:build-latest", - "label": "nextjs-13 (latest)" - } - ] - } -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/click-error.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/click-error.tsx deleted file mode 100644 index c0b3dc70edec..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/click-error.tsx +++ /dev/null @@ -1,12 +0,0 @@ -export default function ClickErrorPage() { - return ( - - ); -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/customPageExtension.page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/customPageExtension.page.tsx deleted file mode 100644 index 5f25223a9b4d..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/customPageExtension.page.tsx +++ /dev/null @@ -1,12 +0,0 @@ -export default function BasicPage() { - return ( -

- This page simply exists to test the compatibility of Next.js' `pageExtensions` option with our auto wrapping - process. This file should be turned into a page by Next.js and our webpack loader should process it. -

- ); -} - -export async function getServerSideProps() { - throw new Error('custom page extension error'); -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/error-getServerSideProps.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/error-getServerSideProps.tsx deleted file mode 100644 index 9bc737cf7a7d..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/error-getServerSideProps.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default function WithServerSidePropsPage({ data }: { data: string }) { - return

WithServerSidePropsPage {data}

; -} - -export async function getServerSideProps() { - throw new Error('getServerSideProps Error'); -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/navigation-start-page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/navigation-start-page.tsx deleted file mode 100644 index 4a344176db31..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/navigation-start-page.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import Link from 'next/link'; - -export default function Page() { - return ( - - Navigate - - ); -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/navigation-target-page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/navigation-target-page.tsx deleted file mode 100644 index c49ff17fd490..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/navigation-target-page.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Page() { - return

arrived

; -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/pages-pageload.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/pages-pageload.tsx deleted file mode 100644 index 5b0847bb89fa..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/pages-pageload.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Page() { - return

pageload test page

; -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/withInitialProps.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/withInitialProps.tsx deleted file mode 100644 index 01b557bdd09f..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/withInitialProps.tsx +++ /dev/null @@ -1,7 +0,0 @@ -const WithInitialPropsPage = ({ data }: { data: string }) =>

WithInitialPropsPage {data}

; - -WithInitialPropsPage.getInitialProps = () => { - return { data: '[some getInitialProps data]' }; -}; - -export default WithInitialPropsPage; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/withServerSideProps.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/withServerSideProps.tsx deleted file mode 100644 index 0379cc202436..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/[param]/withServerSideProps.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default function WithServerSidePropsPage({ data }: { data: string }) { - return

WithServerSidePropsPage {data}

; -} - -export async function getServerSideProps() { - return { props: { data: '[some getServerSideProps data]' } }; -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/_app.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/_app.tsx deleted file mode 100644 index d6dfa41828d1..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/_app.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import App, { AppContext, AppProps } from 'next/app'; - -const MyApp = ({ Component, pageProps }: AppProps) => { - // @ts-ignore I don't know why TS complains here - return ; -}; - -MyApp.getInitialProps = async (appContext: AppContext) => { - // This simulates user misconfiguration. Users should always call `App.getInitialProps(appContext)`, but they don't, - // so we have a test for this so we don't break their apps. - if (appContext.ctx.pathname === '/misconfigured-_app-getInitialProps') { - return {}; - } - - const appProps = await App.getInitialProps(appContext); - return { ...appProps }; -}; - -export default MyApp; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/failure-api-route.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/failure-api-route.ts deleted file mode 100644 index 8a0d5f537aa6..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/failure-api-route.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { NextApiRequest, NextApiResponse } from 'next'; - -export default async (_req: NextApiRequest, res: NextApiResponse) => { - throw new Error('api route error'); -}; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/index.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/index.ts deleted file mode 100644 index faa9a571ca10..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { NextApiRequest, NextApiResponse } from 'next'; - -export default async (_req: NextApiRequest, res: NextApiResponse) => { - res.status(200).json({ success: true }); -}; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/success-api-route.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/success-api-route.ts deleted file mode 100644 index faa9a571ca10..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/[param]/success-api-route.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { NextApiRequest, NextApiResponse } from 'next'; - -export default async (_req: NextApiRequest, res: NextApiResponse) => { - res.status(200).json({ success: true }); -}; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/cjs-api-endpoint-with-require.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/cjs-api-endpoint-with-require.ts deleted file mode 100644 index 63a5176101ce..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/cjs-api-endpoint-with-require.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NextApiRequest, NextApiResponse } from 'next'; - -if (process.env.NEXT_PUBLIC_SOME_FALSE_ENV_VAR === 'enabled') { - require('../../tests/server/utils/throw'); // Should not throw unless the hoisting in the wrapping loader is messed up! -} - -const handler = async (_req: NextApiRequest, res: NextApiResponse): Promise => { - require('@sentry/nextjs').captureException; // Should not throw unless the wrapping loader messes up cjs imports - // @ts-expect-error - require.context('.'); // This is a webpack utility call. Should not throw unless the wrapping loader messes it up by mangling. - res.status(200).json({ success: true }); -}; - -module.exports = handler; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/cjs-api-endpoint.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/cjs-api-endpoint.ts deleted file mode 100644 index 6ae521fa5cb4..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/cjs-api-endpoint.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { NextApiRequest, NextApiResponse } from 'next'; - -const handler = async (_req: NextApiRequest, res: NextApiResponse): Promise => { - res.status(200).json({ success: true }); -}; - -module.exports = handler; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/endpoint-excluded-with-regex.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/endpoint-excluded-with-regex.ts deleted file mode 100644 index 5bb9ddca1270..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/endpoint-excluded-with-regex.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { NextApiRequest, NextApiResponse } from 'next'; - -export default async (_req: NextApiRequest, res: NextApiResponse): Promise => { - res.status(200).json({ success: true }); -}; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/endpoint-excluded-with-string.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/endpoint-excluded-with-string.ts deleted file mode 100644 index 5bb9ddca1270..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/endpoint-excluded-with-string.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { NextApiRequest, NextApiResponse } from 'next'; - -export default async (_req: NextApiRequest, res: NextApiResponse): Promise => { - res.status(200).json({ success: true }); -}; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/no-params.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/no-params.ts deleted file mode 100644 index faa9a571ca10..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/no-params.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { NextApiRequest, NextApiResponse } from 'next'; - -export default async (_req: NextApiRequest, res: NextApiResponse) => { - res.status(200).json({ success: true }); -}; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/params/[...pathParts].ts b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/params/[...pathParts].ts deleted file mode 100644 index faa9a571ca10..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/api/params/[...pathParts].ts +++ /dev/null @@ -1,5 +0,0 @@ -import { NextApiRequest, NextApiResponse } from 'next'; - -export default async (_req: NextApiRequest, res: NextApiResponse) => { - res.status(200).json({ success: true }); -}; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/crashed-session-page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/crashed-session-page.tsx deleted file mode 100644 index ddfdc73680db..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/crashed-session-page.tsx +++ /dev/null @@ -1,13 +0,0 @@ -export default function CrashedPage() { - // Magic to naively trigger onerror to make session crashed and allow for SSR - try { - if (typeof window !== 'undefined' && typeof window.onerror === 'function') { - // Lovely oldschool browsers syntax with 5 arguments <3 - // @ts-expect-error - window.onerror(null, null, null, null, new Error('Crashed')); - } - } catch { - // no-empty - } - return

Crashed

; -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/fetch.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/fetch.tsx deleted file mode 100644 index 763c27228193..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/fetch.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { useEffect } from 'react'; - -export default function FetchPage() { - useEffect(() => { - // test that a span is created in the pageload transaction for this fetch request - fetch('https://example.com').catch(() => { - // no-empty - }); - }, []); - - return

Hello world!

; -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/healthy-session-page.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/healthy-session-page.tsx deleted file mode 100644 index 6a30e4f8b3a8..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/healthy-session-page.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Page() { - return

healthy page

; -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/misconfigured-_app-getInitialProps.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/misconfigured-_app-getInitialProps.tsx deleted file mode 100644 index 3627c5088af8..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/misconfigured-_app-getInitialProps.tsx +++ /dev/null @@ -1,5 +0,0 @@ -// See _app.tsx for more information why this file exists. - -export default function Page() { - return

faulty _app getInitialProps

; -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/reportDialog.tsx b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/reportDialog.tsx deleted file mode 100644 index a8e097c769a9..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/reportDialog.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { captureException, showReportDialog } from '@sentry/nextjs'; - -export default function ReportDialogPage() { - return ( - - ); -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/unmatchedCustomPageExtension.someExtension b/dev-packages/e2e-tests/test-applications/nextjs-13/pages/unmatchedCustomPageExtension.someExtension deleted file mode 100644 index e8d58e47f18e..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/pages/unmatchedCustomPageExtension.someExtension +++ /dev/null @@ -1,3 +0,0 @@ -This page simply exists to test the compatibility of Next.js' `pageExtensions` option with our auto wrapping -process. This file should not be turned into a page by Next.js and our webpack loader also shouldn't process it. -This page should not contain valid JavaScript. diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/playwright.config.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/playwright.config.ts deleted file mode 100644 index 8448829443d6..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/playwright.config.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { getPlaywrightConfig } from '@sentry-internal/test-utils'; -const testEnv = process.env.TEST_ENV; - -if (!testEnv) { - throw new Error('No test env defined'); -} - -const config = getPlaywrightConfig( - { - startCommand: testEnv === 'development' ? 'pnpm next dev -p 3030' : 'pnpm next start -p 3030', - port: 3030, - }, - { - // This comes with the risk of tests leaking into each other but the tests run quite slow so we should parallelize - workers: '100%', - }, -); - -export default config; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/start-event-proxy.mjs b/dev-packages/e2e-tests/test-applications/nextjs-13/start-event-proxy.mjs deleted file mode 100644 index b45472a5484f..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/start-event-proxy.mjs +++ /dev/null @@ -1,14 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; -import { startEventProxyServer } from '@sentry-internal/test-utils'; - -const packageJson = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'))); - -startEventProxyServer({ - port: 3031, - proxyServerName: 'nextjs-13', - envelopeDumpPath: path.join( - process.cwd(), - `event-dumps/next-13-v${packageJson.dependencies.next}-${process.env.TEST_ENV}.dump`, - ), -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/app-dir-pageloads.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/app-dir-pageloads.test.ts deleted file mode 100644 index 6a8080a47aa4..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/app-dir-pageloads.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForTransaction } from '@sentry-internal/test-utils'; - -test('should create a pageload transaction when the `app` directory is used', async ({ page }) => { - const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === '/pageload-transaction' && transactionEvent.contexts?.trace?.op === 'pageload' - ); - }); - - await page.goto(`/pageload-transaction`); - - const transaction = await transactionPromise; - - expect(transaction).toMatchObject({ - breadcrumbs: expect.arrayContaining([ - { - category: 'navigation', - data: { from: '/pageload-transaction', to: '/pageload-transaction' }, - timestamp: expect.any(Number), - }, - ]), - contexts: { - react: { version: expect.any(String) }, - trace: { - data: { - 'sentry.op': 'pageload', - 'sentry.origin': 'auto.pageload.nextjs.app_router_instrumentation', - 'sentry.source': 'url', - 'url.path': '/pageload-transaction', - 'url.full': expect.stringMatching(/^https?:\/\/localhost:\d+\/pageload-transaction$/), - }, - op: 'pageload', - origin: 'auto.pageload.nextjs.app_router_instrumentation', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }, - }, - environment: 'qa', - request: { - headers: expect.any(Object), - url: expect.stringMatching(/\/pageload-transaction$/), - }, - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - transaction: '/pageload-transaction', - transaction_info: { source: 'url' }, - type: 'transaction', - }); - - expect(transaction.contexts?.trace?.data).not.toHaveProperty('url.template'); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/click-error.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/click-error.test.ts deleted file mode 100644 index 082c46c467a7..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/click-error.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForError } from '@sentry-internal/test-utils'; - -test('should send error for faulty click handlers', async ({ page }) => { - const errorPromise = waitForError('nextjs-13', async errorEvent => { - return errorEvent.exception?.values?.[0].value === 'click error'; - }); - - await page.goto('/42/click-error'); - await page.click('#error-button'); - - const errorEvent = await errorPromise; - - expect(errorEvent).toBeDefined(); - - const exception = errorEvent?.exception?.values?.[0]; - - expect(exception?.mechanism).toEqual({ - type: 'auto.browser.browserapierrors.addEventListener', - handled: false, - data: { - handler: expect.any(String), // the handler name varies in CI and locally - target: 'EventTarget', - }, - }); - - const frames = exception?.stacktrace?.frames; - await test.step('error should have a non-url-encoded top frame in route with parameter', () => { - if (process.env.TEST_ENV === 'development') { - // In dev mode we want to check local source mapping - expect(frames?.[frames.length - 1].filename).toMatch(/\/\[param\]\/click-error.tsx$/); - } else { - expect(frames?.[frames.length - 1].filename).toMatch(/\/\[param\]\/click-error-[a-f0-9]+\.js$/); - } - }); - - await test.step('error should have `in_app`: false for nextjs internal frames', () => { - if (process.env.TEST_ENV !== 'development') { - expect(frames).toContainEqual( - expect.objectContaining({ - filename: expect.stringMatching( - /^app:\/\/\/_next\/static\/chunks\/(main-|main-app-|polyfills-|webpack-|framework-|framework\.)[0-9a-f]+\.js(:\d+)*$/, - ), - in_app: false, - }), - ); - - expect(frames).not.toContainEqual( - expect.objectContaining({ - filename: expect.stringMatching( - /^app:\/\/\/_next\/static\/chunks\/(main-|main-app-|polyfills-|webpack-|framework-|framework\.)[0-9a-f]+\.js(:\d+)*$/, - ), - in_app: true, - }), - ); - } - }); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/faultyAppGetInitialPropsConfiguration.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/faultyAppGetInitialPropsConfiguration.test.ts deleted file mode 100644 index 68336c3e5c4e..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/faultyAppGetInitialPropsConfiguration.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { expect, test } from '@playwright/test'; - -// This test verifies that a faulty configuration of `getInitialProps` in `_app` will not cause our -// auto - wrapping / instrumentation to throw an error. -// See `_app.tsx` for more information. - -test('should not fail auto-wrapping when `getInitialProps` configuration is faulty.', async ({ page }) => { - await page.goto('/misconfigured-_app-getInitialProps'); - - const serverErrorText = await page.$('//*[contains(text(), "Internal Server Error")]'); - - expect(serverErrorText).toBeFalsy(); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/fetch.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/fetch.test.ts deleted file mode 100644 index 56ec40117fad..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/fetch.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForTransaction } from '@sentry-internal/test-utils'; - -test('should correctly instrument `fetch` for performance tracing', async ({ page }) => { - await page.route(/^https:\/\/example\.com\//, route => { - return route.fulfill({ - status: 200, - body: JSON.stringify({ - foo: 'bar', - }), - }); - }); - - const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return transactionEvent.transaction === '/fetch' && transactionEvent.contexts?.trace?.op === 'pageload'; - }); - - await page.goto(`/fetch`); - - const transaction = await transactionPromise; - - expect(transaction).toMatchObject({ - transaction: '/fetch', - type: 'transaction', - contexts: { - trace: { - op: 'pageload', - }, - }, - }); - - expect(transaction.spans).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - data: { - 'http.method': 'GET', - url: 'https://example.com', - 'http.url': 'https://example.com/', - 'url.full': 'https://example.com/', - 'server.address': 'example.com', - type: 'fetch', - 'http.response_content_length': expect.any(Number), - 'http.response.status_code': 200, - 'sentry.op': 'http.client', - 'sentry.origin': 'auto.http.browser', - }, - description: 'GET https://example.com/', - op: 'http.client', - parent_span_id: expect.stringMatching(/[a-f0-9]{16}/), - span_id: expect.stringMatching(/[a-f0-9]{16}/), - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - status: expect.any(String), - origin: 'auto.http.browser', - }), - ]), - ); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/pages-dir-navigation.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/pages-dir-navigation.test.ts deleted file mode 100644 index 2198d11da56c..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/pages-dir-navigation.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForTransaction } from '@sentry-internal/test-utils'; - -test('should report a navigation transaction for pages router navigations', async ({ page }) => { - test.skip(process.env.TEST_ENV === 'development', 'Test is flakey in dev mode'); - const navigationTransactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === '/[param]/navigation-target-page' && - transactionEvent.contexts?.trace?.op === 'navigation' - ); - }); - - await page.goto('/foo/navigation-start-page'); - await page.click('#navigation-link'); - - expect(await navigationTransactionPromise).toMatchObject({ - breadcrumbs: expect.arrayContaining([ - { - category: 'navigation', - data: { from: '/foo/navigation-start-page', to: '/foo/navigation-start-page' }, - timestamp: expect.any(Number), - }, - { category: 'ui.click', message: 'body > div#__next > a#navigation-link', timestamp: expect.any(Number) }, - { - category: 'navigation', - data: { from: '/foo/navigation-start-page', to: '/foo/navigation-target-page' }, - timestamp: expect.any(Number), - }, - ]), - contexts: { - trace: { - data: { - 'sentry.idle_span_finish_reason': 'idleTimeout', - 'sentry.op': 'navigation', - 'sentry.origin': 'auto.navigation.nextjs.pages_router_instrumentation', - 'sentry.source': 'route', - 'url.full': expect.stringMatching(/^https?:\/\/localhost:\d+\/foo\/navigation-target-page$/), - 'url.path': '/foo/navigation-target-page', - 'url.template': '/[param]/navigation-target-page', - }, - op: 'navigation', - origin: 'auto.navigation.nextjs.pages_router_instrumentation', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }, - }, - platform: 'javascript', - request: { - headers: expect.any(Object), - url: expect.stringMatching(/\/foo\/navigation-target-page$/), - }, - spans: expect.arrayContaining([]), - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - transaction: '/[param]/navigation-target-page', - transaction_info: { source: 'route' }, - type: 'transaction', - }); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/pages-dir-pageload.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/pages-dir-pageload.test.ts deleted file mode 100644 index 13d13094beac..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/pages-dir-pageload.test.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForTransaction } from '@sentry-internal/test-utils'; - -test('should create a pageload transaction when the `pages` directory is used', async ({ page }) => { - const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === '/[param]/pages-pageload' && transactionEvent.contexts?.trace?.op === 'pageload' - ); - }); - - await page.goto(`/foo/pages-pageload`); - - const transaction = await transactionPromise; - - expect(transaction).toMatchObject({ - breadcrumbs: expect.arrayContaining([ - { - category: 'navigation', - data: { from: '/foo/pages-pageload', to: '/foo/pages-pageload' }, - timestamp: expect.any(Number), - }, - ]), - contexts: { - react: { version: expect.any(String) }, - trace: { - data: { - 'sentry.op': 'pageload', - 'sentry.origin': 'auto.pageload.nextjs.pages_router_instrumentation', - 'sentry.source': 'route', - 'url.full': expect.stringMatching(/^https?:\/\/localhost:\d+\/foo\/pages-pageload$/), - 'url.path': '/foo/pages-pageload', - 'url.template': '/[param]/pages-pageload', - }, - op: 'pageload', - origin: 'auto.pageload.nextjs.pages_router_instrumentation', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }, - }, - environment: 'qa', - request: { - headers: expect.any(Object), - url: expect.stringMatching(/\/foo\/pages-pageload$/), - }, - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - transaction: '/[param]/pages-pageload', - transaction_info: { source: 'route' }, - type: 'transaction', - }); -}); - -test('should create a pageload transaction with correct name when an error occurs in getServerSideProps', async ({ - page, -}) => { - const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === '/[param]/error-getServerSideProps' && - transactionEvent.contexts?.trace?.op === 'pageload' - ); - }); - - // This page returns an error status code, so we need to catch the navigation error - await page.goto(`/something/error-getServerSideProps`, { waitUntil: 'networkidle' }).catch(() => { - // Expected to fail with net::ERR_HTTP_RESPONSE_CODE_FAILURE in newer Chromium versions - }); - - const transaction = await transactionPromise; - - expect(transaction).toMatchObject({ - contexts: { - trace: { - data: { - 'sentry.op': 'pageload', - 'sentry.origin': 'auto.pageload.nextjs.pages_router_instrumentation', - 'sentry.source': 'route', - }, - op: 'pageload', - origin: 'auto.pageload.nextjs.pages_router_instrumentation', - }, - }, - transaction: '/[param]/error-getServerSideProps', - transaction_info: { source: 'route' }, - type: 'transaction', - }); - - // Ensure the transaction name is not '/_error' - expect(transaction.transaction).not.toBe('/_error'); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/parameterized-routes.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/parameterized-routes.test.ts deleted file mode 100644 index ba446f2e7c4e..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/parameterized-routes.test.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForTransaction } from '@sentry-internal/test-utils'; - -test('should create a parameterized transaction when the `app` directory is used', async ({ page }) => { - const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === '/parameterized/:one' && transactionEvent.contexts?.trace?.op === 'pageload' - ); - }); - - await page.goto(`/parameterized/cappuccino`); - - const transaction = await transactionPromise; - - expect(transaction).toMatchObject({ - contexts: { - react: { version: expect.any(String) }, - trace: { - data: { - 'sentry.op': 'pageload', - 'sentry.origin': 'auto.pageload.nextjs.app_router_instrumentation', - 'sentry.source': 'route', - }, - op: 'pageload', - origin: 'auto.pageload.nextjs.app_router_instrumentation', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }, - }, - environment: 'qa', - request: { - headers: expect.any(Object), - url: expect.stringMatching(/\/parameterized\/cappuccino$/), - }, - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - transaction: '/parameterized/:one', - transaction_info: { source: 'route' }, - type: 'transaction', - }); -}); - -test('should create a static transaction when the `app` directory is used and the route is not parameterized', async ({ - page, -}) => { - const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === '/parameterized/static' && transactionEvent.contexts?.trace?.op === 'pageload' - ); - }); - - await page.goto(`/parameterized/static`); - - const transaction = await transactionPromise; - - expect(transaction).toMatchObject({ - contexts: { - react: { version: expect.any(String) }, - trace: { - data: { - 'sentry.op': 'pageload', - 'sentry.origin': 'auto.pageload.nextjs.app_router_instrumentation', - 'sentry.source': 'url', - }, - op: 'pageload', - origin: 'auto.pageload.nextjs.app_router_instrumentation', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }, - }, - environment: 'qa', - request: { - headers: expect.any(Object), - url: expect.stringMatching(/\/parameterized\/static$/), - }, - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - transaction: '/parameterized/static', - transaction_info: { source: 'url' }, - type: 'transaction', - }); -}); - -test('should create a partially parameterized transaction when the `app` directory is used', async ({ page }) => { - const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === '/parameterized/:one/beep' && transactionEvent.contexts?.trace?.op === 'pageload' - ); - }); - - await page.goto(`/parameterized/cappuccino/beep`); - - const transaction = await transactionPromise; - - expect(transaction).toMatchObject({ - contexts: { - react: { version: expect.any(String) }, - trace: { - data: { - 'sentry.op': 'pageload', - 'sentry.origin': 'auto.pageload.nextjs.app_router_instrumentation', - 'sentry.source': 'route', - }, - op: 'pageload', - origin: 'auto.pageload.nextjs.app_router_instrumentation', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }, - }, - environment: 'qa', - request: { - headers: expect.any(Object), - url: expect.stringMatching(/\/parameterized\/cappuccino\/beep$/), - }, - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - transaction: '/parameterized/:one/beep', - transaction_info: { source: 'route' }, - type: 'transaction', - }); -}); - -test('should create a nested parameterized transaction when the `app` directory is used', async ({ page }) => { - const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === '/parameterized/:one/beep/:two' && - transactionEvent.contexts?.trace?.op === 'pageload' - ); - }); - - await page.goto(`/parameterized/cappuccino/beep/espresso`); - - const transaction = await transactionPromise; - - expect(transaction).toMatchObject({ - contexts: { - react: { version: expect.any(String) }, - trace: { - data: { - 'sentry.op': 'pageload', - 'sentry.origin': 'auto.pageload.nextjs.app_router_instrumentation', - 'sentry.source': 'route', - }, - op: 'pageload', - origin: 'auto.pageload.nextjs.app_router_instrumentation', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }, - }, - environment: 'qa', - request: { - headers: expect.any(Object), - url: expect.stringMatching(/\/parameterized\/cappuccino\/beep\/espresso$/), - }, - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - transaction: '/parameterized/:one/beep/:two', - transaction_info: { source: 'route' }, - type: 'transaction', - }); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/reportDialog.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/reportDialog.test.ts deleted file mode 100644 index 386d228ebf0c..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/reportDialog.test.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { expect, test } from '@playwright/test'; - -test('should show a dialog', async ({ page }) => { - // *= means "containing" - const dialogScriptSelector = 'head > script[src*="/api/embed/error-page"]'; - - await page.goto('/reportDialog'); - - expect(await page.locator(dialogScriptSelector).count()).toEqual(0); - - await page.click('#open-report-dialog'); - - const dialogScript = await page.waitForSelector(dialogScriptSelector, { state: 'attached' }); - const dialogScriptSrc = await (await dialogScript.getProperty('src')).jsonValue(); - - expect(dialogScriptSrc).toMatch(/^http.*\/api\/embed\/error-page\/\?.*/); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/sessions.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/sessions.test.ts deleted file mode 100644 index 8fbe8ac8b7b5..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/client/sessions.test.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForSession } from '@sentry-internal/test-utils'; - -test('should report healthy sessions', async ({ page }) => { - test.skip(process.env.TEST_ENV === 'development', 'test is flakey in dev mode'); - - const sessionPromise = waitForSession('nextjs-13', session => { - return session.init === true && session.status === 'ok' && session.errors === 0; - }); - - await page.goto('/healthy-session-page'); - - expect(await sessionPromise).toBeDefined(); -}); - -test('should report crashed sessions', async ({ page }) => { - test.skip(process.env.TEST_ENV === 'development', 'test is flakey in dev mode'); - - const sessionPromise = waitForSession('nextjs-13', session => { - return session.init === false && session.status === 'crashed' && session.errors === 1; - }); - - await page.goto('/crashed-session-page'); - - expect(await sessionPromise).toBeDefined(); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/isomorphic/getInitialProps.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/isomorphic/getInitialProps.test.ts deleted file mode 100644 index 570b19b3271d..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/isomorphic/getInitialProps.test.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForTransaction } from '@sentry-internal/test-utils'; - -test('should propagate serverside `getInitialProps` trace to client', async ({ page }) => { - const pageloadTransactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === '/[param]/withInitialProps' && - transactionEvent.contexts?.trace?.op === 'pageload' - ); - }); - - const serverTransactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === 'GET /[param]/withInitialProps' && - transactionEvent.contexts?.trace?.op === 'http.server' - ); - }); - - await page.goto(`/42/withInitialProps`); - - const pageloadTransaction = await pageloadTransactionPromise; - - expect(pageloadTransaction).toBeDefined(); - - await test.step('should propagate tracing data from server to client', async () => { - const nextDataTag = await page.waitForSelector('#__NEXT_DATA__', { state: 'attached' }); - const nextDataTagValue = JSON.parse(await nextDataTag.evaluate(tag => (tag as HTMLElement).innerText)); - - const traceId = pageloadTransaction?.contexts?.trace?.trace_id; - - expect(traceId).toBeDefined(); - - expect(nextDataTagValue.props.pageProps.data).toBe('[some getInitialProps data]'); - expect(nextDataTagValue.props.pageProps._sentryTraceData).toBeTruthy(); - expect(nextDataTagValue.props.pageProps._sentryBaggage).toBeTruthy(); - - expect(nextDataTagValue.props.pageProps._sentryTraceData.split('-')[0]).toBe(traceId); - - expect(nextDataTagValue.props.pageProps._sentryBaggage.match(/sentry-trace_id=([a-f0-9]*),/)[1]).toBe(traceId); - }); - - await test.step('should record serverside performance', async () => { - expect(await serverTransactionPromise).toMatchObject({ - contexts: { - trace: { - op: 'http.server', - status: 'ok', - }, - }, - transaction: 'GET /[param]/withInitialProps', - transaction_info: { - source: 'route', - }, - type: 'transaction', - request: { - url: expect.stringMatching(/http.*\/42\/withInitialProps$/), - }, - }); - }); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/isomorphic/getServerSideProps.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/isomorphic/getServerSideProps.test.ts deleted file mode 100644 index 765864dbf4a1..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/isomorphic/getServerSideProps.test.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForTransaction } from '@sentry-internal/test-utils'; - -test('Should record performance for getServerSideProps', async ({ page }) => { - const pageloadTransactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === '/[param]/withServerSideProps' && - transactionEvent.contexts?.trace?.op === 'pageload' - ); - }); - - const serverTransactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === 'GET /[param]/withServerSideProps' && - transactionEvent.contexts?.trace?.op === 'http.server' - ); - }); - - await page.goto(`/1337/withServerSideProps`); - - const pageloadTransaction = await pageloadTransactionPromise; - - expect(pageloadTransaction).toBeDefined(); - - await test.step('should propagate tracing data from server to client', async () => { - const nextDataTag = await page.waitForSelector('#__NEXT_DATA__', { state: 'attached' }); - const nextDataTagValue = JSON.parse(await nextDataTag.evaluate(tag => (tag as HTMLElement).innerText)); - - const traceId = pageloadTransaction?.contexts?.trace?.trace_id; - - expect(traceId).toBeDefined(); - - expect(nextDataTagValue.props.pageProps.data).toBe('[some getServerSideProps data]'); - expect(nextDataTagValue.props.pageProps._sentryTraceData).toBeTruthy(); - expect(nextDataTagValue.props.pageProps._sentryBaggage).toBeTruthy(); - - expect(nextDataTagValue.props.pageProps._sentryTraceData.split('-')[0]).toBe(traceId); - - expect(nextDataTagValue.props.pageProps._sentryBaggage.match(/sentry-trace_id=([a-f0-9]*),/)[1]).toBe(traceId); - }); - - await test.step('should record serverside performance', async () => { - expect(await serverTransactionPromise).toMatchObject({ - contexts: { - trace: { - op: 'http.server', - status: 'ok', - }, - }, - transaction: 'GET /[param]/withServerSideProps', - transaction_info: { - source: 'route', - }, - type: 'transaction', - request: { - url: expect.stringMatching(/http.*\/1337\/withServerSideProps$/), - }, - }); - }); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/404.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/404.test.ts deleted file mode 100644 index 4c09bce36b4a..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/404.test.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { test } from '@playwright/test'; -import { waitForTransaction } from '@sentry-internal/test-utils'; - -test('should create a transaction for a CJS pages router API endpoint', async ({ page }) => { - let received404Transaction = false; - waitForTransaction('nextjs-13', async transactionEvent => { - return transactionEvent.transaction === 'GET /404' || transactionEvent.transaction === 'GET /_not-found'; - }).then(() => { - received404Transaction = true; - }); - - await page.goto('/page-that-doesnt-exist'); - - await new Promise((resolve, reject) => { - setTimeout(() => { - if (received404Transaction) { - reject(new Error('received 404 transaction')); - } else { - resolve(); - } - }, 5_000); - }); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/cjs-api-endpoints.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/cjs-api-endpoints.test.ts deleted file mode 100644 index 28cc91e9b879..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/cjs-api-endpoints.test.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForTransaction } from '@sentry-internal/test-utils'; - -const packageJson = require('../../package.json'); -const nextjsVersion = packageJson.dependencies.next; -const nextjsMajor = Number(nextjsVersion.split('.')[0]); - -test('should create a transaction for a CJS pages router API endpoint', async ({ request }) => { - test.skip(nextjsMajor > 13, 'Next.js does not like CJS routes after a certain point.'); - - const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === 'GET /api/cjs-api-endpoint' && - transactionEvent.contexts?.trace?.op === 'http.server' && - transactionEvent.transaction_info?.source === 'route' - ); - }); - - const result = (await request.get(`/api/cjs-api-endpoint`)).json(); - - expect(await result).toMatchObject({ success: true }); - - const transaction = await transactionPromise; - - expect(transaction).toMatchObject({ - contexts: { - otel: { - resource: { - 'service.name': 'node', - 'service.namespace': 'sentry', - 'service.version': expect.any(String), - 'telemetry.sdk.language': 'nodejs', - 'telemetry.sdk.name': 'opentelemetry', - 'telemetry.sdk.version': expect.any(String), - }, - }, - runtime: { name: 'node', version: expect.any(String) }, - trace: { - data: { - 'http.response.status_code': 200, - 'sentry.op': 'http.server', - 'sentry.origin': 'auto.http.nextjs', - 'sentry.sample_rate': 1, - 'sentry.source': 'route', - }, - op: 'http.server', - origin: 'auto.http.nextjs', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - status: 'ok', - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }, - }, - environment: 'qa', - event_id: expect.any(String), - platform: 'node', - request: { - cookies: expect.any(Object), - headers: expect.any(Object), - method: 'GET', - url: expect.stringMatching(/^http.*\/api\/cjs-api-endpoint$/), - }, - spans: expect.arrayContaining([]), - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - transaction: 'GET /api/cjs-api-endpoint', - transaction_info: { source: 'route' }, - type: 'transaction', - }); -}); - -test('should not mess up require statements in CJS API endpoints', async ({ request }) => { - test.skip(nextjsMajor > 13, 'Next.js does not like CJS routes after a certain point.'); - - const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === 'GET /api/cjs-api-endpoint-with-require' && - transactionEvent.contexts?.trace?.op === 'http.server' && - transactionEvent.transaction_info?.source === 'route' - ); - }); - - const result = (await request.get(`/api/cjs-api-endpoint-with-require`)).json(); - - expect(await result).toMatchObject({ success: true }); - - const transaction = await transactionPromise; - - expect(transaction).toMatchObject({ - contexts: { - otel: { - resource: { - 'service.name': 'node', - 'service.namespace': 'sentry', - 'service.version': expect.any(String), - 'telemetry.sdk.language': 'nodejs', - 'telemetry.sdk.name': 'opentelemetry', - 'telemetry.sdk.version': expect.any(String), - }, - }, - runtime: { name: 'node', version: expect.any(String) }, - trace: { - data: { - 'http.response.status_code': 200, - 'sentry.op': 'http.server', - 'sentry.origin': 'auto.http.nextjs', - 'sentry.sample_rate': 1, - 'sentry.source': 'route', - }, - op: 'http.server', - origin: 'auto.http.nextjs', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - status: 'ok', - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }, - }, - environment: 'qa', - event_id: expect.any(String), - platform: 'node', - request: { - cookies: expect.any(Object), - headers: expect.any(Object), - method: 'GET', - url: expect.stringMatching(/^http.*\/api\/cjs-api-endpoint-with-require$/), - }, - spans: expect.arrayContaining([]), - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - transaction: 'GET /api/cjs-api-endpoint-with-require', - transaction_info: { source: 'route' }, - type: 'transaction', - }); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/excluded-api-endpoints.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/excluded-api-endpoints.test.ts deleted file mode 100644 index 2d3854e2a2a4..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/excluded-api-endpoints.test.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForTransaction } from '@sentry-internal/test-utils'; - -test('should not apply build-time instrumentation for routes that were excluded from auto wrapping (string)', async ({ - request, -}) => { - const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === 'GET /api/endpoint-excluded-with-string' && - transactionEvent.contexts?.trace?.op === 'http.server' - ); - }); - - expect(await (await request.get(`/api/endpoint-excluded-with-string`)).text()).toBe('{"success":true}'); - - const transaction = await transactionPromise; - - expect(transaction.contexts?.trace?.data?.['sentry.origin']).toBeDefined(); - expect(transaction.contexts?.trace?.data?.['sentry.origin']).not.toBe('auto.http.nextjs'); // This is the origin set by the build time instrumentation -}); - -test('should not apply build-time instrumentation for routes that were excluded from auto wrapping (regex)', async ({ - request, -}) => { - const transactionPromise = waitForTransaction('nextjs-13', async transactionEvent => { - return ( - transactionEvent.transaction === 'GET /api/endpoint-excluded-with-regex' && - transactionEvent.contexts?.trace?.op === 'http.server' - ); - }); - - expect(await (await request.get(`/api/endpoint-excluded-with-regex`)).text()).toBe('{"success":true}'); - - const transaction = await transactionPromise; - - expect(transaction.contexts?.trace?.data?.['sentry.origin']).toBeDefined(); - expect(transaction.contexts?.trace?.data?.['sentry.origin']).not.toBe('auto.http.nextjs'); // This is the origin set by the build time instrumentation -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/getServerSideProps.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/getServerSideProps.test.ts deleted file mode 100644 index bc7138e5c602..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/getServerSideProps.test.ts +++ /dev/null @@ -1,180 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForError, waitForTransaction } from '@sentry-internal/test-utils'; - -test('Should report an error event for errors thrown in getServerSideProps', async ({ page }) => { - const errorEventPromise = waitForError('nextjs-13', errorEvent => { - return errorEvent.exception?.values?.[0].value === 'getServerSideProps Error'; - }); - - const transactionEventPromise = waitForTransaction('nextjs-13', transactionEvent => { - return ( - transactionEvent.transaction === 'GET /[param]/error-getServerSideProps' && - transactionEvent.contexts?.trace?.op === 'http.server' - ); - }); - - // This page returns an error status code, so we need to catch the navigation error - await page.goto('/dogsaregreat/error-getServerSideProps').catch(() => { - // Expected to fail with net::ERR_HTTP_RESPONSE_CODE_FAILURE in newer Chromium versions - }); - - expect(await errorEventPromise).toMatchObject({ - contexts: { - trace: { span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/) }, - }, - event_id: expect.any(String), - exception: { - values: [ - { - mechanism: { handled: false, type: 'auto.function.nextjs.wrapped' }, - type: 'Error', - value: 'getServerSideProps Error', - stacktrace: { - frames: expect.arrayContaining([]), - }, - }, - ], - }, - platform: 'node', - request: { - cookies: expect.any(Object), - headers: expect.any(Object), - method: 'GET', - url: expect.stringMatching(/^http.*\/error-getServerSideProps/), - }, - timestamp: expect.any(Number), - transaction: 'getServerSideProps (/[param]/error-getServerSideProps)', - }); - - expect(await transactionEventPromise).toMatchObject({ - contexts: { - otel: { - resource: { - 'service.name': 'node', - 'service.namespace': 'sentry', - 'service.version': expect.any(String), - 'telemetry.sdk.language': 'nodejs', - 'telemetry.sdk.name': 'opentelemetry', - 'telemetry.sdk.version': expect.any(String), - }, - }, - runtime: { name: 'node', version: expect.any(String) }, - trace: { - data: { - 'http.response.status_code': 500, - 'sentry.op': 'http.server', - 'sentry.origin': 'auto', - 'sentry.source': 'route', - }, - op: 'http.server', - origin: 'auto', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - status: 'internal_error', - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }, - }, - event_id: expect.any(String), - platform: 'node', - request: { - cookies: expect.any(Object), - headers: expect.any(Object), - method: 'GET', - url: expect.stringMatching(/^http.*\/error-getServerSideProps/), - }, - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - transaction: 'GET /[param]/error-getServerSideProps', - transaction_info: { source: 'route' }, - type: 'transaction', - }); -}); - -test('Should report an error event for errors thrown in getServerSideProps in pages with custom page extensions', async ({ - page, -}) => { - const errorEventPromise = waitForError('nextjs-13', errorEvent => { - return errorEvent.exception?.values?.[0].value === 'custom page extension error'; - }); - - const transactionEventPromise = waitForTransaction('nextjs-13', transactionEvent => { - return ( - transactionEvent.transaction === 'GET /[param]/customPageExtension' && - transactionEvent.contexts?.trace?.op === 'http.server' - ); - }); - - // This page returns an error status code, so we need to catch the navigation error - await page.goto('/123/customPageExtension').catch(() => { - // Expected to fail with net::ERR_HTTP_RESPONSE_CODE_FAILURE in newer Chromium versions - }); - - expect(await errorEventPromise).toMatchObject({ - contexts: { - trace: { span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/) }, - }, - event_id: expect.any(String), - exception: { - values: [ - { - mechanism: { handled: false, type: 'auto.function.nextjs.wrapped' }, - type: 'Error', - value: 'custom page extension error', - stacktrace: { - frames: expect.arrayContaining([]), - }, - }, - ], - }, - platform: 'node', - request: { - cookies: expect.any(Object), - headers: expect.any(Object), - method: 'GET', - url: expect.stringMatching(/^http.*\/customPageExtension/), - }, - timestamp: expect.any(Number), - transaction: 'getServerSideProps (/[param]/customPageExtension)', - }); - - expect(await transactionEventPromise).toMatchObject({ - contexts: { - otel: { - resource: { - 'service.name': 'node', - 'service.namespace': 'sentry', - 'service.version': expect.any(String), - 'telemetry.sdk.language': 'nodejs', - 'telemetry.sdk.name': 'opentelemetry', - 'telemetry.sdk.version': expect.any(String), - }, - }, - runtime: { name: 'node', version: expect.any(String) }, - trace: { - data: { - 'http.response.status_code': 500, - 'sentry.op': 'http.server', - 'sentry.origin': 'auto', - 'sentry.source': 'route', - }, - op: 'http.server', - origin: 'auto', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - status: 'internal_error', - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }, - }, - event_id: expect.any(String), - platform: 'node', - request: { - cookies: expect.any(Object), - headers: expect.any(Object), - method: 'GET', - url: expect.stringMatching(/^http.*\/customPageExtension/), - }, - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - transaction: 'GET /[param]/customPageExtension', - transaction_info: { source: 'route' }, - type: 'transaction', - }); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/pages-router-api-endpoints.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/pages-router-api-endpoints.test.ts deleted file mode 100644 index 9f5ff5db8434..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/pages-router-api-endpoints.test.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForError, waitForTransaction } from '@sentry-internal/test-utils'; - -test('Should report an error event for errors thrown in pages router api routes', async ({ request }) => { - const errorEventPromise = waitForError('nextjs-13', errorEvent => { - return errorEvent.exception?.values?.[0].value === 'api route error'; - }); - - const transactionEventPromise = waitForTransaction('nextjs-13', transactionEvent => { - return ( - transactionEvent.transaction === 'GET /api/[param]/failure-api-route' && - transactionEvent.contexts?.trace?.op === 'http.server' - ); - }); - - request.get('/api/foo/failure-api-route').catch(e => { - // expected to crash - }); - - expect(await errorEventPromise).toMatchObject({ - contexts: { - runtime: { name: 'node', version: expect.any(String) }, - trace: { span_id: expect.stringMatching(/[a-f0-9]{16}/), trace_id: expect.stringMatching(/[a-f0-9]{32}/) }, - }, - exception: { - values: [ - { - mechanism: { - data: { - function: 'withSentry', - }, - handled: false, - type: 'auto.http.nextjs.api_handler', - }, - stacktrace: { frames: expect.arrayContaining([]) }, - type: 'Error', - value: 'api route error', - }, - ], - }, - platform: 'node', - request: { - headers: expect.any(Object), - method: 'GET', - url: expect.stringMatching(/^http.*\/api\/foo\/failure-api-route$/), - }, - timestamp: expect.any(Number), - transaction: 'GET /api/[param]/failure-api-route', - }); - - expect(await transactionEventPromise).toMatchObject({ - contexts: { - runtime: { name: 'node', version: expect.any(String) }, - trace: { - data: { - 'http.response.status_code': 500, - 'sentry.op': 'http.server', - 'sentry.origin': 'auto.http.nextjs', - 'sentry.source': 'route', - }, - op: 'http.server', - origin: 'auto.http.nextjs', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - status: 'internal_error', - trace_id: (await errorEventPromise).contexts?.trace?.trace_id, - }, - }, - platform: 'node', - request: { - headers: expect.any(Object), - method: 'GET', - url: expect.stringMatching(/^http.*\/api\/foo\/failure-api-route$/), - }, - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - transaction: 'GET /api/[param]/failure-api-route', - transaction_info: { source: 'route' }, - type: 'transaction', - }); -}); - -test('Should report a transaction event for a successful pages router api route', async ({ request }) => { - const transactionEventPromise = waitForTransaction('nextjs-13', transactionEvent => { - return ( - transactionEvent.transaction === 'GET /api/[param]/success-api-route' && - transactionEvent.contexts?.trace?.op === 'http.server' - ); - }); - - request.get('/api/foo/success-api-route').catch(e => { - // we don't care about crashes - }); - - expect(await transactionEventPromise).toMatchObject({ - contexts: { - runtime: { name: 'node', version: expect.any(String) }, - trace: { - data: { - 'http.response.status_code': 200, - 'sentry.op': 'http.server', - 'sentry.origin': 'auto.http.nextjs', - 'sentry.source': 'route', - }, - op: 'http.server', - origin: 'auto.http.nextjs', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - status: 'ok', - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }, - }, - platform: 'node', - request: { - headers: expect.any(Object), - method: 'GET', - url: expect.stringMatching(/^http.*\/api\/foo\/success-api-route$/), - }, - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - transaction: 'GET /api/[param]/success-api-route', - transaction_info: { source: 'route' }, - type: 'transaction', - }); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/server-component-error.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/server-component-error.test.ts deleted file mode 100644 index 5412cc000694..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/server-component-error.test.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForError } from '@sentry-internal/test-utils'; - -test('Should capture an error thrown in a server component', async ({ page }) => { - const errorEventPromise = waitForError('nextjs-13', errorEvent => { - return errorEvent.exception?.values?.[0].value === 'RSC error'; - }); - - // This page returns an error status code, so we need to catch the navigation error - await page.goto('/rsc-error').catch(() => { - // Expected to fail with net::ERR_HTTP_RESPONSE_CODE_FAILURE in newer Chromium versions - }); - - expect(await errorEventPromise).toMatchObject({ - contexts: { - runtime: { name: 'node', version: expect.any(String) }, - trace: { - span_id: expect.stringMatching(/[a-f0-9]{16}/), - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }, - }, - event_id: expect.any(String), - exception: { - values: [ - { - mechanism: { handled: false, type: 'auto.function.nextjs.server_component' }, - type: 'Error', - value: 'RSC error', - }, - ], - }, - platform: 'node', - request: { - cookies: expect.any(Object), - headers: expect.any(Object), - }, - timestamp: expect.any(Number), - transaction: 'Page Server Component (/rsc-error)', - }); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/server-components.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/server-components.test.ts deleted file mode 100644 index c9e3a6ff588c..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/server-components.test.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForTransaction } from '@sentry-internal/test-utils'; - -test('Sends a transaction for a request to app router with URL', async ({ page }) => { - const serverComponentTransactionPromise = waitForTransaction('nextjs-13', transactionEvent => { - return ( - transactionEvent?.transaction === 'GET /parameterized/[one]/beep/[two]' && - transactionEvent.contexts?.trace?.data?.['http.target']?.startsWith('/parameterized/1337/beep/42') - ); - }); - - await page.goto('/parameterized/1337/beep/42'); - - const transactionEvent = await serverComponentTransactionPromise; - - expect(transactionEvent.contexts?.trace).toEqual({ - data: expect.objectContaining({ - 'sentry.op': 'http.server', - 'sentry.origin': 'auto', - 'sentry.sample_rate': 1, - 'sentry.source': 'route', - 'http.method': 'GET', - 'http.response.status_code': 200, - 'http.route': '/parameterized/[one]/beep/[two]', - 'http.status_code': 200, - 'http.target': '/parameterized/1337/beep/42', - 'otel.kind': 'SERVER', - 'next.route': '/parameterized/[one]/beep/[two]', - }), - op: 'http.server', - origin: 'auto', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - status: 'ok', - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }); - - expect(transactionEvent.request).toMatchObject({ - url: expect.stringContaining('/parameterized/1337/beep/42'), - }); - - // The transaction should not contain any spans with the same name as the transaction - // e.g. "GET /parameterized/[one]/beep/[two]" - expect( - transactionEvent.spans?.filter(span => { - return span.description === transactionEvent.transaction; - }), - ).toHaveLength(0); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/utils/throw.js b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/utils/throw.js deleted file mode 100644 index 0e37a4135be4..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/utils/throw.js +++ /dev/null @@ -1 +0,0 @@ -throw new Error('I am throwing'); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/wrapApiHandlerWithSentry.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/wrapApiHandlerWithSentry.test.ts deleted file mode 100644 index 798ea3409089..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tests/server/wrapApiHandlerWithSentry.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { expect, test } from '@playwright/test'; -import { waitForTransaction } from '@sentry-internal/test-utils'; - -const cases = [ - { - name: 'wrappedNoParamURL', - url: `/api/no-params`, - transactionName: 'GET /api/no-params', - }, - { - name: 'wrappedDynamicURL', - url: `/api/dog`, - transactionName: 'GET /api/[param]', - }, - { - name: 'wrappedCatchAllURL', - url: `/api/params/dog/bug`, - transactionName: 'GET /api/params/[...pathParts]', - }, -]; - -cases.forEach(({ name, url, transactionName }) => { - test(`Should capture transactions for routes with various shapes (${name})`, async ({ request }) => { - const transactionEventPromise = waitForTransaction('nextjs-13', transactionEvent => { - return ( - transactionEvent.transaction === transactionName && - transactionEvent.contexts?.trace?.op === 'http.server' && - transactionEvent.transaction_info?.source === 'route' - ); - }); - - request.get(url).catch(() => { - // we don't care about crashes - }); - - expect(await transactionEventPromise).toMatchObject({ - contexts: { - trace: { - data: { - 'http.response.status_code': 200, - 'sentry.op': 'http.server', - 'sentry.origin': 'auto.http.nextjs', - 'sentry.source': 'route', - }, - op: 'http.server', - origin: 'auto.http.nextjs', - span_id: expect.stringMatching(/[a-f0-9]{16}/), - status: 'ok', - trace_id: expect.stringMatching(/[a-f0-9]{32}/), - }, - }, - platform: 'node', - request: { - url: expect.stringContaining(url), - }, - start_timestamp: expect.any(Number), - timestamp: expect.any(Number), - transaction: transactionName, - transaction_info: { source: 'route' }, - type: 'transaction', - }); - }); -}); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-13/tsconfig.json b/dev-packages/e2e-tests/test-applications/nextjs-13/tsconfig.json deleted file mode 100644 index ef9e351d7a7b..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-13/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "compilerOptions": { - "target": "es2018", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "plugins": [ - { - "name": "next" - } - ], - "incremental": true - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "next.config.js", ".next/types/**/*.ts"], - "exclude": ["node_modules", "playwright.config.ts"] -} diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json index cb7927e9b0d8..e6cd86b8b143 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/package.json @@ -10,7 +10,6 @@ "test:build": "pnpm install && pnpm build", "test:test-build": "pnpm ts-node --script-mode assert-build.ts", "test:build-15": "pnpm install && pnpm add next@15 && pnpm add react@latest && pnpm add react-dom@latest && pnpm build", - "test:build-13": "pnpm install && pnpm add next@13.5.11 && pnpm build", "test:assert": "pnpm test:test-build && pnpm test:prod && pnpm test:dev" }, "dependencies": { @@ -34,10 +33,6 @@ }, "sentryTest": { "variants": [ - { - "build-command": "pnpm test:build-13", - "label": "nextjs-app-dir (next@13)" - }, { "build-command": "pnpm test:build-15", "label": "nextjs-app-dir (next@15)" diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/connected-servercomponent-trace.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/connected-servercomponent-trace.test.ts index 8616aafadba8..7e56da7e0c86 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/connected-servercomponent-trace.test.ts +++ b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/connected-servercomponent-trace.test.ts @@ -1,6 +1,5 @@ import { expect, test } from '@playwright/test'; import { waitForTransaction } from '@sentry-internal/test-utils'; -import { isNext13 } from './nextjsVersion'; test('Will create a transaction with spans for every server component and metadata generation functions when visiting a page', async ({ page, @@ -18,16 +17,13 @@ test('Will create a transaction with spans for every server component and metada expect(spanDescriptions).toContainEqual('render route (app) /nested-layout'); expect(spanDescriptions).toContainEqual('generateMetadata /(nested-layout)/nested-layout/page'); - // Next.js 13 has limited OTEL support for server components, so we don't expect to see the following spans - if (!isNext13) { - expect(spanDescriptions).toContainEqual('resolve page components'); - expect(spanDescriptions).toContainEqual('build component tree'); - expect(spanDescriptions).toContainEqual('resolve root layout server component'); - expect(spanDescriptions).toContainEqual('resolve layout server component "(nested-layout)"'); - expect(spanDescriptions).toContainEqual('resolve layout server component "nested-layout"'); - expect(spanDescriptions).toContainEqual('resolve page server component "/nested-layout"'); - expect(spanDescriptions).toContainEqual('start response'); - } + expect(spanDescriptions).toContainEqual('resolve page components'); + expect(spanDescriptions).toContainEqual('build component tree'); + expect(spanDescriptions).toContainEqual('resolve root layout server component'); + expect(spanDescriptions).toContainEqual('resolve layout server component "(nested-layout)"'); + expect(spanDescriptions).toContainEqual('resolve layout server component "nested-layout"'); + expect(spanDescriptions).toContainEqual('resolve page server component "/nested-layout"'); + expect(spanDescriptions).toContainEqual('start response'); }); test('Will create a transaction with spans for every server component and metadata generation functions when visiting a dynamic page', async ({ @@ -46,15 +42,12 @@ test('Will create a transaction with spans for every server component and metada expect(spanDescriptions).toContainEqual('render route (app) /nested-layout/[dynamic]'); expect(spanDescriptions).toContainEqual('generateMetadata /(nested-layout)/nested-layout/[dynamic]/page'); - // Next.js 13 has limited OTEL support for server components, so we don't expect to see the following spans - if (!isNext13) { - expect(spanDescriptions).toContainEqual('resolve page components'); - expect(spanDescriptions).toContainEqual('build component tree'); - expect(spanDescriptions).toContainEqual('resolve root layout server component'); - expect(spanDescriptions).toContainEqual('resolve layout server component "(nested-layout)"'); - expect(spanDescriptions).toContainEqual('resolve layout server component "nested-layout"'); - expect(spanDescriptions).toContainEqual('resolve layout server component "[dynamic]"'); - expect(spanDescriptions).toContainEqual('resolve page server component "/nested-layout/[dynamic]"'); - expect(spanDescriptions).toContainEqual('start response'); - } + expect(spanDescriptions).toContainEqual('resolve page components'); + expect(spanDescriptions).toContainEqual('build component tree'); + expect(spanDescriptions).toContainEqual('resolve root layout server component'); + expect(spanDescriptions).toContainEqual('resolve layout server component "(nested-layout)"'); + expect(spanDescriptions).toContainEqual('resolve layout server component "nested-layout"'); + expect(spanDescriptions).toContainEqual('resolve layout server component "[dynamic]"'); + expect(spanDescriptions).toContainEqual('resolve page server component "/nested-layout/[dynamic]"'); + expect(spanDescriptions).toContainEqual('start response'); }); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/nextjsVersion.ts b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/nextjsVersion.ts deleted file mode 100644 index 1ca2c43302e4..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/nextjsVersion.ts +++ /dev/null @@ -1,6 +0,0 @@ -const packageJson = require('../package.json'); -const nextjsVersion = packageJson.dependencies.next; -const nextjsMajor = Number(nextjsVersion.split('.')[0]); - -export const isNext13 = !isNaN(nextjsMajor) && nextjsMajor === 13; -export const nextjsMajorVersion = nextjsMajor; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/server-components.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/server-components.test.ts index 3386324d650c..5aca8a0b1688 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/server-components.test.ts +++ b/dev-packages/e2e-tests/test-applications/nextjs-app-dir/tests/server-components.test.ts @@ -1,6 +1,5 @@ import { expect, test } from '@playwright/test'; import { waitForError, waitForTransaction } from '@sentry-internal/test-utils'; -import { isNext13 } from './nextjsVersion'; test('Sends a transaction for a request to app router', async ({ page }) => { const serverComponentTransactionPromise = waitForTransaction('nextjs-app-dir', transactionEvent => { @@ -80,20 +79,17 @@ test('Should set a "not_found" status on a server component span when notFound() }), ); - // Next.js 13 has limited OTEL support for server components, so we don't expect to see the following span - if (!isNext13) { - // Page server component span should have the right name and attributes - expect(transactionEvent.spans).toContainEqual( - expect.objectContaining({ - description: 'resolve page server component "/server-component/not-found"', - op: 'function.nextjs', - data: expect.objectContaining({ - 'sentry.nextjs.ssr.function.type': 'Page', - 'sentry.nextjs.ssr.function.route': '/server-component/not-found', - }), + // Page server component span should have the right name and attributes + expect(transactionEvent.spans).toContainEqual( + expect.objectContaining({ + description: 'resolve page server component "/server-component/not-found"', + op: 'function.nextjs', + data: expect.objectContaining({ + 'sentry.nextjs.ssr.function.type': 'Page', + 'sentry.nextjs.ssr.function.route': '/server-component/not-found', }), - ); - } + }), + ); }); test('Should capture an error and transaction for a app router page', async ({ page }) => { @@ -122,20 +118,17 @@ test('Should capture an error and transaction for a app router page', async ({ p }), ); - // Next.js 13 has limited OTEL support for server components, so we don't expect to see the following span - if (!isNext13) { - // The page server component span should have the right name and attributes - expect(transactionEvent.spans).toContainEqual( - expect.objectContaining({ - description: 'resolve page server component "/server-component/faulty"', - op: 'function.nextjs', - data: expect.objectContaining({ - 'sentry.nextjs.ssr.function.type': 'Page', - 'sentry.nextjs.ssr.function.route': '/server-component/faulty', - }), + // The page server component span should have the right name and attributes + expect(transactionEvent.spans).toContainEqual( + expect.objectContaining({ + description: 'resolve page server component "/server-component/faulty"', + op: 'function.nextjs', + data: expect.objectContaining({ + 'sentry.nextjs.ssr.function.type': 'Page', + 'sentry.nextjs.ssr.function.route': '/server-component/faulty', }), - ); - } + }), + ); expect(errorEvent.tags?.['my-isolated-tag']).toBe(true); expect(errorEvent.tags?.['my-global-scope-isolated-tag']).not.toBeDefined(); diff --git a/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/package.json b/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/package.json index f677e02dd954..897d8cfe20d1 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/package.json +++ b/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/package.json @@ -11,7 +11,6 @@ "test:build": "pnpm install && pnpm build", "test:test-build": "pnpm ts-node --script-mode assert-build.ts", "test:build-15": "pnpm install && pnpm add next@15 && pnpm add react@latest && pnpm add react-dom@latest && pnpm build", - "test:build-13": "pnpm install && pnpm add next@13.5.11 && pnpm build", "test:assert": "pnpm test:test-build && pnpm test:prod && pnpm test:dev" }, "dependencies": { @@ -35,10 +34,6 @@ }, "sentryTest": { "variants": [ - { - "build-command": "pnpm test:build-13", - "label": "nextjs-pages-dir (next@13)" - }, { "build-command": "pnpm test:build-15", "label": "nextjs-pages-dir (next@15)" diff --git a/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/error-page-lasteventid.test.ts b/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/error-page-lasteventid.test.ts index 224fbc075488..39e8f8703e88 100644 --- a/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/error-page-lasteventid.test.ts +++ b/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/error-page-lasteventid.test.ts @@ -1,11 +1,9 @@ import { expect, test } from '@playwright/test'; import { waitForError } from '@sentry-internal/test-utils'; import { isDevMode } from './isDevMode'; -import { isNext13 } from './nextjsVersion'; test('lastEventId() should return the event ID after captureUnderscoreErrorException', async ({ page }) => { test.skip(isDevMode, 'should be skipped for non-dev mode'); - test.skip(isNext13, 'should be skipped for Next.js 13'); const errorEventPromise = waitForError('nextjs-pages-dir', errorEvent => { return errorEvent?.exception?.values?.[0]?.value === 'Test error to trigger _error.tsx page'; @@ -39,7 +37,6 @@ test('lastEventId() should return the event ID after captureUnderscoreErrorExcep test('lastEventId() should return the event ID for component render errors', async ({ page }) => { test.skip(isDevMode, 'should be skipped for non-dev mode'); - test.skip(isNext13, 'should be skipped for Next.js 13'); const errorEventPromise = waitForError('nextjs-pages-dir', errorEvent => { return errorEvent?.exception?.values?.[0]?.value === 'Test render error to trigger _error.tsx page'; diff --git a/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/nextjsVersion.ts b/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/nextjsVersion.ts deleted file mode 100644 index 6d38e00ee50e..000000000000 --- a/dev-packages/e2e-tests/test-applications/nextjs-pages-dir/tests/nextjsVersion.ts +++ /dev/null @@ -1,5 +0,0 @@ -const packageJson = require('../package.json'); -const nextjsVersion = packageJson.dependencies.next; -const nextjsMajor = Number(nextjsVersion.split('.')[0]); - -export const isNext13 = !isNaN(nextjsMajor) && nextjsMajor === 13;