103 lines
3.8 KiB
Python
103 lines
3.8 KiB
Python
"""Tests for Chat memory integration — 记忆注入 + MemoryTool + 日志生成 (U4)."""
|
|
|
|
from pathlib import Path
|
|
from unittest.mock import AsyncMock, MagicMock, patch
|
|
|
|
import pytest
|
|
|
|
from agentkit.memory.profile import MemoryStore, MemorySnapshot
|
|
from agentkit.tools.memory_tool import MemoryTool
|
|
|
|
|
|
class TestChatMemoryInjection:
|
|
"""Chat 启动时记忆注入 system prompt 测试."""
|
|
|
|
def test_memory_store_initializes_with_base_dir(self, tmp_path: Path):
|
|
store = MemoryStore(base_dir=tmp_path)
|
|
store.ensure_defaults()
|
|
snapshot = store.load_all()
|
|
prompt = store.build_system_prompt(snapshot, "Be helpful.")
|
|
assert "<agent-identity>" in prompt
|
|
assert "AgentKit" in prompt
|
|
assert "Be helpful." in prompt
|
|
|
|
def test_no_memory_files_returns_base_prompt(self, tmp_path: Path):
|
|
store = MemoryStore(base_dir=tmp_path)
|
|
snapshot = store.load_all()
|
|
prompt = store.build_system_prompt(snapshot, "Be helpful.")
|
|
assert prompt == "Be helpful."
|
|
|
|
def test_default_soul_injected(self, tmp_path: Path):
|
|
store = MemoryStore(base_dir=tmp_path)
|
|
store.ensure_defaults()
|
|
snapshot = store.load_all()
|
|
prompt = store.build_system_prompt(snapshot)
|
|
assert "<agent-identity>" in prompt
|
|
assert "专业" in prompt or "AgentKit" in prompt
|
|
|
|
|
|
class TestChatMemoryToolAvailable:
|
|
"""MemoryTool 在对话中可用测试."""
|
|
|
|
async def test_memory_tool_in_tools_list(self, tmp_path: Path):
|
|
store = MemoryStore(base_dir=tmp_path)
|
|
tool = MemoryTool(memory_store=store)
|
|
assert tool.name == "memory"
|
|
assert tool.input_schema is not None
|
|
|
|
async def test_memory_tool_add_and_read(self, tmp_path: Path):
|
|
store = MemoryStore(base_dir=tmp_path)
|
|
tool = MemoryTool(memory_store=store)
|
|
# Add
|
|
result = await tool.execute(action="add", file="user", section="称呼", content="叫我老板")
|
|
assert result["success"] is True
|
|
# Read
|
|
result = await tool.execute(action="read", file="user")
|
|
assert "老板" in result["content"]
|
|
|
|
|
|
class TestChatMemoryPersistence:
|
|
"""记忆跨 /clear 会话持久化测试."""
|
|
|
|
def test_memory_survives_session_clear(self, tmp_path: Path):
|
|
"""/clear 只清除会话历史,不清除记忆文件."""
|
|
store = MemoryStore(base_dir=tmp_path)
|
|
store.get_file("user").write("## 称呼\n叫我老板")
|
|
|
|
# 模拟 /clear — 重新创建 MemoryStore
|
|
store2 = MemoryStore(base_dir=tmp_path)
|
|
content = store2.get_file("user").read()
|
|
assert "老板" in content
|
|
|
|
def test_memory_persists_across_store_instances(self, tmp_path: Path):
|
|
store1 = MemoryStore(base_dir=tmp_path)
|
|
store1.get_file("memory").write("## 项目\nAgentKit框架")
|
|
|
|
store2 = MemoryStore(base_dir=tmp_path)
|
|
content = store2.get_file("memory").read()
|
|
assert "AgentKit" in content
|
|
|
|
|
|
class TestChatDailyLogGeneration:
|
|
"""会话结束时日志生成测试."""
|
|
|
|
def test_daily_file_path_is_today(self, tmp_path: Path):
|
|
from datetime import datetime, timezone
|
|
store = MemoryStore(base_dir=tmp_path)
|
|
daily = store.get_file("daily")
|
|
today = datetime.now(timezone.utc).strftime("%Y-%m-%d")
|
|
assert today in str(daily.path)
|
|
|
|
def test_write_daily_log(self, tmp_path: Path):
|
|
store = MemoryStore(base_dir=tmp_path)
|
|
daily = store.get_file("daily")
|
|
daily.write("讨论了AgentKit记忆系统架构")
|
|
content = daily.read()
|
|
assert "记忆系统" in content
|
|
|
|
def test_daily_log_loads_in_snapshot(self, tmp_path: Path):
|
|
store = MemoryStore(base_dir=tmp_path)
|
|
store.get_file("daily").write("今天完成了记忆系统开发")
|
|
snapshot = store.load_all()
|
|
assert "记忆系统" in snapshot.daily
|