You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
2.7 KiB
Python

"""Tests: daily_new_risk_used resets only once per day, not on every run."""
from __future__ import annotations
import datetime as dt
from unittest.mock import AsyncMock, MagicMock, patch
import pytest
from apps.paper_trader.state import SessionRow, SessionStateRow, StateManager
@pytest.fixture()
def state_manager(tmp_path):
return StateManager(tmp_path / "test.db")
@pytest.fixture()
def session(state_manager: StateManager) -> SessionRow:
sid = state_manager.create_session("test", "configs/test.json", 10000.0)
return state_manager.get_session(sid)
class TestDailyRiskReset:
def test_first_call_resets_risk_used(self, state_manager: StateManager, session: SessionRow):
"""First run of the day resets daily_new_risk_used from a prior-day value."""
# Simulate prior day had used risk
ss = state_manager.get_session_state(session.session_id)
ss.daily_new_risk_used = 0.5
ss.last_processed_date = "2026-04-23" # yesterday
state_manager.update_session_state(ss)
# Direct test of the guard logic
today = dt.date(2026, 4, 24)
ss = state_manager.get_session_state(session.session_id)
if ss.last_processed_date != today.isoformat():
ss.daily_new_risk_used = 0.0
assert ss.daily_new_risk_used == 0.0
def test_same_day_second_call_preserves_risk_used(
self, state_manager: StateManager, session: SessionRow
):
"""Second call on same day must NOT reset daily_new_risk_used."""
today = dt.date(2026, 4, 24)
# Simulate: run_open already ran today, used 0.3 risk
ss = state_manager.get_session_state(session.session_id)
ss.daily_new_risk_used = 0.3
ss.last_processed_date = today.isoformat()
state_manager.update_session_state(ss)
# Simulate second call (e.g., run_close later in same day)
ss = state_manager.get_session_state(session.session_id)
if ss.last_processed_date != today.isoformat():
ss.daily_new_risk_used = 0.0
# Value must be preserved
assert ss.daily_new_risk_used == pytest.approx(0.3)
def test_new_day_clears_risk(self, state_manager: StateManager, session: SessionRow):
"""Next calendar day's run resets the counter."""
ss = state_manager.get_session_state(session.session_id)
ss.daily_new_risk_used = 0.4
ss.last_processed_date = "2026-04-24"
state_manager.update_session_state(ss)
today = dt.date(2026, 4, 25)
ss = state_manager.get_session_state(session.session_id)
if ss.last_processed_date != today.isoformat():
ss.daily_new_risk_used = 0.0
assert ss.daily_new_risk_used == 0.0