Skip to content

Commit 1dad574

Browse files
committed
Add unit tests for mergeBaggageHeaders
1 parent 9c68295 commit 1dad574

1 file changed

Lines changed: 131 additions & 0 deletions

File tree

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
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('foo=bar,sentry-release=1.0.0,other=vendor', 'sentry-release=2.0.0,third=party');
50+
51+
const entries = result?.split(',');
52+
expect(entries).toContain('foo=bar');
53+
expect(entries).toContain('other=vendor');
54+
expect(entries).toContain('third=party');
55+
expect(entries).toContain('sentry-release=2.0.0');
56+
expect(entries).not.toContain('sentry-release=1.0.0');
57+
});
58+
59+
it('handles third-party baggage with Sentry entries', () => {
60+
const result = mergeBaggageHeaders(
61+
'other=vendor,foo=bar,third=party,sentry-release=9.9.9,sentry-environment=staging,sentry-sample_rate=0.54,last=item',
62+
'sentry-release=2.1.0,sentry-environment=myEnv',
63+
);
64+
65+
const entries = result?.split(',');
66+
expect(entries).toContain('foo=bar');
67+
expect(entries).toContain('last=item');
68+
expect(entries).toContain('other=vendor');
69+
expect(entries).toContain('third=party');
70+
expect(entries).toContain('sentry-environment=myEnv');
71+
expect(entries).toContain('sentry-release=2.1.0');
72+
expect(entries).toContain('sentry-sample_rate=0.54');
73+
expect(entries).not.toContain('sentry-environment=staging');
74+
expect(entries).not.toContain('sentry-release=9.9.9');
75+
});
76+
77+
it('adds new Sentry entries when they do not exist', () => {
78+
const result = mergeBaggageHeaders('foo=bar,other=vendor', 'sentry-release=1.0.0,sentry-environment=prod');
79+
80+
const entries = result?.split(',');
81+
expect(entries).toContain('foo=bar');
82+
expect(entries).toContain('other=vendor');
83+
expect(entries).toContain('sentry-release=1.0.0');
84+
expect(entries).toContain('sentry-environment=prod');
85+
});
86+
87+
it('handles array-type existing baggage', () => {
88+
const result = mergeBaggageHeaders(['foo=bar', 'other=vendor'], 'sentry-release=1.0.0');
89+
90+
const entries = result?.split(',');
91+
expect(entries).toContain('foo=bar');
92+
expect(entries).toContain('other=vendor');
93+
expect(entries).toContain('sentry-release=1.0.0');
94+
});
95+
96+
it('preserves order of existing entries', () => {
97+
const result = mergeBaggageHeaders('first=1,second=2,third=3', 'fourth=4');
98+
expect(result).toBe('first=1,second=2,third=3,fourth=4');
99+
});
100+
101+
it('handles complex scenario with multiple Sentry keys', () => {
102+
const result = mergeBaggageHeaders(
103+
'foo=bar,sentry-release=old,sentry-environment=old,other=vendor',
104+
'sentry-release=new,sentry-environment=new,sentry-transaction=test,new=entry',
105+
);
106+
107+
const entries = result?.split(',');
108+
expect(entries).toContain('foo=bar');
109+
expect(entries).toContain('other=vendor');
110+
expect(entries).toContain('sentry-release=new');
111+
expect(entries).toContain('sentry-environment=new');
112+
expect(entries).toContain('sentry-transaction=test');
113+
expect(entries).toContain('new=entry');
114+
expect(entries).not.toContain('sentry-release=old');
115+
expect(entries).not.toContain('sentry-environment=old');
116+
});
117+
118+
it('matches OTEL propagation.inject() behavior for Sentry keys', () => {
119+
const result = mergeBaggageHeaders(
120+
'sentry-trace_id=abc123,sentry-sampled=false,non-sentry=keep',
121+
'sentry-trace_id=xyz789,sentry-sampled=true',
122+
);
123+
124+
const entries = result?.split(',');
125+
expect(entries).toContain('sentry-trace_id=xyz789');
126+
expect(entries).toContain('sentry-sampled=true');
127+
expect(entries).toContain('non-sentry=keep');
128+
expect(entries).not.toContain('sentry-trace_id=abc123');
129+
expect(entries).not.toContain('sentry-sampled=false');
130+
});
131+
});

0 commit comments

Comments
 (0)