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 }