Skip to content

Commit 8424fdc

Browse files
authored
test(nextjs): Add route handler tests for turbopack (#17515)
1 parent 48882d2 commit 8424fdc

File tree

5 files changed

+91
-1
lines changed

5 files changed

+91
-1
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export async function GET(request: Request) {
2+
throw new Error('Dynamic route handler error');
3+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { NextResponse } from 'next/server';
2+
3+
export async function GET() {
4+
return NextResponse.json({ name: 'Beep' });
5+
}
6+
7+
export async function POST() {
8+
return NextResponse.json({ name: 'Boop' }, { status: 400 });
9+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { NextResponse } from 'next/server';
2+
3+
export async function GET(request: Request) {
4+
return NextResponse.json({ name: 'Static' });
5+
}

dev-packages/e2e-tests/test-applications/nextjs-turbo/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"@types/node": "^18.19.1",
1818
"@types/react": "^19",
1919
"@types/react-dom": "^19",
20-
"next": "^15.3.5",
20+
"next": "^15.5.4",
2121
"react": "^19",
2222
"react-dom": "^19",
2323
"typescript": "~5.0.0"
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import { expect, test } from '@playwright/test';
2+
import { waitForError, waitForTransaction } from '@sentry-internal/test-utils';
3+
4+
test('Should create a transaction for dynamic route handlers', async ({ request }) => {
5+
const routehandlerTransactionPromise = waitForTransaction('nextjs-turbo', async transactionEvent => {
6+
return transactionEvent?.transaction === 'GET /route-handlers/[param]';
7+
});
8+
9+
const response = await request.get('/route-handlers/foo');
10+
expect(await response.json()).toStrictEqual({ name: 'Beep' });
11+
12+
const routehandlerTransaction = await routehandlerTransactionPromise;
13+
14+
expect(routehandlerTransaction.contexts?.trace?.status).toBe('ok');
15+
expect(routehandlerTransaction.contexts?.trace?.op).toBe('http.server');
16+
});
17+
18+
test('Should create a transaction for static route handlers', async ({ request }) => {
19+
const routehandlerTransactionPromise = waitForTransaction('nextjs-turbo', async transactionEvent => {
20+
return transactionEvent?.transaction === 'GET /route-handlers/static';
21+
});
22+
23+
const response = await request.get('/route-handlers/static');
24+
expect(await response.json()).toStrictEqual({ name: 'Static' });
25+
26+
const routehandlerTransaction = await routehandlerTransactionPromise;
27+
28+
expect(routehandlerTransaction.contexts?.trace?.status).toBe('ok');
29+
expect(routehandlerTransaction.contexts?.trace?.op).toBe('http.server');
30+
});
31+
32+
test('Should create a transaction for route handlers and correctly set span status depending on http status', async ({
33+
request,
34+
}) => {
35+
const routehandlerTransactionPromise = waitForTransaction('nextjs-turbo', async transactionEvent => {
36+
return transactionEvent?.transaction === 'POST /route-handlers/[param]';
37+
});
38+
39+
const response = await request.post('/route-handlers/bar');
40+
expect(await response.json()).toStrictEqual({ name: 'Boop' });
41+
42+
const routehandlerTransaction = await routehandlerTransactionPromise;
43+
44+
expect(routehandlerTransaction.contexts?.trace?.status).toBe('invalid_argument');
45+
expect(routehandlerTransaction.contexts?.trace?.op).toBe('http.server');
46+
});
47+
48+
test('Should record exceptions and transactions for faulty route handlers', async ({ request }) => {
49+
const errorEventPromise = waitForError('nextjs-turbo', errorEvent => {
50+
return errorEvent?.exception?.values?.[0]?.value === 'Dynamic route handler error';
51+
});
52+
53+
const routehandlerTransactionPromise = waitForTransaction('nextjs-turbo', async transactionEvent => {
54+
return transactionEvent?.transaction === 'GET /route-handlers/[param]/error';
55+
});
56+
57+
await request.get('/route-handlers/boop/error').catch(() => {});
58+
59+
const routehandlerTransaction = await routehandlerTransactionPromise;
60+
const routehandlerError = await errorEventPromise;
61+
62+
expect(routehandlerTransaction.contexts?.trace?.status).toBe('internal_error');
63+
expect(routehandlerTransaction.contexts?.trace?.op).toBe('http.server');
64+
expect(routehandlerTransaction.contexts?.trace?.origin).toContain('auto');
65+
66+
expect(routehandlerError.exception?.values?.[0].value).toBe('Dynamic route handler error');
67+
68+
expect(routehandlerError.request?.method).toBe('GET');
69+
// todo: make sure url is attached to request object
70+
// expect(routehandlerError.request?.url).toContain('/route-handlers/boop/error');
71+
72+
expect(routehandlerError.transaction).toBe('/route-handlers/[param]/error');
73+
});

0 commit comments

Comments
 (0)