conftest.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. """pytest fixtures"""
  2. import pytest
  3. from fastapi.testclient import TestClient
  4. from sqlalchemy import create_engine
  5. from sqlalchemy.orm import sessionmaker
  6. from sqlalchemy.pool import StaticPool
  7. from app.core.database import Base, get_db
  8. from app.main import app as fastapi_app
  9. from app.services.seed import seed_if_empty
  10. import app.models # noqa: F401 — register metadata
  11. @pytest.fixture()
  12. def db_session():
  13. """独立内存库会话,供种子与模型测试使用。"""
  14. engine = create_engine(
  15. "sqlite+pysqlite:///:memory:",
  16. connect_args={"check_same_thread": False},
  17. poolclass=StaticPool,
  18. )
  19. Base.metadata.create_all(bind=engine)
  20. TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  21. session = TestingSessionLocal()
  22. try:
  23. yield session
  24. finally:
  25. session.close()
  26. Base.metadata.drop_all(bind=engine)
  27. engine.dispose()
  28. @pytest.fixture()
  29. def client():
  30. """已建表并种子的 TestClient(覆盖 get_db)。"""
  31. engine = create_engine(
  32. "sqlite+pysqlite:///:memory:",
  33. connect_args={"check_same_thread": False},
  34. poolclass=StaticPool,
  35. )
  36. Base.metadata.create_all(bind=engine)
  37. TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
  38. session = TestingSessionLocal()
  39. seed_if_empty(session)
  40. def _override_get_db():
  41. try:
  42. yield session
  43. finally:
  44. pass
  45. fastapi_app.dependency_overrides[get_db] = _override_get_db
  46. with TestClient(fastapi_app) as c:
  47. yield c
  48. fastapi_app.dependency_overrides.clear()
  49. session.close()
  50. Base.metadata.drop_all(bind=engine)
  51. engine.dispose()