test_builtin_cleanup_compatibility.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from __future__ import annotations
  2. import ast
  3. from pathlib import Path
  4. import pytest
  5. def test_legacy_glob_module_reexports_the_canonical_tool() -> None:
  6. from agent.tools.builtin.file.glob import LIMIT as canonical_limit
  7. from agent.tools.builtin.file.glob import glob_files as canonical_glob
  8. from agent.tools.builtin.glob_tool import LIMIT as legacy_limit
  9. from agent.tools.builtin.glob_tool import glob_files as legacy_glob
  10. assert legacy_glob is canonical_glob
  11. assert legacy_limit == canonical_limit == 100
  12. assert canonical_glob.__module__ == "agent.tools.builtin.file.glob"
  13. def test_trace_tree_dump_imports_remain_compatible() -> None:
  14. from agent.debug.tree_dump import dump_tree as canonical_dump_tree
  15. from agent.trace import dump_tree as package_dump_tree
  16. from agent.trace.tree_dump import DEFAULT_DUMP_PATH, dump_tree as legacy_dump_tree
  17. assert legacy_dump_tree is canonical_dump_tree
  18. assert package_dump_tree is canonical_dump_tree
  19. assert DEFAULT_DUMP_PATH == ".trace/tree.txt"
  20. @pytest.mark.asyncio
  21. async def test_canonical_glob_still_lists_matching_files(tmp_path: Path) -> None:
  22. from agent.tools.builtin.file.glob import glob_files
  23. expected = tmp_path / "example.py"
  24. expected.write_text("pass\n", encoding="utf-8")
  25. (tmp_path / "ignored.txt").write_text("ignored\n", encoding="utf-8")
  26. result = await glob_files("*.py", path=str(tmp_path))
  27. assert result.error is None
  28. assert result.metadata["count"] == 1
  29. assert result.output == str(expected)
  30. def test_browser_download_uses_stdlib_url_decode_and_time() -> None:
  31. source_path = (
  32. Path(__file__).parents[1]
  33. / "agent"
  34. / "tools"
  35. / "builtin"
  36. / "browser"
  37. / "downloads.py"
  38. )
  39. tree = ast.parse(source_path.read_text(encoding="utf-8"), filename=str(source_path))
  40. imported_names = {
  41. alias.asname or alias.name
  42. for node in tree.body
  43. if isinstance(node, ast.Import)
  44. for alias in node.names
  45. }
  46. urllib_imports = {
  47. alias.asname or alias.name
  48. for node in tree.body
  49. if isinstance(node, ast.ImportFrom) and node.module == "urllib.parse"
  50. for alias in node.names
  51. }
  52. assert "time" in imported_names
  53. assert "unquote" in urllib_imports
  54. assert "unquote" not in {
  55. alias.name
  56. for node in ast.walk(tree)
  57. if isinstance(node, ast.Import)
  58. for alias in node.names
  59. }