58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
# conftest.py
|
|
from typing import Generator, Callable, Any
|
|
import pytest
|
|
from testcontainers.postgres import PostgresContainer
|
|
from fastapi.testclient import TestClient
|
|
from core.config import settings
|
|
from faker import Faker
|
|
from sqlalchemy.orm import Session
|
|
|
|
from core.database import get_db, get_sessionmaker
|
|
|
|
|
|
fake = Faker()
|
|
|
|
@pytest.fixture(scope="session")
|
|
def postgres_container() -> Generator[PostgresContainer, None, None]:
|
|
"""Fixture to create a PostgreSQL container for testing."""
|
|
print("Starting Postgres container...")
|
|
with PostgresContainer("postgres:latest") as postgres:
|
|
settings.DB_URL = postgres.get_connection_url()
|
|
print(f"Postgres container started at {settings.DB_URL}")
|
|
yield postgres
|
|
print("Postgres container stopped.")
|
|
|
|
@pytest.fixture(scope="function")
|
|
def db(postgres_container) -> Generator[Session, None, None]:
|
|
"""Function-scoped database session with rollback"""
|
|
SessionLocal = get_sessionmaker()
|
|
session = SessionLocal()
|
|
session.begin_nested() # Enable nested transaction
|
|
try:
|
|
yield session
|
|
finally:
|
|
session.rollback()
|
|
session.close()
|
|
|
|
@pytest.fixture(scope="function")
|
|
def client(db: Session) -> Generator[TestClient, None, None]:
|
|
"""Function-scoped test client with dependency override"""
|
|
from main import app
|
|
|
|
# Override the database dependency
|
|
def override_get_db():
|
|
try:
|
|
yield db
|
|
finally:
|
|
pass # Don't close session here
|
|
|
|
app.dependency_overrides[get_db] = override_get_db
|
|
|
|
with TestClient(app) as test_client:
|
|
yield test_client
|
|
|
|
app.dependency_overrides.clear()
|
|
|
|
def override_dependency(dependency: Callable[..., Any], mocked_response: Any) -> None:
|
|
from main import app
|
|
app.dependency_overrides[dependency] = lambda: mocked_response |