import pytest from pathlib import Path from aggregate import build_tier1_context, build_tier2_context, build_tier3_context def test_build_tier1_context_exists(): # This should fail if the function is not defined file_items = [ {"path": Path("conductor/product.md"), "entry": "conductor/product.md", "content": "Product content", "error": False}, {"path": Path("other.py"), "entry": "other.py", "content": "Other content", "error": False} ] history = ["User: hello", "AI: hi"] result = build_tier1_context(file_items, Path("."), [], history) assert "Product content" in result # other.py should be summarized, not full content in a code block assert "Other content" not in result or "Summarized" in result # Assuming summary format def test_build_tier2_context_exists(): file_items = [ {"path": Path("other.py"), "entry": "other.py", "content": "Other content", "error": False} ] history = ["User: hello"] result = build_tier2_context(file_items, Path("."), [], history) assert "Other content" in result def test_build_tier3_context_ast_skeleton(monkeypatch): from unittest.mock import MagicMock import aggregate import file_cache # Mock ASTParser mock_parser_instance = MagicMock() mock_parser_instance.get_skeleton.return_value = "def other():\n ..." mock_parser_class = MagicMock(return_value=mock_parser_instance) # Mock file_cache.ASTParser in aggregate module monkeypatch.setattr("aggregate.ASTParser", mock_parser_class) file_items = [ {"path": Path("other.py"), "entry": "other.py", "content": "def other():\n pass", "error": False} ] history = [] # New behavior check: it should use ASTParser for .py files not in focus result = build_tier3_context(file_items, Path("."), [], history, focus_files=[]) assert "def other():" in result assert "..." in result assert "Python" not in result # summarize.py output should not be there if AST skeleton is used mock_parser_class.assert_called_once_with("python") mock_parser_instance.get_skeleton.assert_called_once_with("def other():\n pass") def test_build_tier3_context_exists(): file_items = [ {"path": Path("focus.py"), "entry": "focus.py", "content": "def focus():\n pass", "error": False}, {"path": Path("other.py"), "entry": "other.py", "content": "def other():\n pass", "error": False} ] history = ["User: hello"] result = build_tier3_context(file_items, Path("."), [], history, focus_files=["focus.py"]) assert "def focus():" in result assert "pass" in result # other.py should have skeletonized content, not full "pass" (if get_skeleton works) # However, for a simple "pass", the skeleton might be the same or similar. # Let's check for the header assert "other.py" in result assert "AST Skeleton" in result