Files
blackroad-operating-system/backend/tests/conftest.py
2025-11-16 01:59:54 -06:00

95 lines
2.5 KiB
Python

"""Pytest configuration and fixtures"""
import pytest
import pytest_asyncio
import asyncio
import os
from typing import AsyncGenerator
import pytest
from httpx import ASGITransport, AsyncClient
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine
from app.main import app
from app.database import get_db, Base
from app.config import settings
# Test database URL
TEST_DATABASE_URL = os.getenv(
"TEST_DATABASE_URL",
"sqlite+aiosqlite:///./test.db"
)
# Create test engine
test_engine = create_async_engine(TEST_DATABASE_URL, echo=False)
TestSessionLocal = async_sessionmaker(test_engine, class_=AsyncSession, expire_on_commit=False)
@pytest.fixture(scope="session")
def event_loop():
"""Create event loop for tests"""
loop = asyncio.get_event_loop_policy().new_event_loop()
yield loop
loop.close()
@pytest_asyncio.fixture(scope="function")
async def db_session() -> AsyncGenerator[AsyncSession, None]:
"""Create test database session"""
async with test_engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async with TestSessionLocal() as session:
yield session
async with test_engine.begin() as conn:
await conn.run_sync(Base.metadata.drop_all)
@pytest_asyncio.fixture(scope="function")
async def client(db_session: AsyncSession) -> AsyncGenerator[AsyncClient, None]:
"""Create test client"""
async def override_get_db():
yield db_session
app.dependency_overrides[get_db] = override_get_db
transport = ASGITransport(app=app)
async with AsyncClient(transport=transport, base_url="http://test") as client:
yield client
app.dependency_overrides.clear()
@pytest_asyncio.fixture
async def test_user(client: AsyncClient):
"""Create a test user"""
user_data = {
"username": "testuser",
"email": "test@example.com",
"password": "testpassword123",
"full_name": "Test User"
}
response = await client.post("/api/auth/register", json=user_data)
assert response.status_code == 201
return response.json()
@pytest_asyncio.fixture
async def auth_headers(client: AsyncClient, test_user):
"""Get authentication headers"""
login_data = {
"username": "testuser",
"password": "testpassword123"
}
response = await client.post(
"/api/auth/login",
data=login_data
)
assert response.status_code == 200
token = response.json()["access_token"]
return {"Authorization": f"Bearer {token}"}