Skip to content

Commit e49dcd5

Browse files
authored
Merge pull request #282 from tisnik/lcore-381-unit-tests-for-extract-mcp-headers
LCORE-381: Unit tests for extract mcp headers
2 parents bc6de6b + 34ffc3c commit e49dcd5

File tree

2 files changed

+187
-3
lines changed

2 files changed

+187
-3
lines changed

src/utils/mcp_headers.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
logger = logging.getLogger("app.endpoints.dependencies")
1313

1414

15-
async def mcp_headers_dependency(_request: Request) -> dict[str, dict[str, str]]:
16-
"""Get the mcp headers dependency to passed to mcp servers.
15+
async def mcp_headers_dependency(request: Request) -> dict[str, dict[str, str]]:
16+
"""Get the MCP headers dependency to passed to mcp servers.
1717
1818
mcp headers is a json dictionary or mcp url paths and their respective headers
1919
@@ -23,7 +23,7 @@ async def mcp_headers_dependency(_request: Request) -> dict[str, dict[str, str]]
2323
Returns:
2424
The mcp headers dictionary, or empty dictionary if not found or on json decoding error
2525
"""
26-
return extract_mcp_headers(_request)
26+
return extract_mcp_headers(request)
2727

2828

2929
def extract_mcp_headers(request: Request) -> dict[str, dict[str, str]]:
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
"""Unit tests for MCP headers utility functions."""
2+
3+
from unittest.mock import Mock
4+
import pytest
5+
6+
from fastapi import Request
7+
8+
from utils import mcp_headers
9+
10+
11+
def test_extract_mcp_headers_empty_headers():
12+
"""Test the extract_mcp_headers function for request without any headers."""
13+
request = Mock(spec=Request)
14+
# no headers
15+
request.headers = {}
16+
17+
result = mcp_headers.extract_mcp_headers(request)
18+
assert result == {}
19+
20+
21+
def test_extract_mcp_headers_mcp_headers_empty():
22+
"""Test the extract_mcp_headers function for request with empty MCP-HEADERS header."""
23+
request = Mock(spec=Request)
24+
# empty MCP-HEADERS
25+
request.headers = {"MCP-HEADERS": ""}
26+
27+
# empty dict should be returned
28+
result = mcp_headers.extract_mcp_headers(request)
29+
assert result == {}
30+
31+
32+
def test_extract_mcp_headers_valid_mcp_header():
33+
"""Test the extract_mcp_headers function for request with valid MCP-HEADERS header."""
34+
request = Mock(spec=Request)
35+
# valid MCP-HEADERS
36+
request.headers = {"MCP-HEADERS": '{"http://www.redhat.com": {"auth": "token123"}}'}
37+
38+
result = mcp_headers.extract_mcp_headers(request)
39+
40+
expected = {"http://www.redhat.com": {"auth": "token123"}}
41+
assert result == expected
42+
43+
44+
def test_extract_mcp_headers_valid_mcp_headers():
45+
"""Test the extract_mcp_headers function for request with valid MCP-HEADERS headers."""
46+
request = Mock(spec=Request)
47+
# valid MCP-HEADERS
48+
header1 = '"http://www.redhat.com": {"auth": "token123"}'
49+
header2 = '"http://www.example.com": {"auth": "tokenXYZ"}'
50+
51+
request.headers = {"MCP-HEADERS": f"{{{header1}, {header2}}}"}
52+
53+
result = mcp_headers.extract_mcp_headers(request)
54+
55+
expected = {
56+
"http://www.redhat.com": {"auth": "token123"},
57+
"http://www.example.com": {"auth": "tokenXYZ"},
58+
}
59+
assert result == expected
60+
61+
62+
def test_extract_mcp_headers_invalid_json_mcp_header():
63+
"""Test the extract_mcp_headers function for request with invalid MCP-HEADERS header."""
64+
request = Mock(spec=Request)
65+
# invalid MCP-HEADERS - not a JSON
66+
request.headers = {"MCP-HEADERS": "this-is-invalid"}
67+
68+
# empty dict should be returned
69+
result = mcp_headers.extract_mcp_headers(request)
70+
assert result == {}
71+
72+
73+
def test_extract_mcp_headers_invalid_mcp_header_type():
74+
"""Test the extract_mcp_headers function for request with invalid MCP-HEADERS header type."""
75+
request = Mock(spec=Request)
76+
# invalid MCP-HEADERS - not a dict
77+
request.headers = {"MCP-HEADERS": "[]"}
78+
79+
# empty dict should be returned
80+
result = mcp_headers.extract_mcp_headers(request)
81+
assert result == {}
82+
83+
84+
def test_extract_mcp_headers_invalid_mcp_header_null_value():
85+
"""Test the extract_mcp_headers function for request with invalid MCP-HEADERS header type."""
86+
request = Mock(spec=Request)
87+
# invalid MCP-HEADERS - not a dict
88+
request.headers = {"MCP-HEADERS": "null"}
89+
90+
# empty dict should be returned
91+
result = mcp_headers.extract_mcp_headers(request)
92+
assert result == {}
93+
94+
95+
@pytest.mark.asyncio
96+
async def test_mcp_headers_dependency_empty_headers():
97+
"""Test the mcp_headers_dependency function for request with empty MCP-HEADERS header."""
98+
request = Mock(spec=Request)
99+
# empty MCP-HEADERS
100+
request.headers = {"MCP-HEADERS": ""}
101+
102+
# empty dict should be returned
103+
result = await mcp_headers.mcp_headers_dependency(request)
104+
assert result == {}
105+
106+
107+
@pytest.mark.asyncio
108+
async def test_mcp_headers_dependency_mcp_headers_empty():
109+
"""Test the mcp_headers_dependency function for request with empty MCP-HEADERS header."""
110+
request = Mock(spec=Request)
111+
# empty MCP-HEADERS
112+
request.headers = {"MCP-HEADERS": ""}
113+
114+
# empty dict should be returned
115+
result = await mcp_headers.mcp_headers_dependency(request)
116+
assert result == {}
117+
118+
119+
@pytest.mark.asyncio
120+
async def test_mcp_headers_dependency_valid_mcp_header():
121+
"""Test the mcp_headers_dependency function for request with valid MCP-HEADERS header."""
122+
request = Mock(spec=Request)
123+
# valid MCP-HEADERS
124+
request.headers = {"MCP-HEADERS": '{"http://www.redhat.com": {"auth": "token123"}}'}
125+
126+
result = await mcp_headers.mcp_headers_dependency(request)
127+
128+
expected = {"http://www.redhat.com": {"auth": "token123"}}
129+
assert result == expected
130+
131+
132+
@pytest.mark.asyncio
133+
async def test_mcp_headers_dependency_valid_mcp_headers():
134+
"""Test the mcp_headers_dependency function for request with valid MCP-HEADERS headers."""
135+
request = Mock(spec=Request)
136+
# valid MCP-HEADERS
137+
header1 = '"http://www.redhat.com": {"auth": "token123"}'
138+
header2 = '"http://www.example.com": {"auth": "tokenXYZ"}'
139+
140+
request.headers = {"MCP-HEADERS": f"{{{header1}, {header2}}}"}
141+
142+
result = await mcp_headers.mcp_headers_dependency(request)
143+
144+
expected = {
145+
"http://www.redhat.com": {"auth": "token123"},
146+
"http://www.example.com": {"auth": "tokenXYZ"},
147+
}
148+
assert result == expected
149+
150+
151+
@pytest.mark.asyncio
152+
async def test_mcp_headers_dependency_invalid_json_mcp_header():
153+
"""Test the mcp_headers_dependency function for request with invalid MCP-HEADERS header."""
154+
request = Mock(spec=Request)
155+
# invalid MCP-HEADERS - not a JSON
156+
request.headers = {"MCP-HEADERS": "this-is-invalid"}
157+
158+
# empty dict should be returned
159+
result = await mcp_headers.mcp_headers_dependency(request)
160+
assert result == {}
161+
162+
163+
@pytest.mark.asyncio
164+
async def test_mcp_headers_dependency_invalid_mcp_header_type():
165+
"""Test the mcp_headers_dependency function for request with invalid MCP-HEADERS header type."""
166+
request = Mock(spec=Request)
167+
# invalid MCP-HEADERS - not a dict
168+
request.headers = {"MCP-HEADERS": "[]"}
169+
170+
# empty dict should be returned
171+
result = await mcp_headers.mcp_headers_dependency(request)
172+
assert result == {}
173+
174+
175+
@pytest.mark.asyncio
176+
async def test_mcp_headers_dependency_invalid_mcp_header_null_value():
177+
"""Test the mcp_headers_dependency function for request with invalid MCP-HEADERS header type."""
178+
request = Mock(spec=Request)
179+
# invalid MCP-HEADERS - not a dict
180+
request.headers = {"MCP-HEADERS": "null"}
181+
182+
# empty dict should be returned
183+
result = await mcp_headers.mcp_headers_dependency(request)
184+
assert result == {}

0 commit comments

Comments
 (0)