Backend (pytest): - Auth flow tests (login, token, protected routes) - Portfolio CRUD and transaction tests - Strategy endpoint tests - Backtest flow tests - Snapshot and returns tests Frontend (Playwright): - Auth page tests - Portfolio navigation tests - Strategy page tests - Backtest page tests - Playwright configuration Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
141 lines
4.3 KiB
Python
141 lines
4.3 KiB
Python
"""
|
|
E2E tests for backtest flow.
|
|
"""
|
|
import pytest
|
|
from fastapi.testclient import TestClient
|
|
|
|
|
|
def test_create_backtest(client: TestClient, auth_headers):
|
|
"""Test creating a backtest."""
|
|
response = client.post(
|
|
"/api/backtest",
|
|
json={
|
|
"strategy_type": "multi_factor",
|
|
"strategy_params": {
|
|
"weights": {"value": 0.3, "quality": 0.3, "momentum": 0.2, "f_score": 0.2}
|
|
},
|
|
"start_date": "2023-01-01",
|
|
"end_date": "2023-12-31",
|
|
"rebalance_period": "quarterly",
|
|
"initial_capital": 100000000,
|
|
"commission_rate": 0.00015,
|
|
"slippage_rate": 0.001,
|
|
"benchmark": "KODEX200",
|
|
"top_n": 20,
|
|
},
|
|
headers=auth_headers,
|
|
)
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert "id" in data
|
|
assert data["status"] == "pending"
|
|
|
|
|
|
def test_list_backtests(client: TestClient, auth_headers):
|
|
"""Test listing backtests."""
|
|
# Create a backtest first
|
|
client.post(
|
|
"/api/backtest",
|
|
json={
|
|
"strategy_type": "quality",
|
|
"strategy_params": {"min_f_score": 6},
|
|
"start_date": "2023-01-01",
|
|
"end_date": "2023-06-30",
|
|
"rebalance_period": "monthly",
|
|
"initial_capital": 50000000,
|
|
"commission_rate": 0.00015,
|
|
"slippage_rate": 0.001,
|
|
"benchmark": "KODEX200",
|
|
"top_n": 10,
|
|
},
|
|
headers=auth_headers,
|
|
)
|
|
|
|
# List backtests
|
|
response = client.get("/api/backtest", headers=auth_headers)
|
|
assert response.status_code == 200
|
|
backtests = response.json()
|
|
assert len(backtests) >= 1
|
|
|
|
|
|
def test_get_backtest(client: TestClient, auth_headers):
|
|
"""Test getting backtest details."""
|
|
# Create a backtest
|
|
create_response = client.post(
|
|
"/api/backtest",
|
|
json={
|
|
"strategy_type": "value_momentum",
|
|
"strategy_params": {"value_weight": 0.6, "momentum_weight": 0.4},
|
|
"start_date": "2023-01-01",
|
|
"end_date": "2023-03-31",
|
|
"rebalance_period": "monthly",
|
|
"initial_capital": 10000000,
|
|
"commission_rate": 0.00015,
|
|
"slippage_rate": 0.001,
|
|
"benchmark": "KODEX200",
|
|
"top_n": 5,
|
|
},
|
|
headers=auth_headers,
|
|
)
|
|
backtest_id = create_response.json()["id"]
|
|
|
|
# Get backtest
|
|
response = client.get(f"/api/backtest/{backtest_id}", headers=auth_headers)
|
|
assert response.status_code == 200
|
|
data = response.json()
|
|
assert data["id"] == backtest_id
|
|
assert data["strategy_type"] == "value_momentum"
|
|
|
|
|
|
def test_delete_backtest(client: TestClient, auth_headers):
|
|
"""Test deleting a backtest."""
|
|
# Create a backtest
|
|
create_response = client.post(
|
|
"/api/backtest",
|
|
json={
|
|
"strategy_type": "multi_factor",
|
|
"strategy_params": {},
|
|
"start_date": "2023-01-01",
|
|
"end_date": "2023-01-31",
|
|
"rebalance_period": "monthly",
|
|
"initial_capital": 1000000,
|
|
"commission_rate": 0.00015,
|
|
"slippage_rate": 0.001,
|
|
"benchmark": "KODEX200",
|
|
"top_n": 3,
|
|
},
|
|
headers=auth_headers,
|
|
)
|
|
backtest_id = create_response.json()["id"]
|
|
|
|
# Delete backtest
|
|
response = client.delete(f"/api/backtest/{backtest_id}", headers=auth_headers)
|
|
assert response.status_code == 200
|
|
|
|
# Verify deleted
|
|
response = client.get(f"/api/backtest/{backtest_id}", headers=auth_headers)
|
|
assert response.status_code == 404
|
|
|
|
|
|
def test_backtest_requires_auth(client: TestClient):
|
|
"""Test that backtest endpoints require authentication."""
|
|
response = client.get("/api/backtest")
|
|
assert response.status_code == 401
|
|
|
|
response = client.post(
|
|
"/api/backtest",
|
|
json={
|
|
"strategy_type": "multi_factor",
|
|
"strategy_params": {},
|
|
"start_date": "2023-01-01",
|
|
"end_date": "2023-12-31",
|
|
"rebalance_period": "quarterly",
|
|
"initial_capital": 100000000,
|
|
"commission_rate": 0.00015,
|
|
"slippage_rate": 0.001,
|
|
"benchmark": "KODEX200",
|
|
"top_n": 20,
|
|
},
|
|
)
|
|
assert response.status_code == 401
|