"""Contract tests for get_predecessors MCP tool.""" from pathlib import Path import pytest from xer_mcp.db import db @pytest.fixture(autouse=True) def setup_db(): """Initialize and clear database for each test.""" db.initialize() yield db.clear() class TestGetPredecessorsContract: """Contract tests verifying get_predecessors tool interface.""" async def test_get_predecessors_returns_list(self, sample_xer_single_project: Path) -> None: """get_predecessors returns predecessor activities.""" from xer_mcp.tools.get_predecessors import get_predecessors from xer_mcp.tools.load_xer import load_xer await load_xer(file_path=str(sample_xer_single_project)) # A1010 (2002) has one predecessor: A1000 (2001) result = await get_predecessors(activity_id="2002") assert "activity_id" in result assert result["activity_id"] == "2002" assert "predecessors" in result assert len(result["predecessors"]) == 1 assert result["predecessors"][0]["task_id"] == "2001" async def test_get_predecessors_includes_relationship_details( self, sample_xer_single_project: Path ) -> None: """get_predecessors includes relationship type and lag.""" from xer_mcp.tools.get_predecessors import get_predecessors from xer_mcp.tools.load_xer import load_xer await load_xer(file_path=str(sample_xer_single_project)) result = await get_predecessors(activity_id="2002") pred = result["predecessors"][0] assert "relationship_type" in pred assert "lag_hr_cnt" in pred assert pred["relationship_type"] in ["FS", "SS", "FF", "SF"] async def test_get_predecessors_empty_list_for_no_predecessors( self, sample_xer_single_project: Path ) -> None: """get_predecessors returns empty list when no predecessors exist.""" from xer_mcp.tools.get_predecessors import get_predecessors from xer_mcp.tools.load_xer import load_xer await load_xer(file_path=str(sample_xer_single_project)) # A1000 (2001) has no predecessors result = await get_predecessors(activity_id="2001") assert "predecessors" in result assert len(result["predecessors"]) == 0 async def test_get_predecessors_no_file_loaded_returns_error(self) -> None: """get_predecessors without loaded file returns NO_FILE_LOADED error.""" from xer_mcp.server import set_file_loaded from xer_mcp.tools.get_predecessors import get_predecessors set_file_loaded(False) result = await get_predecessors(activity_id="2002") assert "error" in result assert result["error"]["code"] == "NO_FILE_LOADED" async def test_get_predecessors_includes_driving_flag( self, sample_xer_single_project: Path ) -> None: """get_predecessors includes driving flag for each predecessor.""" from xer_mcp.tools.get_predecessors import get_predecessors from xer_mcp.tools.load_xer import load_xer await load_xer(file_path=str(sample_xer_single_project)) # A1010 (2002) has one predecessor: A1000 (2001) result = await get_predecessors(activity_id="2002") assert "predecessors" in result assert len(result["predecessors"]) >= 1 # All predecessors should have a driving flag for pred in result["predecessors"]: assert "driving" in pred assert isinstance(pred["driving"], bool)