import sys import os import pytest from starlette.testclient import TestClient from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # Add backend root from main import app from src.models.base import Base # Explicitly import Base from its definition # Import all models to ensure Base.metadata.create_all is aware of them from src.models.api_token import APIToken from src.models.activity import Activity from src.models.auth_status import AuthStatus from src.models.config import Configuration from src.models.health_metric import HealthMetric from src.models.sync_log import SyncLog from src.models.weight_record import WeightRecord # Ensure all models are imported from src.api.status import get_db # Import get_db from an API file import os # Use an in-memory SQLite database for testing SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db" engine = create_engine( SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False} ) TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) @pytest.fixture(scope="session") def db_engine(): """Create a test database engine.""" Base.metadata.create_all(bind=engine) # Create tables yield engine Base.metadata.drop_all(bind=engine) # Drop tables after tests @pytest.fixture(scope="module") def db_session(db_engine): """Create a test database session.""" connection = db_engine.connect() transaction = connection.begin() session = TestingSessionLocal(bind=connection) yield session session.close() transaction.rollback() connection.close() @pytest.fixture(scope="module") def client(db_session): """Create a FastAPI test client.""" def override_get_db(): try: yield db_session finally: db_session.close() app.dependency_overrides[get_db] = override_get_db with TestClient(app) as c: yield c app.dependency_overrides.clear()