""" Tests for live/treasury.py — central treasury and risk management. """ from live.treasury import Treasury class TestTreasury: def test_initial_equity(self): t = Treasury(initial_equity=10000.0) assert t.equity == 10000.0 assert t.total_pnl() == 0.0 def test_can_open_within_limits(self): t = Treasury(initial_equity=10000.0, max_position_per_asset=0.005) result = t.can_open("BTC", side="buy", size=0.001, mark_price=50000.0) assert result["allowed"] def test_cannot_open_exceed_inventory(self): t = Treasury(initial_equity=10000.0, max_position_per_asset=0.002) t.can_open("BTC", side="buy", size=0.001, mark_price=50000.0) t.record_fill("BTC", side="buy", size=0.001, price=50000.0, fee=10.0, pnl=0) result = t.can_open("BTC", side="buy", size=0.0015, mark_price=50000.0) assert not result["allowed"] def test_record_fill_updates_position(self): t = Treasury(initial_equity=10000.0) t.record_fill("BTC", side="buy", size=0.001, price=50000.0, fee=10.0, pnl=0) assert t.position("BTC") == 0.001 def test_record_close_updates_pnl(self): t = Treasury(initial_equity=10000.0) t.record_fill("BTC", side="buy", size=0.001, price=50000.0, fee=10.0, pnl=0) t.record_fill("BTC", side="sell", size=0.001, price=50100.0, fee=10.0, pnl=100.0) assert t.position("BTC") == 0.0 assert t.total_pnl() > 0 def test_unrealized_pnl(self): t = Treasury(initial_equity=10000.0) t.record_fill("BTC", side="buy", size=0.001, price=50000.0, fee=10.0, pnl=0) t.update_mark_price("BTC", 50200.0) assert t.unrealized_pnl() > 0 def test_pnl_pct(self): t = Treasury(initial_equity=10000.0) t.record_fill("BTC", side="buy", size=0.1, price=50000.0, fee=0.1, pnl=0) t.update_mark_price("BTC", 50200.0) # 0.1 * 200 = $20 unrealized >> $0.10 fee assert t.pnl_pct() > 0 def test_circuit_breaker_drawdown(self): t = Treasury(initial_equity=10000.0, max_drawdown_pct=-1.0) # Force large negative PnL t._realized_pnl = -5000.0 t._fees_paid = 0 t._check_breakers() assert t.is_halted() def test_liquidation_distance(self): t = Treasury(initial_equity=50000.0) t.record_fill("BTC", side="buy", size=1.0, price=50000.0, fee=10.0, pnl=0) dist = t.liquidation_distance("BTC") assert dist > 0 def test_all_positions(self): t = Treasury() t.record_fill("BTC", side="buy", size=0.001, price=50000.0, fee=10.0, pnl=0) t.record_fill("ETH", side="sell", size=0.01, price=3000.0, fee=10.0, pnl=0) positions = t.all_positions assert positions["BTC"] == 0.001 assert positions["ETH"] == -0.01 def test_net_exposure(self): t = Treasury() t.record_fill("BTC", side="buy", size=0.002, price=50000.0, fee=10.0, pnl=0) t.record_fill("ETH", side="buy", size=0.003, price=3000.0, fee=10.0, pnl=0) assert t.net_exposure == 0.005 def test_summary(self): t = Treasury(initial_equity=10000.0) t.record_fill("BTC", side="buy", size=0.001, price=50000.0, fee=10.0, pnl=0) s = t.summary() assert "equity" in s assert "pnl_pct" in s assert "positions" in s assert "BTC" in s["positions"] def test_toxic_fill_tracking(self): t = Treasury(initial_equity=10000.0, max_toxic_rate=0.1) t.record_fill("BTC", side="buy", size=0.001, price=50000.0, fee=10.0, pnl=0) for _ in range(9): t.record_fill("BTC", side="buy", size=0.001, price=50000.0, fee=10.0, pnl=-1.0) t.record_toxic_fill() t.record_toxic_fill() t._check_breakers() # 2/10 = 20% toxic > 10% threshold assert t.is_halted()