Skip to content

Commit f9c87ab

Browse files
author
Luca Forstner
committed
Add integration tests for multiple event listener attachments
1 parent 161d302 commit f9c87ab

File tree

6 files changed

+94
-1
lines changed

6 files changed

+94
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Simple function event listener
2+
const eventListener1 = () => {
3+
// Trigger something that puppeteer can listen to - like console.log
4+
console.log('eventListener1');
5+
};
6+
7+
// Attach event listener twice
8+
window.addEventListener('click', eventListener1);
9+
window.addEventListener('click', eventListener1);
10+
11+
// Event listener that has handleEvent() method: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#listener
12+
class EventHandlerClass {
13+
handleEvent() {
14+
// Trigger something that puppeteer can listen to - like console.log
15+
console.log('eventListener2');
16+
}
17+
}
18+
19+
const eventListener2 = new EventHandlerClass();
20+
21+
// Attach event listener twice
22+
window.addEventListener('click', eventListener2, { passive: true, capture: false });
23+
window.addEventListener('click', eventListener2, { passive: true, capture: false });
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { expect } from '@playwright/test';
2+
3+
import { sentryTest } from '../../../../utils/fixtures';
4+
5+
sentryTest('should attach the same event listener only once', async ({ getLocalTestPath, page }) => {
6+
const url = await getLocalTestPath({ testDir: __dirname });
7+
await page.goto(url);
8+
9+
const testCompletionPromise = new Promise<void>(resolve => {
10+
let eventListener1Calls = 0;
11+
let eventListener2Calls = 0;
12+
13+
page.on('console', async msg => {
14+
const msgText = msg.text();
15+
16+
if (msgText === 'eventListener1') {
17+
eventListener1Calls = eventListener1Calls + 1;
18+
} else if (msgText === 'eventListener2') {
19+
eventListener2Calls = eventListener2Calls + 1;
20+
} else if (msgText === 'done') {
21+
expect(eventListener1Calls).toBe(2);
22+
expect(eventListener2Calls).toBe(2);
23+
resolve();
24+
}
25+
});
26+
});
27+
28+
// Trigger event listeners twice and signal completion afterwards
29+
await page.evaluate('document.body.click()');
30+
await page.evaluate('document.body.click()');
31+
await page.evaluate('console.log("done")');
32+
33+
return testCompletionPromise;
34+
});
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
window.addEventListener('click', () => {
2+
throw new Error('event_listener_error');
3+
});
4+
5+
document.body.click();
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { expect } from '@playwright/test';
2+
import { Event } from '@sentry/types';
3+
4+
import { sentryTest } from '../../../../utils/fixtures';
5+
import { getFirstSentryEnvelopeRequest } from '../../../../utils/helpers';
6+
7+
sentryTest('should capture an error thrown in an event handler', async ({ getLocalTestPath, page }) => {
8+
const url = await getLocalTestPath({ testDir: __dirname });
9+
10+
const eventData = await getFirstSentryEnvelopeRequest<Event>(page, url);
11+
12+
expect(eventData.exception?.values).toHaveLength(1);
13+
expect(eventData.exception?.values?.[0]).toMatchObject({
14+
type: 'Error',
15+
value: 'event_listener_error',
16+
mechanism: {
17+
type: 'instrument',
18+
handled: true,
19+
},
20+
stacktrace: {
21+
frames: expect.any(Array),
22+
},
23+
});
24+
});
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import * as Sentry from '@sentry/browser';
2+
3+
window.Sentry = Sentry;
4+
5+
Sentry.init({
6+
dsn: 'https://[email protected]/1337',
7+
});

packages/integration-tests/suites/tracing/baggage/test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { expect } from '@playwright/test';
2-
import { Event, EventEnvelopeHeaders } from '@sentry/types';
2+
import { EventEnvelopeHeaders } from '@sentry/types';
33

44
import { sentryTest } from '../../../utils/fixtures';
55
import { envelopeHeaderRequestParser, getFirstSentryEnvelopeRequest } from '../../../utils/helpers';

0 commit comments

Comments
 (0)