Skip to content

Commit 83eb81f

Browse files
committed
Handle URL tests
1 parent f1abe01 commit 83eb81f

5 files changed

+104
-158
lines changed

tests/resources/test_file_resources.py

+9-8
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import pytest
44
from pathlib import Path
55
from tempfile import NamedTemporaryFile
6+
from pydantic import FileUrl
67

78
from fastmcp.resources import FileResource
89

@@ -30,7 +31,7 @@ class TestFileResource:
3031
def test_file_resource_creation(self, temp_file: Path):
3132
"""Test creating a FileResource."""
3233
resource = FileResource(
33-
uri=temp_file.as_uri(),
34+
uri=FileUrl(temp_file.as_uri()),
3435
name="test",
3536
description="test file",
3637
path=temp_file,
@@ -45,17 +46,17 @@ def test_file_resource_creation(self, temp_file: Path):
4546
def test_file_resource_str_path_conversion(self, temp_file: Path):
4647
"""Test FileResource handles string paths."""
4748
resource = FileResource(
48-
uri=f"file://{temp_file}",
49+
uri=FileUrl(f"file://{temp_file}"),
4950
name="test",
50-
path=str(temp_file),
51+
path=Path(str(temp_file)),
5152
)
5253
assert isinstance(resource.path, Path)
5354
assert resource.path.is_absolute()
5455

5556
async def test_read_text_file(self, temp_file: Path):
5657
"""Test reading a text file."""
5758
resource = FileResource(
58-
uri=f"file://{temp_file}",
59+
uri=FileUrl(f"file://{temp_file}"),
5960
name="test",
6061
path=temp_file,
6162
)
@@ -66,7 +67,7 @@ async def test_read_text_file(self, temp_file: Path):
6667
async def test_read_binary_file(self, temp_file: Path):
6768
"""Test reading a file as binary."""
6869
resource = FileResource(
69-
uri=f"file://{temp_file}",
70+
uri=FileUrl(f"file://{temp_file}"),
7071
name="test",
7172
path=temp_file,
7273
is_binary=True,
@@ -79,7 +80,7 @@ def test_relative_path_error(self):
7980
"""Test error on relative path."""
8081
with pytest.raises(ValueError, match="Path must be absolute"):
8182
FileResource(
82-
uri="file:///test.txt",
83+
uri=FileUrl("file:///test.txt"),
8384
name="test",
8485
path=Path("test.txt"),
8586
)
@@ -89,7 +90,7 @@ async def test_missing_file_error(self, temp_file: Path):
8990
# Create path to non-existent file
9091
missing = temp_file.parent / "missing.txt"
9192
resource = FileResource(
92-
uri="file:///missing.txt",
93+
uri=FileUrl("file:///missing.txt"),
9394
name="test",
9495
path=missing,
9596
)
@@ -104,7 +105,7 @@ async def test_permission_error(self, temp_file: Path):
104105
temp_file.chmod(0o000) # Remove all permissions
105106
try:
106107
resource = FileResource(
107-
uri=temp_file.as_uri(),
108+
uri=FileUrl(temp_file.as_uri()),
108109
name="test",
109110
path=temp_file,
110111
)

tests/resources/test_function_resources.py

+9-8
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from pydantic import BaseModel
1+
from pydantic import BaseModel, AnyUrl
22
import pytest
33
from fastmcp.resources import FunctionResource
44

@@ -13,7 +13,7 @@ def my_func() -> str:
1313
return "test content"
1414

1515
resource = FunctionResource(
16-
uri="fn://test",
16+
uri=AnyUrl("fn://test"),
1717
name="test",
1818
description="test function",
1919
fn=my_func,
@@ -31,7 +31,7 @@ def get_data() -> str:
3131
return "Hello, world!"
3232

3333
resource = FunctionResource(
34-
uri="function://test",
34+
uri=AnyUrl("function://test"),
3535
name="test",
3636
fn=get_data,
3737
)
@@ -46,7 +46,7 @@ def get_data() -> bytes:
4646
return b"Hello, world!"
4747

4848
resource = FunctionResource(
49-
uri="function://test",
49+
uri=AnyUrl("function://test"),
5050
name="test",
5151
fn=get_data,
5252
)
@@ -60,11 +60,12 @@ def get_data() -> dict:
6060
return {"key": "value"}
6161

6262
resource = FunctionResource(
63-
uri="function://test",
63+
uri=AnyUrl("function://test"),
6464
name="test",
6565
fn=get_data,
6666
)
6767
content = await resource.read()
68+
assert isinstance(content, str)
6869
assert '"key": "value"' in content
6970

7071
async def test_error_handling(self):
@@ -74,7 +75,7 @@ def failing_func() -> str:
7475
raise ValueError("Test error")
7576

7677
resource = FunctionResource(
77-
uri="function://test",
78+
uri=AnyUrl("function://test"),
7879
name="test",
7980
fn=failing_func,
8081
)
@@ -88,7 +89,7 @@ class MyModel(BaseModel):
8889
name: str
8990

9091
resource = FunctionResource(
91-
uri="function://test",
92+
uri=AnyUrl("function://test"),
9293
name="test",
9394
fn=lambda: MyModel(name="test"),
9495
)
@@ -106,7 +107,7 @@ def get_data() -> CustomData:
106107
return CustomData()
107108

108109
resource = FunctionResource(
109-
uri="function://test",
110+
uri=AnyUrl("function://test"),
110111
name="test",
111112
fn=get_data,
112113
)

tests/resources/test_resource_manager.py

+10-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import pytest
22
from pathlib import Path
33
from tempfile import NamedTemporaryFile
4+
from pydantic import AnyUrl, FileUrl
45

56
from fastmcp.resources import (
67
FileResource,
@@ -34,7 +35,7 @@ def test_add_resource(self, temp_file: Path):
3435
"""Test adding a resource."""
3536
manager = ResourceManager()
3637
resource = FileResource(
37-
uri=f"file://{temp_file}",
38+
uri=FileUrl(f"file://{temp_file}"),
3839
name="test",
3940
path=temp_file,
4041
)
@@ -46,7 +47,7 @@ def test_add_duplicate_resource(self, temp_file: Path):
4647
"""Test adding the same resource twice."""
4748
manager = ResourceManager()
4849
resource = FileResource(
49-
uri=f"file://{temp_file}",
50+
uri=FileUrl(f"file://{temp_file}"),
5051
name="test",
5152
path=temp_file,
5253
)
@@ -59,7 +60,7 @@ def test_warn_on_duplicate_resources(self, temp_file: Path, caplog):
5960
"""Test warning on duplicate resources."""
6061
manager = ResourceManager()
6162
resource = FileResource(
62-
uri=f"file://{temp_file}",
63+
uri=FileUrl(f"file://{temp_file}"),
6364
name="test",
6465
path=temp_file,
6566
)
@@ -71,7 +72,7 @@ def test_disable_warn_on_duplicate_resources(self, temp_file: Path, caplog):
7172
"""Test disabling warning on duplicate resources."""
7273
manager = ResourceManager(warn_on_duplicate_resources=False)
7374
resource = FileResource(
74-
uri=f"file://{temp_file}",
75+
uri=FileUrl(f"file://{temp_file}"),
7576
name="test",
7677
path=temp_file,
7778
)
@@ -83,7 +84,7 @@ async def test_get_resource(self, temp_file: Path):
8384
"""Test getting a resource by URI."""
8485
manager = ResourceManager()
8586
resource = FileResource(
86-
uri=f"file://{temp_file}",
87+
uri=FileUrl(f"file://{temp_file}"),
8788
name="test",
8889
path=temp_file,
8990
)
@@ -105,7 +106,7 @@ def greet(name: str) -> str:
105106
)
106107
manager._templates[template.uri_template] = template
107108

108-
resource = await manager.get_resource("greet://world")
109+
resource = await manager.get_resource(AnyUrl("greet://world"))
109110
assert isinstance(resource, FunctionResource)
110111
content = await resource.read()
111112
assert content == "Hello, world!"
@@ -114,18 +115,18 @@ async def test_get_unknown_resource(self):
114115
"""Test getting a non-existent resource."""
115116
manager = ResourceManager()
116117
with pytest.raises(ValueError, match="Unknown resource"):
117-
await manager.get_resource("unknown://test")
118+
await manager.get_resource(AnyUrl("unknown://test"))
118119

119120
def test_list_resources(self, temp_file: Path):
120121
"""Test listing all resources."""
121122
manager = ResourceManager()
122123
resource1 = FileResource(
123-
uri=f"file://{temp_file}",
124+
uri=FileUrl(f"file://{temp_file}"),
124125
name="test1",
125126
path=temp_file,
126127
)
127128
resource2 = FileResource(
128-
uri=f"file://{temp_file}2",
129+
uri=FileUrl(f"file://{temp_file}2"),
129130
name="test2",
130131
path=temp_file,
131132
)

0 commit comments

Comments
 (0)