Skip to content

Commit f533f0a

Browse files
authored
test(node): Ensure outgoing http & fetch are tested in esm & cjs (#16261)
While doing this, I also fixed a problem with our test runner when using both `expectNoErrorOutput()` and `expect` - the former leads to the test finishing before we check the `expect` content, so now we make sure both of these are not used together. No test content should have changed, just moved around.
1 parent ce09095 commit f533f0a

File tree

37 files changed

+706
-762
lines changed

37 files changed

+706
-762
lines changed

dev-packages/node-integration-tests/.eslintrc.js

+3
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ module.exports = {
1818
sourceType: 'module',
1919
ecmaVersion: 'latest',
2020
},
21+
globals: {
22+
fetch: 'readonly',
23+
},
2124
rules: {
2225
'@typescript-eslint/typedef': 'off',
2326
// Explicitly allow ts-ignore with description for Node integration tests
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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+
tracePropagationTargets: [/\/v0/, 'v1'],
8+
integrations: [],
9+
transport: loggingTransport,
10+
tracesSampleRate: 0.0,
11+
// Ensure this gets a correct hint
12+
beforeBreadcrumb(breadcrumb, hint) {
13+
breadcrumb.data = breadcrumb.data || {};
14+
const req = hint?.request;
15+
breadcrumb.data.ADDED_PATH = req?.path;
16+
return breadcrumb;
17+
},
18+
});
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,8 @@
11
import * as Sentry from '@sentry/node';
2-
import { loggingTransport } from '@sentry-internal/node-integration-tests';
32

