scientific-backend / app /tests /conftest.py
Dama12's picture
Initial clean backend deployment
0bd4ab4
Raw
History Blame
2.54 kB
"""
Pytest configuration and shared fixtures
"""
import pytest
from fastapi.testclient import TestClient
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import StaticPool
from app.db.base import Base
from app.dependencies import get_db
# Import all models here to register them with Base.metadata
from app.db.models.user import User
from app.db.models.project import Project
from app.db.models.research_paper import ResearchPaper
from app.db.models.paper_chunk import PaperChunk
from app.db.models.analysis_run import AnalysisRun
from app.db.models.contradiction import Contradiction
from app.db.models.research_gap import ResearchGap
from app.db.models.protocol import ExperimentalProtocol
from app.db.models.reasoning_trace import ReasoningTrace
from app.db.models.export import Export
from app.db.models.activity_log import ActivityLog
# Use PostgreSQL for tests (isolated test database)
SQLALCHEMY_TEST_DATABASE_URL = "postgresql://user:onion123@localhost:5432/scoinvestigator_test"
engine = create_engine(
SQLALCHEMY_TEST_DATABASE_URL,
)
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
@pytest.fixture(scope="function")
def db():
"""Create fresh DB tables for each test, then drop them."""
# Ensure extensions exist
from sqlalchemy import text
with engine.connect() as conn:
conn.execute(text('CREATE EXTENSION IF NOT EXISTS "uuid-ossp"'))
conn.execute(text('CREATE EXTENSION IF NOT EXISTS "pgcrypto"'))
conn.commit()
Base.metadata.create_all(bind=engine)
session = TestingSessionLocal()
try:
yield session
finally:
session.close()
# Clean teardown for PostgreSQL
from sqlalchemy import text
with engine.connect() as conn:
conn.execute(text("DROP SCHEMA public CASCADE"))
conn.execute(text("CREATE SCHEMA public"))
conn.execute(text('GRANT ALL ON SCHEMA public TO public'))
conn.execute(text('GRANT ALL ON SCHEMA public TO "user"'))
conn.commit()
@pytest.fixture(scope="function")
def client(db):
"""FastAPI test client with DB override."""
# Import here to avoid settings validation at import time
from app.main import app
def override_get_db():
try:
yield db
finally:
pass
app.dependency_overrides[get_db] = override_get_db
with TestClient(app) as c:
yield c
app.dependency_overrides.clear()