"""venue_news: il guardiano di cio' che il venue ANNUNCIA.
Si testano le funzioni PURE (parsing del feed, match, derivazione delle chiavi). La rete no:
`scarica()` ritorna None su qualunque errore ed e' quello il contratto — 'non vedo' non e'
'niente di nuovo' (P5).
"""
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
sys.path.insert(0, str(ROOT / "scripts" / "live"))
import importlib.util
_spec = importlib.util.spec_from_file_location(
"venue_news", ROOT / "scripts" / "live" / "venue_news.py")
vn = importlib.util.module_from_spec(_spec)
_spec.loader.exec_module(vn)
_FEED = """
https://x/ahttps://x/?p=1Fri, 14 Aug 2026 09:18:57 +0000Deribit Welcomes Orbit Markets
https://x/bhttps://x/?p=2Fri, 10 Jul 2026 00:00:00 +0000"""
def test_estrae_le_voci_con_guid_titolo_e_data():
v = vn.voci(_FEED)
assert [x["guid"] for x in v] == ["https://x/?p=1", "https://x/?p=2"]
assert v[0]["titolo"] == "Contract Specifications change for Linear USDC Perpetuals"
assert v[0]["data"].startswith("Fri, 14 Aug 2026")
def test_feed_illeggibile_non_solleva_e_non_inventa_voci():
assert vn.voci("") == []
assert vn.voci("rotto") == []
def test_le_chiavi_sono_DERIVATE_dagli_strumenti_del_book():
"""P1: il bersaglio si deriva dal codice sorvegliato, non si ridichiara. Se un domani il book
prende un altro asset, la sorveglianza lo segue da sola."""
from src.live.deribit import _CONTRACT
ks = vn.chiavi()
for nome in _CONTRACT:
base = nome.split("_")[0].split("-")[0].lower()
assert base in ks, f"{base} (da {nome}) non e' fra le parole sorvegliate"
assert "usdc" in ks and "margin" in ks and "collateral" in ks
def test_riconosce_l_annuncio_che_ci_tocca_e_lascia_stare_gli_altri():
ks = vn.chiavi()
assert vn.rilevante("Contract Specifications change for Linear USDC Perpetuals", ks)
assert vn.rilevante("New SM Margin Model On Deribit", ks)
assert vn.rilevante("Deribit to Discontinue Daily Proof of Reserves Publication", ks)
assert vn.rilevante("USDC Rewards Available In More Countries", ks)
assert not vn.rilevante("Deribit Welcomes Orbit Markets to Block RFQ Platform", ks)
def test_il_match_e_case_insensitive_e_riporta_QUALI_parole():
m = vn.rilevante("New SM MARGIN Model On Deribit", vn.chiavi())
assert "margin" in m