Mini-Agent / tests /test_session_integration.py
AbdulElahGwaith's picture
Upload folder using huggingface_hub
dc893fb verified
"""
Session integration tests - Testing multi-turn conversations and session management
"""
import tempfile
from pathlib import Path
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from mini_agent import LLMClient
from mini_agent.agent import Agent
from mini_agent.schema import LLMResponse, Message
from mini_agent.tools.bash_tool import BashTool
from mini_agent.tools.file_tools import ReadTool, WriteTool
from mini_agent.tools.note_tool import RecallNoteTool, SessionNoteTool
@pytest.fixture
def mock_llm_client():
"""Create mock LLM client"""
client = MagicMock(spec=LLMClient)
return client
@pytest.fixture
def temp_workspace():
"""Create temporary workspace directory"""
with tempfile.TemporaryDirectory() as tmpdir:
yield tmpdir
def test_multi_turn_conversation(mock_llm_client, temp_workspace):
"""Test multi-turn conversation and context sharing"""
# Prepare test data
system_prompt = "You are an intelligent assistant"
tools = [
ReadTool(workspace_dir=temp_workspace),
WriteTool(workspace_dir=temp_workspace),
SessionNoteTool(),
]
# Create agent
agent = Agent(
llm_client=mock_llm_client,
system_prompt=system_prompt,
tools=tools,
workspace_dir=temp_workspace,
)
# Verify initial state
assert len(agent.messages) == 1 # Only system prompt
assert agent.messages[0].role == "system"
# Agent automatically adds workspace info to system prompt
assert system_prompt in agent.messages[0].content
assert "Current Workspace" in agent.messages[0].content
# Add first user message
agent.add_user_message("Hello")
assert len(agent.messages) == 2
assert agent.messages[1].role == "user"
assert agent.messages[1].content == "Hello"
# Add second user message
agent.add_user_message("Help me create a file")
assert len(agent.messages) == 3
assert agent.messages[2].role == "user"
# Verify all messages are retained in history
user_messages = [m for m in agent.messages if m.role == "user"]
assert len(user_messages) == 2
assert user_messages[0].content == "Hello"
assert user_messages[1].content == "Help me create a file"
def test_session_history_management(mock_llm_client, temp_workspace):
"""Test session history management"""
agent = Agent(
llm_client=mock_llm_client,
system_prompt="System prompt",
tools=[],
workspace_dir=temp_workspace,
)
# Add multiple messages
for i in range(5):
agent.add_user_message(f"Message {i}")
# Verify message count (1 system + 5 user)
assert len(agent.messages) == 6
# Clear history (keep system prompt)
agent.messages = [agent.messages[0]]
# Verify only system prompt remains after clearing
assert len(agent.messages) == 1
assert agent.messages[0].role == "system"
def test_get_history(mock_llm_client, temp_workspace):
"""Test getting session history"""
agent = Agent(
llm_client=mock_llm_client,
system_prompt="System",
tools=[],
workspace_dir=temp_workspace,
)
# Add message
agent.add_user_message("Test message")
# Get history
history = agent.get_history()
# Verify history is a copy (doesn't affect original messages)
assert len(history) == len(agent.messages)
assert history is not agent.messages
# Modifying copy should not affect original messages
history.append(Message(role="user", content="New message"))
assert len(agent.messages) == 2 # Original messages unchanged
assert len(history) == 3 # Copy changed
@pytest.mark.asyncio
async def test_session_note_persistence(temp_workspace):
"""Test SessionNoteTool persistence functionality"""
memory_file = Path(temp_workspace) / "memory.json"
# Create first tool instance and record note
record_tool = SessionNoteTool(memory_file=str(memory_file))
result1 = await record_tool.execute(content="Test note", category="test")
assert result1.success
# Create second tool instance (simulating new session)
recall_tool = RecallNoteTool(memory_file=str(memory_file))
# Verify ability to read previous notes
result2 = await recall_tool.execute()
assert result2.success
assert "Test note" in result2.content
def test_message_statistics(mock_llm_client, temp_workspace):
"""Test message statistics functionality"""
agent = Agent(
llm_client=mock_llm_client,
system_prompt="System",
tools=[],
workspace_dir=temp_workspace,
)
# Add different types of messages
agent.add_user_message("User message 1")
agent.messages.append(Message(role="assistant", content="Assistant response 1"))
agent.add_user_message("User message 2")
agent.messages.append(
Message(
role="tool", content="Tool result", tool_call_id="123", name="test_tool"
)
)
# Count different types of messages
user_msgs = sum(1 for m in agent.messages if m.role == "user")
assistant_msgs = sum(1 for m in agent.messages if m.role == "assistant")
tool_msgs = sum(1 for m in agent.messages if m.role == "tool")
assert user_msgs == 2
assert assistant_msgs == 1
assert tool_msgs == 1
assert len(agent.messages) == 5 # 1 system + 2 user + 1 assistant + 1 tool