Skip to content

Commit d524e49

Browse files
committed
coverage: add pragmas to reach 100% coverage on tests/
1 parent 4b6cec4 commit d524e49

File tree

61 files changed

+442
-432
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+442
-432
lines changed

tests/cli/test_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def test_get_npx_windows(monkeypatch: pytest.MonkeyPatch):
8282
def fake_run(cmd: list[str], **kw: Any) -> subprocess.CompletedProcess[bytes]:
8383
if cmd[0] in candidates:
8484
return subprocess.CompletedProcess(cmd, 0)
85-
else:
85+
else: # pragma: no cover
8686
raise subprocess.CalledProcessError(1, cmd[0])
8787

8888
monkeypatch.setattr(sys, "platform", "win32")

tests/client/auth/extensions/test_client_credentials.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ def __init__(self):
1515
self._tokens: OAuthToken | None = None
1616
self._client_info: OAuthClientInformationFull | None = None
1717

18-
async def get_tokens(self) -> OAuthToken | None:
18+
async def get_tokens(self) -> OAuthToken | None: # pragma: no cover
1919
return self._tokens
2020

21-
async def set_tokens(self, tokens: OAuthToken) -> None:
21+
async def set_tokens(self, tokens: OAuthToken) -> None: # pragma: no cover
2222
self._tokens = tokens
2323

24-
async def get_client_info(self) -> OAuthClientInformationFull | None:
24+
async def get_client_info(self) -> OAuthClientInformationFull | None: # pragma: no cover
2525
return self._client_info
2626

27-
async def set_client_info(self, client_info: OAuthClientInformationFull) -> None:
27+
async def set_client_info(self, client_info: OAuthClientInformationFull) -> None: # pragma: no cover
2828
self._client_info = client_info
2929

3030

@@ -45,11 +45,11 @@ def client_metadata():
4545

4646
@pytest.fixture
4747
def rfc7523_oauth_provider(client_metadata: OAuthClientMetadata, mock_storage: MockTokenStorage):
48-
async def redirect_handler(url: str) -> None:
48+
async def redirect_handler(url: str) -> None: # pragma: no cover
4949
"""Mock redirect handler."""
5050
pass
5151

52-
async def callback_handler() -> tuple[str, str | None]:
52+
async def callback_handler() -> tuple[str, str | None]: # pragma: no cover
5353
"""Mock callback handler."""
5454
return "test_auth_code", "test_state"
5555

tests/client/conftest.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,23 +40,23 @@ def clear(self) -> None:
4040
self.client.sent_messages.clear()
4141
self.server.sent_messages.clear()
4242

43-
def get_client_requests(self, method: str | None = None) -> list[JSONRPCRequest]:
43+
def get_client_requests(self, method: str | None = None) -> list[JSONRPCRequest]: # pragma: no cover
4444
"""Get client-sent requests, optionally filtered by method."""
4545
return [
4646
req.message.root
4747
for req in self.client.sent_messages
4848
if isinstance(req.message.root, JSONRPCRequest) and (method is None or req.message.root.method == method)
4949
]
5050

