"""Unit tests for data models."""
import os
import tempfile
from pathlib import Path
from unittest.mock import patch, MagicMock
import pytest
from file_system_mcp_server.models import (
FileMetadata,
ErrorResponse,
FileReadResult,
FileWriteResult,
DirectoryEntry,
DirectoryListResult,
FileDeleteResult,
FileInfoResult
)
class TestFileMetadata:
"""Test the FileMetadata class."""
def test_file_metadata_creation(self):
"""Test creating FileMetadata manually."""
metadata = FileMetadata(
size=1024,
modified_time="2023-01-01T12:00:00",
permissions="0o644",
is_directory=False,
mime_type="text/plain"
)
assert metadata.size == 1024
assert metadata.modified_time == "2023-01-01T12:00:00"
assert metadata.permissions == "0o644"
assert metadata.is_directory is False
assert metadata.mime_type == "text/plain"
def test_from_path_file(self):
"""Test creating FileMetadata from a real file."""
with tempfile.NamedTemporaryFile(mode='w', delete=False) as f:
f.write("test content")
temp_path = f.name
try:
metadata = FileMetadata.from_path(temp_path, "text/plain")
assert metadata.size > 0
assert metadata.modified_time is not None
assert metadata.permissions is not None
assert metadata.is_directory is False
assert metadata.mime_type == "text/plain"
assert metadata.created_time is not None
assert metadata.accessed_time is not None
finally:
os.unlink(temp_path)
def test_from_path_directory(self):
"""Test creating FileMetadata from a directory."""
with tempfile.TemporaryDirectory() as temp_dir:
metadata = FileMetadata.from_path(temp_dir, "directory")
assert metadata.is_directory is True
assert metadata.mime_type == "directory"
assert metadata.size >= 0
def test_from_path_nonexistent(self):
"""Test creating FileMetadata from nonexistent path."""
with pytest.raises(ValueError, match="Cannot get metadata"):
FileMetadata.from_path("/nonexistent/path")
class TestErrorResponse:
"""Test the ErrorResponse class."""
def test_error_response_basic(self):
"""Test basic ErrorResponse creation."""
error = ErrorResponse(
error_type="FileNotFound",
message="File does not exist"
)
assert error.error_type == "FileNotFound"
assert error.message == "File does not exist"
assert error.details is None
assert error.recovery_suggestions is None
def test_error_response_with_details(self):
"""Test ErrorResponse with details and suggestions."""
error = ErrorResponse(
error_type="PermissionError",
message="Access denied",
details={"path": "/protected/file", "required_permission": "write"},
recovery_suggestions=["Check file permissions", "Run as administrator"]
)
assert error.error_type == "PermissionError"
assert error.message == "Access denied"
assert error.details["path"] == "/protected/file"
assert "Check file permissions" in error.recovery_suggestions
def test_to_dict(self):
"""Test ErrorResponse to_dict conversion."""
error = ErrorResponse(
error_type="TestError",
message="Test message",
details={"key": "value"},
recovery_suggestions=["suggestion1", "suggestion2"]
)
result = error.to_dict()
assert result["error_type"] == "TestError"
assert result["message"] == "Test message"
assert result["details"]["key"] == "value"
assert result["recovery_suggestions"] == ["suggestion1", "suggestion2"]
class TestFileReadResult:
"""Test the FileReadResult class."""
def test_successful_read_result(self):
"""Test successful file read result."""
metadata = FileMetadata(
size=100,
modified_time="2023-01-01T12:00:00",
permissions="0o644",
is_directory=False,
mime_type="text/plain"
)
result = FileReadResult(
content="file content",
metadata=metadata,
success=True,
encoding="utf-8"
)
assert result.content == "file content"
assert result.metadata == metadata
assert result.success is True
assert result.error is None
assert result.encoding == "utf-8"
def test_failed_read_result(self):
"""Test failed file read result."""
error = ErrorResponse(
error_type="FileNotFound",
message="File does not exist"
)
result = FileReadResult(
content=None,
metadata=None,
success=False,
error=error
)
assert result.content is None
assert result.metadata is None
assert result.success is False
assert result.error == error
def test_to_dict(self):
"""Test FileReadResult to_dict conversion."""
metadata = FileMetadata(
size=100,
modified_time="2023-01-01T12:00:00",
permissions="0o644",
is_directory=False,
mime_type="text/plain"
)
result = FileReadResult(
content="test",
metadata=metadata,
success=True,
encoding="utf-8"
)
dict_result = result.to_dict()
assert dict_result["success"] is True
assert dict_result["content"] == "test"
assert dict_result["encoding"] == "utf-8"
assert dict_result["metadata"]["size"] == 100
class TestFileWriteResult:
"""Test the FileWriteResult class."""
def test_successful_write_result(self):
"""Test successful file write result."""
metadata = FileMetadata(
size=100,
modified_time="2023-01-01T12:00:00",
permissions="0o644",
is_directory=False,
mime_type="text/plain"
)
result = FileWriteResult(
path="/test/file.txt",
metadata=metadata,
success=True,
bytes_written=100
)
assert result.path == "/test/file.txt"
assert result.metadata == metadata
assert result.success is True
assert result.bytes_written == 100
def test_to_dict(self):
"""Test FileWriteResult to_dict conversion."""
metadata = FileMetadata(
size=100,
modified_time="2023-01-01T12:00:00",
permissions="0o644",
is_directory=False,
mime_type="text/plain"
)
result = FileWriteResult(
path="/test/file.txt",
metadata=metadata,
success=True,
backup_created="/backup/file.txt.bak",
bytes_written=100
)
dict_result = result.to_dict()
assert dict_result["path"] == "/test/file.txt"
assert dict_result["success"] is True
assert dict_result["backup_created"] == "/backup/file.txt.bak"
assert dict_result["bytes_written"] == 100
class TestDirectoryEntry:
"""Test the DirectoryEntry class."""
def test_directory_entry(self):
"""Test DirectoryEntry creation and conversion."""
metadata = FileMetadata(
size=0,
modified_time="2023-01-01T12:00:00",
permissions="0o755",
is_directory=True,
mime_type="directory"
)
entry = DirectoryEntry(
name="test_dir",
path="/path/to/test_dir",
metadata=metadata
)
assert entry.name == "test_dir"
assert entry.path == "/path/to/test_dir"
assert entry.metadata.is_directory is True
dict_result = entry.to_dict()
assert dict_result["name"] == "test_dir"
assert dict_result["path"] == "/path/to/test_dir"
assert dict_result["metadata"]["is_directory"] is True
class TestDirectoryListResult:
"""Test the DirectoryListResult class."""
def test_directory_list_result(self):
"""Test DirectoryListResult creation and conversion."""
metadata = FileMetadata(
size=100,
modified_time="2023-01-01T12:00:00",
permissions="0o644",
is_directory=False,
mime_type="text/plain"
)
entry = DirectoryEntry(
name="file.txt",
path="/path/to/file.txt",
metadata=metadata
)
result = DirectoryListResult(
path="/path/to",
entries=[entry],
success=True,
total_entries=5,
filtered_entries=1,
pattern_used="*.txt",
recursive=True
)
assert result.path == "/path/to"
assert len(result.entries) == 1
assert result.success is True
assert result.total_entries == 5
assert result.filtered_entries == 1
assert result.pattern_used == "*.txt"
assert result.recursive is True
dict_result = result.to_dict()
assert dict_result["path"] == "/path/to"
assert len(dict_result["entries"]) == 1
assert dict_result["pattern_used"] == "*.txt"