2277ac1b8e
CI / lint (pull_request) Failing after 14s
CI / typecheck (pull_request) Successful in 27s
CI / coverage (pull_request) Has been skipped
CI / security (pull_request) Successful in 22s
CI / quality (pull_request) Successful in 15s
CI / integration_tests (pull_request) Failing after 4m37s
CI / build (pull_request) Successful in 16s
CI / lint (push) Failing after 11s
CI / typecheck (push) Successful in 27s
CI / coverage (push) Has been skipped
CI / security (push) Successful in 22s
CI / quality (push) Successful in 15s
CI / unit_tests (pull_request) Successful in 10m13s
CI / docker (pull_request) Has been skipped
CI / integration_tests (push) Failing after 4m42s
CI / build (push) Successful in 14s
CI / unit_tests (push) Successful in 9m56s
CI / docker (push) Has been skipped
160 lines
4.6 KiB
Python
160 lines
4.6 KiB
Python
"""Helper script for Robot Framework built-in file tools smoke tests."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import shutil
|
|
import sys
|
|
import tempfile
|
|
from pathlib import Path
|
|
from typing import Any
|
|
|
|
# Ensure src is importable when run from workspace root
|
|
sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "src"))
|
|
|
|
from cleveragents.tool.builtins import register_file_tools
|
|
from cleveragents.tool.registry import ToolRegistry
|
|
from cleveragents.tool.runner import ToolRunner
|
|
|
|
|
|
def _make_runner(sandbox: str) -> ToolRunner:
|
|
registry = ToolRegistry()
|
|
register_file_tools(registry)
|
|
return ToolRunner(registry)
|
|
|
|
|
|
def test_read() -> None:
|
|
sandbox = tempfile.mkdtemp()
|
|
try:
|
|
(Path(sandbox) / "test.txt").write_text("hello robot")
|
|
runner = _make_runner(sandbox)
|
|
result = runner.execute(
|
|
"builtin/file-read",
|
|
{"path": "test.txt", "sandbox_root": sandbox},
|
|
)
|
|
assert result.success
|
|
assert result.output["content"] == "hello robot"
|
|
print("file-read-ok")
|
|
finally:
|
|
shutil.rmtree(sandbox, ignore_errors=True)
|
|
|
|
|
|
def test_write() -> None:
|
|
sandbox = tempfile.mkdtemp()
|
|
try:
|
|
runner = _make_runner(sandbox)
|
|
result = runner.execute(
|
|
"builtin/file-write",
|
|
{"path": "new.txt", "content": "written", "sandbox_root": sandbox},
|
|
)
|
|
assert result.success
|
|
assert result.output["created"] is True
|
|
assert (Path(sandbox) / "new.txt").read_text() == "written"
|
|
print("file-write-ok")
|
|
finally:
|
|
shutil.rmtree(sandbox, ignore_errors=True)
|
|
|
|
|
|
def test_edit() -> None:
|
|
sandbox = tempfile.mkdtemp()
|
|
try:
|
|
(Path(sandbox) / "edit.txt").write_text("foo bar foo")
|
|
runner = _make_runner(sandbox)
|
|
result = runner.execute(
|
|
"builtin/file-edit",
|
|
{
|
|
"path": "edit.txt",
|
|
"old_text": "foo",
|
|
"new_text": "baz",
|
|
"sandbox_root": sandbox,
|
|
},
|
|
)
|
|
assert result.success
|
|
assert result.output["replacements"] == 1
|
|
print("file-edit-ok")
|
|
finally:
|
|
shutil.rmtree(sandbox, ignore_errors=True)
|
|
|
|
|
|
def test_delete() -> None:
|
|
sandbox = tempfile.mkdtemp()
|
|
try:
|
|
(Path(sandbox) / "bye.txt").write_text("gone")
|
|
runner = _make_runner(sandbox)
|
|
result = runner.execute(
|
|
"builtin/file-delete",
|
|
{"path": "bye.txt", "sandbox_root": sandbox},
|
|
)
|
|
assert result.success
|
|
assert result.output["existed"] is True
|
|
assert not (Path(sandbox) / "bye.txt").exists()
|
|
print("file-delete-ok")
|
|
finally:
|
|
shutil.rmtree(sandbox, ignore_errors=True)
|
|
|
|
|
|
def test_list() -> None:
|
|
sandbox = tempfile.mkdtemp()
|
|
try:
|
|
(Path(sandbox) / "a.txt").write_text("a")
|
|
(Path(sandbox) / "b.txt").write_text("b")
|
|
runner = _make_runner(sandbox)
|
|
result = runner.execute(
|
|
"builtin/file-list",
|
|
{"path": ".", "sandbox_root": sandbox},
|
|
)
|
|
assert result.success
|
|
assert len(result.output["files"]) >= 2
|
|
print("file-list-ok")
|
|
finally:
|
|
shutil.rmtree(sandbox, ignore_errors=True)
|
|
|
|
|
|
def test_search() -> None:
|
|
sandbox = tempfile.mkdtemp()
|
|
try:
|
|
(Path(sandbox) / "data.txt").write_text("needle in haystack\n")
|
|
runner = _make_runner(sandbox)
|
|
result = runner.execute(
|
|
"builtin/file-search",
|
|
{"path": ".", "pattern": "needle", "sandbox_root": sandbox},
|
|
)
|
|
assert result.success
|
|
assert len(result.output["matches"]) >= 1
|
|
print("file-search-ok")
|
|
finally:
|
|
shutil.rmtree(sandbox, ignore_errors=True)
|
|
|
|
|
|
def test_traversal() -> None:
|
|
sandbox = tempfile.mkdtemp()
|
|
try:
|
|
runner = _make_runner(sandbox)
|
|
result = runner.execute(
|
|
"builtin/file-read",
|
|
{"path": "../../etc/passwd", "sandbox_root": sandbox},
|
|
)
|
|
assert not result.success
|
|
assert "traversal" in (result.error or "").lower()
|
|
print("traversal-ok")
|
|
finally:
|
|
shutil.rmtree(sandbox, ignore_errors=True)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
cmd = sys.argv[1] if len(sys.argv) > 1 else "read"
|
|
dispatch: dict[str, Any] = {
|
|
"read": test_read,
|
|
"write": test_write,
|
|
"edit": test_edit,
|
|
"delete": test_delete,
|
|
"list": test_list,
|
|
"search": test_search,
|
|
"traversal": test_traversal,
|
|
}
|
|
fn = dispatch.get(cmd)
|
|
if fn:
|
|
fn()
|
|
else:
|
|
print(f"Unknown command: {cmd}", file=sys.stderr)
|
|
sys.exit(1)
|