/
tegdif
/
cism
Обзор
Документация
Войти
/
tegdif
/
cism
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
tests/test_api.py
134 строки
5 KB
tegdif
first_commit
28 июл 2026, 08:54
28 июл 2026, 08:54
8ecbd07
Код
Авторство
О чём код?
import pytest from httpx import AsyncClient from src.models.task import TaskStatus from src.services.task_service import TaskService from src.core.database import get_session @pytest.mark.asyncio async def test_create_task(client: AsyncClient): """Тест создания задачи через API со всеми полями.""" response = await client.post( "/api/v1/tasks", json={"title": "API Test Task", "description": "Created via API", "priority": "HIGH"}, ) assert response.status_code == 201 data = response.json() assert data["title"] == "API Test Task" assert data["description"] == "Created via API" assert data["priority"] == "HIGH" assert data["status"] == "NEW" assert "id" in data @pytest.mark.asyncio async def test_create_task_defaults(client: AsyncClient): """Тест создания задачи только с обязательным полем — используются значения по умолчанию.""" response = await client.post( "/api/v1/tasks", json={"title": "Default task"}, ) assert response.status_code == 201 data = response.json() assert data["priority"] == "MEDIUM" assert data["status"] == "NEW" assert data["description"] == "" @pytest.mark.asyncio async def test_get_task(client: AsyncClient): """Тест получения одной задачи по ID.""" create_resp = await client.post("/api/v1/tasks", json={"title": "Get me"}) task_id = create_resp.json()["id"] response = await client.get(f"/api/v1/tasks/{task_id}") assert response.status_code == 200 data = response.json() assert data["id"] == task_id assert data["title"] == "Get me" @pytest.mark.asyncio async def test_get_task_not_found(client: AsyncClient): """Тест получения несуществующей задачи — возвращает 404.""" response = await client.get("/api/v1/tasks/00000000-0000-0000-0000-000000000000") assert response.status_code == 404 @pytest.mark.asyncio async def test_list_tasks(client: AsyncClient): """Тест получения списка всех задач.""" for i in range(5): await client.post("/api/v1/tasks", json={"title": f"List task {i}"}) response = await client.get("/api/v1/tasks") assert response.status_code == 200 data = response.json() assert data["total"] >= 5 assert len(data["items"]) >= 5 assert data["page"] == 1 @pytest.mark.asyncio async def test_list_tasks_pagination(client: AsyncClient): """Тест пагинации при получении списка задач.""" response = await client.get("/api/v1/tasks?page=1&page_size=3") assert response.status_code == 200 data = response.json() assert data["page"] == 1 assert data["page_size"] == 3 assert len(data["items"]) <= 3 @pytest.mark.asyncio async def test_cancel_task(client: AsyncClient): """Тест отмены задачи через DELETE endpoint.""" create_resp = await client.post("/api/v1/tasks", json={"title": "Cancel me"}) task_id = create_resp.json()["id"] response = await client.delete(f"/api/v1/tasks/{task_id}") assert response.status_code == 200 data = response.json() assert data["status"] == "CANCELLED" @pytest.mark.asyncio async def test_cancel_completed_task(client: AsyncClient, session): """Тест, что отмена выполненной задачи возвращает 400.""" import uuid create_resp = await client.post("/api/v1/tasks", json={"title": "Already done"}) task_id_str = create_resp.json()["id"] task_id = uuid.UUID(task_id_str) # Сначала завершаем задачу через сервис (имитация работы worker'а) service = TaskService(session) await service.update_task_status(task_id, TaskStatus.COMPLETED, result="done") # Пытаемся отменить завершённую задачу — ожидаем 400 response = await client.delete(f"/api/v1/tasks/{task_id_str}") assert response.status_code == 400 data = response.json() assert "Невозможно отменить задачу в статусе COMPLETED" in data["detail"] @pytest.mark.asyncio async def test_get_task_status(client: AsyncClient): """Тест получения только статуса задачи.""" create_resp = await client.post("/api/v1/tasks", json={"title": "Status check"}) task_id = create_resp.json()["id"] response = await client.get(f"/api/v1/tasks/{task_id}/status") assert response.status_code == 200 data = response.json() assert data["status"] == "NEW" assert data["id"] == task_id @pytest.mark.asyncio async def test_health_check(client: AsyncClient): """Тест эндпоинта healthcheck.""" response = await client.get("/health") assert response.status_code == 200 data = response.json() assert data["status"] == "healthy"