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
+1
View File
@@ -0,0 +1 @@
# Tests for freelancer-match backend
+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
+13
View File
@@ -0,0 +1,13 @@
"""Тесты для health endpoint."""
import pytest
@pytest.mark.asyncio
async def test_health(client):
"""Проверка что health endpoint возвращает ok."""
response = await client.get("/api/health")
assert response.status_code == 200
data = response.json()
assert data["status"] == "ok"
assert data["service"] == "freelancer-match"