- 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.
200 lines
6.2 KiB
Python
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
|