galaxis-po/backend/tests/e2e/test_backtest_flow.py
zephyrdark efcfc0e090 feat: add E2E tests for backend and frontend
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>
2026-02-03 12:30:13 +09:00

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