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"]