feat: Freelancer Match — AI-матчинг, escrow, milestones, portfolio, skill-tests, verification

This commit is contained in:
2026-07-03 15:03:30 +00:00
commit 0b785db1b3
61 changed files with 2725 additions and 0 deletions
+83
View File
@@ -0,0 +1,83 @@
"""Конфигурация тестов."""
import asyncio
from typing import AsyncGenerator
import pytest
import pytest_asyncio
from httpx import ASGITransport, AsyncClient
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker
from app.core.database import Base
# Создаём тестовую БД в памяти (SQLite)
TEST_DATABASE_URL = "sqlite+aiosqlite:///:memory:"
engine = create_async_engine(TEST_DATABASE_URL, echo=False)
async_session_factory = async_sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
@pytest.fixture(scope="session")
def event_loop():
"""Создаём event loop для тестов."""
loop = asyncio.new_event_loop()
yield loop
loop.close()
@pytest_asyncio.fixture(autouse=True)
async def setup_db():
"""Создаём таблицы перед каждым тестом и удаляем после."""
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
yield
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.drop_all)
@pytest_asyncio.fixture
async def db_session() -> AsyncGenerator[AsyncSession, None]:
"""Тестовая сессия БД."""
async with async_session_factory() as session:
yield session
@pytest_asyncio.fixture
async def client(db_session) -> AsyncGenerator[AsyncClient, None]:
"""HTTP клиент для тестирования API."""
from app.main import app
transport = ASGITransport(app=app)
async with AsyncClient(transport=transport, base_url="http://test") as ac:
yield ac
@pytest_asyncio.fixture
async def test_user(db_session):
"""Создаём тестового пользователя."""
from app.models.user import User
user = User(email="test@example.com", password_hash="$2b$12$LJ3m4ys6LJ3m4ys6LJ3m4e", role="freelancer")
db_session.add(user)
await db_session.commit()
return user
@pytest_asyncio.fixture
async def test_project(db_session, test_user):
"""Создаём тестовый проект."""
from app.models.project import Project
project = Project(
client_id=test_user.id,
title="Тестовый проект",
description="Описание проекта для тестирования",
category="web-development",
required_skills=["python", "fastapi"],
budget_min=1000.0,
budget_max=5000.0,
)
db_session.add(project)
await db_session.commit()
return project