mirror of
https://github.com/shadoll/moma.git
synced 2026-08-28 19:43:28 +00:00
- Added core caching functionality with `Cache` class supporting in-memory and file-based caching. - Introduced `CacheManager` for high-level cache operations and statistics. - Created various cache key generation strategies: `FilepathMethodStrategy`, `APIRequestStrategy`, `SimpleKeyStrategy`, and `CustomStrategy`. - Developed decorators for easy method caching: `cached`, `cached_method`, `cached_api`, and `cached_property`. - Implemented type definitions for cache entries and statistics. - Added comprehensive tests for cache operations, strategies, and decorators to ensure functionality and backward compatibility.
85 lines
3.3 KiB
Python
85 lines
3.3 KiB
Python
import pytest
|
|
from pathlib import Path
|
|
from unittest.mock import MagicMock
|
|
from renamer.extractors.mediainfo_extractor import MediaInfoExtractor
|
|
import json
|
|
|
|
|
|
class TestMediaInfoExtractor:
|
|
@pytest.fixture
|
|
def extractor(self, test_file):
|
|
return MediaInfoExtractor(test_file)
|
|
|
|
@pytest.fixture
|
|
def test_file(self):
|
|
"""Use the filenames.txt file for testing"""
|
|
return Path(__file__).parent / "filenames.txt"
|
|
|
|
@pytest.fixture
|
|
def frame_class_cases(self):
|
|
"""Load test cases for frame class extraction"""
|
|
# Try the expected file first, fallback to the main frame class test file
|
|
cases_file = Path(__file__).parent / "test_mediainfo_frame_class_cases.json"
|
|
if not cases_file.exists():
|
|
cases_file = Path(__file__).parent / "test_mediainfo_frame_class.json"
|
|
|
|
if not cases_file.exists():
|
|
pytest.skip(f"Test case file not found: {cases_file}")
|
|
|
|
with open(cases_file, 'r') as f:
|
|
return json.load(f)
|
|
|
|
def test_extract_resolution(self, extractor, test_file):
|
|
"""Test extracting resolution from media info"""
|
|
resolution = extractor.extract_resolution()
|
|
# Text files don't have video resolution
|
|
assert resolution is None
|
|
|
|
def test_extract_hdr(self, extractor, test_file):
|
|
"""Test extracting HDR info"""
|
|
hdr = extractor.extract_hdr()
|
|
# Text files don't have HDR
|
|
assert hdr is None
|
|
|
|
def test_extract_audio_langs(self, extractor, test_file):
|
|
"""Test extracting audio languages"""
|
|
langs = extractor.extract_audio_langs()
|
|
# Text files don't have audio tracks
|
|
assert langs is None
|
|
|
|
def test_extract_anamorphic(self, extractor, test_file):
|
|
"""Test extracting anamorphic info"""
|
|
anamorphic = extractor.extract_anamorphic()
|
|
# Text files don't have video tracks
|
|
assert anamorphic is None
|
|
|
|
def test_extract_extension(self, extractor, test_file):
|
|
"""Test extracting extension"""
|
|
extension = extractor.extract_extension()
|
|
# For text file, should return None since no media info
|
|
assert extension is None
|
|
|
|
def test_is_3d(self, extractor, test_file):
|
|
"""Test checking if video is 3D"""
|
|
is_3d = extractor.is_3d()
|
|
# Text files don't have video tracks
|
|
assert is_3d is False
|
|
|
|
def test_extract_frame_class_parametrized(self, frame_class_cases):
|
|
"""Test extracting frame class from various resolutions using fixture"""
|
|
for case in frame_class_cases:
|
|
# Create a mock extractor with the test resolution
|
|
extractor = MagicMock(spec=MediaInfoExtractor)
|
|
extractor.file_path = Path(f"test_{case['testname']}")
|
|
|
|
# Mock the video_tracks with proper attributes
|
|
mock_track = MagicMock()
|
|
mock_track.height = case["resolution"][1]
|
|
mock_track.width = case["resolution"][0]
|
|
mock_track.interlaced = 'Yes' if case["interlaced"] else 'No'
|
|
|
|
extractor.video_tracks = [mock_track]
|
|
|
|
# Call the actual method
|
|
result = MediaInfoExtractor.extract_frame_class(extractor)
|
|
assert result == case["expected_frame_class"], f"Failed for {case['testname']}: expected {case['expected_frame_class']}, got {result}" |