import os
import tempfile
from pr.tools.base import get_tools_definition
from pr.tools.command import run_command
from pr.tools.filesystem import chdir, getpwd, list_directory, read_file, search_replace, write_file
from pr.tools.interactive_control import start_interactive_session
from pr.tools.patch import apply_patch, create_diff
from pr.tools.python_exec import python_exec
class TestFilesystemTools:
def test_write_and_read_file(self, temp_dir):
filepath = os.path.join(temp_dir, "test.txt")
content = "Hello, World!"
write_result = write_file(filepath, content)
assert write_result["status"] == "success"
read_result = read_file(filepath)
assert read_result["status"] == "success"
assert content in read_result["content"]
def test_read_nonexistent_file(self):
result = read_file("/nonexistent/path/file.txt")
assert result["status"] == "error"
def test_list_directory(self, temp_dir):
test_file = os.path.join(temp_dir, "testfile.txt")
with open(test_file, "w") as f:
f.write("test")
result = list_directory(temp_dir)
assert result["status"] == "success"
assert any(item["name"] == "testfile.txt" for item in result["items"])
def test_search_replace(self, temp_dir):
filepath = os.path.join(temp_dir, "test.txt")
content = "Hello, World!"
with open(filepath, "w") as f:
f.write(content)
result = search_replace(filepath, "World", "Universe")
assert result["status"] == "success"
read_result = read_file(filepath)
assert "Hello, Universe!" in read_result["content"]
def test_chdir_and_getpwd(self):
original_cwd = getpwd()["path"]
try:
with tempfile.TemporaryDirectory() as temp_dir:
result = chdir(temp_dir)
assert result["status"] == "success"
assert getpwd()["path"] == temp_dir
finally:
chdir(original_cwd)
class TestCommandTools:
def test_run_command_with_cwd(self):
with tempfile.TemporaryDirectory() as temp_dir:
result = run_command("pwd", cwd=temp_dir)
assert result["status"] == "success"
assert temp_dir in result["stdout"].strip()
def test_run_command_basic(self):
result = run_command("echo hello")
assert result["status"] == "success"
assert "hello" in result["stdout"]
class TestInteractiveSessionTools:
def test_start_interactive_session_with_cwd(self):
with tempfile.TemporaryDirectory() as temp_dir:
session_name = start_interactive_session("pwd", cwd=temp_dir)
assert session_name is not None
# Note: In a real test, we'd need to interact with the session, but for now just check it starts
class TestPythonExecTools:
def test_python_exec_with_cwd(self):
with tempfile.TemporaryDirectory() as temp_dir:
code = "import os; print(os.getcwd())"
result = python_exec(code, {}, cwd=temp_dir)
assert result["status"] == "success"
assert temp_dir in result["output"].strip()
def test_python_exec_basic(self):
result = python_exec("print('hello')", {})
assert result["status"] == "success"
assert "hello" in result["output"]
class TestPatchTools:
def test_create_diff(self, temp_dir):
file1 = os.path.join(temp_dir, "file1.txt")
file2 = os.path.join(temp_dir, "file2.txt")
with open(file1, "w") as f:
f.write("line1\nline2\nline3\n")
with open(file2, "w") as f:
f.write("line1\nline2 modified\nline3\n")
result = create_diff(file1, file2)
assert result["status"] == "success"
assert "line2" in result["diff"]
assert "line2 modified" in result["diff"]
def test_apply_patch(self, temp_dir):
filepath = os.path.join(temp_dir, "file.txt")
with open(filepath, "w") as f:
f.write("line1\nline2\nline3\n")
# Create a simple patch
patch_content = """--- a/file.txt
+++ b/file.txt
@@ -1,3 +1,3 @@
line1
-line2
+line2 modified
line3
"""
result = apply_patch(filepath, patch_content)
assert result["status"] == "success"
read_result = read_file(filepath)
assert "line2 modified" in read_result["content"]
class TestToolDefinitions:
def test_get_tools_definition_returns_list(self):
tools = get_tools_definition()
assert isinstance(tools, list)
assert len(tools) > 0
def test_all_tools_have_required_fields(self):
tools = get_tools_definition()
for tool in tools:
assert "type" in tool
assert tool["type"] == "function"
assert "function" in tool
func = tool["function"]
assert "name" in func
assert "description" in func
assert "parameters" in func
def test_filesystem_tools_present(self):
tools = get_tools_definition()
tool_names = [t["function"]["name"] for t in tools]
assert "read_file" in tool_names
assert "write_file" in tool_names
assert "list_directory" in tool_names
assert "search_replace" in tool_names
assert "chdir" in tool_names
assert "getpwd" in tool_names
def test_command_tools_present(self):
tools = get_tools_definition()
tool_names = [t["function"]["name"] for t in tools]
assert "run_command" in tool_names
def test_python_exec_present(self):
tools = get_tools_definition()
tool_names = [t["function"]["name"] for t in tools]
assert "python_exec" in tool_names
def test_patch_tools_present(self):
tools = get_tools_definition()
tool_names = [t["function"]["name"] for t in tools]
assert "apply_patch" in tool_names
assert "create_diff" in tool_names