mcp-server-code-assist
by abhishekbhakat
Verified
- tests
import os
from pathlib import Path
import pytest
from mcp_server_code_assist.tools.file_tools import FileTools
TEST_DIR = Path(__file__).parent / "test_data"
@pytest.fixture
def file_tools():
TEST_DIR.mkdir(exist_ok=True)
tools = FileTools(allowed_paths=[str(TEST_DIR)])
yield tools
for item in TEST_DIR.glob("*"):
if item.is_file():
item.unlink()
elif item.is_dir():
import shutil
shutil.rmtree(item)
TEST_DIR.rmdir()
@pytest.mark.asyncio
async def test_validate_path(file_tools):
valid_path = TEST_DIR / "test.txt"
validated = await file_tools.validate_path(str(valid_path))
assert os.path.normpath(validated) == os.path.normpath(str(valid_path))
with pytest.raises(ValueError):
await file_tools.validate_path("/invalid/path/outside")
@pytest.mark.asyncio
async def test_write_file(file_tools):
test_file = TEST_DIR / "test.txt"
content = "test content"
await file_tools.write_file(str(test_file), content)
assert test_file.exists()
assert test_file.read_text() == content
@pytest.mark.asyncio
async def test_read_file(file_tools):
test_file = TEST_DIR / "test.txt"
content = "test content"
test_file.write_text(content)
assert await file_tools.read_file(str(test_file)) == content
@pytest.mark.asyncio
async def test_create_delete_file(file_tools):
test_file = TEST_DIR / "new_file.txt"
content = "new content"
# Test create
await file_tools.create_file(str(test_file), content)
assert test_file.exists()
assert test_file.read_text() == content
# Test delete
result = await file_tools.delete_file(str(test_file))
assert "Moved file to trash" in result
assert not test_file.exists()
# Verify file is in trash
trash_dir = TEST_DIR / ".mcp_server_code_assist_trash"
assert trash_dir.exists()
trash_files = list(trash_dir.glob("new_file.txt_*"))
assert len(trash_files) == 1
assert trash_files[0].read_text() == content
@pytest.mark.asyncio
async def test_modify_file(file_tools):
test_file = TEST_DIR / "modify.txt"
content = "Hello world!"
await file_tools.write_file(str(test_file), content)
replacements = {"world": "Python"}
diff = await file_tools.modify_file(str(test_file), replacements)
assert "Hello Python!" == await file_tools.read_file(str(test_file))
assert "-Hello world!" in diff
assert "+Hello Python!" in diff
@pytest.mark.asyncio
async def test_rewrite_file(file_tools):
test_file = TEST_DIR / "rewrite.txt"
original = "Original content"
new_content = "New content"
await file_tools.write_file(str(test_file), original)
diff = await file_tools.rewrite_file(str(test_file), new_content)
assert new_content == await file_tools.read_file(str(test_file))
assert "-Original content" in diff
assert "+New content" in diff
@pytest.mark.asyncio
async def test_file_tree(file_tools):
# Create test structure
(TEST_DIR / "dir1").mkdir()
await file_tools.write_file(str(TEST_DIR / "dir1/file1.txt"), "content1")
await file_tools.write_file(str(TEST_DIR / "dir1/file2.txt"), "content2")
(TEST_DIR / "dir1/subdir").mkdir()
await file_tools.write_file(str(TEST_DIR / "dir1/subdir/file3.txt"), "content3")
tree = await file_tools.file_tree(str(TEST_DIR))
assert "dir1" in tree
assert "file1.txt" in tree
assert "file2.txt" in tree
assert "subdir" in tree
assert "file3.txt" in tree