1+ """Tests for prompt manager."""
2+
13import pytest
24
3- from mcp .server .fastmcp .prompts .base import Prompt , TextContent , UserMessage
45from mcp .server .fastmcp .prompts .manager import PromptManager
56
67
78class TestPromptManager :
9+ """Test prompt manager functionality."""
10+
811 def test_add_prompt (self ):
912 """Test adding a prompt to the manager."""
1013
1114 def fn () -> str :
1215 return "Hello, world!"
1316
1417 manager = PromptManager ()
15- added = manager .add_prompt (fn )
16- assert isinstance ( added , Prompt )
18+ added = manager .add_prompt (fn = fn )
19+
1720 assert added .name == "fn"
18- assert manager .get_prompt ("fn" ) == added
21+ assert added .description == ""
22+ assert len (manager .list_prompts ()) == 1
1923
20- def test_add_prompt_object (self ):
21- """Test adding a Prompt object directly ."""
24+ def test_add_prompt_with_name (self ):
25+ """Test adding a prompt with a custom name ."""
2226
2327 def fn () -> str :
2428 return "Hello, world!"
2529
26- prompt = Prompt .from_function (fn , name = "test_prompt" , description = "Test prompt" )
2730 manager = PromptManager ()
28- added = manager .add_prompt (prompt )
29- assert added == prompt
30- assert manager .get_prompt ("test_prompt" ) == prompt
31+ added = manager .add_prompt (fn = fn , name = "greeting" )
3132
32- def test_add_prompt_object_ignores_name_and_description (self ):
33- """Test if name and description args are ignored when adding a Prompt object."""
33+ assert added .name == "greeting"
34+ assert added .description == ""
35+ assert len (manager .list_prompts ()) == 1
36+
37+ def test_add_prompt_with_description (self ):
38+ """Test adding a prompt with a description."""
3439
3540 def fn () -> str :
41+ """A greeting prompt."""
3642 return "Hello, world!"
3743
38- prompt = Prompt .from_function (
39- fn , name = "original_name" , description = "Original description"
40- )
4144 manager = PromptManager ()
42- # These should be ignored
43- added = manager .add_prompt (
44- prompt , name = "ignored_name" , description = "ignored_description"
45- )
46- assert added .name == "original_name"
47- assert added .description == "Original description"
45+ added = manager .add_prompt (fn = fn , description = "A custom greeting" )
46+
47+ assert added .name == "fn"
48+ assert added .description == "A custom greeting"
49+ assert len (manager .list_prompts ()) == 1
4850
4951 def test_add_duplicate_prompt (self , caplog ):
5052 """Test adding the same prompt twice."""
@@ -53,10 +55,12 @@ def fn() -> str:
5355 return "Hello, world!"
5456
5557 manager = PromptManager ()
56- first = manager .add_prompt (fn )
57- second = manager .add_prompt (fn )
58+ first = manager .add_prompt (fn = fn )
59+ second = manager .add_prompt (fn = fn )
60+
5861 assert first == second
59- assert "Prompt already exists" in caplog .text
62+ assert len (manager .list_prompts ()) == 1
63+ assert "Prompt already exists: fn" in caplog .text
6064
6165 def test_disable_warn_on_duplicate_prompts (self , caplog ):
6266 """Test disabling warning on duplicate prompts."""
@@ -65,9 +69,11 @@ def fn() -> str:
6569 return "Hello, world!"
6670
6771 manager = PromptManager (warn_on_duplicate_prompts = False )
68- first = manager .add_prompt (fn )
69- second = manager .add_prompt (fn )
72+ first = manager .add_prompt (fn = fn )
73+ second = manager .add_prompt (fn = fn )
74+
7075 assert first == second
76+ assert len (manager .list_prompts ()) == 1
7177 assert "Prompt already exists" not in caplog .text
7278
7379 def test_list_prompts (self ):
@@ -80,11 +86,13 @@ def fn2() -> str:
8086 return "Goodbye, world!"
8187
8288 manager = PromptManager ()
83- prompt1 = manager .add_prompt (fn1 )
84- prompt2 = manager .add_prompt (fn2 )
89+ prompt1 = manager .add_prompt (fn = fn1 )
90+ prompt2 = manager .add_prompt (fn = fn2 )
91+
8592 prompts = manager .list_prompts ()
8693 assert len (prompts ) == 2
87- assert prompts == [prompt1 , prompt2 ]
94+ assert prompt1 in prompts
95+ assert prompt2 in prompts
8896
8997 @pytest .mark .anyio
9098 async def test_render_prompt (self ):
@@ -94,11 +102,12 @@ def fn() -> str:
94102 return "Hello, world!"
95103
96104 manager = PromptManager ()
97- manager .add_prompt (fn )
105+ manager .add_prompt (fn = fn )
106+
98107 messages = await manager .render_prompt ("fn" )
99- assert messages == [
100- UserMessage ( content = TextContent ( type = "text" , text = "Hello, world!" ))
101- ]
108+ assert len ( messages ) == 1
109+ assert messages [ 0 ]. role == "user"
110+ assert messages [ 0 ]. content . text == "Hello, world!"
102111
103112 @pytest .mark .anyio
104113 async def test_render_prompt_with_args (self ):
@@ -108,18 +117,12 @@ def fn(name: str) -> str:
108117 return f"Hello, { name } !"
109118
110119 manager = PromptManager ()
111- manager .add_prompt (fn )
112- messages = await manager .render_prompt ("fn" , arguments = {"name" : "World" })
113- assert messages == [
114- UserMessage (content = TextContent (type = "text" , text = "Hello, World!" ))
115- ]
120+ manager .add_prompt (fn = fn )
116121
117- @pytest .mark .anyio
118- async def test_render_unknown_prompt (self ):
119- """Test rendering a non-existent prompt."""
120- manager = PromptManager ()
121- with pytest .raises (ValueError , match = "Unknown prompt: unknown" ):
122- await manager .render_prompt ("unknown" )
122+ messages = await manager .render_prompt ("fn" , {"name" : "Alice" })
123+ assert len (messages ) == 1
124+ assert messages [0 ].role == "user"
125+ assert messages [0 ].content .text == "Hello, Alice!"
123126
124127 @pytest .mark .anyio
125128 async def test_render_prompt_with_missing_args (self ):
@@ -129,6 +132,16 @@ def fn(name: str) -> str:
129132 return f"Hello, { name } !"
130133
131134 manager = PromptManager ()
132- manager .add_prompt (fn )
135+ manager .add_prompt (fn = fn )
136+
133137 with pytest .raises (ValueError , match = "Missing required arguments" ):
134138 await manager .render_prompt ("fn" )
139+
140+ @pytest .mark .anyio
141+ async def test_render_unknown_prompt (self ):
142+ """Test rendering an unknown prompt."""
143+
144+ manager = PromptManager ()
145+
146+ with pytest .raises (ValueError , match = "Unknown prompt" ):
147+ await manager .render_prompt ("unknown" )
0 commit comments