Skip to content

Commit dcb74c7

Browse files
committed
test(node-core): Add unit tests for mergeBaggageHeaders
1 parent fa70f36 commit dcb74c7

File tree

1 file changed

+134
-0
lines changed

1 file changed

+134
-0
lines changed
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
import { describe, expect, it } from 'vitest';
2+
import { mergeBaggageHeaders } from '../../src/utils/baggage';
3+
4+
describe('mergeBaggageHeaders', () => {
5+
it('returns new baggage when existing is undefined', () => {
6+
const result = mergeBaggageHeaders(undefined, 'foo=bar');
7+
expect(result).toBe('foo=bar');
8+
});
9+
10+
it('returns existing baggage when new baggage is empty', () => {
11+
const result = mergeBaggageHeaders('foo=bar', '');
12+
expect(result).toBe('foo=bar');
13+
});
14+
15+
it('returns existing baggage when new baggage is invalid', () => {
16+
const result = mergeBaggageHeaders('foo=bar', 'invalid');
17+
expect(result).toBe('foo=bar');
18+
});
19+
20+
it('handles empty existing baggage', () => {
21+
const result = mergeBaggageHeaders('', 'foo=bar,sentry-release=1.0.0');
22+
expect(result).toBe('foo=bar,sentry-release=1.0.0');
23+
});
24+
25+
it('preserves existing non-Sentry entries', () => {
26+
const result = mergeBaggageHeaders('foo=bar,other=vendor', 'foo=newvalue,third=party');
27+
28+
const entries = result?.split(',');
29+
expect(entries).toContain('foo=bar');
30+
expect(entries).toContain('other=vendor');
31+
expect(entries).toContain('third=party');
32+
expect(entries).not.toContain('foo=newvalue');
33+
});
34+
35+
it('overwrites existing Sentry entries with new ones', () => {
36+
const result = mergeBaggageHeaders(
37+
'sentry-release=1.0.0,sentry-environment=prod',
38+
'sentry-release=2.0.0,sentry-environment=staging',
39+
);
40+
41+
const entries = result?.split(',');
42+
expect(entries).toContain('sentry-release=2.0.0');
43+
expect(entries).toContain('sentry-environment=staging');
44+
expect(entries).not.toContain('sentry-release=1.0.0');
45+
expect(entries).not.toContain('sentry-environment=prod');
46+
});
47+
48+
it('merges Sentry and non-Sentry entries correctly', () => {
49+
const result = mergeBaggageHeaders(
50+
'foo=bar,sentry-release=1.0.0,other=vendor',
51+
'sentry-release=2.0.0,third=party',
52+
);
53+
54+
const entries = result?.split(',');
55+
expect(entries).toContain('foo=bar');
56+
expect(entries).toContain('other=vendor');
57+
expect(entries).toContain('third=party');
58+
expect(entries).toContain('sentry-release=2.0.0');
59+
expect(entries).not.toContain('sentry-release=1.0.0');
60+
});
61+
62+
it('handles third-party baggage with Sentry entries', () => {
63+
const result = mergeBaggageHeaders(
64+
'other=vendor,foo=bar,third=party,sentry-release=9.9.9,sentry-environment=staging,sentry-sample_rate=0.54,last=item',
65+
'sentry-release=2.1.0,sentry-environment=myEnv',
66+
);
67+
68+
const entries = result?.split(',');
69+
expect(entries).toContain('foo=bar');
70+
expect(entries).toContain('last=item');
71+
expect(entries).toContain('other=vendor');
72+
expect(entries).toContain('third=party');
73+
expect(entries).toContain('sentry-environment=myEnv');
74+
expect(entries).toContain('sentry-release=2.1.0');
75+
expect(entries).toContain('sentry-sample_rate=0.54');
76+
expect(entries).not.toContain('sentry-environment=staging');
77+
expect(entries).not.toContain('sentry-release=9.9.9');
78+
});
79+
80+
it('adds new Sentry entries when they do not exist', () => {
81+
const result = mergeBaggageHeaders('foo=bar,other=vendor', 'sentry-release=1.0.0,sentry-environment=prod');
82+
83+
const entries = result?.split(',');
84+
expect(entries).toContain('foo=bar');
85+
expect(entries).toContain('other=vendor');
86+
expect(entries).toContain('sentry-release=1.0.0');
87+
expect(entries).toContain('sentry-environment=prod');
88+
});
89+
90+
it('handles array-type existing baggage', () => {
91+
const result = mergeBaggageHeaders(['foo=bar', 'other=vendor'], 'sentry-release=1.0.0');
92+
93+
const entries = result?.split(',');
94+
expect(entries).toContain('foo=bar');
95+
expect(entries).toContain('other=vendor');
96+
expect(entries).toContain('sentry-release=1.0.0');
97+
});
98+
99+
it('preserves order of existing entries', () => {
100+
const result = mergeBaggageHeaders('first=1,second=2,third=3', 'fourth=4');
101+
expect(result).toBe('first=1,second=2,third=3,fourth=4');
102+
});
103+
104+
it('handles complex scenario with multiple Sentry keys', () => {
105+
const result = mergeBaggageHeaders(
106+
'foo=bar,sentry-release=old,sentry-environment=old,other=vendor',
107+
'sentry-release=new,sentry-environment=new,sentry-transaction=test,new=entry',
108+
);
109+
110+
const entries = result?.split(',');
111+
expect(entries).toContain('foo=bar');
112+
expect(entries).toContain('other=vendor');
113+
expect(entries).toContain('sentry-release=new');
114+
expect(entries).toContain('sentry-environment=new');
115+
expect(entries).toContain('sentry-transaction=test');
116+
expect(entries).toContain('new=entry');
117+
expect(entries).not.toContain('sentry-release=old');
118+
expect(entries).not.toContain('sentry-environment=old');
119+
});
120+
121+
it('matches OTEL propagation.inject() behavior for Sentry keys', () => {
122+
const result = mergeBaggageHeaders(
123+
'sentry-trace_id=abc123,sentry-sampled=false,non-sentry=keep',
124+
'sentry-trace_id=xyz789,sentry-sampled=true',
125+
);
126+
127+
const entries = result?.split(',');
128+
expect(entries).toContain('sentry-trace_id=xyz789');
129+
expect(entries).toContain('sentry-sampled=true');
130+
expect(entries).toContain('non-sentry=keep');
131+
expect(entries).not.toContain('sentry-trace_id=abc123');
132+
expect(entries).not.toContain('sentry-sampled=false');
133+
});
134+
});

0 commit comments

Comments
 (0)