import os import asyncio import pytest from app.database import init_db, SessionLocal from app.models import LogEntry, Task, ProjectMembership, Project, User, generate_user_id @pytest.fixture(autouse=True) def _ensure_gemini_env(monkeypatch): # Prevent import-time failure in app.llm when GEMINI_API_KEY is missing monkeypatch.setenv("GEMINI_API_KEY", os.getenv("GEMINI_API_KEY", "test-key")) @pytest.fixture(autouse=True, scope="session") def setup_db(): """Drop and recreate all tables once per test session.""" from app.database import Base, engine # Drop all tables to ensure clean schema Base.metadata.drop_all(bind=engine) # Recreate with new schema init_db() yield @pytest.fixture(autouse=True) def reset_db(setup_db): """Clean all rows before each test.""" db = SessionLocal() try: # Delete in dependency order to satisfy FKs db.query(LogEntry).delete() db.query(Task).delete() db.query(ProjectMembership).delete() db.query(Project).delete() db.query(User).delete() db.commit() yield finally: db.close() @pytest.fixture() def db_session(): db = SessionLocal() try: yield db finally: db.close() @pytest.fixture() def create_user(db_session): def _create(first_name: str, last_name: str): user_id = generate_user_id(first_name) u = User(id=user_id, first_name=first_name, last_name=last_name) db_session.add(u) db_session.commit() db_session.refresh(u) return u return _create