93 lines
2.9 KiB
Python
93 lines
2.9 KiB
Python
import pytest
|
|
|
|
from ra_aid.tools import read_file_tool
|
|
|
|
|
|
def test_basic_file_reading(tmp_path):
|
|
"""Test basic file reading functionality"""
|
|
# Create a test file
|
|
test_file = tmp_path / "test.txt"
|
|
test_content = "Hello\nWorld\n"
|
|
test_file.write_text(test_content)
|
|
|
|
# Read the file
|
|
result = read_file_tool.invoke({"filepath": str(test_file)})
|
|
|
|
# Verify return format and content
|
|
assert isinstance(result, dict)
|
|
assert "content" in result
|
|
assert result["content"] == test_content
|
|
|
|
|
|
def test_no_truncation(tmp_path):
|
|
"""Test that files under max_lines are not truncated"""
|
|
# Create a test file with content under the limit
|
|
test_file = tmp_path / "small.txt"
|
|
line_count = 4000 # Well under 5000 limit
|
|
test_content = "line\n" * line_count
|
|
test_file.write_text(test_content)
|
|
|
|
# Read the file
|
|
result = read_file_tool.invoke({"filepath": str(test_file)})
|
|
|
|
# Verify no truncation occurred
|
|
assert isinstance(result, dict)
|
|
assert "[lines of output truncated]" not in result["content"]
|
|
assert len(result["content"].splitlines()) == line_count
|
|
|
|
|
|
def test_with_truncation(tmp_path):
|
|
"""Test that files over max_lines are properly truncated"""
|
|
# Create a test file exceeding the limit
|
|
test_file = tmp_path / "large.txt"
|
|
line_count = 6000 # Exceeds 5000 limit
|
|
test_content = "line\n" * line_count
|
|
test_file.write_text(test_content)
|
|
|
|
# Read the file
|
|
result = read_file_tool.invoke({"filepath": str(test_file)})
|
|
|
|
# Verify truncation occurred correctly
|
|
assert isinstance(result, dict)
|
|
assert "[1000 lines of output truncated]" in result["content"]
|
|
assert (
|
|
len(result["content"].splitlines()) == 5001
|
|
) # 5000 content lines + 1 truncation message
|
|
|
|
|
|
def test_nonexistent_file():
|
|
"""Test error handling for non-existent files"""
|
|
with pytest.raises(FileNotFoundError):
|
|
read_file_tool.invoke({"filepath": "/nonexistent/file.txt"})
|
|
|
|
|
|
def test_empty_file(tmp_path):
|
|
"""Test reading an empty file"""
|
|
# Create an empty test file
|
|
test_file = tmp_path / "empty.txt"
|
|
test_file.write_text("")
|
|
|
|
# Read the file
|
|
result = read_file_tool.invoke({"filepath": str(test_file)})
|
|
|
|
# Verify return format and empty content
|
|
assert isinstance(result, dict)
|
|
assert "content" in result
|
|
assert result["content"] == ""
|
|
|
|
|
|
def test_binary_file_detection(tmp_path):
|
|
"""Test that binary files are detected and not read"""
|
|
# Create a binary file with null bytes
|
|
test_file = tmp_path / "binary.bin"
|
|
with open(test_file, "wb") as f:
|
|
f.write(b"Some text with \x00 null bytes \x00 to make it binary")
|
|
|
|
# Try to read the binary file
|
|
result = read_file_tool.invoke({"filepath": str(test_file)})
|
|
|
|
# Verify that the tool detected it as a binary file
|
|
assert isinstance(result, dict)
|
|
assert "error" in result
|
|
assert "read_file failed because we cannot read binary files" == result["error"]
|