"""Tests for the report formatter.""" import json from datetime import timedelta from decimal import Decimal from backtester.engine import BacktestResult from backtester.metrics import DetailedMetrics from backtester.reporter import export_csv, export_json, format_report def _make_result(with_detailed: bool = False) -> BacktestResult: detailed = None if with_detailed: detailed = DetailedMetrics( total_return=0.15, total_trades=10, winning_trades=6, losing_trades=4, win_rate=60.0, profit_factor=2.5, sharpe_ratio=1.5, sortino_ratio=2.0, calmar_ratio=3.0, max_drawdown=0.05, max_drawdown_duration=timedelta(hours=5), monthly_returns={"2025-01": 500.0, "2025-02": 1000.0}, avg_win=250.0, avg_loss=125.0, largest_win=600.0, largest_loss=-300.0, ) return BacktestResult( strategy_name="sma_crossover", symbol="AAPL", total_trades=10, initial_balance=Decimal("10000"), final_balance=Decimal("11500"), profit=Decimal("1500"), profit_pct=Decimal("15"), trades=[], detailed=detailed, ) def test_format_report_contains_key_metrics(): result = _make_result(with_detailed=False) report = format_report(result) assert "sma_crossover" in report assert "AAPL" in report assert "10000" in report assert "11500" in report assert "1500" in report assert "15" in report def test_format_report_with_detailed_metrics(): result = _make_result(with_detailed=True) report = format_report(result) assert "Sharpe Ratio" in report assert "Sortino Ratio" in report assert "Max Drawdown" in report assert "Profit Factor" in report def test_format_report_monthly_returns(): result = _make_result(with_detailed=True) report = format_report(result) assert "Monthly Returns" in report assert "2025-01" in report assert "2025-02" in report def test_export_csv(): result = _make_result(with_detailed=True) csv_output = export_csv(result) assert "Metric,Value" in csv_output assert "sma_crossover" in csv_output assert "Sharpe Ratio" in csv_output def test_export_json(): result = _make_result(with_detailed=True) json_output = export_json(result) data = json.loads(json_output) assert data["strategy_name"] == "sma_crossover" assert data["symbol"] == "AAPL" assert "detailed" in data assert data["detailed"]["sharpe_ratio"] == 1.5 assert data["detailed"]["monthly_returns"]["2025-01"] == 500.0