from __future__ import annotations from contextlib import contextmanager from pathlib import Path from typing import Iterator from sqlalchemy import create_engine from sqlalchemy.orm import Session, sessionmaker from hockey_data.models import Base class LocalTestDatabase: """SQLite-only adapter for unit tests. Production deliberately requires PostgreSQL; tests use this lightweight adapter so they do not weaken or bypass the production database policy. """ def __init__(self, path: Path) -> None: self.engine = create_engine(f"sqlite:///{Path(path).as_posix()}", future=True) self.SessionFactory = sessionmaker( bind=self.engine, autoflush=False, expire_on_commit=False, future=True, ) def create_all(self) -> None: Base.metadata.create_all(self.engine) @contextmanager def session(self) -> Iterator[Session]: session = self.SessionFactory() try: yield session session.commit() except Exception: session.rollback() raise finally: session.close()