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
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
|