#845 tests: cover the verification_status migration backfill

Locks the one-time backfill that derives verification_status for pre-column
library_history rows from acoustid_result: pass->verified, skip->unverified,
fail->force_imported; never overwrites an existing status (NULL-only); leaves
no-acoustid rows NULL; idempotent across repeated inits. Exercises the real
_initialize_database path (clears the per-process init guard to re-trigger it).
This commit is contained in:
BoulderBadgeDad 2026-06-11 11:17:09 -07:00
parent a207bd943b
commit 174adf2dc9

View file

@ -0,0 +1,53 @@
"""#845: the migration backfills verification_status for library_history rows
written before the column existed, from the acoustid_result they recorded. Must
map correctly, never overwrite an existing status, leave no-acoustid rows alone,
and be idempotent (it runs on every fresh DB init).
The backfill runs inside _initialize_database, which is guarded to run once per
path per process so the tests clear that guard to re-trigger it on the seeded
rows (exercising the real production code path, not a copy of the SQL)."""
from __future__ import annotations
import database.music_database as mdb
from database.music_database import MusicDatabase
def _reinit(path):
"""Force _initialize_database (incl. the backfill) to run again on `path`."""
mdb._database_initialized_paths.clear()
return MusicDatabase(path)
def _statuses(db):
with db._get_connection() as conn:
return {r['title']: r['verification_status']
for r in conn.execute("SELECT title, verification_status FROM library_history")}
def test_backfill_maps_and_preserves(tmp_path):
p = str(tmp_path / "m.db")
db = MusicDatabase(p)
db.add_library_history_entry('import', 'A', acoustid_result='pass')
db.add_library_history_entry('import', 'B', acoustid_result='skip')
db.add_library_history_entry('import', 'C', acoustid_result='fail')
db.add_library_history_entry('import', 'D', acoustid_result='pass',
verification_status='human_verified') # pre-set, must NOT change
db.add_library_history_entry('import', 'E') # no acoustid → stays NULL
_reinit(p) # run the backfill migration over the seeded rows
s = _statuses(db)
assert s['A'] == 'verified'
assert s['B'] == 'unverified'
assert s['C'] == 'force_imported'
assert s['D'] == 'human_verified' # existing status preserved (NULL-only)
assert s['E'] is None # no acoustid_result → untouched
def test_backfill_is_idempotent(tmp_path):
p = str(tmp_path / "m2.db")
db = MusicDatabase(p)
db.add_library_history_entry('import', 'A', acoustid_result='pass')
_reinit(p); _reinit(p) # run the migration two more times
assert _statuses(db)['A'] == 'verified'