"""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]