Skip to content

Commit 7b39a22

Browse files
authored
test: Test INP spans in E2E test (#12636)
While looking into #11646, I decided to add an E2E test for INP spans.
1 parent a37c5b7 commit 7b39a22

File tree

2 files changed

+65
-9
lines changed

2 files changed

+65
-9
lines changed

dev-packages/e2e-tests/test-applications/react-router-6/tests/transactions.test.ts

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { expect, test } from '@playwright/test';
2-
import { waitForTransaction } from '@sentry-internal/test-utils';
2+
import { waitForEnvelopeItem, waitForTransaction } from '@sentry-internal/test-utils';
33

44
test('sends a pageload transaction with a parameterized URL', async ({ page }) => {
55
const transactionPromise = waitForTransaction('react-router-6', async transactionEvent => {
@@ -54,3 +54,45 @@ test('sends a navigation transaction with a parameterized URL', async ({ page })
5454
},
5555
});
5656
});
57+
58+
test('sends an INP span', async ({ page }) => {
59+
const inpSpanPromise = waitForEnvelopeItem('react-router-6', item => {
60+
return item[0].type === 'span';
61+
});
62+
63+
await page.goto(`/`);
64+
65+
await page.click('#exception-button');
66+
67+
await page.waitForTimeout(500);
68+
69+
// Page hide to trigger INP
70+
await page.evaluate(() => {
71+
window.dispatchEvent(new Event('pagehide'));
72+
});
73+
74+
const inpSpan = await inpSpanPromise;
75+
76+
expect(inpSpan[1]).toEqual({
77+
data: {
78+
'sentry.origin': 'auto.http.browser.inp',
79+
'sentry.op': 'ui.interaction.click',
80+
release: 'e2e-test',
81+
environment: 'qa',
82+
transaction: '/',
83+
'sentry.exclusive_time': expect.any(Number),
84+
replay_id: expect.any(String),
85+
},
86+
description: 'body > div#root > input#exception-button[type="button"]',
87+
op: 'ui.interaction.click',
88+
parent_span_id: expect.any(String),
89+
span_id: expect.any(String),
90+
start_timestamp: expect.any(Number),
91+
timestamp: expect.any(Number),
92+
trace_id: expect.any(String),
93+
origin: 'auto.http.browser.inp',
94+
exclusive_time: expect.any(Number),
95+
measurements: { inp: { unit: 'millisecond', value: expect.any(Number) } },
96+
segment_id: expect.any(String),
97+
});
98+
});

dev-packages/test-utils/src/event-proxy-server.ts

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -115,14 +115,28 @@ export async function startEventProxyServer(options: EventProxyServerOptions): P
115115
eventCallbackListeners.forEach(listener => {
116116
const rawSentryResponseBody = Buffer.concat(sentryResponseChunks).toString();
117117

118-
const data: SentryRequestCallbackData = {
119-
envelope: parseEnvelope(proxyRequestBody),
120-
rawProxyRequestBody: proxyRequestBody,
121-
rawSentryResponseBody,
122-
sentryResponseStatusCode: sentryResponse.statusCode,
123-
};
124-
125-
listener(Buffer.from(JSON.stringify(data)).toString('base64'));
118+
try {
119+
const data: SentryRequestCallbackData = {
120+
envelope: parseEnvelope(proxyRequestBody),
121+
rawProxyRequestBody: proxyRequestBody,
122+
rawSentryResponseBody,
123+
sentryResponseStatusCode: sentryResponse.statusCode,
124+
};
125+
126+
listener(Buffer.from(JSON.stringify(data)).toString('base64'));
127+
} catch (error) {
128+
if (`${error}`.includes('Unexpected token') && proxyRequestBody.includes('{"type":"replay_event"}')) {
129+
// eslint-disable-next-line no-console
130+
console.log('[event-proxy-server] Info: Received replay event, skipping...');
131+
} else {
132+
// eslint-disable-next-line no-console
133+
console.error(
134+
'[event-proxy-server] Error: Failed to parse Sentry request envelope',
135+
error,
136+
proxyRequestBody,
137+
);
138+
}
139+
}
126140
});
127141
proxyResponse.end();
128142
});

0 commit comments

Comments
 (0)