import os
import pytest
from crewai_tools import FileReadTool

def test_file_read_tool_constructor():
    """Test FileReadTool initialization with file_path."""
    # Create a temporary test file
    test_file = "/tmp/test_file.txt"
    test_content = "Hello, World!"
    with open(test_file, "w") as f:
        f.write(test_content)

    # Test initialization with file_path
    tool = FileReadTool(file_path=test_file)
    assert tool.file_path == test_file
    assert "test_file.txt" in tool.description

    # Clean up
    os.remove(test_file)

def test_file_read_tool_run():
    """Test FileReadTool _run method with file_path at runtime."""
    # Create a temporary test file
    test_file = "/tmp/test_file.txt"
    test_content = "Hello, World!"
    with open(test_file, "w") as f:
        f.write(test_content)

    # Test reading file with runtime file_path
    tool = FileReadTool()
    result = tool._run(file_path=test_file)
    assert result == test_content

    # Clean up
    os.remove(test_file)

def test_file_read_tool_error_handling():
    """Test FileReadTool error handling."""
    # Test missing file path
    tool = FileReadTool()
    result = tool._run()
    assert "Error: No file path provided" in result

    # Test non-existent file
    result = tool._run(file_path="/nonexistent/file.txt")
    assert "Error: File not found at path:" in result

    # Test permission error (create a file without read permissions)
    test_file = "/tmp/no_permission.txt"
    with open(test_file, "w") as f:
        f.write("test")
    os.chmod(test_file, 0o000)

    result = tool._run(file_path=test_file)
    assert "Error: Permission denied" in result

    # Clean up
    os.chmod(test_file, 0o666)  # Restore permissions to delete
    os.remove(test_file)

def test_file_read_tool_constructor_and_run():
    """Test FileReadTool using both constructor and runtime file paths."""
    # Create two test files
    test_file1 = "/tmp/test1.txt"
    test_file2 = "/tmp/test2.txt"
    content1 = "File 1 content"
    content2 = "File 2 content"

    with open(test_file1, "w") as f1, open(test_file2, "w") as f2:
        f1.write(content1)
        f2.write(content2)

    # Test that constructor file_path works
    tool = FileReadTool(file_path=test_file1)
    result = tool._run()
    assert result == content1

    # Test that runtime file_path overrides constructor
    result = tool._run(file_path=test_file2)
    assert result == content2

    # Clean up
    os.remove(test_file1)
    os.remove(test_file2)
