Skip to content

Commit 5a9c916

Browse files
authored
ref(tests): Update replay integration tests to avoid flakes. (#9025)
Resolves: #8975 Refactored most flaky replay tests to `Promise.all` pattern to reduce flakiness.
1 parent a57b66d commit 5a9c916

File tree

16 files changed

+235
-289
lines changed

16 files changed

+235
-289
lines changed

packages/browser-integration-tests/suites/replay/bufferMode/test.ts

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,13 @@ sentryTest(
8484
await reqErrorPromise;
8585
expect(callsToSentry).toEqual(2);
8686

87-
await page.evaluate(async () => {
88-
const replayIntegration = (window as unknown as Window & { Replay: Replay }).Replay;
89-
await replayIntegration.flush();
90-
});
91-
92-
const req0 = await reqPromise0;
87+
const [req0] = await Promise.all([
88+
reqPromise0,
89+
page.evaluate(async () => {
90+
const replayIntegration = (window as unknown as Window & { Replay: Replay }).Replay;
91+
await replayIntegration.flush();
92+
}),
93+
]);
9394

9495
// 2 errors, 1 flush
9596
await reqErrorPromise;
@@ -226,12 +227,13 @@ sentryTest(
226227
await reqErrorPromise;
227228
expect(callsToSentry).toEqual(2);
228229

229-
await page.evaluate(async () => {
230-
const replayIntegration = (window as unknown as Window & { Replay: Replay }).Replay;
231-
await replayIntegration.flush({ continueRecording: false });
232-
});
233-
234-
const req0 = await reqPromise0;
230+
const [req0] = await Promise.all([
231+
reqPromise0,
232+
page.evaluate(async () => {
233+
const replayIntegration = (window as unknown as Window & { Replay: Replay }).Replay;
234+
await replayIntegration.flush({ continueRecording: false });
235+
}),
236+
]);
235237

236238
// 2 errors, 1 flush
237239
await reqErrorPromise;
@@ -346,9 +348,12 @@ sentryTest(
346348

347349
// Error sample rate is now at 1.0, this error should create a replay
348350
const reqErrorPromise1 = waitForErrorRequest(page);
349-
await page.click('#error2');
350-
// 1 unsampled error, 1 sampled error -> 1 flush
351-
const req0 = await reqPromise0;
351+
const [req0] = await Promise.all([
352+
// 1 unsampled error, 1 sampled error -> 1 flush
353+
reqPromise0,
354+
page.click('#error2'),
355+
]);
356+
352357
const reqError1 = await reqErrorPromise1;
353358
const errorEvent1 = envelopeRequestParser(reqError1);
354359
expect(callsToSentry).toEqual(3);

packages/browser-integration-tests/suites/replay/captureConsoleLog/test.ts

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ sentryTest('should capture console messages in replay', async ({ getLocalTestPat
1010
sentryTest.skip();
1111
}
1212

13-
const reqPromise0 = waitForReplayRequest(page, 0);
14-
1513
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
1614
return route.fulfill({
1715
status: 200,
@@ -20,10 +18,11 @@ sentryTest('should capture console messages in replay', async ({ getLocalTestPat
2018
});
2119
});
2220

21+
const reqPromise0 = waitForReplayRequest(page, 0);
22+
2323
const url = await getLocalTestPath({ testDir: __dirname });
2424

25-
await page.goto(url);
26-
await reqPromise0;
25+
await Promise.all([page.goto(url), reqPromise0]);
2726

2827
const reqPromise1 = waitForReplayRequest(
2928
page,
@@ -38,11 +37,10 @@ sentryTest('should capture console messages in replay', async ({ getLocalTestPat
3837
await page.click('[data-log]');
3938

4039
// Sometimes this doesn't seem to trigger, so we trigger it twice to be sure...
41-
await page.click('[data-log]');
42-
40+
const [req1] = await Promise.all([reqPromise1, page.click('[data-log]')]);
4341
await forceFlushReplay();
4442

45-
const { breadcrumbs } = getCustomRecordingEvents(await reqPromise1);
43+
const { breadcrumbs } = getCustomRecordingEvents(req1);
4644

4745
expect(breadcrumbs.filter(breadcrumb => breadcrumb.category === 'console')).toEqual(
4846
expect.arrayContaining([
@@ -65,8 +63,6 @@ sentryTest('should capture very large console logs', async ({ getLocalTestPath,
6563
sentryTest.skip();
6664
}
6765

68-
const reqPromise0 = waitForReplayRequest(page, 0);
69-
7066
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
7167
return route.fulfill({
7268
status: 200,
@@ -75,10 +71,11 @@ sentryTest('should capture very large console logs', async ({ getLocalTestPath,
7571
});
7672
});
7773

74+
const reqPromise0 = waitForReplayRequest(page, 0);
75+
7876
const url = await getLocalTestPath({ testDir: __dirname });
7977

80-
await page.goto(url);
81-
await reqPromise0;
78+
await Promise.all([page.goto(url), reqPromise0]);
8279

8380
const reqPromise1 = waitForReplayRequest(
8481
page,
@@ -90,14 +87,10 @@ sentryTest('should capture very large console logs', async ({ getLocalTestPath,
9087
5_000,
9188
);
9289

93-
await page.click('[data-log-large]');
94-
95-
// Sometimes this doesn't seem to trigger, so we trigger it twice to be sure...
96-
await page.click('[data-log-large]');
97-
90+
const [req1] = await Promise.all([reqPromise1, page.click('[data-log-large]')]);
9891
await forceFlushReplay();
9992

100-
const { breadcrumbs } = getCustomRecordingEvents(await reqPromise1);
93+
const { breadcrumbs } = getCustomRecordingEvents(req1);
10194

10295
expect(breadcrumbs.filter(breadcrumb => breadcrumb.category === 'console')).toEqual(
10396
expect.arrayContaining([

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

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,26 +50,25 @@ sentryTest(
5050

5151
const url = await getLocalTestPath({ testDir: __dirname });
5252

53-
await page.goto(url);
54-
await page.click('#go-background');
55-
await new Promise(resolve => setTimeout(resolve, 1000));
53+
await Promise.all([
54+
page.goto(url),
55+
page.click('#go-background'),
56+
new Promise(resolve => setTimeout(resolve, 1000)),
57+
]);
5658

5759
expect(callsToSentry).toEqual(0);
5860

59-
await page.click('#error');
60-
const req0 = await reqPromise0;
61+
const [req0] = await Promise.all([reqPromise0, page.click('#error')]);
6162

6263
expect(callsToSentry).toEqual(2); // 1 error, 1 replay event
6364

64-
await page.click('#go-background');
65-
const req1 = await reqPromise1;
66-
await reqErrorPromise;
65+
const [req1] = await Promise.all([reqPromise1, page.click('#go-background'), reqErrorPromise]);
6766

6867
expect(callsToSentry).toEqual(3); // 1 error, 2 replay events
6968

7069
await page.click('#log');
71-
await page.click('#go-background');
72-
const req2 = await reqPromise2;
70+
71+
const [req2] = await Promise.all([reqPromise2, page.click('#go-background')]);
7372

7473
const event0 = getReplayEvent(req0);
7574
const content0 = getReplayRecordingContent(req0);

packages/browser-integration-tests/suites/replay/largeMutations/defaultOptions/test.ts

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ sentryTest(
1010
sentryTest.skip();
1111
}
1212

13-
const reqPromise0 = waitForReplayRequest(page, 0);
14-
1513
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
1614
return route.fulfill({
1715
status: 200,
@@ -22,26 +20,17 @@ sentryTest(
2220

2321
const url = await getLocalTestPath({ testDir: __dirname });
2422

25-
await page.goto(url);
26-
const res0 = await reqPromise0;
27-
28-
const reqPromise1 = waitForReplayRequest(page);
29-
30-
void page.click('#button-add');
23+
const [res0] = await Promise.all([waitForReplayRequest(page, 0), page.goto(url)]);
3124
await forceFlushReplay();
32-
const res1 = await reqPromise1;
3325

34-
const reqPromise2 = waitForReplayRequest(page);
35-
36-
void page.click('#button-modify');
26+
const [res1] = await Promise.all([waitForReplayRequest(page), page.click('#button-add')]);
3727
await forceFlushReplay();
38-
const res2 = await reqPromise2;
3928

40-
const reqPromise3 = waitForReplayRequest(page);
29+
const [res2] = await Promise.all([waitForReplayRequest(page), page.click('#button-modify')]);
30+
await forceFlushReplay();
4131

42-
void page.click('#button-remove');
32+
const [res3] = await Promise.all([waitForReplayRequest(page), page.click('#button-remove')]);
4333
await forceFlushReplay();
44-
const res3 = await reqPromise3;
4534

4635
const replayData0 = getReplayRecordingContent(res0);
4736
const replayData1 = getReplayRecordingContent(res1);

packages/browser-integration-tests/suites/replay/largeMutations/mutationLimit/test.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ sentryTest(
1515
sentryTest.skip();
1616
}
1717

18-
const reqPromise0 = waitForReplayRequest(page, 0);
19-
2018
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
2119
return route.fulfill({
2220
status: 200,
@@ -25,23 +23,24 @@ sentryTest(
2523
});
2624
});
2725

26+
const reqPromise0 = waitForReplayRequest(page, 0);
27+
2828
const url = await getLocalTestPath({ testDir: __dirname });
2929

30-
await page.goto(url);
31-
const res0 = await reqPromise0;
30+
const [res0] = await Promise.all([reqPromise0, page.goto(url)]);
31+
await forceFlushReplay();
3232

3333
const reqPromise1 = waitForReplayRequest(page);
3434

35-
void page.click('#button-add');
35+
const [res1] = await Promise.all([reqPromise1, page.click('#button-add')]);
3636
await forceFlushReplay();
37-
const res1 = await reqPromise1;
3837

3938
// replay should be stopped due to mutation limit
4039
let replay = await getReplaySnapshot(page);
4140
expect(replay.session).toBe(undefined);
4241
expect(replay._isEnabled).toBe(false);
4342

44-
void page.click('#button-modify');
43+
await page.click('#button-modify');
4544
await forceFlushReplay();
4645

4746
await page.click('#button-remove');

packages/browser-integration-tests/suites/replay/maxReplayDuration/test.ts

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,6 @@ sentryTest('keeps track of max duration across reloads', async ({ getLocalTestPa
1111
sentryTest.skip();
1212
}
1313

14-
const reqPromise0 = waitForReplayRequest(page, 0);
15-
const reqPromise1 = waitForReplayRequest(page, 1);
16-
1714
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
1815
return route.fulfill({
1916
status: 200,
@@ -22,33 +19,42 @@ sentryTest('keeps track of max duration across reloads', async ({ getLocalTestPa
2219
});
2320
});
2421

22+
const reqPromise0 = waitForReplayRequest(page, 0);
23+
const reqPromise1 = waitForReplayRequest(page, 1);
24+
2525
const url = await getLocalTestPath({ testDir: __dirname });
2626

2727
await page.goto(url);
2828

2929
await new Promise(resolve => setTimeout(resolve, MAX_REPLAY_DURATION / 2));
3030

31-
await page.reload();
32-
await page.click('#button1');
31+
await Promise.all([page.reload(), page.click('#button1')]);
3332

3433
// After the second reload, we should have a new session (because we exceeded max age)
3534
const reqPromise3 = waitForReplayRequest(page, 0);
3635

3736
await new Promise(resolve => setTimeout(resolve, MAX_REPLAY_DURATION / 2 + 100));
3837

39-
void page.click('#button1');
40-
await page.evaluate(`Object.defineProperty(document, 'visibilityState', {
38+
const [req0, req1] = await Promise.all([
39+
reqPromise0,
40+
reqPromise1,
41+
page.click('#button1'),
42+
page.evaluate(
43+
`Object.defineProperty(document, 'visibilityState', {
4144
configurable: true,
4245
get: function () {
4346
return 'hidden';
4447
},
4548
});
46-
document.dispatchEvent(new Event('visibilitychange'));`);
4749
48-
const replayEvent0 = getReplayEvent(await reqPromise0);
50+
document.dispatchEvent(new Event('visibilitychange'));`,
51+
),
52+
]);
53+
54+
const replayEvent0 = getReplayEvent(req0);
4955
expect(replayEvent0).toEqual(getExpectedReplayEvent({}));
5056

51-
const replayEvent1 = getReplayEvent(await reqPromise1);
57+
const replayEvent1 = getReplayEvent(req1);
5258
expect(replayEvent1).toEqual(
5359
getExpectedReplayEvent({
5460
segment_id: 1,

0 commit comments

Comments
 (0)