51-
def get_server_requests(self, method: str | None = None) -> list[JSONRPCRequest]:
51+
def get_server_requests(self, method: str | None = None) -> list[JSONRPCRequest]: # pragma: no cover
5252
"""Get server-sent requests, optionally filtered by method."""
53-
return [
53+
return [ # pragma: no cover
5454
req.message.root
5555
for req in self.server.sent_messages
5656
if isinstance(req.message.root, JSONRPCRequest) and (method is None or req.message.root.method == method)
5757
]
5858

59-
def get_client_notifications(self, method: str | None = None) -> list[JSONRPCNotification]:
59+
def get_client_notifications(self, method: str | None = None) -> list[JSONRPCNotification]: # pragma: no cover
6060
"""Get client-sent notifications, optionally filtered by method."""
6161
return [
6262
notif.message.root
@@ -65,7 +65,7 @@ def get_client_notifications(self, method: str | None = None) -> list[JSONRPCNot
6565
and (method is None or notif.message.root.method == method)
6666
]
6767

68-
def get_server_notifications(self, method: str | None = None) -> list[JSONRPCNotification]:
68+
def get_server_notifications(self, method: str | None = None) -> list[JSONRPCNotification]: # pragma: no cover
6969
"""Get server-sent notifications, optionally filtered by method."""
7070
return [
7171
notif.message.root

tests/client/test_auth.py

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@ def __init__(self):
2222
self._client_info: OAuthClientInformationFull | None = None
2323

2424
async def get_tokens(self) -> OAuthToken | None:
25-
return self._tokens
25+
return self._tokens # pragma: no cover
2626

2727
async def set_tokens(self, tokens: OAuthToken) -> None:
2828
self._tokens = tokens
2929

3030
async def get_client_info(self) -> OAuthClientInformationFull | None:
31-
return self._client_info
31+
return self._client_info # pragma: no cover
3232

3333
async def set_client_info(self, client_info: OAuthClientInformationFull) -> None:
3434
self._client_info = client_info
@@ -64,11 +64,11 @@ def valid_tokens():
6464
def oauth_provider(client_metadata: OAuthClientMetadata, mock_storage: MockTokenStorage):
6565
async def redirect_handler(url: str) -> None:
6666
"""Mock redirect handler."""
67-
pass
67+
pass # pragma: no cover
6868

6969
async def callback_handler() -> tuple[str, str | None]:
7070
"""Mock callback handler."""
71-
return "test_auth_code", "test_state"
71+
return "test_auth_code", "test_state" # pragma: no cover
7272

7373
return OAuthClientProvider(
7474
server_url="https://api.example.com/v1/mcp",
@@ -247,10 +247,10 @@ async def test_discover_protected_resource_request(
247247
"""Test protected resource discovery request building maintains backward compatibility."""
248248

249249
async def redirect_handler(url: str) -> None:
250-
pass
250+
pass # pragma: no cover
251251

252252
async def callback_handler() -> tuple[str, str | None]:
253-
return "test_auth_code", "test_state"
253+
return "test_auth_code", "test_state" # pragma: no cover
254254

255255
provider = OAuthClientProvider(
256256
server_url="https://api.example.com",
@@ -664,7 +664,7 @@ async def aread(self):
664664

665665
@property
666666
def text(self):
667-
if not self._aread_called:
667+
if not self._aread_called: # pragma: no cover
668668
raise RuntimeError("Response.text accessed before response.aread()")
669669
return self._text
670670

@@ -847,10 +847,10 @@ async def test_auth_flow_no_unnecessary_retry_after_oauth(
847847
# In the buggy version, this would yield the request AGAIN unconditionally
848848
# In the fixed version, this should end the generator
849849
try:
850-
await auth_flow.asend(response) # extra request
851-
request_yields += 1
852-
# If we reach here, the bug is present
853-
pytest.fail(
850+
await auth_flow.asend(response) # extra request # pragma: no cover
851+
request_yields += 1 # pragma: no cover
852+
# If we reach here, the bug is present # pragma: no cover
853+
pytest.fail( # pragma: no cover
854854
f"Unnecessary retry detected! Request was yielded {request_yields} times. "
855855
f"This indicates the retry logic bug that caused 2x performance degradation. "
856856
f"The request should only be yielded once for successful responses."
@@ -950,7 +950,7 @@ async def mock_callback() -> tuple[str, str | None]:
950950
success_response = httpx.Response(200, request=final_request)
951951
try:
952952
await auth_flow.asend(success_response)
953-
pytest.fail("Should have stopped after successful response")
953+
pytest.fail("Should have stopped after successful response") # pragma: no cover
954954
except StopAsyncIteration:
955955
pass # Expected
956956

@@ -1094,10 +1094,10 @@ def test_extract_field_from_www_auth_valid_cases(
10941094
"""Test extraction of various fields from valid WWW-Authenticate headers."""
10951095

10961096
async def redirect_handler(url: str) -> None:
1097-
pass
1097+
pass # pragma: no cover
10981098

10991099
async def callback_handler() -> tuple[str, str | None]:
1100-
return "test_auth_code", "test_state"
1100+
return "test_auth_code", "test_state" # pragma: no cover
11011101

11021102
provider = OAuthClientProvider(
11031103
server_url="https://api.example.com/v1/mcp",
@@ -1142,10 +1142,10 @@ def test_extract_field_from_www_auth_invalid_cases(
11421142
"""Test extraction returns None for invalid cases."""
11431143

11441144
async def redirect_handler(url: str) -> None:
1145-
pass
1145+
pass # pragma: no cover
11461146

11471147
async def callback_handler() -> tuple[str, str | None]:
1148-
return "test_auth_code", "test_state"
1148+
return "test_auth_code", "test_state" # pragma: no cover
11491149

11501150
provider = OAuthClientProvider(
11511151
server_url="https://api.example.com/v1/mcp",

tests/client/test_http_unicode.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
}
3636

3737

38-
def run_unicode_server(port: int) -> None:
38+
def run_unicode_server(port: int) -> None: # pragma: no cover
3939
"""Run the Unicode test server in a separate process."""
4040
# Import inside the function since this runs in a separate process
4141
from collections.abc import AsyncGenerator
@@ -167,7 +167,7 @@ def running_unicode_server(unicode_server_port: int) -> Generator[str, None, Non
167167
# Clean up - try graceful termination first
168168
proc.terminate()
169169
proc.join(timeout=2)
170-
if proc.is_alive():
170+
if proc.is_alive(): # pragma: no cover
171171
proc.kill()
172172
proc.join(timeout=1)
173173

tests/client/test_list_methods_cursor.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,27 +19,27 @@ async def full_featured_server():
1919
server = FastMCP("test")
2020

2121
@server.tool(name="test_tool_1")
22-
async def test_tool_1() -> str:
22+
async def test_tool_1() -> str: # pragma: no cover
2323
"""First test tool"""
2424
return "Result 1"
2525

2626
@server.tool(name="test_tool_2")
27-
async def test_tool_2() -> str:
27+
async def test_tool_2() -> str: # pragma: no cover
2828
"""Second test tool"""
2929
return "Result 2"
3030

3131
@server.resource("resource://test/data")
32-
async def test_resource() -> str:
32+
async def test_resource() -> str: # pragma: no cover
3333
"""Test resource"""
3434
return "Test data"
3535

3636
@server.prompt()
37-
async def test_prompt(name: str) -> str:
37+
async def test_prompt(name: str) -> str: # pragma: no cover
3838
"""Test prompt"""
3939
return f"Hello, {name}!"
4040

4141
@server.resource("resource://test/{name}")
42-
async def test_template(name: str) -> str:
42+
async def test_template(name: str) -> str: # pragma: no cover
4343
"""Test resource template"""
4444
return f"Data for {name}"
4545

@@ -209,7 +209,7 @@ async def test_list_tools_with_strict_server_validation():
209209
server = Server("strict_server")
210210

211211
@server.list_tools()
212-
async def handle_list_tools(request: ListToolsRequest) -> ListToolsResult:
212+
async def handle_list_tools(request: ListToolsRequest) -> ListToolsResult: # pragma: no cover
213213
"""Strict handler that validates params field exists"""
214214

215215
# Simulate strict server validation

tests/client/test_logging_callback.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ async def test_tool_with_log(
5151
async def message_handler(
5252
message: RequestResponder[types.ServerRequest, types.ClientResult] | types.ServerNotification | Exception,
5353
) -> None:
54-
if isinstance(message, Exception):
54+
if isinstance(message, Exception): # pragma: no cover
5555
raise message
5656

5757
async with create_session(

tests/client/test_notification_response.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from tests.test_helpers import wait_for_server
2525

2626

27-
def create_non_sdk_server_app() -> Starlette:
27+
def create_non_sdk_server_app() -> Starlette: # pragma: no cover
2828
"""Create a minimal server that doesn't follow SDK conventions."""
2929

3030
async def handle_mcp_request(request: Request) -> Response:
@@ -67,7 +67,7 @@ async def handle_mcp_request(request: Request) -> Response:
6767
return app
6868

6969

70-
def run_non_sdk_server(port: int) -> None:
70+
def run_non_sdk_server(port: int) -> None: # pragma: no cover
7171
"""Run the non-SDK server in a separate process."""
7272
app = create_non_sdk_server_app()
7373
config = uvicorn.Config(
@@ -95,9 +95,9 @@ def non_sdk_server(non_sdk_server_port: int) -> Generator[None, None, None]:
9595
proc.start()
9696

9797
# Wait for server to be ready
98-
try:
98+
try: # pragma: no cover
9999
wait_for_server(non_sdk_server_port, timeout=10.0)
100-
except TimeoutError:
100+
except TimeoutError: # pragma: no cover
101101
proc.kill()
102102
proc.join(timeout=2)
103103
pytest.fail("Server failed to start within 10 seconds")
@@ -120,7 +120,7 @@ async def test_non_compliant_notification_response(non_sdk_server: None, non_sdk
120120
server_url = f"http://127.0.0.1:{non_sdk_server_port}/mcp"
121121
returned_exception = None
122122

123-
async def message_handler(
123+
async def message_handler( # pragma: no cover
124124
message: RequestResponder[types.ServerRequest, types.ClientResult] | types.ServerNotification | Exception,
125125
):
126126
nonlocal returned_exception
@@ -141,5 +141,5 @@ async def message_handler(
141141
ClientNotification(RootsListChangedNotification(method="notifications/roots/list_changed"))
142142
)
143143

144-
if returned_exception:
144+
if returned_exception: # pragma: no cover
145145
pytest.fail(f"Server encountered an exception: {returned_exception}")

tests/client/test_resource_cleanup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ async def test_send_request_stream_cleanup():
1919

2020
# Create a mock session with the minimal required functionality
2121
class TestSession(BaseSession[ClientRequest, ClientNotification, ClientResult, Any, Any]):
22-
async def _send_response(self, request_id: RequestId, response: SendResultT | ErrorData) -> None:
22+
async def _send_response(self, request_id: RequestId, response: SendResultT | ErrorData) -> None: # pragma: no cover
2323
pass
2424

2525
# Create streams

tests/client/test_session.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ async def mock_server():
8282
)
8383

8484
# Create a message handler to catch exceptions
85-
async def message_handler(
85+
async def message_handler( # pragma: no cover
8686
message: RequestResponder[types.ServerRequest, types.ClientResult] | types.ServerNotification | Exception,
8787
) -> None:
8888
if isinstance(message, Exception):
@@ -426,7 +426,7 @@ async def test_client_capabilities_with_custom_callbacks():
426426

427427
received_capabilities = None
428428

429-
async def custom_sampling_callback(
429+
async def custom_sampling_callback( # pragma: no cover
430430
context: RequestContext["ClientSession", Any],
431431
params: types.CreateMessageRequestParams,
432432
) -> types.CreateMessageResult | types.ErrorData:
@@ -436,7 +436,7 @@ async def custom_sampling_callback(
436436
model="test-model",
437437
)
438438

439-
async def custom_list_roots_callback(
439+
async def custom_list_roots_callback( # pragma: no cover
440440
context: RequestContext["ClientSession", Any],
441441
) -> types.ListRootsResult | types.ErrorData:
442442
return types.ListRootsResult(roots=[])

0 commit comments

Comments
 (0)