Files
xixu-me cb5c198d16 Refactor tests and enhance coverage for conflict resolution and edge cases
- Removed outdated tests for missing lines in core.py.
- Added comprehensive tests for conflict resolution functionality, including various resolution strategies and edge cases.
- Improved error handling tests for archive creation and extraction processes.
- Enhanced unit tests for basic functionality and convenience functions with pytest markers.
- Introduced tests for unique filename generation and conflict handling scenarios.
- Added edge case tests for archive extraction and error conditions to improve overall test coverage.
2025-06-04 18:55:53 +08:00

200 lines
6.2 KiB
Python

"""Test configuration and fixtures."""
import os
import tempfile
from pathlib import Path
import pytest
def pytest_configure(config):
"""Configure pytest with custom markers."""
config.addinivalue_line("markers", "unit: Unit tests")
config.addinivalue_line("markers", "integration: Integration tests")
config.addinivalue_line("markers", "cli: CLI interface tests")
config.addinivalue_line("markers", "platform: Platform-specific tests")
config.addinivalue_line("markers", "windows: Windows-specific tests")
config.addinivalue_line("markers", "unix: Unix/Linux-specific tests")
config.addinivalue_line("markers", "slow: Slow running tests")
@pytest.fixture
def temp_dir():
"""Create a temporary directory for tests."""
tmpdir = tempfile.mkdtemp()
try:
yield Path(tmpdir)
finally:
# Robust cleanup for Windows
def cleanup_dir(path):
import shutil
import stat
def handle_remove_readonly(func, path, exc):
"""Error handler for Windows readonly files."""
try:
os.chmod(path, stat.S_IWRITE)
func(path)
except Exception:
pass # If we still can't delete it, ignore
try:
shutil.rmtree(path, onerror=handle_remove_readonly)
except (PermissionError, OSError):
# On Windows, sometimes files are still locked
# Try to clean up what we can
import time
time.sleep(0.1) # Brief pause
try:
shutil.rmtree(path, onerror=handle_remove_readonly)
except Exception:
pass # Final fallback - ignore cleanup errors
cleanup_dir(tmpdir)
@pytest.fixture
def sample_files(temp_dir):
"""Create sample files for testing."""
files = []
# Create a simple text file
text_file = temp_dir / "test.txt"
text_file.write_text("Hello, World!\nThis is a test file.\n")
files.append(text_file)
# Create a binary file
binary_file = temp_dir / "test.bin"
binary_file.write_bytes(b"\x00\x01\x02\x03\x04\x05" * 100)
files.append(binary_file)
# Create a subdirectory with files
subdir = temp_dir / "subdir"
subdir.mkdir()
sub_file = subdir / "sub.txt"
sub_file.write_text("Subdirectory file content\n")
files.append(sub_file)
# Create another subdirectory
subdir2 = temp_dir / "subdir" / "nested"
subdir2.mkdir()
nested_file = subdir2 / "nested.txt"
nested_file.write_text("Nested file content\n")
files.append(nested_file)
return files
@pytest.fixture
def sample_archive_path(temp_dir):
"""Get path for a sample archive."""
return temp_dir / "test.tzst"
@pytest.fixture
def comprehensive_test_files(temp_dir):
"""Create comprehensive test files covering edge cases found during testing."""
files = []
# Empty file
empty_file = temp_dir / "empty_file.txt"
empty_file.touch()
files.append(empty_file)
# File with only whitespace
whitespace_file = temp_dir / "whitespace_only.txt"
whitespace_file.write_text(" \n\t\n \n")
files.append(whitespace_file)
# File with only newlines
newlines_file = temp_dir / "newlines_only.txt"
newlines_file.write_text("\n\n\n\n\n")
files.append(newlines_file)
# Binary file with null bytes
null_bytes_file = temp_dir / "null_bytes.bin"
null_bytes_file.write_bytes(b"\x00\x00\x00\x01\x00\x02\x00\x00\x03")
files.append(null_bytes_file)
# Large text file
large_file = temp_dir / "large_file.txt"
large_content = "This is a large file for testing compression.\n" * 10000
large_file.write_text(large_content)
files.append(large_file)
# Binary data file
binary_data_file = temp_dir / "binary_data.bin"
binary_content = bytes(range(256)) * 100 # 25.6KB of binary data
binary_data_file.write_bytes(binary_content)
files.append(binary_data_file)
# File with spaces and special characters in name
special_chars_file = temp_dir / "file with spaces.txt"
special_chars_file.write_text("File with special characters in name")
files.append(special_chars_file)
# Unicode content file (should work on all platforms)
unicode_content_file = temp_dir / "unicode_content.txt"
unicode_content_file.write_text("Hello 世界! 🌍", encoding="utf-8")
files.append(unicode_content_file)
# Create nested directory structure
nested_dir = temp_dir / "nested" / "very" / "deep" / "directory"
nested_dir.mkdir(parents=True, exist_ok=True)
nested_file = nested_dir / "deepest_file.txt"
nested_file.write_text("File in deeply nested structure")
files.append(nested_file)
return files
@pytest.fixture
def platform_specific_files(temp_dir):
"""Create platform-specific test files."""
files = []
if os.name == "posix": # Unix/Linux
# Create executable file
script_file = temp_dir / "test_script.sh"
script_file.write_text("#!/bin/bash\necho 'Hello World'\n")
try:
script_file.chmod(0o755)
files.append(script_file)
except OSError:
pass
# Create symlink if possible
target_file = temp_dir / "symlink_target.txt"
target_file.write_text("Symlink target content")
files.append(target_file)
symlink_file = temp_dir / "test_symlink.txt"
try:
symlink_file.symlink_to(target_file)
files.append(symlink_file)
except OSError:
pass
return files
@pytest.fixture
def compression_test_files(temp_dir):
"""Create files for testing different compression levels."""
files = []
# Highly compressible file (repetitive content)
compressible_file = temp_dir / "highly_compressible.txt"
compressible_content = "A" * 5000 + "B" * 5000 + "C" * 5000
compressible_file.write_text(compressible_content)
files.append(compressible_file)
# Poorly compressible file (pseudo-random data)
random_file = temp_dir / "poorly_compressible.bin"
random_data = bytes((i * 7 + 23) % 256 for i in range(15000))
random_file.write_bytes(random_data)
files.append(random_file)
return files