fischer-agentkit/tests/unit/test_memory_tool.py

113 lines
4.6 KiB
Python

"""Tests for MemoryTool — Agent 可调用的记忆操作工具 (U3)."""
from pathlib import Path
import pytest
from agentkit.memory.profile import MemoryStore
from agentkit.tools.memory_tool import MemoryTool
@pytest.fixture
def store(tmp_path: Path) -> MemoryStore:
return MemoryStore(base_dir=tmp_path)
@pytest.fixture
def tool(store: MemoryStore) -> MemoryTool:
return MemoryTool(memory_store=store)
class TestMemoryToolAdd:
"""memory_add 操作测试."""
async def test_add_creates_new_section(self, tool: MemoryTool, store: MemoryStore):
result = await tool.execute(action="add", file="memory", section="项目信息", content="使用Python和FastAPI")
assert result["success"] is True
content = store.get_file("memory").read_section("项目信息")
assert "Python和FastAPI" in content
async def test_add_appends_to_existing_section(self, tool: MemoryTool, store: MemoryStore):
store.get_file("memory").write("## 项目信息\n使用Python")
result = await tool.execute(action="add", file="memory", section="项目信息", content="还有TypeScript")
assert result["success"] is True
content = store.get_file("memory").read_section("项目信息")
assert "Python" in content
assert "TypeScript" in content
async def test_add_to_soul(self, tool: MemoryTool, store: MemoryStore):
result = await tool.execute(action="add", file="soul", section="爱好", content="编程和阅读")
assert result["success"] is True
assert "编程和阅读" in store.get_file("soul").read_section("爱好")
class TestMemoryToolReplace:
"""memory_replace 操作测试."""
async def test_replace_text_in_section(self, tool: MemoryTool, store: MemoryStore):
store.get_file("memory").write("## 项目信息\n使用Python\n## 团队\n3人")
result = await tool.execute(
action="replace", file="memory", section="项目信息",
old_text="Python", new_text="Rust"
)
assert result["success"] is True
assert "Rust" in store.get_file("memory").read_section("项目信息")
assert "3人" in store.get_file("memory").read_section("团队")
async def test_replace_old_not_found_fails(self, tool: MemoryTool, store: MemoryStore):
store.get_file("memory").write("## 项目信息\n使用Python")
result = await tool.execute(
action="replace", file="memory", section="项目信息",
old_text="不存在", new_text="新内容"
)
assert result["success"] is False
assert "not found" in result.get("error", "").lower()
class TestMemoryToolRemove:
"""memory_remove 操作测试."""
async def test_remove_section(self, tool: MemoryTool, store: MemoryStore):
store.get_file("memory").write("## 项目信息\n使用Python\n## 团队\n3人")
result = await tool.execute(action="remove", file="memory", section="项目信息")
assert result["success"] is True
assert store.get_file("memory").read_section("项目信息") == ""
assert "3人" in store.get_file("memory").read_section("团队")
class TestMemoryToolRead:
"""memory_read 操作测试."""
async def test_read_file_content(self, tool: MemoryTool, store: MemoryStore):
store.get_file("memory").write("## 项目信息\n使用Python")
result = await tool.execute(action="read", file="memory")
assert result["success"] is True
assert "Python" in result["content"]
async def test_read_empty_file(self, tool: MemoryTool, store: MemoryStore):
result = await tool.execute(action="read", file="memory")
assert result["success"] is True
assert result["content"] == ""
class TestMemoryToolValidation:
"""参数验证测试."""
async def test_invalid_file_key(self, tool: MemoryTool):
result = await tool.execute(action="read", file="invalid")
assert result["success"] is False
assert "Invalid" in result.get("error", "")
async def test_invalid_action(self, tool: MemoryTool):
result = await tool.execute(action="delete_everything", file="memory")
assert result["success"] is False
assert "Unknown action" in result.get("error", "")
async def test_add_respects_capacity(self, tool: MemoryTool, store: MemoryStore):
# memory file has MEMORY_BUDGET=2200
long_content = "A" * 3000
result = await tool.execute(action="add", file="memory", section="测试", content=long_content)
assert result["success"] is True
content = store.get_file("memory").read()
assert len(content) <= 2200