import os import tempfile import unittest from pathlib import Path from backend.app.scanner import probe_local_assets class ScannerAssetProbeTests(unittest.TestCase): def setUp(self): self.temp_dir = tempfile.TemporaryDirectory() self.library_dir = Path(self.temp_dir.name) def tearDown(self): self.temp_dir.cleanup() def test_probe_local_assets_supports_cover_jpeg(self): audio_path = self._create_file('album/track.flac') cover_path = self._create_file('album/cover.jpeg') assets = probe_local_assets(audio_path) self.assertEqual(assets['local_cover'], str(cover_path.resolve())) self.assertIsNone(assets['local_lyric']) def test_probe_local_assets_supports_folder_webp(self): audio_path = self._create_file('album/track.flac') cover_path = self._create_file('album/folder.webp') assets = probe_local_assets(audio_path) self.assertEqual(assets['local_cover'], str(cover_path.resolve())) def test_probe_local_assets_matches_track_name_case_insensitively(self): audio_path = self._create_file('album/Track.FLAC') cover_path = self._create_file('album/track.JPEG') lyric_path = self._create_file('album/TRACK.LRC', '[00:00.00] lyric') assets = probe_local_assets(audio_path) self.assertEqual(assets['local_cover'], str(cover_path.resolve())) self.assertEqual(assets['local_lyric'], str(lyric_path.resolve())) def test_probe_local_assets_respects_cover_priority(self): audio_path = self._create_file('album/song.flac') self._create_file('album/song.jpg') self._create_file('album/folder.jpg') preferred_cover = self._create_file('album/cover.png') self._create_file('album/cover.webp') assets = probe_local_assets(audio_path) self.assertEqual(assets['local_cover'], str(preferred_cover.resolve())) def test_probe_local_assets_ignores_symlink_covers(self): audio_path = self._create_file('album/song.flac') fallback_cover = self._create_file('album/folder.webp') target_path = self._create_file('targets/real-cover.jpeg') symlink_path = self.library_dir / 'album' / 'cover.jpeg' symlink_path.parent.mkdir(parents=True, exist_ok=True) os.symlink(target_path, symlink_path) assets = probe_local_assets(audio_path) self.assertEqual(assets['local_cover'], str(fallback_cover.resolve())) def _create_file(self, relative_path: str, content: str = '') -> Path: path = self.library_dir / relative_path path.parent.mkdir(parents=True, exist_ok=True) path.write_text(content, encoding='utf-8') return path if __name__ == '__main__': unittest.main()