"""Cache-key golden rules: keyed by pixel hash + size + version, so identity changes invalidate and EXIF-only changes reuse.""" from photo_pipeline.models import Asset from photo_pipeline.services.thumbnails import THUMB_VERSION, ThumbnailService def _asset(pixel=None, sha="deadbeef"): return Asset( id="a1", original_path="a.jpg", current_path="a.jpg", current_sha256=sha, pixel_sha256=pixel, hash_version=1, ) def test_key_is_pixel_size_and_version(): key = ThumbnailService._cache_key(_asset(pixel="PIX"), 512) assert key == f"PIX-512-v{THUMB_VERSION}" def test_different_size_changes_key(): asset = _asset(pixel="PIX") assert ThumbnailService._cache_key(asset, 256) != ThumbnailService._cache_key(asset, 512) def test_different_pixels_change_key(): assert ThumbnailService._cache_key(_asset(pixel="P1"), 512) != ThumbnailService._cache_key( _asset(pixel="P2"), 512 ) def test_undecodable_asset_keys_by_source_bytes(): key = ThumbnailService._cache_key(_asset(pixel=None, sha="abc123"), 256) assert key == f"src:abc123-256-v{THUMB_VERSION}"