Skip to content

Commit 7b77a01

Browse files
committed
ref waitForReplayRequest
1 parent c5df04a commit 7b77a01

File tree

2 files changed

+74
-23
lines changed

2 files changed

+74
-23
lines changed

packages/integration-tests/suites/replay/captureReplay/test.ts

Lines changed: 73 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1+
import type { Page, Request } from '@playwright/test';
12
import { expect } from '@playwright/test';
23
import { SDK_VERSION } from '@sentry/browser';
3-
import type { Event } from '@sentry/types';
44

55
import { sentryTest } from '../../../utils/fixtures';
6-
import { getFirstSentryEnvelopeRequest } from '../../../utils/helpers';
6+
import { envelopeRequestParser } from '../../../utils/helpers';
77

88
sentryTest('captureReplay', async ({ getLocalTestPath, page }) => {
99
// Replay bundles are es6 only
1010
if (process.env.PW_BUNDLE && process.env.PW_BUNDLE.startsWith('bundle_es5')) {
1111
sentryTest.skip();
1212
}
1313

14+
const reqPromise0 = waitForReplayRequest(page, 0);
15+
const reqPromise1 = waitForReplayRequest(page, 1);
16+
const reqPromise2 = waitForReplayRequest(page, 2);
17+
1418
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
1519
return route.fulfill({
1620
status: 200,
@@ -21,38 +25,65 @@ sentryTest('captureReplay', async ({ getLocalTestPath, page }) => {
2125

2226
const url = await getLocalTestPath({ testDir: __dirname });
2327

24-
const reqPromise = page.waitForRequest(req => {
25-
const postData = req.postData();
26-
if (!postData) {
27-
return false;
28-
}
29-
return postData.includes('{"type":"replay_event"}');
30-
});
31-
3228
await page.goto(url);
33-
await reqPromise;
29+
const req0 = await reqPromise0;
30+
const replayEvent0 = envelopeRequestParser(req0);
3431

35-
const reqPromise2 = page.waitForRequest(req => {
36-
const postData = req.postData();
37-
if (!postData) {
38-
return false;
39-
}
40-
return postData.includes('{"type":"replay_event"}');
41-
});
32+
await page.click('button');
33+
await reqPromise1;
4234

4335
await page.click('button');
44-
await reqPromise2;
36+
const req2 = await reqPromise2;
4537

46-
const replayEvent = await getFirstSentryEnvelopeRequest<Event>(page, url);
38+
const replayEvent2 = envelopeRequestParser(req2);
4739

48-
expect(replayEvent).toBeDefined();
49-
expect(replayEvent).toEqual({
40+
expect(replayEvent0).toBeDefined();
41+
expect(replayEvent0).toEqual({
5042
type: 'replay_event',
5143
timestamp: expect.any(Number),
5244
error_ids: [],
5345
trace_ids: [],
5446
urls: [expect.stringContaining('/dist/index.html')],
5547
replay_id: expect.stringMatching(/\w{32}/),
48+
replay_start_timestamp: expect.any(Number),
49+
segment_id: 0,
50+
replay_type: 'session',
51+
event_id: expect.stringMatching(/\w{32}/),
52+
environment: 'production',
53+
sdk: {
54+
integrations: [
55+
'InboundFilters',
56+
'FunctionToString',
57+
'TryCatch',
58+
'Breadcrumbs',
59+
'GlobalHandlers',
60+
'LinkedErrors',
61+
'Dedupe',
62+
'HttpContext',
63+
'Replay',
64+
],
65+
version: SDK_VERSION,
66+
name: 'sentry.javascript.browser',
67+
},
68+
sdkProcessingMetadata: {},
69+
request: {
70+
url: expect.stringContaining('/dist/index.html'),
71+
headers: {
72+
'User-Agent': expect.stringContaining(''),
73+
},
74+
},
75+
platform: 'javascript',
76+
tags: { sessionSampleRate: 1, errorSampleRate: 0 },
77+
});
78+
79+
expect(replayEvent2).toBeDefined();
80+
expect(replayEvent2).toEqual({
81+
type: 'replay_event',
82+
timestamp: expect.any(Number),
83+
error_ids: [],
84+
trace_ids: [],
85+
urls: [],
86+
replay_id: expect.stringMatching(/\w{32}/),
5687
segment_id: 2,
5788
replay_type: 'session',
5889
event_id: expect.stringMatching(/\w{32}/),
@@ -83,3 +114,23 @@ sentryTest('captureReplay', async ({ getLocalTestPath, page }) => {
83114
tags: { sessionSampleRate: 1, errorSampleRate: 0 },
84115
});
85116
});
117+
118+
function waitForReplayRequest(page: Page, segmentId?: number): Promise<Request> {
119+
return page.waitForRequest(
120+
req => {
121+
const postData = req.postData();
122+
if (!postData) {
123+
return false;
124+
}
125+
console.log(postData);
126+
127+
const isReplayRequest = postData.includes('{"type":"replay_event"}');
128+
129+
if (isReplayRequest && segmentId !== undefined) {
130+
return postData.includes(`{"segment_id":${segmentId}}`);
131+
}
132+
return isReplayRequest;
133+
},
134+
{ timeout: 30_000 },
135+
);
136+
}

packages/integration-tests/utils/helpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { Event, EventEnvelopeHeaders } from '@sentry/types';
44

55
const envelopeUrlRegex = /\.sentry\.io\/api\/\d+\/envelope\//;
66

7-
const envelopeRequestParser = (request: Request | null): Event => {
7+
export const envelopeRequestParser = (request: Request | null): Event => {
88
// https://develop.sentry.dev/sdk/envelopes/
99
const envelope = request?.postData() || '';
1010

0 commit comments

Comments
 (0)