Skip to content

Commit cdf2d4c

Browse files
committed
test: Fix flaky replay test
1 parent eedd811 commit cdf2d4c

File tree

5 files changed

+33
-12
lines changed

5 files changed

+33
-12
lines changed

packages/integration-tests/suites/replay/errors/errorMode/test.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { expect } from '@playwright/test';
22

33
import { sentryTest } from '../../../../utils/fixtures';
4-
import { envelopeRequestParser } from '../../../../utils/helpers';
4+
import { envelopeRequestParser, waitForErrorRequest } from '../../../../utils/helpers';
55
import {
66
expectedClickBreadcrumb,
77
expectedConsoleBreadcrumb,
@@ -10,6 +10,7 @@ import {
1010
import {
1111
getReplayEvent,
1212
getReplayRecordingContent,
13+
isReplayEvent,
1314
shouldSkipReplayTest,
1415
waitForReplayRequest,
1516
} from '../../../../utils/replayHelpers';
@@ -26,14 +27,18 @@ sentryTest(
2627
const reqPromise0 = waitForReplayRequest(page, 0);
2728
const reqPromise1 = waitForReplayRequest(page, 1);
2829
const reqPromise2 = waitForReplayRequest(page, 2);
30+
const reqErrorPromise = waitForErrorRequest(page);
2931

3032
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
3133
const event = envelopeRequestParser(route.request());
3234
// error events have no type field
3335
if (event && !event.type && event.event_id) {
3436
errorEventId = event.event_id;
3537
}
36-
callsToSentry++;
38+
// We only want to count errors & replays here
39+
if (event && (!event.type || isReplayEvent(event))) {
40+
callsToSentry++;
41+
}
3742

3843
return route.fulfill({
3944
status: 200,
@@ -46,13 +51,16 @@ sentryTest(
4651

4752
await page.goto(url);
4853
await page.click('#go-background');
54+
await new Promise(resolve => setTimeout(resolve, 1000));
55+
4956
expect(callsToSentry).toEqual(0);
5057

5158
await page.click('#error');
5259
const req0 = await reqPromise0;
5360

5461
await page.click('#go-background');
5562
const req1 = await reqPromise1;
63+
await reqErrorPromise;
5664

5765
expect(callsToSentry).toEqual(3); // 1 error, 2 replay events
5866

@@ -69,11 +77,12 @@ sentryTest(
6977
const event2 = getReplayEvent(req2);
7078
const content2 = getReplayRecordingContent(req2);
7179

80+
expect(callsToSentry).toBe(4); // 1 error, 3 replay events
81+
7282
expect(event0).toEqual(
7383
getExpectedReplayEvent({
7484
contexts: { replay: { error_sample_rate: 1, session_sample_rate: 0 } },
75-
// @ts-ignore this is fine
76-
error_ids: [errorEventId],
85+
error_ids: [errorEventId!],
7786
replay_type: 'error',
7887
}),
7988
);
@@ -97,7 +106,6 @@ sentryTest(
97106
expect(event1).toEqual(
98107
getExpectedReplayEvent({
99108
contexts: { replay: { error_sample_rate: 1, session_sample_rate: 0 } },
100-
// @ts-ignore this is fine
101109
replay_type: 'error', // although we're in session mode, we still send 'error' as replay_type
102110
replay_start_timestamp: undefined,
103111
segment_id: 1,
@@ -108,14 +116,12 @@ sentryTest(
108116
// Also the second snapshot should have a full snapshot, as we switched from error to session
109117
// mode which triggers another checkout
110118
expect(content1.fullSnapshots).toHaveLength(1);
111-
expect(content1.incrementalSnapshots).toHaveLength(0);
112119

113120
// The next event should just be a normal replay event as we're now in session mode and
114121
// we continue recording everything
115122
expect(event2).toEqual(
116123
getExpectedReplayEvent({
117124
contexts: { replay: { error_sample_rate: 1, session_sample_rate: 0 } },
118-
// @ts-ignore this is fine
119125
replay_type: 'error',
120126
replay_start_timestamp: undefined,
121127
segment_id: 2,

packages/integration-tests/suites/replay/errors/errorsInSession/test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ sentryTest(
3939
const url = await getLocalTestPath({ testDir: __dirname });
4040

4141
await page.goto(url);
42-
await page.click('#go-background');
4342
const req0 = await reqPromise0;
4443

4544
await page.click('#error');
@@ -57,7 +56,6 @@ sentryTest(
5756
getExpectedReplayEvent({
5857
replay_start_timestamp: undefined,
5958
segment_id: 1,
60-
// @ts-ignore this is fine
6159
error_ids: [errorEventId],
6260
urls: [],
6361
}),

packages/integration-tests/suites/replay/errors/init.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import * as Sentry from '@sentry/browser';
22

33
window.Sentry = Sentry;
44
window.Replay = new Sentry.Replay({
5-
flushMinDelay: 500,
6-
flushMaxDelay: 500,
5+
flushMinDelay: 1000,
6+
flushMaxDelay: 1000,
77
});
88

99
Sentry.init({

packages/integration-tests/utils/helpers.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,23 @@ async function getSentryEvents(page: Page, url?: string): Promise<Array<Event>>
108108
return eventsHandle.jsonValue();
109109
}
110110

111+
export function waitForErrorRequest(page: Page): Promise<Request> {
112+
return page.waitForRequest(req => {
113+
const postData = req.postData();
114+
if (!postData) {
115+
return false;
116+
}
117+
118+
try {
119+
const event = envelopeRequestParser(req);
120+
121+
return !event.type;
122+
} catch {
123+
return false;
124+
}
125+
});
126+
}
127+
111128
/**
112129
* Waits until a number of requests matching urlRgx at the given URL arrive.
113130
* If the timout option is configured, this function will abort waiting, even if it hasn't reveived the configured

packages/integration-tests/utils/replayHelpers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export function waitForReplayRequest(page: Page, segmentId?: number): Promise<Re
6464
});
6565
}
6666

67-
function isReplayEvent(event: Event): event is ReplayEvent {
67+
export function isReplayEvent(event: Event): event is ReplayEvent {
6868
return event.type === 'replay_event';
6969
}
7070

0 commit comments

Comments
 (0)