|
| 1 | +import pytest |
| 2 | + |
| 3 | +from mcp import types |
| 4 | +from mcp.server.fastmcp import FastMCP |
| 5 | + |
| 6 | + |
| 7 | +@pytest.mark.anyio |
| 8 | +async def test_resource_templates(): |
| 9 | + # Create an MCP server |
| 10 | + mcp = FastMCP("Demo") |
| 11 | + |
| 12 | + # Add a dynamic greeting resource |
| 13 | + @mcp.resource("greeting://{name}") |
| 14 | + def get_greeting(name: str) -> str: |
| 15 | + """Get a personalized greeting""" |
| 16 | + return f"Hello, {name}!" |
| 17 | + |
| 18 | + @mcp.resource("users://{user_id}/profile") |
| 19 | + def get_user_profile(user_id: str) -> str: |
| 20 | + """Dynamic user data""" |
| 21 | + return f"Profile data for user {user_id}" |
| 22 | + |
| 23 | + # Get the list of resource templates using the underlying server |
| 24 | + # Note: list_resource_templates() returns a decorator that wraps the handler |
| 25 | + # The handler returns a ServerResult with a ListResourceTemplatesResult inside |
| 26 | + result = await mcp._mcp_server.request_handlers[types.ListResourceTemplatesRequest]( |
| 27 | + types.ListResourceTemplatesRequest( |
| 28 | + method="resources/templates/list", params=None, cursor=None |
| 29 | + ) |
| 30 | + ) |
| 31 | + assert isinstance(result.root, types.ListResourceTemplatesResult) |
| 32 | + templates = result.root.resourceTemplates |
| 33 | + |
| 34 | + # Verify we get both templates back |
| 35 | + assert len(templates) == 2 |
| 36 | + |
| 37 | + # Verify template details |
| 38 | + greeting_template = next(t for t in templates if t.name == "get_greeting") |
| 39 | + assert greeting_template.uriTemplate == "greeting://{name}" |
| 40 | + assert greeting_template.description == "Get a personalized greeting" |
| 41 | + |
| 42 | + profile_template = next(t for t in templates if t.name == "get_user_profile") |
| 43 | + assert profile_template.uriTemplate == "users://{user_id}/profile" |
| 44 | + assert profile_template.description == "Dynamic user data" |
0 commit comments