"""Backfill job: Resolve Canonical Album Versions (#765 Stage 2 trigger).""" from __future__ import annotations import types import core.repair_jobs.canonical_version_resolve as cvr from core.repair_jobs import get_all_jobs from core.repair_jobs.canonical_version_resolve import ( CanonicalVersionResolveJob, _describe_pin, ) from database.music_database import MusicDatabase def _ctx(db, findings): return types.SimpleNamespace( db=db, config_manager=None, # -> active_server None -> all albums check_stop=lambda: False, wait_if_paused=lambda: False, report_progress=None, update_progress=None, create_finding=lambda **kw: (findings.append(kw) or True), ) def _seed_two_albums(db): conn = db._get_connection() cur = conn.cursor() cur.execute("INSERT INTO artists (id, name) VALUES ('art1', 'A')") cur.execute("INSERT INTO albums (id, title, artist_id) VALUES ('alb1', 'Album One', 'art1')") cur.execute("INSERT INTO albums (id, title, artist_id) VALUES ('alb2', 'Album Two', 'art1')") conn.commit() conn.close() def _fake_resolver(monkeypatch): def fake(db, album_id, *, min_score=0.5, store=True, mode="active_preferred"): res = {"source": "spotify", "album_id": f"sp_{album_id}", "score": 0.9} if store: db.set_album_canonical(album_id, res["source"], res["album_id"], res["score"]) return res monkeypatch.setattr(cvr, "resolve_and_store_canonical_for_album", fake) def test_job_is_registered(): jobs = get_all_jobs() # {job_id: cls} assert "canonical_version_resolve" in jobs assert jobs["canonical_version_resolve"] is CanonicalVersionResolveJob def test_job_is_opt_in_and_dry_run_by_default(): assert CanonicalVersionResolveJob.default_enabled is False assert CanonicalVersionResolveJob.default_settings["dry_run"] is True def test_source_selection_defaults_to_active_preferred(): assert CanonicalVersionResolveJob.default_settings["source_selection"] == "active_preferred" def test_source_selection_exposes_dropdown_options(): # The UI renders a