import pytest import asyncio from typing import AsyncGenerator from httpx import AsyncClient, ASGITransport from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine from sqlalchemy.orm import sessionmaker import sys import os sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from app.main import app from app.database import Base, get_db from app.models.user import User from app.core.security import hash_password TEST_DATABASE_URL = "postgresql+asyncpg://admin:dWFNi67nHNbPbjmP@localhost:5432/foreign_trade_test" test_engine = create_async_engine(TEST_DATABASE_URL, echo=False) TestAsyncSessionLocal = sessionmaker( test_engine, class_=AsyncSession, expire_on_commit=False, ) @pytest.fixture(scope="session") def event_loop(): loop = asyncio.get_event_loop_policy().new_event_loop() yield loop loop.close() @pytest.fixture(scope="function") async def db_session() -> AsyncGenerator[AsyncSession, None]: async with test_engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) async with TestAsyncSessionLocal() as session: yield session async with test_engine.begin() as conn: await conn.run_sync(Base.metadata.drop_all) @pytest.fixture(scope="function") async def client(db_session: AsyncSession) -> AsyncGenerator[AsyncClient, None]: async def override_get_db(): yield db_session app.dependency_overrides[get_db] = override_get_db async with AsyncClient( transport=ASGITransport(app=app), base_url="http://test" ) as ac: yield ac app.dependency_overrides.clear() @pytest.fixture async def test_user(db_session: AsyncSession) -> User: user = User( phone="13800138000", username="test_user", password_hash=hash_password("test123456"), tier="free", ) db_session.add(user) await db_session.commit() await db_session.refresh(user) return user @pytest.fixture async def auth_headers(test_user: User) -> dict: from app.core.security import create_access_token token = create_access_token({"sub": str(test_user.id), "tier": test_user.tier}) return {"Authorization": f"Bearer {token}"}