Skip to content

Commit a52eb3c

Browse files
committed
add working e2e tests
1 parent 3acf7a8 commit a52eb3c

File tree

7 files changed

+58
-23
lines changed

7 files changed

+58
-23
lines changed

dev-packages/e2e-tests/lib/copyToTemp.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ function fixPackageJson(cwd: string): void {
2828

2929
// 2. Fix volta extends
3030
if (!packageJson.volta) {
31-
throw new Error('No volta config found, please provide one!');
31+
throw new Error("No volta config found, please add one to the test app's package.json!");
3232
}
3333

3434
if (typeof packageJson.volta.extends === 'string') {
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
@sentry:registry=http://127.0.0.1:4873
2+
@sentry-internal:registry=http://127.0.0.1:4873
Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
{
2-
"name": "gh-sentry-javascript-bundler-plugins-755-vite-worker-bundles",
2+
"name": "browser-webworker-vite",
33
"private": true,
44
"version": "0.0.0",
55
"type": "module",
66
"scripts": {
77
"dev": "vite",
8-
"build": "rm -rf dist &&tsc && vite build",
8+
"build": "rm -rf dist && tsc && vite build",
99
"preview": "vite preview --port 3030",
10+
"test": "playwright test",
1011
"test:build": "pnpm install && pnpm build",
1112
"test:assert": "pnpm test"
1213
},
@@ -17,7 +18,12 @@
1718
"vite": "^7.0.4"
1819
},
1920
"dependencies": {
20-
"@sentry/browser": "^9.38.0",
21+
"@sentry/browser": "latest || *",
2122
"@sentry/vite-plugin": "^3.5.0"
23+
},
24+
"volta": {
25+
"node": "20.19.2",
26+
"yarn": "1.22.22",
27+
"pnpm": "9.15.9"
2228
}
2329
}

dev-packages/e2e-tests/test-applications/browser-webworker-vite/playwright.config.mjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ import { getPlaywrightConfig } from '@sentry-internal/test-utils';
22

33
const config = getPlaywrightConfig({
44
startCommand: `pnpm preview`,
5+
eventProxyFile: 'start-event-proxy.mjs',
6+
eventProxyPort: 3031,
7+
port: 3030,
58
});
69

710
export default config;
Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
import './style.css';
21
import MyWorker from './worker.ts?worker';
32
import * as Sentry from '@sentry/browser';
43

54
Sentry.init({
6-
dsn: import.meta.env.E2E_TEST_DSN,
5+
dsn: import.meta.env.PUBLIC_E2E_TEST_DSN,
76
environment: import.meta.env.MODE || 'development',
87
tracesSampleRate: 1.0,
98
debug: true,
109
integrations: [Sentry.browserTracingIntegration()],
10+
tunnel: 'http://localhost:3031/', // proxy server
1111
});
1212

1313
const worker = new MyWorker();
@@ -16,12 +16,11 @@ Sentry.addIntegration(Sentry.webWorkerIntegration({ worker }));
1616

1717
worker.addEventListener('message', event => {
1818
// this is part of the test, do not delete
19-
console.log('xx received message from worker', event);
19+
console.log('received message from worker:', event.data.msg);
2020
});
2121

2222
document.querySelector<HTMLButtonElement>('#trigger-error')!.addEventListener('click', () => {
2323
worker.postMessage({
24-
type: 'TRIGGER_ERROR',
25-
data: 'This message triggers an uncaught error!',
24+
msg: 'TRIGGER_ERROR',
2625
});
2726
});
Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
import { expect, test } from '@playwright/test';
22
import { waitForError, waitForTransaction } from '@sentry-internal/test-utils';
33

4-
const E2E_TEST_APP_NAME = 'browser-webworker-vite';
5-
64
test('captures an error with debug ids and pageload trace context', async ({ page }) => {
7-
const errorEventPromise = waitForError(E2E_TEST_APP_NAME, event => {
8-
return !event.type && event.exception?.values?.[0]?.value === 'Uncaught error in worker';
5+
const errorEventPromise = waitForError('browser-webworker-vite', async event => {
6+
return !event.type && !!event.exception?.values?.[0];
97
});
108

11-
const transactionPromise = waitForTransaction(E2E_TEST_APP_NAME, transactionEvent => {
9+
const transactionPromise = waitForTransaction('browser-webworker-vite', transactionEvent => {
1210
return !!transactionEvent?.transaction && transactionEvent.contexts?.trace?.op === 'pageload';
1311
});
1412

1513
await page.goto('/');
1614

17-
await page.locator('id=trigger-error').click();
15+
await page.locator('#trigger-error').click();
16+
17+
await page.waitForTimeout(1000);
1818

1919
const errorEvent = await errorEventPromise;
2020
const transactionEvent = await transactionPromise;
@@ -23,15 +23,15 @@ test('captures an error with debug ids and pageload trace context', async ({ pag
2323
const pageloadSpanId = transactionEvent.contexts?.trace?.span_id;
2424

2525
expect(errorEvent.exception?.values).toHaveLength(1);
26-
expect(errorEvent.exception?.values?.[0]?.value).toBe('Uncaught error in worker');
26+
expect(errorEvent.exception?.values?.[0]?.value).toBe('Uncaught Error: Uncaught error in worker');
2727
expect(errorEvent.exception?.values?.[0]?.stacktrace?.frames).toHaveLength(1);
28-
expect(errorEvent.exception?.values?.[0]?.stacktrace?.frames?.[0]?.filename).toContain('worker.js');
28+
expect(errorEvent.exception?.values?.[0]?.stacktrace?.frames?.[0]?.filename).toMatch(/worker-.+\.js$/);
2929

3030
expect(errorEvent.transaction).toBe('/');
3131
expect(transactionEvent.transaction).toBe('/');
3232

3333
expect(errorEvent.request).toEqual({
34-
url: 'http://localhost:4173/',
34+
url: 'http://localhost:3030/',
3535
headers: expect.any(Object),
3636
});
3737

@@ -41,11 +41,33 @@ test('captures an error with debug ids and pageload trace context', async ({ pag
4141
});
4242

4343
expect(errorEvent.debug_meta).toEqual({
44-
sourcemaps: {
45-
'worker.js': {
46-
version: expect.any(String),
47-
url: expect.any(String),
44+
images: [
45+
{
46+
code_file: expect.stringMatching(/http:\/\/localhost:3030\/assets\/worker-.+\.js/),
47+
debug_id: expect.stringMatching(/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/),
48+
type: 'sourcemap',
4849
},
49-
},
50+
],
51+
});
52+
});
53+
54+
test("user worker message handlers don't trigger for sentry messages", async ({ page }) => {
55+
const workerReadyPromise = new Promise<number>(resolve => {
56+
let workerMessageCount = 0;
57+
page.on('console', msg => {
58+
if (msg.text().startsWith('received message from worker:')) {
59+
workerMessageCount++;
60+
}
61+
62+
if (msg.text() === 'received message from worker: WORKER_READY') {
63+
resolve(workerMessageCount);
64+
}
65+
});
5066
});
67+
68+
await page.goto('/');
69+
70+
const workerMessageCount = await workerReadyPromise;
71+
72+
expect(workerMessageCount).toBe(1);
5173
});

dev-packages/e2e-tests/test-applications/browser-webworker-vite/vite.config.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { defineConfig } from 'vite';
44
export default defineConfig({
55
build: {
66
sourcemap: 'hidden',
7+
envPrefix: ['PUBLIC_'],
78
},
89

910
plugins: [
@@ -23,4 +24,6 @@ export default defineConfig({
2324
}),
2425
],
2526
},
27+
28+
envPrefix: ['PUBLIC_'],
2629
});

0 commit comments

Comments
 (0)