8000 test(node): otel Express integration tests (#10169) · GingerAdonis/sentry-javascript@daef9a7 · GitHub
[go: up one dir, main page]

Skip to content
8000

Commit daef9a7

Browse files
timfishmydea
andauthored
test(node): otel Express integration tests (getsentry#10169)
- Adds CJS integration tests for express for `@sentry/node-experimental` - I found some differences with the transactions vs the Sentry instrumentation (getsentry#10168) - Converts all the existing express tests to use the new runner - These are the only tests that dont appear to like the jest runner in their original form - Added a `cleanupChildProcesses()` method to the runner than should be called in the `afterAll` hook to ensure no processes are left open/leaked --------- Co-authored-by: Francesco Novy <francesconovy@gmail.com>
1 parent 6077cb9 commit daef9a7

File tree

38 files changed

+541
-245
lines changed

38 files changed

+541
-245
lines changed

dev-packages/node-integration-tests/suites/anr/test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { conditionalTest } from '../../utils';
2-
import { createRunner } from '../../utils/runner';
2+
import { cleanupChildProcesses, createRunner } from '../../utils/runner';
33

44
const EXPECTED_ANR_EVENT = {
55
// Ensure we have context
@@ -52,6 +52,10 @@ const EXPECTED_ANR_EVENT = {
5252
};
5353

5454
conditionalTest({ min: 16 })('should report ANR when event loop blocked', () => {
55+
afterAll(() => {
56+
cleanupChildProcesses();
57+
});
58+
5559
// TODO (v8): Remove this old API and this test
5660
test('Legacy API', done => {
5761
createRunner(__dirname, 'legacy.js').expect({ event: EXPECTED_ANR_EVENT }).start(done);

dev-packages/node-integration-tests/suites/express/handle-error/server.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { loggingTransport, startExpressServerAndSendPortToRunner } from '@sentry-internal/node-integration-tests';
12
import * as Sentry from '@sentry/node';
23
import express from 'express';
34

@@ -6,6 +7,7 @@ const app = express();
67
Sentry.init({
78
dsn: 'https://public@dsn.ingest.sentry.io/1337',
89
release: '1.0',
10+
transport: loggingTransport,
911
});
1012

1113
app.use(Sentry.Handlers.requestHandler());
@@ -16,4 +18,4 @@ app.get('/test/express', () => {
1618

1719
app.use(Sentry.Handlers.errorHandler());
1820

19-
export default app;
21+
startExpressServerAndSendPortToRunner(app);
Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,38 @@
1-
import { TestEnv, assertSentryEvent } from '../../../utils/index';
1+
import { cleanupChildProcesses, createRunner } from '../../../utils/runner';
22

3-
test('should capture and send Express controller error.', async () => {
4-
const env = await TestEnv.init(__dirname, `${__dirname}/server.ts`);
5-
const event = await env.getEnvelopeRequest({ url: `${env.url}/express` });
6-
7-
expect((event[2] as any).exception.values[0].stacktrace.frames.length).toBeGreaterThan(0);
3+
afterAll(() => {
4+
cleanupChildProcesses();
5+
});
86

9-
assertSentryEvent(event[2] as any, {
10-
exception: {
11-
values: [
12-
{
13-
mechanism: {
14-
type: 'middleware',
15-
handled: false,
16-
},
17-
type: 'Error',
18-
value: 'test_error',
7+
test('should capture and send Express controller error.', done => {
8+
const runner = createRunner(__dirname, 'server.ts')
9+
.ignore('session', 'sessions')
10+
.expect({
11+
event: {
12+
exception: {
13+
values: [
14+
{
15+
mechanism: {
16+
type: 'middleware',
17+
handled: false,
18+
},
19+
type: 'Error',
20+
value: 'test_error',
21+
stacktrace: {
22+
frames: expect.arrayContaining([
23+
expect.objectContaining({
24+
function: expect.any(String),
25+
lineno: expect.any(Number),
26+
colno: expect.any(Number),
27+
}),
28+
]),
29+
},
30+
},
31+
],
1932
},
20-
],
21-
},
22-
});
33+
},
34+
})
35+
.start(done);
36+
37+
expect(() => runner.makeRequest('get', '/test/express')).rejects.toThrow();
2338
});

dev-packages/node-integration-tests/suites/express/multiple-routers/common-infix-parameterized/server.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { loggingTransport, startExpressServerAndSendPortToRunner } from '@sentry-internal/node-integration-tests';
12
import * as Sentry from '@sentry/node';
23
import * as Tracing from '@sentry/tracing';
34
import cors from 'cors';
@@ -11,6 +12,7 @@ Sentry.init({
1112
// eslint-disable-next-line deprecation/deprecation
1213
integrations: [new Sentry.Integrations.Http({ tracing: true }), new Tracing.Integrations.Express({ app })],
1314
tracesSampleRate: 1.0,
15+
transport: loggingTransport,
1416
});
1517

1618
app.use(Sentry.Handlers.requestHandler());
@@ -32,4 +34,4 @@ app.use('/api/v1', APIv1);
3234

3335
app.use(Sentry.Handlers.errorHandler());
3436

35-
export default app;
37+
startExpressServerAndSendPortToRunner(app);
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
import { TestEnv, assertSentryEvent } from '../../../../utils/index';
1+
import { cleanupChildProcesses, createRunner } from '../../../../utils/runner';
22

3-
test('should construct correct url with common infixes with multiple parameterized routers.', async () => {
4-
const env = await TestEnv.init(__dirname, `${__dirname}/server.ts`);
5-
const event = await env.getEnvelopeRequest({ url: env.url.replace('test', 'api/v1/user/3212') });
3+
afterAll(() => {
4+
cleanupChildProcesses();
5+
});
66

7-
assertSentryEvent(event[2] as any, {
8-
message: 'Custom Message',
9-
transaction: 'GET /api/v1/user/:userId',
10-
});
7+
test('should construct correct url with common infixes with multiple parameterized routers.', done => {
8+
createRunner(__dirname, 'server.ts')
9+
.ignore('transaction', 'session', 'sessions')
10+
.expect({ event: { message: 'Custom Message', transaction: 'GET /api/v1/user/:userId' } })
11+
.start(done)
12+
.makeRequest('get', '/api/v1/user/3212');
1113
});

dev-packages/node-integration-tests/suites/express/multiple-routers/common-infix/server.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { loggingTransport, startExpressServerAndSendPortToRunner } from '@sentry-internal/node-integration-tests';
12
import * as Sentry from '@sentry/node';
23
import * as Tracing from '@sentry/tracing';
34
import cors from 'cors';
@@ -11,6 +12,7 @@ Sentry.init({
1112
// eslint-disable-next-line deprecation/deprecation
1213
integrations: [new Sentry.Integrations.Http({ tracing: true }), new Tracing.Integrations.Express({ app })],
1314
tracesSampleRate: 1.0,
15+
transport: loggingTransport,
1416
});
1517

1618
app.use(Sentry.Handlers.requestHandler());
@@ -32,4 +34,4 @@ app.use('/api2/v1', APIv1);
3234

3335
app.use(Sentry.Handlers.errorHandler());
3436

35-
export default app;
37+
startExpressServerAndSendPortToRunner(app);
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
import { TestEnv, assertSentryEvent } from '../../../../utils/index';
1+
import { cleanupChildProcesses, createRunner } from '../../../../utils/runner';
22

3-
test('should construct correct url with common infixes with multiple routers.', async () => {
4-
const env = await TestEnv.init(__dirname, `${__dirname}/server.ts`);
5-
const event = await env.getEnvelopeRequest({ url: env.url.replace('test', 'api2/v1/test/') });
3+
afterAll(() => {
4+
cleanupChildProcesses();
5+
});
66

7-
assertSentryEvent(event[2] as any, {
8-
message: 'Custom Message',
9-
transaction: 'GET /api2/v1/test',
10-
});
7+
test('should construct correct url with common infixes with multiple routers.', done => {
8+
createRunner(__dirname, 'server.ts')
9+
.ignore('transaction', 'session', 'sessions')
10+
.expect({ event: { message: 'Custom Message', transaction: 'GET /api2/v1/test' } })
11+
.start(done)
12+
.makeRequest('get', '/api2/v1/test');
1113
});

dev-packages/node-integration-tests/suites/express/multiple-routers/common-prefix-parameterized-reverse/server.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { loggingTransport, startExpressServerAndSendPortToRunner } from '@sentry-internal/node-integration-tests';
12
import * as Sentry from '@sentry/node';
23
import * as Tracing from '@sentry/tracing';
34
import cors from 'cors';
@@ -11,6 +12,7 @@ Sentry.init({
1112
// eslint-disable-next-line deprecation/deprecation
1213
integrations: [new Sentry.Integrations.Http({ tracing: true }), new Tracing.Integrations.Express({ app })],
1314
tracesSampleRate: 1.0,
15+
transport: loggingTransport,
1416
});
1517

1618
app.use(Sentry.Handlers.requestHandler());
@@ -32,4 +34,4 @@ app.use('/api', root);
3234

3335
app.use(Sentry.Handlers.errorHandler());
3436

35-
export default app;
37+
startExpressServerAndSendPortToRunner(app);
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
import { TestEnv, assertSentryEvent } from '../../../../utils/index';
1+
import { cleanupChildProcesses, createRunner } from '../../../../utils/runner';
22

3-
test('should construct correct urls with multiple parameterized routers (use order reversed).', async () => {
4-
const env = await TestEnv.init(__dirname, `${__dirname}/server.ts`);
5-
const event = await env.getEnvelopeRequest({ url: env.url.replace('test', 'api/v1/user/1234/') });
3+
afterAll(() => {
4+
cleanupChildProcesses();
5+
});
66

7-
assertSentryEvent(event[2] as any, {
8-
message: 'Custom Message',
9-
transaction: 'GET /api/v1/user/:userId',
10-
});
7+
test('should construct correct urls with multiple parameterized routers (use order reversed).', done => {
8+
createRunner(__dirname, 'server.ts')
9+
.ignore('transaction', 'session', 'sessions')
10+
.expect({ event: { message: 'Custom Message', transaction: 'GET /api/v1/user/:userId' } })
11+
.start(done)
12+
.makeRequest('get', '/api/v1/user/1234/');
1113
});

dev-packages/node-integration-tests/suites/express/multiple-routers/common-prefix-parameterized/server.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { loggingTransport, startExpressServerAndSendPortToRunner } from '@sentry-internal/node-integration-tests';
12
import * as Sentry from '@sentry/node';
23
import * as Tracing from '@sentry/tracing';
34
import cors from 'cors';
@@ -11,6 +12,7 @@ Sentry.init({
1112
// eslint-disable-next-line deprecation/deprecation
1213
integrations: [new Sentry.Integrations.Http({ tracing: true }), new Tracing.Integrations.Express({ app })],
1314
tracesSampleRate: 1.0,
15+
transport: loggingTransport,
1416
});
1517

1618
app.use(Sentry.Handlers.requestHandler());
@@ -32,4 +34,4 @@ app.use('/api/v1', APIv1);
3234

3335
app.use(Sentry.Handlers.errorHandler());
3436

35-
export default app;
37+
startExpressServerAndSendPortToRunner(app);
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
import { TestEnv, assertSentryEvent } from '../../../../utils/index';
1+
import { cleanupChildProcesses, createRunner } from '../../../../utils/runner';
22

3-
test('should construct correct urls with multiple parameterized routers.', async () => {
4-
const env = await TestEnv.init(__dirname, `${__dirname}/server.ts`);
5-
const event = await env.getEnvelopeRequest({ url: env.url.replace('test', 'api/v1/user/1234/') });
3+
afterAll(() => {
4+
cleanupChildProcesses();
5+
});
66

7-
assertSentryEvent(event[2] as any, {
8-
message: 'Custom Message',
9-
transaction: 'GET /api/v1/user/:userId',
10-
});
7+
test('should construct correct urls with multiple parameterized routers.', done => {
8+
createRunner(__dirname, 'server.ts')
9+
.ignore('transaction', 'session', 'sessions')
10+
.expect({ event: { message: 'Custom Message', transaction: 'GET /api/v1/user/:userId' } })
11+
.start(done)
12+
.makeRequest('get', '/api/v1/user/1234/');
1113
});

dev-packages/node-integration-tests/suites/express/multiple-routers/common-prefix-same-length-parameterized copy/server.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { loggingTransport, startExpressServerAndSendPortToRunner } from '@sentry-internal/node-integration-tests';
12
import * as Sentry from '@sentry/node';
23
import * as Tracing from '@sentry/tracing';
34
import cors from 'cors';
@@ -11,6 +12,7 @@ Sentry.init({
1112
// eslint-disable-next-line deprecation/deprecation
1213
integrations: [new Sentry.Integrations.Http({ tracing: true }), new Tracing.Integrations.Express({ app })],
1314
tracesSampleRate: 1.0,
15+
transport: loggingTransport,
1416
});
1517

1618
app.use(Sentry.Handlers.requestHandler());
@@ -32,4 +34,4 @@ app.use('/api', root);
3234

3335
app.use(Sentry.Handlers.errorHandler());
3436

35-
export default app;
37+
startExpressServerAndSendPortToRunner(app);
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
import { TestEnv, assertSentryEvent } from '../../../../utils/index';
1+
import { cleanupChildProcesses, createRunner } from '../../../../utils/runner';
22

3-
test('should construct correct url with multiple parameterized routers of the same length (use order reversed).', async () => {
4-
const env = await TestEnv.init(__dirname, `${__dirname}/server.ts`);
5-
const event = await env.getEnvelopeRequest({ url: env.url.replace('test', 'api/v1/1234/') });
3+
afterAll(() => {
4+
cleanupChildProcesses();
5+
});
66

7-
assertSentryEvent(event[2] as any, {
8-
message: 'Custom Message',
9-
transaction: 'GET /api/v1/:userId',
10-
});
7+
test('should construct correct url with multiple parameterized routers of the same length (use order reversed).', done => {
8+
createRunner(__dirname, 'server.ts')
9+
.ignore('transaction', 'session', 'sessions')
10+
.expect({ event: { message: 'Custom Message', transaction: 'GET /api/v1/:userId' } })
11+
.start(done)
12+
.makeRequest('get', '/api/v1/1234/');
1113
});

dev-packages/node-integration-tests/suites/express/multiple-routers/common-prefix-same-length-parameterized/server.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { loggingTransport, startExpressServerAndSendPortToRunner } from '@sentry-internal/node-integration-tests';
12
import * as Sentry from '@sentry/node';
23
import * as Tracing from '@sentry/tracing';
34
import cors from 'cors';
@@ -11,6 +12,7 @@ Sentry.init({
1112
// eslint-disable-next-line deprecation/deprecation
1213
integrations: [new Sentry.Integrations.Http({ tracing: true }), new Tracing.Integrations.Express({ app })],
1314
tracesSampleRate: 1.0,
15+
transport: loggingTransport,
1416
});
1517

1618
app.use(Sentry.Handlers.requestHandler());
@@ -32,4 +34,4 @@ app.use('/api/v1', APIv1);
3234

3335
app.use(Sentry.Handlers.errorHandler());
3436

35-
export default app;
37+
startExpressServerAndSendPortToRunner(app);
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
import { TestEnv, assertSentryEvent } from '../../../../utils/index';
1+
import { cleanupChildProcesses, createRunner } from '../../../../utils/runner';
22

3-
test('should construct correct url with multiple parameterized routers of the same length.', async () => {
4-
const env = await TestEnv.init(__dirname, `${__dirname}/server.ts`);
5-
const event = await env.getEnvelopeRequest({ url: env.url.replace('test', 'api/v1/1234/') });
3+
afterAll(() => {
4+
cleanupChildProcesses();
5+
});
66

7-
assertSentryEvent(event[2] as any, {
8-
message: 'Custom Message',
9-
transaction: 'GET /api/v1/:userId',
10-
});
7+
test('should construct correct url with multiple parameterized routers of the same length.', done => {
8+
createRunner(__dirname, 'server.ts')
9+
.ignore('transaction', 'session', 'sessions')
10+
.expect({ event: { message: 'Custom Message', transaction: 'GET /api/v1/:userId' } })
11+
.start(done)
12+
.makeRequest('get', '/api/v1/1234/');
1113
});

dev-packages/node-integration-tests/suites/express/multiple-routers/common-prefix/server.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { loggingTransport, startExpressServerAndSendPortToRunner } from '@sentry-internal/node-integration-tests';
12
import * as Sentry from '@sentry/node';
23
import * as Tracing from '@sentry/tracing';
34
import cors from 'cors';
@@ -11,6 +12,7 @@ Sentry.init({
1112
// eslint-disable-next-line deprecation/deprecation
1213
integrations: [new Sentry.Integrations.Http({ tracing: true }), new Tracing.Integrations.Express({ app })],
1314
tracesSampleRate: 1.0,
15+
transport: loggingTransport,
1416
});
1517

1618
app.use(Sentry.Handlers.requestHandler());
@@ -32,4 +34,4 @@ app.use('/api/v1', APIv1);
3234

3335
app.use(Sentry.Handlers.errorHandler());
3436

35-
export default app;
37+
startExpressServerAndSendPortToRunner(app);
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1-
import { TestEnv, assertSentryEvent } from '../../../../utils/index';
1+
import { cleanupChildProcesses, createRunner } from '../../../../utils/runner';
22

3-
test('should construct correct urls with multiple routers.', async () => {
4-
const env = await TestEnv.init(__dirname, `${__dirname}/server.ts`);
5-
const event = await env.getEnvelopeRequest({ url: env.url.replace('test', 'api/v1/test/') });
3+
afterAll(() => {
4+
cleanupChildProcesses();
5+
});
66

7-
assertSentryEvent(event[2] as any, {
8-
message: 'Custom Message',
9-
transaction: 'GET /api/v1/test',
10-
});
7+
test('should construct correct urls with multiple routers.', done => {
8+
createRunner(__dirname, 'server.ts')
9+
.ignore('transaction', 'session', 'sessions')
10+
.expect({ event: { message: 'Custom Message', transaction: 'GET /api/v1/test' } })
11+
.start(done)
12+
.makeRequest('get', '/api/v1/test');
1113
});

0 commit comments

Comments
 (0)
0