fischer-agentkit/tests/unit/test_prompt_section.py

116 lines
3.7 KiB
Python

"""Tests for PromptSection - 模块化 Prompt 段落"""
import pytest
from agentkit.prompts.section import PromptSection
class TestPromptSectionInit:
"""PromptSection 初始化测试"""
def test_default_all_empty(self):
section = PromptSection()
assert section.identity == ""
assert section.context == ""
assert section.instructions == ""
assert section.constraints == ""
assert section.output_format == ""
assert section.examples == ""
def test_custom_fields(self):
section = PromptSection(
identity="Bot",
context="Context info",
instructions="Do things",
constraints="Be safe",
output_format="JSON",
examples="Q: hi A: hello",
)
assert section.identity == "Bot"
assert section.context == "Context info"
assert section.instructions == "Do things"
assert section.constraints == "Be safe"
assert section.output_format == "JSON"
assert section.examples == "Q: hi A: hello"
class TestPromptSectionRender:
"""PromptSection.render 渲染测试"""
def test_render_empty_section(self):
section = PromptSection()
assert section.render() == ""
def test_render_single_field(self):
section = PromptSection(identity="I am a bot")
assert section.render() == "I am a bot"
def test_render_multiple_fields_joined(self):
section = PromptSection(
identity="Bot",
instructions="Do stuff",
)
result = section.render()
assert result == "Bot\n\nDo stuff"
def test_render_all_fields(self):
section = PromptSection(
identity="I",
context="C",
instructions="Ins",
constraints="Con",
output_format="O",
examples="E",
)
result = section.render()
assert result == "I\n\nC\n\nIns\n\nCon\n\nO\n\nE"
def test_render_skips_empty_fields(self):
section = PromptSection(
identity="Bot",
constraints="Be safe",
)
result = section.render()
assert result == "Bot\n\nBe safe"
def test_render_with_variable_substitution(self):
section = PromptSection(
identity="Hello ${name}",
context="You are in ${place}",
)
result = section.render(variables={"name": "Alice", "place": "Wonderland"})
assert "Hello Alice" in result
assert "You are in Wonderland" in result
def test_render_unsubstituted_variables_remain(self):
section = PromptSection(context="Hello ${name}")
result = section.render()
assert result == "Hello ${name}"
def test_render_partial_variable_substitution(self):
section = PromptSection(
context="Hello ${name}, ${unknown} stays",
)
result = section.render(variables={"name": "Bob"})
assert "Hello Bob, ${unknown} stays" == result
def test_render_variable_value_converted_to_string(self):
section = PromptSection(context="Count: ${count}")
result = section.render(variables={"count": 42})
assert result == "Count: 42"
def test_render_none_variables_treated_as_empty(self):
section = PromptSection(context="Hello ${name}")
result = section.render(variables=None)
assert result == "Hello ${name}"
def test_render_preserves_field_order(self):
section = PromptSection(
examples="E",
identity="I",
context="C",
)
result = section.render()
# 渲染顺序应为 identity, context, ..., examples
assert result.index("I") < result.index("C") < result.index("E")