Musiksammlung/tests/test_playlist.py
dschlueter 255496bd1b Add per-track artist to filename: 09_Titel_-_Kuenstler.flac
- Track model: add optional artist field (None = fall back to album artist)
- organizer: append _-_<artist> to each filename
- tagger: use track.artist over album.artist for the 'artist' tag
- playlist: widen glob pattern to match new _-_<artist> suffix
- tests: update assertions + add test for track-artist override

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-18 00:11:07 +01:00

98 lines
3.2 KiB
Python

"""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 mit Künstler-Suffix
(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