Files
LetterFeed/backend/app/tests/conftest.py
2025-07-15 22:54:35 +02:00

66 lines
1.7 KiB
Python

import os
os.environ["LETTERFEED_DATABASE_URL"] = "sqlite:///./test.db"
import pytest
from fastapi.testclient import TestClient
from sqlalchemy.orm import sessionmaker
from app.core.database import Base, engine, get_db
from app.main import app
TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
@pytest.fixture(scope="function", autouse=True)
def setup_and_teardown_db():
"""Set up and tear down the database for each test.
This fixture is automatically used for all tests. It creates all tables
before a test and drops them afterwards. This ensures a clean database for
every test.
"""
Base.metadata.create_all(bind=engine)
yield
Base.metadata.drop_all(bind=engine)
@pytest.fixture(name="db_session")
def db_session_fixture():
"""Yield a database session for a test."""
db = TestingSessionLocal()
try:
yield db
finally:
db.close()
@pytest.fixture(name="client")
def client_fixture(db_session):
"""Yield a TestClient for a test."""
def override_get_db():
yield db_session
app.dependency_overrides[get_db] = override_get_db
with TestClient(app) as client:
yield client
app.dependency_overrides.clear()
@pytest.fixture(scope="session", autouse=True)
def cleanup_test_db(request):
"""Clean up the test database after the test session.
This fixture is automatically used once per test session. It registers a
finalizer to remove the test database file after all tests have run.
"""
def remove_test_db():
# The path is relative to the backend directory where pytest is run
db_file = "test.db"
if os.path.exists(db_file):
os.remove(db_file)
request.addfinalizer(remove_test_db)