Skip to content

Commit 63a1396

Browse files
Add integration tests for inp click span envelopes
1 parent aff12df commit 63a1396

File tree

4 files changed

+100
-2
lines changed
  • dev-packages/browser-integration-tests/suites/tracing

4 files changed

+100
-2
lines changed

dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/interactions/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ Sentry.init({
1111
_experiments: {
1212
enableInteractions: true,
1313
},
14+
enableInp: true,
1415
}),
1516
],
1617
tracesSampleRate: 1,

dev-packages/browser-integration-tests/suites/tracing/browserTracingIntegration/interactions/test.ts

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { Route } from '@playwright/test';
22
import { expect } from '@playwright/test';
3-
import type { Event, Span, SpanContext, Transaction } from '@sentry/types';
3+
import type { Event, Measurements, Span, SpanContext, SpanJSON, Transaction } from '@sentry/types';
44

55
import { sentryTest } from '../../../../utils/fixtures';
66
import {
@@ -112,3 +112,51 @@ sentryTest(
112112
expect(interactionSpan.description).toBe('body > AnnotatedButton');
113113
},
114114
);
115+
116+
sentryTest('should capture an INP click event span. @firefox', async ({ browserName, getLocalTestPath, page }) => {
117+
const supportedBrowsers = ['chromium', 'firefox'];
118+
119+
if (shouldSkipTracingTest() || !supportedBrowsers.includes(browserName)) {
120+
sentryTest.skip();
121+
}
122+
123+
await page.route('**/path/to/script.js', (route: Route) => route.fulfill({ path: `${__dirname}/assets/script.js` }));
124+
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
125+
return route.fulfill({
126+
status: 200,
127+
contentType: 'application/json',
128+
body: JSON.stringify({ id: 'test-id' }),
129+
});
130+
});
131+
132+
const url = await getLocalTestPath({ testDir: __dirname });
133+
134+
await page.goto(url);
135+
await getFirstSentryEnvelopeRequest<Event>(page);
136+
137+
await page.locator('[data-test-id=interaction-button]').click();
138+
await page.locator('.clicked[data-test-id=interaction-button]').isVisible();
139+
140+
// Wait for the interaction transaction from the enableInteractions experiment
141+
await getMultipleSentryEnvelopeRequests<TransactionJSON>(page, 1);
142+
143+
const spanEnvelopesPromise = getMultipleSentryEnvelopeRequests<
144+
SpanJSON & { exclusive_time: number; measurements: Measurements }
145+
>(page, 1, {
146+
envelopeType: 'span',
147+
});
148+
// Page hide to trigger INP
149+
await page.evaluate(() => {
150+
window.dispatchEvent(new Event('pagehide'));
151+
});
152+
153+
// Get the INP span envelope
154+
const spanEnvelopes = await spanEnvelopesPromise;
155+
156+
expect(spanEnvelopes).toHaveLength(1);
157+
expect(spanEnvelopes[0].op).toBe('ui.interaction.click');
158+
expect(spanEnvelopes[0].description).toBe('body > button.clicked');
159+
expect(spanEnvelopes[0].exclusive_time).toBeGreaterThan(0);
160+
expect(spanEnvelopes[0].measurements.inp.value).toBeGreaterThan(0);
161+
expect(spanEnvelopes[0].measurements.inp.unit).toBe('millisecond');
162+
});

dev-packages/browser-integration-tests/suites/tracing/browsertracing/interactions/init.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Sentry.init({
1212
enableInteractions: true,
1313
enableLongTask: false,
1414
},
15+
enableInp: true,
1516
}),
1617
],
1718
tracesSampleRate: 1,

dev-packages/browser-integration-tests/suites/tracing/browsertracing/interactions/test.ts

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { Route } from '@playwright/test';
22
import { expect } from '@playwright/test';
3-
import type { SerializedEvent, Span, SpanContext, Transaction } from '@sentry/types';
3+
import type { Measurements, SerializedEvent, Span, SpanContext, SpanJSON, Transaction } from '@sentry/types';
44

55
import { sentryTest } from '../../../../utils/fixtures';
66
import {
@@ -112,3 +112,51 @@ sentryTest(
112112
expect(interactionSpan.description).toBe('body > AnnotatedButton');
113113
},
114114
);
115+
116+
sentryTest('should capture an INP click event span. @firefox', async ({ browserName, getLocalTestPath, page }) => {
117+
const supportedBrowsers = ['chromium', 'firefox'];
118+
119+
if (shouldSkipTracingTest() || !supportedBrowsers.includes(browserName)) {
120+
sentryTest.skip();
121+
}
122+
123+
await page.route('**/path/to/script.js', (route: Route) => route.fulfill({ path: `${__dirname}/assets/script.js` }));
124+
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
125+
return route.fulfill({
126+
status: 200,
127+
contentType: 'application/json',
128+
body: JSON.stringify({ id: 'test-id' }),
129+
});
130+
});
131+
132+
const url = await getLocalTestPath({ testDir: __dirname });
133+
134+
await page.goto(url);
135+
await getFirstSentryEnvelopeRequest<Event>(page);
136+
137+
await page.locator('[data-test-id=interaction-button]').click();
138+
await page.locator('.clicked[data-test-id=interaction-button]').isVisible();
139+
140+
// Wait for the interaction transaction from the enableInteractions experiment
141+
await getMultipleSentryEnvelopeRequests<TransactionJSON>(page, 1);
142+
143+
const spanEnvelopesPromise = getMultipleSentryEnvelopeRequests<
144+
SpanJSON & { exclusive_time: number; measurements: Measurements }
145+
>(page, 1, {
146+
envelopeType: 'span',
147+
});
148+
// Page hide to trigger INP
149+
await page.evaluate(() => {
150+
window.dispatchEvent(new Event('pagehide'));
151+
});
152+
153+
// Get the INP span envelope
154+
const spanEnvelopes = await spanEnvelopesPromise;
155+
156+
expect(spanEnvelopes).toHaveLength(1);
157+
expect(spanEnvelopes[0].op).toBe('ui.interaction.click');
158+
expect(spanEnvelopes[0].description).toBe('body > button.clicked');
159+
expect(spanEnvelopes[0].exclusive_time).toBeGreaterThan(0);
160+
expect(spanEnvelopes[0].measurements.inp.value).toBeGreaterThan(0);
161+
expect(spanEnvelopes[0].measurements.inp.unit).toBe('millisecond');
162+
});

0 commit comments

Comments
 (0)