mirror of
https://github.com/aljazceru/mcp-python-sdk.git
synced 2025-12-19 14:54:24 +01:00
102 lines
2.8 KiB
Python
102 lines
2.8 KiB
Python
import pytest
|
|
from pydantic import AnyUrl
|
|
|
|
from mcp.server.fastmcp.resources import FunctionResource, Resource
|
|
|
|
|
|
class TestResourceValidation:
|
|
"""Test base Resource validation."""
|
|
|
|
def test_resource_uri_validation(self):
|
|
"""Test URI validation."""
|
|
|
|
def dummy_func() -> str:
|
|
return "data"
|
|
|
|
# Valid URI
|
|
resource = FunctionResource(
|
|
uri=AnyUrl("http://example.com/data"),
|
|
name="test",
|
|
fn=dummy_func,
|
|
)
|
|
assert str(resource.uri) == "http://example.com/data"
|
|
|
|
# Missing protocol
|
|
with pytest.raises(ValueError, match="Input should be a valid URL"):
|
|
FunctionResource(
|
|
uri=AnyUrl("invalid"),
|
|
name="test",
|
|
fn=dummy_func,
|
|
)
|
|
|
|
# Missing host
|
|
with pytest.raises(ValueError, match="Input should be a valid URL"):
|
|
FunctionResource(
|
|
uri=AnyUrl("http://"),
|
|
name="test",
|
|
fn=dummy_func,
|
|
)
|
|
|
|
def test_resource_name_from_uri(self):
|
|
"""Test name is extracted from URI if not provided."""
|
|
|
|
def dummy_func() -> str:
|
|
return "data"
|
|
|
|
resource = FunctionResource(
|
|
uri=AnyUrl("resource://my-resource"),
|
|
fn=dummy_func,
|
|
)
|
|
assert resource.name == "resource://my-resource"
|
|
|
|
def test_resource_name_validation(self):
|
|
"""Test name validation."""
|
|
|
|
def dummy_func() -> str:
|
|
return "data"
|
|
|
|
# Must provide either name or URI
|
|
with pytest.raises(ValueError, match="Either name or uri must be provided"):
|
|
FunctionResource(
|
|
fn=dummy_func,
|
|
)
|
|
|
|
# Explicit name takes precedence over URI
|
|
resource = FunctionResource(
|
|
uri=AnyUrl("resource://uri-name"),
|
|
name="explicit-name",
|
|
fn=dummy_func,
|
|
)
|
|
assert resource.name == "explicit-name"
|
|
|
|
def test_resource_mime_type(self):
|
|
"""Test mime type handling."""
|
|
|
|
def dummy_func() -> str:
|
|
return "data"
|
|
|
|
# Default mime type
|
|
resource = FunctionResource(
|
|
uri=AnyUrl("resource://test"),
|
|
fn=dummy_func,
|
|
)
|
|
assert resource.mime_type == "text/plain"
|
|
|
|
# Custom mime type
|
|
resource = FunctionResource(
|
|
uri=AnyUrl("resource://test"),
|
|
fn=dummy_func,
|
|
mime_type="application/json",
|
|
)
|
|
assert resource.mime_type == "application/json"
|
|
|
|
@pytest.mark.anyio
|
|
async def test_resource_read_abstract(self):
|
|
"""Test that Resource.read() is abstract."""
|
|
|
|
class ConcreteResource(Resource):
|
|
pass
|
|
|
|
with pytest.raises(TypeError, match="abstract method"):
|
|
ConcreteResource(uri=AnyUrl("test://test"), name="test") # type: ignore
|