"""Tests for research tools."""
from pathfinder_mcp.state import Phase
from pathfinder_mcp.tools.research import save_research, start_research
class TestStartResearch:
"""Tests for start_research tool."""
def test_creates_session(
self,
session_manager,
artifact_writer,
context_monitor,
active_sessions,
) -> None:
"""start_research creates a new session."""
result = start_research(
task_description="Test task",
session_id="test_001",
session_manager=session_manager,
artifact_writer=artifact_writer,
context_monitor=context_monitor,
sessions=active_sessions,
)
assert result["session_id"] == "test_001"
assert result["phase"] == "research"
assert "test_001" in active_sessions
def test_auto_generates_session_id(
self,
session_manager,
artifact_writer,
context_monitor,
active_sessions,
) -> None:
"""start_research generates session ID if not provided."""
result = start_research(
task_description="Test task",
session_id=None,
session_manager=session_manager,
artifact_writer=artifact_writer,
context_monitor=context_monitor,
sessions=active_sessions,
)
assert "session_id" in result
assert result["session_id"].startswith("session_")
def test_creates_research_artifact(
self,
session_manager,
artifact_writer,
context_monitor,
active_sessions,
) -> None:
"""start_research creates research.md artifact."""
start_research(
task_description="My test task",
session_id="test_002",
session_manager=session_manager,
artifact_writer=artifact_writer,
context_monitor=context_monitor,
sessions=active_sessions,
)
content = artifact_writer.read_artifact("test_002", "research.md")
assert content is not None
assert "My test task" in content
def test_sets_phase_to_research(
self,
session_manager,
artifact_writer,
context_monitor,
active_sessions,
) -> None:
"""start_research sets phase state to RESEARCH."""
start_research(
task_description="Test",
session_id="test_003",
session_manager=session_manager,
artifact_writer=artifact_writer,
context_monitor=context_monitor,
sessions=active_sessions,
)
state = active_sessions["test_003"]
assert state.current_phase == Phase.RESEARCH
class TestSaveResearch:
"""Tests for save_research tool."""
def test_saves_findings(
self,
session_manager,
artifact_writer,
context_monitor,
active_sessions,
sample_session_id,
research_state,
) -> None:
"""save_research appends findings to artifact."""
# Setup: create session and initial research
session_manager.create_session(sample_session_id)
active_sessions[sample_session_id] = research_state
artifact_writer.write_research(sample_session_id, "", task="Test")
result = save_research(
session_id=sample_session_id,
findings="New finding: important discovery",
session_manager=session_manager,
artifact_writer=artifact_writer,
context_monitor=context_monitor,
sessions=active_sessions,
)
assert "error" not in result
content = artifact_writer.read_artifact(sample_session_id, "research.md")
assert "important discovery" in content
def test_returns_error_for_missing_session(
self,
session_manager,
artifact_writer,
context_monitor,
active_sessions,
) -> None:
"""save_research returns error for non-existent session."""
result = save_research(
session_id="nonexistent",
findings="Test",
session_manager=session_manager,
artifact_writer=artifact_writer,
context_monitor=context_monitor,
sessions=active_sessions,
)
assert result["error"] == "Session not found"
assert result["code"] == "SESSION_NOT_FOUND"
def test_returns_error_for_wrong_phase(
self,
session_manager,
artifact_writer,
context_monitor,
active_sessions,
sample_session_id,
plan_state,
) -> None:
"""save_research returns error when not in research phase."""
session_manager.create_session(sample_session_id)
active_sessions[sample_session_id] = plan_state
result = save_research(
session_id=sample_session_id,
findings="Test",
session_manager=session_manager,
artifact_writer=artifact_writer,
context_monitor=context_monitor,
sessions=active_sessions,
)
assert "error" in result
assert result["code"] == "INVALID_PHASE"
def test_returns_context_status(
self,
session_manager,
artifact_writer,
context_monitor,
active_sessions,
sample_session_id,
research_state,
) -> None:
"""save_research includes context utilization in response."""
session_manager.create_session(sample_session_id)
active_sessions[sample_session_id] = research_state
artifact_writer.write_research(sample_session_id, "", task="Test")
result = save_research(
session_id=sample_session_id,
findings="Test findings",
session_manager=session_manager,
artifact_writer=artifact_writer,
context_monitor=context_monitor,
sessions=active_sessions,
)
assert "context" in result
assert "utilization_percent" in result["context"]