84 lines
4.1 KiB
Python
84 lines
4.1 KiB
Python
from lyra_worker.adapters.fakes import FakeMbBrowser
|
|
from lyra_worker.browser import ReleaseGroupInfo
|
|
from lyra_worker.monitor import MonitorConfig, discover
|
|
from tests.conftest import insert_watched_artist
|
|
|
|
|
|
def _releases():
|
|
return [
|
|
ReleaseGroupInfo("rg-old", "Old Album", "Album", (), "2001-01-01"),
|
|
ReleaseGroupInfo("rg-new", "New Album", "Album", (), "2999-01-01"),
|
|
]
|
|
|
|
|
|
def _monitored_map(conn):
|
|
with conn.cursor() as cur:
|
|
cur.execute('SELECT "rgMbid", monitored FROM "MonitoredRelease"')
|
|
return dict(cur.fetchall())
|
|
|
|
|
|
def test_discover_auto_monitor_future_only_flags_new(conn):
|
|
aid = insert_watched_artist(conn, mbid="a1", name="John Mayer", auto_monitor_future=True)
|
|
browser = FakeMbBrowser(releases={"a1": _releases()})
|
|
inserted = discover(conn, browser, MonitorConfig(enabled=True))
|
|
assert inserted == 2
|
|
assert _monitored_map(conn) == {"rg-old": False, "rg-new": True} # only the future one is monitored
|
|
|
|
|
|
def test_discover_default_off_monitors_nothing(conn):
|
|
insert_watched_artist(conn, mbid="a1", name="X", auto_monitor_future=False)
|
|
browser = FakeMbBrowser(releases={"a1": _releases()})
|
|
discover(conn, browser, MonitorConfig(enabled=True))
|
|
assert _monitored_map(conn) == {"rg-old": False, "rg-new": False}
|
|
|
|
|
|
def test_discover_is_idempotent_and_sets_last_polled(conn):
|
|
insert_watched_artist(conn, mbid="a1", name="X", auto_monitor_future=True)
|
|
browser = FakeMbBrowser(releases={"a1": _releases()})
|
|
assert discover(conn, browser, MonitorConfig(enabled=True)) == 2
|
|
assert discover(conn, browser, MonitorConfig(enabled=True)) == 0 # lastPolledAt now recent; not re-polled
|
|
with conn.cursor() as cur:
|
|
cur.execute('SELECT "lastPolledAt" IS NOT NULL FROM "WatchedArtist" WHERE mbid = %s', ("a1",))
|
|
assert cur.fetchone()[0] is True
|
|
|
|
|
|
def test_config_from_config_parses_strings():
|
|
cfg = MonitorConfig.from_config({"monitor.enabled": "true", "monitor.qualityCutoff": "3"})
|
|
assert cfg.enabled is True and cfg.quality_cutoff == 3
|
|
assert MonitorConfig.from_config({}).enabled is False
|
|
|
|
|
|
def test_discover_dedupes_shared_release_group_in_one_pass(conn):
|
|
# Two watched artists whose discographies share a release-group (a collaboration):
|
|
# the second insert must hit ON CONFLICT ("rgMbid") DO NOTHING within a single pass.
|
|
insert_watched_artist(conn, mbid="a1", name="Artist One", auto_monitor_future=True)
|
|
insert_watched_artist(conn, mbid="a2", name="Artist Two", auto_monitor_future=True)
|
|
shared = ReleaseGroupInfo("rg-shared", "Split", "Album", (), "2999-01-01")
|
|
browser = FakeMbBrowser(releases={"a1": [shared], "a2": [shared]})
|
|
assert discover(conn, browser, MonitorConfig(enabled=True)) == 1 # deduped
|
|
with conn.cursor() as cur:
|
|
cur.execute('SELECT count(*) FROM "MonitoredRelease" WHERE "rgMbid" = %s', ("rg-shared",))
|
|
assert cur.fetchone()[0] == 1
|
|
|
|
|
|
def test_discover_repolls_after_interval_and_dedupes(conn):
|
|
# Aged lastPolledAt (48h > 24h default) makes the artist due; re-browsing the same
|
|
# releases inserts nothing new, proving both the due-branch and ON CONFLICT dedup.
|
|
insert_watched_artist(conn, mbid="a1", name="X", auto_monitor_future=True,
|
|
last_polled_sql="now() - interval '48 hours'")
|
|
browser = FakeMbBrowser(releases={"a1": _releases()})
|
|
assert discover(conn, browser, MonitorConfig(enabled=True)) == 2 # due: inserts both
|
|
with conn.cursor() as cur:
|
|
cur.execute("UPDATE \"WatchedArtist\" SET \"lastPolledAt\" = now() - interval '48 hours' WHERE mbid = %s", ("a1",))
|
|
conn.commit()
|
|
assert discover(conn, browser, MonitorConfig(enabled=True)) == 0 # due again, all rgMbids conflict
|
|
|
|
|
|
def test_config_defaults_and_truthy_variants():
|
|
cfg = MonitorConfig.from_config({})
|
|
assert (cfg.enabled, cfg.poll_interval_hours, cfg.retry_interval_hours,
|
|
cfg.quality_cutoff, cfg.upgrade_window_days) == (False, 24, 6, 2, 14)
|
|
for v in ("1", "yes", "on", "TRUE"):
|
|
assert MonitorConfig.from_config({"monitor.enabled": v}).enabled is True
|
|
assert MonitorConfig.from_config({"monitor.enabled": "nope"}).enabled is False
|