fix(worker): reconcile every job + backfill owned releases
Wanted releases pressed while the monitor is off never got reconciled, so they lingered on the wanted list. Extract finish_job() and call it for every finished job (not just when monitor.enabled) so the MonitoredRelease transitions to fulfilled. Add fulfill_owned_releases(), run once at startup, to backfill releases already owned at/above the quality cutoff (self-heals items stuck from before this fix). Both idempotent + tested. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
from lyra_worker.monitor import MonitorConfig, reconcile
|
||||
from lyra_worker.monitor import MonitorConfig, fulfill_owned_releases, reconcile
|
||||
from tests.conftest import insert_monitored_release
|
||||
|
||||
CFG = MonitorConfig(enabled=True, quality_cutoff=2)
|
||||
@@ -69,6 +69,43 @@ def test_needs_attention_leaves_wanted(conn):
|
||||
assert _release(conn, rel) == ("wanted", None, False)
|
||||
|
||||
|
||||
def test_finish_job_reconciles_even_when_monitor_disabled(conn):
|
||||
# Regression: a manually-wanted release that gets pressed must transition to fulfilled
|
||||
# (and drop off the Wanted list) even with the monitor off — reconcile is core
|
||||
# correctness, not a monitor-sweep feature.
|
||||
from lyra_worker.main import finish_job
|
||||
|
||||
rel = insert_monitored_release(conn, artist_name="A", album="B", rg_mbid="rg-1",
|
||||
monitored=True, state="wanted")
|
||||
req, job = _make_job(conn, rel, "A", "B", "imported")
|
||||
_add_library(conn, req, "A", "B", 3)
|
||||
finish_job(conn, job, MonitorConfig(enabled=False, quality_cutoff=2))
|
||||
assert _release(conn, rel) == ("fulfilled", 3, True)
|
||||
|
||||
|
||||
def test_fulfill_owned_releases_backfills_stuck_wanted(conn):
|
||||
# A release pressed while the monitor was off: owned in the library at cutoff, but its
|
||||
# MonitoredRelease is still 'wanted' (never reconciled). Startup backfill fixes it.
|
||||
rel = insert_monitored_release(conn, artist_name="A", album="B", rg_mbid="rg-1",
|
||||
monitored=True, state="wanted")
|
||||
other = insert_monitored_release(conn, artist_name="C", album="D", rg_mbid="rg-2",
|
||||
monitored=True, state="wanted") # not owned → stays wanted
|
||||
_add_library(conn, None, "A", "B", 3)
|
||||
cfg = MonitorConfig(quality_cutoff=2)
|
||||
assert fulfill_owned_releases(conn, cfg) == 1
|
||||
assert _release(conn, rel) == ("fulfilled", 3, True)
|
||||
assert _release(conn, other)[0] == "wanted"
|
||||
assert fulfill_owned_releases(conn, cfg) == 0 # idempotent
|
||||
|
||||
|
||||
def test_fulfill_owned_releases_ignores_below_cutoff(conn):
|
||||
rel = insert_monitored_release(conn, artist_name="A", album="B", rg_mbid="rg-1",
|
||||
monitored=True, state="wanted")
|
||||
_add_library(conn, None, "A", "B", 1) # owned but below cutoff → keep wanting (upgrade)
|
||||
assert fulfill_owned_releases(conn, MonitorConfig(quality_cutoff=2)) == 0
|
||||
assert _release(conn, rel)[0] == "wanted"
|
||||
|
||||
|
||||
def test_unlinked_job_is_ignored(conn):
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(
|
||||
|
||||
Reference in New Issue
Block a user