from collections.abc import AsyncIterator import pytest import pytest_asyncio from sqlalchemy import select, text from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine from src.config import build_database_url from src.models.user import User from src.scripts.seed import build_seed_user, seed_database TEST_DATABASE_URL = build_database_url( user="headquarter", password="headquarter", host="localhost", port=5432, database="headquarter", ) @pytest_asyncio.fixture async def db_session() -> AsyncIterator[AsyncSession]: engine = create_async_engine(TEST_DATABASE_URL) session_factory = async_sessionmaker(engine, expire_on_commit=False) async with session_factory() as session: await session.execute(text("TRUNCATE TABLE git_repositories, projects, users RESTART IDENTITY CASCADE")) await session.commit() yield session await session.execute(text("TRUNCATE TABLE git_repositories, projects, users RESTART IDENTITY CASCADE")) await session.commit() await engine.dispose() def test_build_seed_user_returns_deterministic_payload() -> None: payload = build_seed_user() assert payload == { "email": "dev@headquarter.local", "name": "Development User", "authentik_id": "dev-authentik-user", "avatar_url": None, } @pytest.mark.asyncio async def test_seed_database_creates_development_user(db_session: AsyncSession) -> None: await seed_database(db_session) seeded_user = await db_session.scalar(select(User).where(User.email == "dev@headquarter.local")) assert seeded_user is not None assert seeded_user.authentik_id == "dev-authentik-user"