Initial import: Music_Server, MusicFree, catalog-sync
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
import io
|
||||
import tempfile
|
||||
import unittest
|
||||
import zipfile
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
|
||||
|
||||
class ExportBundlesTests(unittest.TestCase):
|
||||
def _prepare_playlist_dir(self, root: Path, dirname: str) -> Path:
|
||||
playlist_dir = root / dirname
|
||||
covers_dir = playlist_dir / "covers"
|
||||
covers_dir.mkdir(parents=True, exist_ok=True)
|
||||
(playlist_dir / "playlist.yaml").write_text("playlist_id: 1\n", encoding="utf-8")
|
||||
(playlist_dir / ".playlist_meta.json").write_text('{"playlist_id": 1}', encoding="utf-8")
|
||||
(covers_dir / "playlist-cover.jpg").write_bytes(b"cover")
|
||||
return playlist_dir
|
||||
|
||||
def test_create_single_playlist_bundle_includes_playlist_dir_files(self):
|
||||
from musicdl.catalogsync.export_bundles import create_single_playlist_bundle
|
||||
|
||||
with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmpdir:
|
||||
root = Path(tmpdir)
|
||||
playlist_dir = self._prepare_playlist_dir(root, "Playlist One_101")
|
||||
bundle_root = root / "bundles"
|
||||
|
||||
bundle_path = create_single_playlist_bundle(
|
||||
playlist_dir=playlist_dir,
|
||||
bundle_root=bundle_root,
|
||||
platform="qq",
|
||||
playlist_id=101,
|
||||
playlist_name="Playlist One",
|
||||
)
|
||||
|
||||
self.assertTrue(bundle_path.exists())
|
||||
self.assertEqual("playlist-qq-101-Playlist One.zip", bundle_path.name)
|
||||
self.assertEqual(bundle_root.resolve(), bundle_path.parent.resolve())
|
||||
with zipfile.ZipFile(bundle_path, "r") as archive:
|
||||
members = set(archive.namelist())
|
||||
self.assertIn("Playlist One_101/playlist.yaml", members)
|
||||
self.assertIn("Playlist One_101/.playlist_meta.json", members)
|
||||
self.assertIn("Playlist One_101/covers/playlist-cover.jpg", members)
|
||||
|
||||
def test_create_multi_playlist_bundle_wraps_under_playlists_root(self):
|
||||
from musicdl.catalogsync.export_bundles import create_multi_playlist_bundle
|
||||
|
||||
with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmpdir:
|
||||
root = Path(tmpdir)
|
||||
playlist_dir_a = self._prepare_playlist_dir(root, "Playlist A_201")
|
||||
playlist_dir_b = self._prepare_playlist_dir(root, "Playlist B_202")
|
||||
bundle_root = root / "bundles"
|
||||
|
||||
bundle_path = create_multi_playlist_bundle(
|
||||
playlist_dirs=[playlist_dir_a, playlist_dir_b],
|
||||
bundle_root=bundle_root,
|
||||
created_at=datetime(2026, 4, 19, 12, 34, 56),
|
||||
)
|
||||
|
||||
self.assertTrue(bundle_path.exists())
|
||||
self.assertTrue(bundle_path.name.endswith("playlists-export-20260419-123456.zip"))
|
||||
self.assertEqual(bundle_root.resolve(), bundle_path.parent.resolve())
|
||||
with zipfile.ZipFile(io.BytesIO(bundle_path.read_bytes()), "r") as archive:
|
||||
members = set(archive.namelist())
|
||||
self.assertIn("playlists/Playlist A_201/playlist.yaml", members)
|
||||
self.assertIn("playlists/Playlist B_202/.playlist_meta.json", members)
|
||||
|
||||
def test_create_multi_playlist_bundle_uses_unique_storage_path_for_same_timestamp(self):
|
||||
from musicdl.catalogsync.export_bundles import create_multi_playlist_bundle
|
||||
|
||||
with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as tmpdir:
|
||||
root = Path(tmpdir)
|
||||
playlist_dir_a = self._prepare_playlist_dir(root, "Playlist A_201")
|
||||
playlist_dir_b = self._prepare_playlist_dir(root, "Playlist B_202")
|
||||
bundle_root = root / "bundles"
|
||||
created_at = datetime(2026, 4, 19, 12, 34, 56)
|
||||
|
||||
first_path = create_multi_playlist_bundle(
|
||||
playlist_dirs=[playlist_dir_a, playlist_dir_b],
|
||||
bundle_root=bundle_root,
|
||||
created_at=created_at,
|
||||
)
|
||||
second_path = create_multi_playlist_bundle(
|
||||
playlist_dirs=[playlist_dir_a, playlist_dir_b],
|
||||
bundle_root=bundle_root,
|
||||
created_at=created_at,
|
||||
)
|
||||
|
||||
self.assertNotEqual(first_path, second_path)
|
||||
self.assertTrue(first_path.exists())
|
||||
self.assertTrue(second_path.exists())
|
||||
self.assertTrue(first_path.name.endswith("playlists-export-20260419-123456.zip"))
|
||||
self.assertTrue(second_path.name.endswith("playlists-export-20260419-123456.zip"))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user