"""R8: /risk-metrics, /sharpe-ratio 는 executed_at NULL(DT·스윙 청산·MDD) 행을 created_at 으로 정렬.""" import asyncio from datetime import timedelta from unittest.mock import MagicMock from sqlalchemy.dialects import postgresql from app.api.endpoints import risk_management as rm class _CaptureDB: def __init__(self): self.stmts = [] async def execute(self, stmt, *_a, **_k): self.stmts.append(stmt) r = MagicMock() r.scalars.return_value.all.return_value = [] return r def _order_sql(stmt): sql = str(stmt.compile(dialect=postgresql.dialect())) return sql.split("ORDER BY", 1)[1].lower() def test_risk_metrics_orders_by_coalesce(): db = _CaptureDB() asyncio.run(rm.get_risk_metrics(days=30, db=db)) order = _order_sql(db.stmts[0]) assert "coalesce(trade_history.executed_at, trade_history.created_at)" in order def test_sharpe_orders_by_coalesce(): db = _CaptureDB() asyncio.run(rm.get_sharpe_ratio(days=30, db=db)) order = _order_sql(db.stmts[0]) assert "coalesce(trade_history.executed_at, trade_history.created_at)" in order