Skip to content

Commit 508e77f

Browse files
committed
debug flaky test
1 parent 873d9bb commit 508e77f

File tree

1 file changed

+128
-125
lines changed
  • packages/browser-integration-tests/suites/replay/errors/errorsInSession

1 file changed

+128
-125
lines changed

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

Lines changed: 128 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -10,138 +10,141 @@ import {
1010
waitForReplayRequest,
1111
} from '../../../../utils/replayHelpers';
1212

13-
sentryTest(
14-
'[session-mode] replay event should contain an error id of an error that occurred during session recording',
15-
async ({ getLocalTestPath, page, browserName, forceFlushReplay }) => {
16-
// TODO(replay): This is flakey on firefox where clicks are flakey
17-
if (shouldSkipReplayTest() || ['firefox'].includes(browserName)) {
18-
sentryTest.skip();
19-
}
20-
21-
let errorEventId: string = 'invalid_id';
22-
23-
const reqPromise0 = waitForReplayRequest(page, 0);
24-
const reqPromise1 = waitForReplayRequest(page, 1);
25-
26-
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
27-
const event = envelopeRequestParser(route.request());
28-
// error events have no type field
29-
if (event && !event.type && event.event_id) {
30-
errorEventId = event.event_id;
13+
for (let i = 0; i < 100; i++) {
14+
sentryTest(
15+
`[session-mode] replay event should contain an error id of an error that occurred during session recording RUN ${i}`,
16+
async ({ getLocalTestPath, page, browserName, forceFlushReplay }) => {
17+
// TODO(replay): This is flakey on firefox where clicks are flakey
18+
if (shouldSkipReplayTest() || browserName === 'firefox') {
19+
sentryTest.skip();
3120
}
3221

33-
return route.fulfill({
34-
status: 200,
35-
contentType: 'application/json',
36-
body: JSON.stringify({ id: 'test-id' }),
22+
let errorEventId: string = 'invalid_id';
23+
24+
const reqPromise0 = waitForReplayRequest(page, 0);
25+
const reqPromise1 = waitForReplayRequest(page, 1);
26+
27+
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
28+
const event = envelopeRequestParser(route.request());
29+
// error events have no type field
30+
if (event && !event.type && event.event_id) {
31+
errorEventId = event.event_id;
32+
}
33+
34+
return route.fulfill({
35+
status: 200,
36+
contentType: 'application/json',
37+
body: JSON.stringify({ id: 'test-id' }),
38+
});
3739
});
38-
});
39-
40-
const url = await getLocalTestPath({ testDir: __dirname });
41-
42-
await page.goto(url);
43-
const req0 = await reqPromise0;
44-
45-
await page.click('#error');
46-
await forceFlushReplay();
47-
const req1 = await reqPromise1;
48-
49-
const event0 = getReplayEvent(req0);
50-
51-
const event1 = getReplayEvent(req1);
52-
const content1 = getReplayRecordingContent(req1);
53-
54-
expect(event0).toEqual(getExpectedReplayEvent());
55-
56-
expect(event1).toEqual(
57-
getExpectedReplayEvent({
58-
replay_start_timestamp: undefined,
59-
segment_id: 1,
60-
error_ids: [errorEventId],
61-
urls: [],
62-
}),
63-
);
64-
65-
expect(content1.breadcrumbs).toEqual(
66-
expect.arrayContaining([
67-
{
68-
...expectedClickBreadcrumb,
69-
message: 'body > button#error',
70-
data: {
71-
node: {
72-
attributes: {
73-
id: 'error',
40+
41+
const url = await getLocalTestPath({ testDir: __dirname });
42+
43+
await page.goto(url);
44+
const req0 = await reqPromise0;
45+
46+
await page.click('#error');
47+
await forceFlushReplay();
48+
const req1 = await reqPromise1;
49+
50+
const event0 = getReplayEvent(req0);
51+
52+
const event1 = getReplayEvent(req1);
53+
const content1 = getReplayRecordingContent(req1);
54+
55+
expect(event0).toEqual(getExpectedReplayEvent());
56+
57+
expect(event1).toEqual(
58+
getExpectedReplayEvent({
59+
replay_start_timestamp: undefined,
60+
segment_id: 1,
61+
error_ids: [errorEventId],
62+
urls: [],
63+
}),
64+
);
65+
66+
expect(content1.breadcrumbs).toEqual(
67+
expect.arrayContaining([
68+
{
69+
...expectedClickBreadcrumb,
70+
message: 'body > button#error',
71+
data: {
72+
node: {
73+
attributes: {
74+
id: 'error',
75+
},
76+
id: expect.any(Number),
77+
tagName: 'button',
78+
textContent: '***** *****',
7479
},
75-
id: expect.any(Number),
76-
tagName: 'button',
77-
textContent: '***** *****',
80+
nodeId: expect.any(Number),
7881
},
79-
nodeId: expect.any(Number),
8082
},
81-
},
82-
]),
83-
);
84-
},
85-
);
86-
87-
sentryTest(
88-
'[session-mode] replay event should not contain an error id of a dropped error while recording',
89-
async ({ getLocalTestPath, page, forceFlushReplay }) => {
90-
if (shouldSkipReplayTest()) {
91-
sentryTest.skip();
92-
}
93-
94-
const reqPromise0 = waitForReplayRequest(page, 0);
95-
const reqPromise1 = waitForReplayRequest(page, 1);
96-
97-
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
98-
return route.fulfill({
99-
status: 200,
100-
contentType: 'application/json',
101-
body: JSON.stringify({ id: 'test-id' }),
83+
]),
84+
);
85+
},
86+
);
87+
88+
sentryTest(
89+
`[session-mode] replay event should not contain an error id of a dropped error while recording RUN ${i}`,
90+
async ({ getLocalTestPath, page, forceFlushReplay, browserName }) => {
91+
// TODO(replay): This is flakey on firefox where clicks are flakey
92+
if (shouldSkipReplayTest() || browserName === 'firefox') {
93+
sentryTest.skip();
94+
}
95+
96+
const reqPromise0 = waitForReplayRequest(page, 0);
97+
const reqPromise1 = waitForReplayRequest(page, 1);
98+
99+
await page.route('https://dsn.ingest.sentry.io/**/*', route => {
100+
return route.fulfill({
101+
status: 200,
102+
contentType: 'application/json',
103+
body: JSON.stringify({ id: 'test-id' }),
104+
});
102105
});
103-
});
104-
105-
const url = await getLocalTestPath({ testDir: __dirname });
106-
107-
await page.goto(url);
108-
await reqPromise0;
109-
110-
await page.click('#drop');
111-
await forceFlushReplay();
112-
const req1 = await reqPromise1;
113-
114-
const event1 = getReplayEvent(req1);
115-
const content1 = getReplayRecordingContent(req1);
116-
117-
expect(event1).toEqual(
118-
getExpectedReplayEvent({
119-
replay_start_timestamp: undefined,
120-
segment_id: 1,
121-
error_ids: [], // <-- no error id
122-
urls: [],
123-
}),
124-
);
125-
126-
// The button click that triggered the error should still be recorded
127-
expect(content1.breadcrumbs).toEqual(
128-
expect.arrayContaining([
129-
{
130-
...expectedClickBreadcrumb,
131-
message: 'body > button#drop',
132-
data: {
133-
node: {
134-
attributes: {
135-
id: 'drop',
106+
107+
const url = await getLocalTestPath({ testDir: __dirname });
108+
109+
await page.goto(url);
110+
await reqPromise0;
111+
112+
await page.click('#drop');
113+
await forceFlushReplay();
114+
const req1 = await reqPromise1;
115+
116+
const event1 = getReplayEvent(req1);
117+
const content1 = getReplayRecordingContent(req1);
118+
119+
expect(event1).toEqual(
120+
getExpectedReplayEvent({
121+
replay_start_timestamp: undefined,
122+
segment_id: 1,
123+
error_ids: [], // <-- no error id
124+
urls: [],
125+
}),
126+
);
127+
128+
// The button click that triggered the error should still be recorded
129+
expect(content1.breadcrumbs).toEqual(
130+
expect.arrayContaining([
131+
{
132+
...expectedClickBreadcrumb,
133+
message: 'body > button#drop',
134+
data: {
135+
node: {
136+
attributes: {
137+
id: 'drop',
138+
},
139+
id: expect.any(Number),
140+
tagName: 'button',
141+
textContent: '***** ***** *** **** **',
136142
},
137-
id: expect.any(Number),
138-
tagName: 'button',
139-
textContent: '***** ***** *** **** **',
143+
nodeId: expect.any(Number),
140144
},
141-
nodeId: expect.any(Number),
142145
},
143-
},
144-
]),
145-
);
146-
},
147-
);
146+
]),
147+
);
148+
},
149+
);
150+
}

0 commit comments

Comments
 (0)