Skip to content

Commit 62a5f44

Browse files
committed
test(node): Add basic integration tests for Express.
1 parent b2836b8 commit 62a5f44

File tree

6 files changed

+135
-4
lines changed

6 files changed

+135
-4
lines changed

packages/node-integration-tests/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,11 @@
1818
"@types/mongodb": "^3.6.20",
1919
"@types/mysql": "^2.15.21",
2020
"@types/pg": "^8.6.5",
21+
"cors": "^2.8.5",
2122
"express": "^4.17.3",
22-
"mysql": "^2.18.1",
2323
"mongodb": "^3.7.3",
2424
"mongodb-memory-server": "^7.6.3",
25+
"mysql": "^2.18.1",
2526
"nock": "^13.1.0",
2627
"pg": "^8.7.3",
2728
"portfinder": "^1.0.28"
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import * as Sentry from '@sentry/node';
2+
import express from 'express';
3+
4+
const app = express();
5+
6+
Sentry.init({
7+
dsn: 'https://[email protected]/1337',
8+
release: '1.0',
9+
});
10+
11+
app.use(Sentry.Handlers.requestHandler());
12+
13+
app.get('/test/express', async () => {
14+
throw new Error('test_error');
15+
});
16+
17+
app.use(Sentry.Handlers.errorHandler());
18+
19+
export default app;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { assertSentryEvent, getEventRequest, runServer } from '../../../utils/index';
2+
3+
test('should capture and send Express controller error.', async () => {
4+
const url = await runServer(__dirname, `${__dirname}/server.ts`);
5+
const event = await getEventRequest(`${url}/express`);
6+
7+
expect((event as any).exception.values[0].stacktrace.frames.length).toBeGreaterThan(0);
8+
9+
assertSentryEvent(event, {
10+
exception: {
11+
values: [
12+
{
13+
mechanism: {
14+
type: 'generic',
15+
handled: true,
16+
},
17+
type: 'Error',
18+
value: 'test_error',
19+
},
20+
],
21+
},
22+
});
23+
});
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import * as Sentry from '@sentry/node';
2+
import * as Tracing from '@sentry/tracing';
3+
import cors from 'cors';
4+
import express from 'express';
5+
6+
const app = express();
7+
8+
Sentry.init({
9+
dsn: 'https://[email protected]/1337',
10+
release: '1.0',
11+
integrations: [new Sentry.Integrations.Http({ tracing: true }), new Tracing.Integrations.Express({ app })],
12+
tracesSampleRate: 1.0,
13+
});
14+
15+
app.use(Sentry.Handlers.requestHandler());
16+
app.use(Sentry.Handlers.tracingHandler());
17+
18+
app.use(cors());
19+
20+
app.get('/test/express', (_req, res) => {
21+
res.send({ response: 'response 1' });
22+
});
23+
24+
app.use(Sentry.Handlers.errorHandler());
25+
26+
export default app;
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { assertSentryTransaction, getEnvelopeRequest, runServer } from '../../../utils/index';
2+
3+
test('should create and send transactions for Express routes and spans for middlewares.', async () => {
4+
const url = await runServer(__dirname, `${__dirname}/server.ts`);
5+
const envelope = await getEnvelopeRequest(`${url}/express`);
6+
7+
expect(envelope).toHaveLength(3);
8+
9+
assertSentryTransaction(envelope[2], {
10+
contexts: {
11+
trace: {
12+
data: {
13+
url: '/test/express',
14+
},
15+
op: 'http.server',
16+
status: 'ok',
17+
tags: {
18+
'http.status_code': '200',
19+
},
20+
},
21+
},
22+
spans: [
23+
{
24+
description: 'corsMiddleware',
25+
op: 'express.middleware.use',
26+
},
27+
],
28+
});
29+
});

yarn.lock

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4582,11 +4582,32 @@ [email protected]:
45824582
resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f"
45834583
integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=
45844584

4585-
agent-base@4, agent-base@5, agent-base@6, agent-base@^4.3.0, agent-base@^6.0.2, agent-base@~4.2.1:
4585+
agent-base@4, agent-base@^4.3.0:
4586+
version "4.3.0"
4587+
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee"
4588+
integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==
4589+
dependencies:
4590+
es6-promisify "^5.0.0"
4591+
4592+
agent-base@5:
45864593
version "5.1.1"
45874594
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-5.1.1.tgz#e8fb3f242959db44d63be665db7a8e739537a32c"
45884595
integrity sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==
45894596

4597+
agent-base@6, agent-base@^6.0.2:
4598+
version "6.0.2"
4599+
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
4600+
integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==
4601+
dependencies:
4602+
debug "4"
4603+
4604+
agent-base@~4.2.1:
4605+
version "4.2.1"
4606+
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9"
4607+
integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==
4608+
dependencies:
4609+
es6-promisify "^5.0.0"
4610+
45904611
agentkeepalive@^3.4.1:
45914612
version "3.5.2"
45924613
resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67"
@@ -8049,7 +8070,7 @@ [email protected], core-util-is@~1.0.0:
80498070
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
80508071
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
80518072

8052-
cors@~2.8.5:
8073+
cors@^2.8.5, cors@~2.8.5:
80538074
version "2.8.5"
80548075
resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
80558076
integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
@@ -10097,6 +10118,18 @@ es6-object-assign@^1.1.0:
1009710118
resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c"
1009810119
integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=
1009910120

10121+
es6-promise@^4.0.3:
10122+
version "4.2.8"
10123+
resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a"
10124+
integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==
10125+
10126+
es6-promisify@^5.0.0:
10127+
version "5.0.0"
10128+
resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203"
10129+
integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=
10130+
dependencies:
10131+
es6-promise "^4.0.3"
10132+
1010010133
escalade@^3.1.1:
1010110134
version "3.1.1"
1010210135
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
@@ -13616,7 +13649,7 @@ jest-environment-jsdom@^24.9.0:
1361613649
jest-util "^24.9.0"
1361713650
jsdom "^11.5.1"
1361813651

13619-
jest-environment-node@24, "jest-environment-node@>=24 <=26", jest-environment-node@^24.9.0:
13652+
"jest-environment-node@>=24 <=26", jest-environment-node@^24.9.0:
1362013653
version "24.9.0"
1362113654
resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-24.9.0.tgz#333d2d2796f9687f2aeebf0742b519f33c1cbfd3"
1362213655
integrity sha512-6d4V2f4nxzIzwendo27Tr0aFm+IXWa0XEUnaH6nU0FMaozxovt+sfRvh4J47wL1OvF83I3SSTu0XK+i4Bqe7uA==

0 commit comments

Comments
 (0)