66 lines
1.8 KiB
Python
66 lines
1.8 KiB
Python
"""Integration tests for UI backtest workflow."""
|
|
|
|
import pytest
|
|
from datetime import datetime, timedelta
|
|
from PyQt6.QtWidgets import QApplication
|
|
from unittest.mock import Mock, patch
|
|
from src.ui.widgets.backtest_view import BacktestViewWidget
|
|
from src.strategies.technical.rsi_strategy import RSIStrategy
|
|
|
|
|
|
@pytest.fixture
|
|
def app():
|
|
"""Create QApplication for tests."""
|
|
if not QApplication.instance():
|
|
return QApplication([])
|
|
return QApplication.instance()
|
|
|
|
|
|
@pytest.fixture
|
|
def backtest_view(app):
|
|
"""Create BacktestViewWidget."""
|
|
view = BacktestViewWidget()
|
|
|
|
# Mock backtest engine
|
|
mock_engine = Mock()
|
|
mock_engine.run_backtest.return_value = {
|
|
'total_return': 10.5,
|
|
'sharpe_ratio': 1.2,
|
|
'max_drawdown': -5.0,
|
|
'win_rate': 0.55,
|
|
'total_trades': 50,
|
|
'final_value': 110.5,
|
|
'trades': []
|
|
}
|
|
view.backtest_engine = mock_engine
|
|
|
|
return view
|
|
|
|
|
|
def test_backtest_configuration(backtest_view):
|
|
"""Test backtest configuration form."""
|
|
assert backtest_view.strategy_combo is not None
|
|
assert backtest_view.symbol_input is not None
|
|
assert backtest_view.start_date is not None
|
|
assert backtest_view.end_date is not None
|
|
|
|
|
|
def test_backtest_results_display(backtest_view):
|
|
"""Test backtest results are displayed."""
|
|
results = {
|
|
'total_return': 10.5,
|
|
'sharpe_ratio': 1.2,
|
|
'max_drawdown': -5.0,
|
|
'win_rate': 0.55,
|
|
'total_trades': 50,
|
|
'final_value': 110.5,
|
|
'trades': []
|
|
}
|
|
|
|
backtest_view._display_results(results)
|
|
|
|
# Verify metrics text contains results
|
|
metrics_text = backtest_view.metrics_text.toPlainText()
|
|
assert "10.5" in metrics_text # Total return
|
|
assert "1.2" in metrics_text # Sharpe ratio
|