Snapshot of the existing codebase before working through the TASKS.md backlog. Real library data (data/) and the iTunes import fixture (itunes-test-library/) are gitignored. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
57 lines
2.0 KiB
Python
57 lines
2.0 KiB
Python
"""Regression tests for live browser refresh after a Get-Info edit.
|
|
|
|
The bug: renaming a track's artist left the column browser (and its filter)
|
|
pointing at the old name, so the renamed artist didn't re-sort and clicking it
|
|
returned no tracks. The fix routes a new `track_fields_edited(track_id, fields)`
|
|
signal to the library view, which rebuilds the browser only when a field it
|
|
groups by changed — and leaves play-count/skip bumps alone.
|
|
"""
|
|
|
|
from lintunes.models import Library, Track
|
|
from lintunes.library_manager import LibraryManager
|
|
from lintunes.gui.library_view import _BROWSER_FIELDS
|
|
|
|
|
|
def _manager(tmp_path):
|
|
track = Track(track_id=1, name="Song", artist="Aardvark",
|
|
album="Debut", genre="Rock")
|
|
library = Library(tracks={1: track})
|
|
return LibraryManager(library, tmp_path), track
|
|
|
|
|
|
def test_edit_emits_changed_fields(qapp, tmp_path):
|
|
manager, _track = _manager(tmp_path)
|
|
edits, updates = [], []
|
|
manager.track_fields_edited.connect(lambda tid, fields: edits.append((tid, fields)))
|
|
manager.track_updated.connect(updates.append)
|
|
|
|
manager.update_track_fields(1, {"artist": "Zz Top"})
|
|
|
|
assert edits == [(1, ["artist"])]
|
|
assert updates == [1]
|
|
assert _BROWSER_FIELDS.intersection(edits[0][1]) # would refresh the browser
|
|
|
|
|
|
def test_no_op_edit_is_silent(qapp, tmp_path):
|
|
manager, _track = _manager(tmp_path)
|
|
edits = []
|
|
manager.track_fields_edited.connect(lambda tid, fields: edits.append((tid, fields)))
|
|
|
|
manager.update_track_fields(1, {"artist": "Aardvark"}) # unchanged value
|
|
|
|
assert edits == []
|
|
|
|
|
|
def test_play_count_does_not_reorganize(qapp, tmp_path):
|
|
"""record_play bumps play_count via track_updated but must NOT emit
|
|
track_fields_edited, so a finished play never rebuilds the browser."""
|
|
manager, _track = _manager(tmp_path)
|
|
edits, updates = [], []
|
|
manager.track_fields_edited.connect(lambda tid, fields: edits.append((tid, fields)))
|
|
manager.track_updated.connect(updates.append)
|
|
|
|
manager.record_play(1)
|
|
|
|
assert edits == []
|
|
assert updates == [1]
|