Skip to content

Commit 4015144

Browse files
committed
add simple tests
1 parent 42d8bbe commit 4015144

File tree

3 files changed

+110
-0
lines changed

3 files changed

+110
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import * as Sentry from '@sentry/node';
2+
import { loggingTransport } from '@sentry-internal/node-integration-tests';
3+
4+
Sentry.init({
5+
dsn: 'https://[email protected]/1337',
6+
release: '1.0',
7+
tracesSampleRate: 1,
8+
transport: loggingTransport,
9+
});
10+
11+
recordSpan(async () => {
12+
doSomething();
13+
doSomethingWithError();
14+
});
15+
16+
async function doSomething() {
17+
return Promise.resolve();
18+
}
19+
20+
async function doSomethingWithError() {
21+
await new Promise(resolve => setTimeout(resolve, 100));
22+
throw new Error('test error');
23+
}
24+
25+
function recordSpan(fn: (span: unknown) => Promise<void>) {
26+
return Sentry.startSpanManual({ name: 'test-span' }, async span => {
27+
try {
28+
const result = await fn(span);
29+
span.end();
30+
return result;
31+
} catch (error) {
32+
try {
33+
span.setStatus({ code: 2 });
34+
} finally {
35+
// always stop the span when there is an error:
36+
span.end();
37+
}
38+
39+
throw error;
40+
}
41+
});
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import * as Sentry from '@sentry/node';
2+
import { loggingTransport } from '@sentry-internal/node-integration-tests';
3+
4+
Sentry.init({
5+
dsn: 'https://[email protected]/1337',
6+
release: '1.0',
7+
tracesSampleRate: 1,
8+
transport: loggingTransport,
9+
});
10+
11+
Sentry.startSpan({ name: 'test-span' }, async () => {
12+
throw new Error('test error');
13+
});

dev-packages/node-integration-tests/suites/public-api/onUnhandledRejectionIntegration/test.ts

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import * as childProcess from 'child_process';
22
import * as path from 'path';
33
import { afterAll, describe, expect, test } from 'vitest';
44
import { cleanupChildProcesses, createRunner } from '../../../utils/runner';
5+
import type { Event } from '@sentry/node';
56

67
describe('onUnhandledRejectionIntegration', () => {
78
afterAll(() => {
@@ -123,4 +124,58 @@ test rejection`);
123124
.start()
124125
.completed();
125126
});
127+
128+
test('handles unhandled rejection in spans', async () => {
129+
let transactionEvent: Event | undefined;
130+
let errorEvent: Event | undefined;
131+
132+
await createRunner(__dirname, 'scenario-with-span.ts')
133+
.expect({
134+
transaction: transaction => {
135+
transactionEvent = transaction;
136+
},
137+
})
138+
.expect({
139+
event: event => {
140+
errorEvent = event;
141+
},
142+
})
143+
.start()
144+
.completed();
145+
146+
expect(transactionEvent).toBeDefined();
147+
expect(errorEvent).toBeDefined();
148+
149+
expect(transactionEvent!.transaction).toBe('test-span');
150+
151+
expect(transactionEvent!.contexts!.trace!.trace_id).toBe(errorEvent!.contexts!.trace!.trace_id);
152+
expect(transactionEvent!.contexts!.trace!.span_id).toBe(errorEvent!.contexts!.trace!.span_id);
153+
});
154+
155+
test('handles unhandled rejection in spans that are ended early', async () => {
156+
let transactionEvent: Event | undefined;
157+
let errorEvent: Event | undefined;
158+
159+
await createRunner(__dirname, 'scenario-with-span-ended.ts')
160+
.expect({
161+
transaction: transaction => {
162+
transactionEvent = transaction;
163+
},
164+
})
165+
.expect({
166+
event: event => {
167+
errorEvent = event;
168+
},
169+
})
170+
.start()
171+
.completed();
172+
173+
expect(transactionEvent).toBeDefined();
174+
expect(errorEvent).toBeDefined();
175+
176+
expect(transactionEvent!.transaction).toBe('test-span');
177+
178+
expect(transactionEvent!.contexts!.trace!.trace_id).toBe(errorEvent!.contexts!.trace!.trace_id);
179+
expect(transactionEvent!.contexts!.trace!.span_id).toBe(errorEvent!.contexts!.trace!.span_id);
180+
});
126181
});

0 commit comments

Comments
 (0)