soulsync/tests/downloads/test_track_detail.py
BoulderBadgeDad e4bbcfda1b Downloads: add per-track detail endpoint for the track-detail modal
New GET /api/downloads/task/<id>/detail merges the live download task with its
library_history row (the data the Download History cards show) into one payload
the upcoming track-detail modal renders: status kind, title/artist/album,
source, quality, final location, AcoustID verdict, and expected-vs-downloaded.

Assembly + status classification live in core/downloads/track_detail.py as a
pure, importable build_track_detail()/classify_status_kind() (9 unit tests);
the endpoint is thin glue that looks up the matching history row by track.
2026-05-31 20:18:35 -07:00

89 lines
3.7 KiB
Python

"""Tests for the track-detail assembly (core/downloads/track_detail.py)."""
from __future__ import annotations
from core.downloads.track_detail import build_track_detail, classify_status_kind
# ── status classification ──────────────────────────────────────────────────
def test_classify_completed():
assert classify_status_kind('completed') == 'completed'
def test_classify_quarantined_from_integrity_message():
assert classify_status_kind('failed', 'File integrity check failed: Duration mismatch') == 'quarantined'
def test_classify_plain_failure():
assert classify_status_kind('failed', 'No sources found') == 'failed'
def test_classify_not_found():
assert classify_status_kind('not_found') == 'not_found'
def test_classify_in_progress():
assert classify_status_kind('downloading') == 'in_progress'
# ── merge: task only ────────────────────────────────────────────────────────
def test_build_from_task_only():
task = {
'task_id': 't1',
'status': 'completed',
'track_info': {'name': 'HUMBLE.', 'artists': [{'name': 'Kendrick Lamar'}], 'album': {'name': 'DAMN.'}},
'username': 'soulseek',
'filename': '/music/HUMBLE.flac',
}
d = build_track_detail(task)
assert d['status_kind'] == 'completed'
assert d['title'] == 'HUMBLE.'
assert d['artist'] == 'Kendrick Lamar'
assert d['album'] == 'DAMN.'
assert d['file_path'] == '/music/HUMBLE.flac'
assert d['source'] == 'soulseek'
def test_quarantined_task_carries_entry_id_and_reason():
task = {
'task_id': 't2',
'status': 'failed',
'error_message': 'File integrity check failed: Duration mismatch',
'quarantine_entry_id': '20260531_120000_song',
'track_info': {'name': 'Clean', 'artists': ['Taylor Swift']},
}
d = build_track_detail(task)
assert d['status_kind'] == 'quarantined'
assert d['quarantine_entry_id'] == '20260531_120000_song'
assert 'integrity' in d['reason'].lower()
assert d['artist'] == 'Taylor Swift' # string-form artist handled
# ── merge: history enriches ─────────────────────────────────────────────────
def test_history_enriches_provenance():
task = {'task_id': 't3', 'status': 'completed', 'track_info': {'name': 'N95', 'artists': [{'name': 'Kendrick Lamar'}]}}
history = {
'title': 'N95', 'artist_name': 'Kendrick Lamar', 'album_name': 'Mr. Morale',
'quality': 'FLAC 16bit', 'file_path': '/lib/N95.flac', 'acoustid_result': 'error',
'download_source': 'Soulseek', 'thumb_url': 'http://x/cover.jpg',
'source_track_title': 'N95', 'source_artist': 'Kendrick Lamar',
}
d = build_track_detail(task, history)
assert d['file_path'] == '/lib/N95.flac'
assert d['quality'] == 'FLAC 16bit'
assert d['acoustid_result'] == 'error'
assert d['source'] == 'Soulseek'
assert d['thumb_url'] == 'http://x/cover.jpg'
assert d['downloaded'] == {'title': 'N95', 'artist': 'Kendrick Lamar', 'album': 'Mr. Morale'}
assert d['expected'] == {'title': 'N95', 'artist': 'Kendrick Lamar'}
def test_history_fills_missing_title_from_task():
task = {'task_id': 't4', 'status': 'completed', 'track_info': {}} # task has no track name
history = {'title': 'Recovered Title', 'artist_name': 'Some Artist'}
d = build_track_detail(task, history)
assert d['title'] == 'Recovered Title'
assert d['artist'] == 'Some Artist'