4-
Sentry.init({
5-
dsn: 'https://[email protected]/1337',
6-
release: '1.0',
7-
tracePropagationTargets: [/\/v0/, 'v1'],
8-
tracesSampleRate: 1.0,
9-
integrations: [],
10-
transport: loggingTransport,
11-
});
3+
async function run() {
4+
Sentry.addBreadcrumb({ message: 'manual breadcrumb' });
125

13-
async function run(): Promise<void> {
146
await fetch(`${process.env.SERVER_URL}/api/v0`).then(res => res.text());
157
await fetch(`${process.env.SERVER_URL}/api/v1`).then(res => res.text());
168
await fetch(`${process.env.SERVER_URL}/api/v2`).then(res => res.text());
@@ -19,5 +11,4 @@ async function run(): Promise<void> {
1911
Sentry.captureException(new Error('foo'));
2012
}
2113

22-
// eslint-disable-next-line @typescript-eslint/no-floating-promises
2314
run();

dev-packages/node-integration-tests/suites/tracing/requests/fetch-breadcrumbs/scenario.ts

-34
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,80 @@
1-
import { describe, expect, test } from 'vitest';
2-
import { createRunner } from '../../../../utils/runner';
1+
import { describe, expect } from 'vitest';
2+
import { createEsmAndCjsTests } from '../../../../utils/runner';
33
import { createTestServer } from '../../../../utils/server';
44

55
describe('outgoing fetch', () => {
6-
test('outgoing fetch requests create breadcrumbs', async () => {
7-
const [SERVER_URL, closeTestServer] = await createTestServer().start();
6+
createEsmAndCjsTests(__dirname, 'scenario.mjs', 'instrument.mjs', (createRunner, test) => {
7+
test('outgoing fetch requests create breadcrumbs xxx', async () => {
8+
const [SERVER_URL, closeTestServer] = await createTestServer().start();
89

9-
await createRunner(__dirname, 'scenario.ts')
10-
.withEnv({ SERVER_URL })
11-
.ensureNoErrorOutput()
12-
.expect({
13-
event: {
14-
breadcrumbs: [
15-
{
16-
message: 'manual breadcrumb',
17-
timestamp: expect.any(Number),
18-
},
19-
{
20-
category: 'http',
21-
data: {
22-
'http.method': 'GET',
23-
url: `${SERVER_URL}/api/v0`,
24-
status_code: 404,
25-
ADDED_PATH: '/api/v0',
10+
await createRunner()
11+
.withEnv({ SERVER_URL })
12+
.expect({
13+
event: {
14+
breadcrumbs: [
15+
{
16+
message: 'manual breadcrumb',
17+
timestamp: expect.any(Number),
2618
},
27-
timestamp: expect.any(Number),
28-
type: 'http',
29-
},
30-
{
31-
category: 'http',
32-
data: {
33-
'http.method': 'GET',
34-
url: `${SERVER_URL}/api/v1`,
35-
status_code: 404,
36-
ADDED_PATH: '/api/v1',
19+
{
20+
category: 'http',
21+
data: {
22+
'http.method': 'GET',
23+
url: `${SERVER_URL}/api/v0`,
24+
status_code: 404,
25+
ADDED_PATH: '/api/v0',
26+
},
27+
timestamp: expect.any(Number),
28+
type: 'http',
3729
},
38-
timestamp: expect.any(Number),
39-
type: 'http',
40-
},
41-
{
42-
category: 'http',
43-
data: {
44-
'http.method': 'GET',
45-
url: `${SERVER_URL}/api/v2`,
46-
status_code: 404,
47-
ADDED_PATH: '/api/v2',
30+
{
31+
category: 'http',
32+
data: {
33+
'http.method': 'GET',
34+
url: `${SERVER_URL}/api/v1`,
35+
status_code: 404,
36+
ADDED_PATH: '/api/v1',
37+
},
38+
timestamp: expect.any(Number),
39+
type: 'http',
4840
},
49-
timestamp: expect.any(Number),
50-
type: 'http',
51-
},
52-
{
53-
category: 'http',
54-
data: {
55-
'http.method': 'GET',
56-
url: `${SERVER_URL}/api/v3`,
57-
status_code: 404,
58-
ADDED_PATH: '/api/v3',
41+
{
42+
category: 'http',
43+
data: {
44+
'http.method': 'GET',
45+
url: `${SERVER_URL}/api/v2`,
46+
status_code: 404,
47+
ADDED_PATH: '/api/v2',
48+
},
49+
timestamp: expect.any(Number),
50+
type: 'http',
5951
},
60-
timestamp: expect.any(Number),
61-
type: 'http',
62-
},
63-
],
64-
exception: {
65-
values: [
6652
{
67-
type: 'Error',
68-
value: 'foo',
53+
category: 'http',
54+
data: {
55+
'http.method': 'GET',
56+
url: `${SERVER_URL}/api/v3`,
57+
status_code: 404,
58+
ADDED_PATH: '/api/v3',
59+
},
60+
timestamp: expect.any(Number),
61+
type: 'http',
6962
},
7063
],
64+
exception: {
65+
values: [
66+
{
67+
type: 'Error',
68+
value: 'foo',
69+
},
70+
],
71+
},
7172
},
72-
},
73-
})
74-
.start()
75-
.completed();
76-
closeTestServer();
73+
})
74+
.start()
75+
.completed();
76+
77+
closeTestServer();
78+
});
7779
});
7880
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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+
tracePropagationTargets: [/\/v0/, 'v1'],
8+
integrations: [Sentry.nativeNodeFetchIntegration({ spans: false })],
9+
transport: loggingTransport,
10+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import * as Sentry from '@sentry/node';
2+
3+
async function run() {
4+
await fetch(`${process.env.SERVER_URL}/api/v0`).then(res => res.text());
5+
await fetch(`${process.env.SERVER_URL}/api/v1`).then(res => res.text());
6+
await fetch(`${process.env.SERVER_URL}/api/v2`).then(res => res.text());
7+
await fetch(`${process.env.SERVER_URL}/api/v3`).then(res => res.text());
8+
9+
Sentry.captureException(new Error('foo'));
10+
}
11+
12+
run();

dev-packages/node-integration-tests/suites/tracing/requests/fetch-no-tracing-no-spans/scenario.ts

-24
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,50 @@
1-
import { describe, expect, test } from 'vitest';
2-
import { createRunner } from '../../../../utils/runner';
1+
import { describe, expect } from 'vitest';
2+
import { createEsmAndCjsTests } from '../../../../utils/runner';
33
import { createTestServer } from '../../../../utils/server';
44

55
describe('outgoing fetch', () => {
6-
test('outgoing fetch requests are correctly instrumented with tracing & spans are disabled', async () => {
7-
expect.assertions(11);
6+
createEsmAndCjsTests(__dirname, 'scenario.mjs', 'instrument.mjs', (createRunner, test) => {
7+
test('outgoing fetch requests are correctly instrumented with tracing & spans are disabled', async () => {
8+
expect.assertions(11);
89

9-
const [SERVER_URL, closeTestServer] = await createTestServer()
10-
.get('/api/v0', headers => {
11-
expect(headers['sentry-trace']).toEqual(expect.stringMatching(/^([a-f0-9]{32})-([a-f0-9]{16})$/));
12-
expect(headers['sentry-trace']).not.toEqual('00000000000000000000000000000000-0000000000000000');
13-
expect(headers['baggage']).toEqual(expect.any(String));
14-
})
15-
.get('/api/v1', headers => {
16-
expect(headers['sentry-trace']).toEqual(expect.stringMatching(/^([a-f0-9]{32})-([a-f0-9]{16})$/));
17-
expect(headers['sentry-trace']).not.toEqual('00000000000000000000000000000000-0000000000000000');
18-
expect(headers['baggage']).toEqual(expect.any(String));
19-
})
20-
.get('/api/v2', headers => {
21-
expect(headers['baggage']).toBeUndefined();
22-
expect(headers['sentry-trace']).toBeUndefined();
23-
})
24-
.get('/api/v3', headers => {
25-
expect(headers['baggage']).toBeUndefined();
26-
expect(headers['sentry-trace']).toBeUndefined();
27-
})
28-
.start();
10+
const [SERVER_URL, closeTestServer] = await createTestServer()
11+
.get('/api/v0', headers => {
12+
expect(headers['sentry-trace']).toEqual(expect.stringMatching(/^([a-f0-9]{32})-([a-f0-9]{16})$/));
13+
expect(headers['sentry-trace']).not.toEqual('00000000000000000000000000000000-0000000000000000');
14+
expect(headers['baggage']).toEqual(expect.any(String));
15+
})
16+
.get('/api/v1', headers => {
17+
expect(headers['sentry-trace']).toEqual(expect.stringMatching(/^([a-f0-9]{32})-([a-f0-9]{16})$/));
18+
expect(headers['sentry-trace']).not.toEqual('00000000000000000000000000000000-0000000000000000');
19+
expect(headers['baggage']).toEqual(expect.any(String));
20+
})
21+
.get('/api/v2', headers => {
22+
expect(headers['baggage']).toBeUndefined();
23+
expect(headers['sentry-trace']).toBeUndefined();
24+
})
25+
.get('/api/v3', headers => {
26+
expect(headers['baggage']).toBeUndefined();
27+
expect(headers['sentry-trace']).toBeUndefined();
28+
})
29+
.start();
2930

30-
await createRunner(__dirname, 'scenario.ts')
31-
.withEnv({ SERVER_URL })
32-
.ensureNoErrorOutput()
33-
.expect({
34-
event: {
35-
exception: {
36-
values: [
37-
{
38-
type: 'Error',
39-
value: 'foo',
40-
},
41-
],
31+
await createRunner()
32+
.withEnv({ SERVER_URL })
33+
.expect({
34+
event: {
35+
exception: {
36+
values: [
37+
{
38+
type: 'Error',
39+
value: 'foo',
40+
},
41+
],
42+
},
4243
},
43-
},
44-
})
45-
.start()
46-
.completed();
47-
closeTestServer;
44+
})
45+
.start()
46+
.completed();
47+
closeTestServer;
48+
});
4849
});
4950
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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+
tracePropagationTargets: [/\/v0/, 'v1'],
8+
integrations: [],
9+
transport: loggingTransport,
10+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import * as Sentry from '@sentry/node';
2+
3+
async function run() {
4+
await fetch(`${process.env.SERVER_URL}/api/v0`).then(res => res.text());
5+
await fetch(`${process.env.SERVER_URL}/api/v1`).then(res => res.text());
6+
await fetch(`${process.env.SERVER_URL}/api/v2`).then(res => res.text());
7+
await fetch(`${process.env.SERVER_URL}/api/v3`).then(res => res.text());
8+
9+
Sentry.captureException(new Error('foo'));
10+
}
11+
12+
run();

0 commit comments

Comments
 (0)