galaxis-po/backend/tests/conftest.py
머니페니 f6db08c9bd feat: improve security, performance, and add missing features
- Remove hardcoded database_url/jwt_secret defaults, require env vars
- Add DB indexes for stocks.market, market_cap, backtests.user_id
- Optimize backtest engine: preload all prices, move stock_names out of loop
- Fix backtest API auth: filter by user_id at query level (6 endpoints)
- Add manual transaction entry modal on portfolio detail page
- Replace console.error with toast.error in signals, backtest, data explorer
- Add backtest delete button with confirmation dialog
- Replace simulated sine chart with real snapshot data
- Add strategy-to-portfolio apply flow with dialog
- Add DC pension risk asset ratio >70% warning on rebalance page
- Add backtest comparison page with metrics table and overlay chart
2026-03-20 12:27:05 +09:00

111 lines
2.9 KiB
Python

"""
Pytest configuration and fixtures for E2E tests.
"""
import os
import pytest
from typing import Generator
os.environ.setdefault("DATABASE_URL", "sqlite:///:memory:")
os.environ.setdefault("JWT_SECRET", "test-secret-key-for-pytest-only")
from fastapi.testclient import TestClient
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker, Session
from sqlalchemy.pool import StaticPool
from app.main import app
from app.core.database import Base, get_db
from app.models.user import User
from app.core.security import get_password_hash, create_access_token
# Use in-memory SQLite for tests
SQLALCHEMY_DATABASE_URL = "sqlite:///:memory:"
engine = create_engine(
SQLALCHEMY_DATABASE_URL,
connect_args={"check_same_thread": False},
poolclass=StaticPool,
)
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
def override_get_db():
"""Override database dependency for tests."""
try:
db = TestingSessionLocal()
yield db
finally:
db.close()
@pytest.fixture(scope="function")
def db() -> Generator[Session, None, None]:
"""Create a fresh database for each test."""
Base.metadata.create_all(bind=engine)
db = TestingSessionLocal()
try:
yield db
finally:
db.close()
Base.metadata.drop_all(bind=engine)
@pytest.fixture(scope="function")
def client(db: Session) -> Generator[TestClient, None, None]:
"""Create a test client with database override."""
app.dependency_overrides[get_db] = override_get_db
# Create tables
Base.metadata.create_all(bind=engine)
with TestClient(app) as test_client:
yield test_client
# Cleanup
Base.metadata.drop_all(bind=engine)
app.dependency_overrides.clear()
@pytest.fixture(scope="function")
def test_user(db: Session) -> User:
"""Create a test user."""
user = User(
username="testuser",
email="test@example.com",
hashed_password=get_password_hash("testpassword"),
)
db.add(user)
db.commit()
db.refresh(user)
return user
@pytest.fixture(scope="function")
def admin_user(db: Session) -> User:
"""Create an admin test user."""
user = User(
username="admin",
email="admin@example.com",
hashed_password=get_password_hash("adminpassword"),
)
db.add(user)
db.commit()
db.refresh(user)
return user
@pytest.fixture(scope="function")
def auth_headers(test_user: User) -> dict:
"""Create authorization headers for test user."""
token = create_access_token(data={"sub": test_user.username})
return {"Authorization": f"Bearer {token}"}
@pytest.fixture(scope="function")
def admin_auth_headers(admin_user: User) -> dict:
"""Create authorization headers for admin user."""
token = create_access_token(data={"sub": admin_user.username})
return {"Authorization": f"Bearer {token}"}