/ tests / conftest.py
conftest.py
  1  """Pytest configuration and fixtures for testing."""
  2  import os
  3  import pytest
  4  from datetime import datetime
  5  from sqlalchemy import create_engine
  6  from sqlalchemy.orm import sessionmaker
  7  from fastapi.testclient import TestClient
  8  
  9  from sussro_services.main import app
 10  from sussro_services.db import Base, get_db
 11  from sussro_services.core.config import settings
 12  from sussro_services.models.user import User, UserRole
 13  
 14  # Test database setup
 15  SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"
 16  engine = create_engine(
 17      SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
 18  )
 19  TestingSessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
 20  
 21  # Create test database and tables
 22  Base.metadata.create_all(bind=engine)
 23  
 24  # Test client
 25  @pytest.fixture(scope="module")
 26  def test_client():
 27      """Create a test client for the FastAPI application."""
 28      with TestClient(app) as client:
 29          yield client
 30  
 31  # Database session fixture
 32  @pytest.fixture(scope="function")
 33  def db_session():
 34      """Create a new database session for testing."""
 35      connection = engine.connect()
 36      transaction = connection.begin()
 37      session = TestingSessionLocal(bind=connection)
 38      
 39      # Create test data
 40      create_test_data(session)
 41      
 42      yield session
 43      
 44      session.close()
 45      transaction.rollback()
 46      connection.close()
 47  
 48  # Override the get_db dependency
 49  def override_get_db():
 50      """Override the get_db dependency for testing."""
 51      try:
 52          db = TestingSessionLocal()
 53          create_test_data(db)
 54          yield db
 55      finally:
 56          db.close()
 57  
 58  app.dependency_overrides[get_db] = override_get_db
 59  
 60  def create_test_data(db):
 61      """Create test data in the database."""
 62      # Create test user
 63      from sussro_services.services.auth_service import AuthService
 64      hashed_password = AuthService.get_password_hash("testpass123")
 65      
 66      # Create test user
 67      user = User(
 68          email="test@example.com",
 69          hashed_password=hashed_password,
 70          full_name="Test User",
 71          is_active=True
 72      )
 73      db.add(user)
 74      
 75      # Create admin user
 76      admin_user = User(
 77          email="admin@example.com",
 78          hashed_password=AuthService.get_password_hash("adminpass123"),
 79          full_name="Admin User",
 80          is_active=True,
 81          is_superuser=True
 82      )
 83      db.add(admin_user)
 84      
 85      # Create roles
 86      user_role = UserRole(user=user, role="user")
 87      admin_role = UserRole(user=admin_user, role="admin")
 88      
 89      db.add_all([user_role, admin_role])
 90      db.commit()
 91  
 92  # Mock database session fixture
 93  @pytest.fixture
 94  def mock_db_session():
 95      """Create a mock database session."""
 96      from unittest.mock import MagicMock
 97      return MagicMock()
 98  
 99  # Test user data
100  @pytest.fixture
101  def test_user_data():
102      """Return test user data."""
103      return {
104          "email": "test@example.com",
105          "password": "testpass123",
106          "full_name": "Test User"
107      }