from __future__ import annotations import ast from pathlib import Path import pytest def test_legacy_glob_module_reexports_the_canonical_tool() -> None: from agent.tools.builtin.file.glob import LIMIT as canonical_limit from agent.tools.builtin.file.glob import glob_files as canonical_glob from agent.tools.builtin.glob_tool import LIMIT as legacy_limit from agent.tools.builtin.glob_tool import glob_files as legacy_glob assert legacy_glob is canonical_glob assert legacy_limit == canonical_limit == 100 assert canonical_glob.__module__ == "agent.tools.builtin.file.glob" def test_trace_tree_dump_imports_remain_compatible() -> None: from agent.debug.tree_dump import dump_tree as canonical_dump_tree from agent.trace import dump_tree as package_dump_tree from agent.trace.tree_dump import DEFAULT_DUMP_PATH, dump_tree as legacy_dump_tree assert legacy_dump_tree is canonical_dump_tree assert package_dump_tree is canonical_dump_tree assert DEFAULT_DUMP_PATH == ".trace/tree.txt" @pytest.mark.asyncio async def test_canonical_glob_still_lists_matching_files(tmp_path: Path) -> None: from agent.tools.builtin.file.glob import glob_files expected = tmp_path / "example.py" expected.write_text("pass\n", encoding="utf-8") (tmp_path / "ignored.txt").write_text("ignored\n", encoding="utf-8") result = await glob_files("*.py", path=str(tmp_path)) assert result.error is None assert result.metadata["count"] == 1 assert result.output == str(expected) def test_browser_download_uses_stdlib_url_decode_and_time() -> None: source_path = ( Path(__file__).parents[1] / "agent" / "tools" / "builtin" / "browser" / "downloads.py" ) tree = ast.parse(source_path.read_text(encoding="utf-8"), filename=str(source_path)) imported_names = { alias.asname or alias.name for node in tree.body if isinstance(node, ast.Import) for alias in node.names } urllib_imports = { alias.asname or alias.name for node in tree.body if isinstance(node, ast.ImportFrom) and node.module == "urllib.parse" for alias in node.names } assert "time" in imported_names assert "unquote" in urllib_imports assert "unquote" not in { alias.name for node in ast.walk(tree) if isinstance(node, ast.Import) for alias in node.names }