Musiksammlung/tests/test_playlist.py

100 lines
3.2 KiB
Python
Raw Normal View History

"""Tests für die Playlist-Generierung."""
from pathlib import Path
from musiksammlung.models import Album, Disc, Track
from musiksammlung.playlist import generate_playlist
def _make_album(n_tracks: int = 2, n_discs: int = 1) -> Album:
discs = [
Disc(
disc_number=d,
tracks=[
Track(track_number=i, title=f"Disc{d} Song {i}") for i in range(1, n_tracks + 1)
],
)
for d in range(1, n_discs + 1)
]
return Album(artist="Artist", album="TestAlbum", year=2000, discs=discs)
def test_generate_playlist_single_disc(tmp_path: Path):
"""M3U für Single-CD: keine CD-Prefix, korrekte Dateinamen."""
album = _make_album(n_tracks=2, n_discs=1)
# Dummy-Audiodateien im Schema 01_-_Titel_-_Künstler
(tmp_path / "01_-_Disc1_Song_1_-_Artist.flac").touch()
(tmp_path / "02_-_Disc1_Song_2_-_Artist.flac").touch()
playlist_path = generate_playlist(album, tmp_path)
assert playlist_path.exists()
content = playlist_path.read_text()
assert "#EXTM3U" in content
assert "01_-_Disc1_Song_1_-_Artist.flac" in content
assert "02_-_Disc1_Song_2_-_Artist.flac" in content
# Kein CD-Prefix bei Single-Disc
assert "CD1/" not in content
def test_generate_playlist_multi_disc(tmp_path: Path):
"""M3U für Multi-CD: CD-Prefix in Pfaden."""
album = _make_album(n_tracks=2, n_discs=2)
cd1 = tmp_path / "CD1"
cd2 = tmp_path / "CD2"
cd1.mkdir()
cd2.mkdir()
(cd1 / "01_-_Disc1_Song_1_-_Artist.flac").touch()
(cd1 / "02_-_Disc1_Song_2_-_Artist.flac").touch()
(cd2 / "01_-_Disc2_Song_1_-_Artist.flac").touch()
(cd2 / "02_-_Disc2_Song_2_-_Artist.flac").touch()
playlist_path = generate_playlist(album, tmp_path)
content = playlist_path.read_text()
assert "CD1/01_-_Disc1_Song_1_-_Artist.flac" in content
assert "CD2/01_-_Disc2_Song_1_-_Artist.flac" in content
def test_generate_playlist_filename(tmp_path: Path):
"""Playlist-Dateiname ist sanitierter Albumname."""
album = Album(
artist="A",
album="Mein Album",
discs=[Disc(disc_number=1, tracks=[Track(track_number=1, title="Song")])],
)
playlist_path = generate_playlist(album, tmp_path)
assert playlist_path.name == "Mein_Album.m3u"
def test_generate_playlist_extinf_contains_title(tmp_path: Path):
"""#EXTINF-Einträge enthalten den originalen Titel."""
album = Album(
artist="A",
album="X",
discs=[
Disc(
disc_number=1,
tracks=[Track(track_number=1, title="Für Elise")],
)
],
)
(tmp_path / "01_-_Für_Elise_-_A.flac").touch()
playlist_path = generate_playlist(album, tmp_path)
content = playlist_path.read_text()
assert "#EXTINF:0,Für Elise" in content
def test_generate_playlist_fallback_if_file_missing(tmp_path: Path):
"""Wenn Audiodatei fehlt, wird Fallback-Name erzeugt (kein Absturz)."""
album = Album(
artist="A",
album="X",
discs=[Disc(disc_number=1, tracks=[Track(track_number=1, title="Ghost")])],
)
# Keine Audiodatei anlegen
playlist_path = generate_playlist(album, tmp_path)
content = playlist_path.read_text()
assert "01_-_Ghost.flac" in content