"""`trades_db.py --report` non stampa piu' un bonifico come rendimento (debito #14, 2026-09-02). Il numero che stampava era `e1/e0-1` sulla serie grezza: «+243%» per il 96,3% un versamento. Il report ora CHIAMA `journal.rendimento_twr` (P1: non rifa' il conto). `T.connect()` nudo finisce in tmp grazie alla fixture autouse di conftest: qui non si tocca il libro vivo. """ from __future__ import annotations import sys from pathlib import Path import pandas as pd ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT)) from helpers import carica_script # noqa: E402 from src.live import journal as J # noqa: E402 from src.live import tradesdb as T # noqa: E402 def _carica_script(): return carica_script("scripts/live/trades_db.py", "trades_db_script") def _px_piatto(livello=100.0): ix = pd.date_range("2026-08-20", "2026-08-27", freq="1h", tz="UTC") return pd.Series(livello, index=ix) def _prepara(con, equity): # il fill si scrive con `upsert_fills`, non con un INSERT a mano: una riga scritta a mano # aveva `verified` NULL, una forma che la produzione non produce mai T.upsert_fills(con, [T.Fill(ts_utc="2026-08-24T10:47:15+00:00", ts_source="test", asset="BTC", side="buy", qty=0.001, price=60000.0, fee=0.01)]) T.upsert_equity(con, [(ts, eq, "test") for ts, eq in equity]) def test_il_report_stampa_il_TWR_e_non_il_grezzo(monkeypatch, capsys): monkeypatch.setattr(J, "_px_1h", lambda a: _px_piatto()) con = T.connect() # -> tmp (conftest), NON data/live/trades.db assert "data/live" not in str(con.execute("PRAGMA database_list").fetchone()[2]) _prepara(con, [("2026-08-24T10:47:01+00:00", 600.0), ("2026-08-25T10:47:01+00:00", 630.0), # +5%: sotto soglia rilevatore ("2026-08-25T11:47:01+00:00", 2030.0), # +1400: versamento ("2026-08-26T10:47:01+00:00", 2009.7)]) # -1% con.close() _carica_script().report() out = capsys.readouterr().out assert "TWR" in out and "+3.95%" in out assert "+234.95%" not in out # il grezzo non compare piu' assert "+1,400.00 certi" in out assert "+9.70" in out assert "movimenti di capitale INCLUSI" in out # il delta $ resta, etichettato def test_il_report_senza_movimenti_dice_lo_stesso_numero_di_prima(monkeypatch, capsys): monkeypatch.setattr(J, "_px_1h", lambda a: _px_piatto()) con = T.connect() _prepara(con, [("2026-08-24T10:47:01+00:00", 600.0), ("2026-08-25T10:47:01+00:00", 630.0)]) con.close() _carica_script().report() out = capsys.readouterr().out assert "+5.00%" in out and "movimenti capitale" not in out def test_il_report_a_base_zero_dice_n_d_e_non_l_intero_conto(monkeypatch, capsys): monkeypatch.setattr(J, "_px_1h", lambda a: _px_piatto()) con = T.connect() _prepara(con, [("2026-08-24T09:47:01+00:00", 0.0), ("2026-08-24T10:47:01+00:00", 598.06), ("2026-08-25T10:47:01+00:00", 610.0)]) con.close() _carica_script().report() out = capsys.readouterr().out assert out.count("n/d") >= 2 and "TWR" in out assert "+610.00 di equity" in out and "arming : +610.00" not in out def test_il_report_con_il_feed_assente_non_stampa_il_grezzo_come_TWR(monkeypatch, capsys): # revisione 02/09: con data/raw assente (host ripristinato prima di rebuild_history) ogni # salto era "ambiguo", certi=0, e il report stampava +243% sotto l'etichetta TWR monkeypatch.setattr(J, "_px_1h", lambda a: None) con = T.connect() _prepara(con, [("2026-08-24T10:47:01+00:00", 600.0), ("2026-08-25T11:47:01+00:00", 2000.0), ("2026-08-26T10:47:01+00:00", 2020.0)]) con.close() _carica_script().report() out = capsys.readouterr().out assert out.count("n/d") >= 2 and "TWR" in out assert "% =" not in out and "+236" not in out assert "[ambiguo: mercato non misurabile" in out