import pytest import os import tempfile from pr.tools.filesystem import read_file, write_file, list_directory, search_replace from pr.tools.patch import apply_patch, create_diff from pr.tools.base import get_tools_definition 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'] 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 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