# Стратегия тестирования API ## 9 обязательных сценариев | # | Сценарий | Статус | Пример | |---|----------|--------|--------| | 1 | Missing field → 422 | Обязателен | `POST /ideas` без body | | 2 | Wrong type → 422 | Обязателен | `title: 123` вместо строки | | 3 | Invalid/expired token → 401 | Обязателен | `Authorization: Bearer bad` | | 4 | Wrong permissions → 403 | Обязателен | user пытается в /admin | | 5 | Not found → 404 | Обязателен | `GET /ideas/nonexistent` | | 6 | Conflict → 409 | Обязателен | Дубликат email при регистрации | | 7 | Success → 200/201 | Обязателен | Успешный CRUD | | 8 | Rate limit → 429 | Когда реализован | 100 запросов подряд | | 9 | Idempotency | Для DELETE/PATCH | Повторный delete → 404 | ## Цель: 4 группы endpoints ``` tests/integration/ ├── conftest.py # async_client, auth headers ├── test_auth.py # register / login / refresh ├── test_ideas.py # CRUD + analyze ├── test_users.py # profile └── test_admin.py # users / health / logs ``` Каждый файл — минимум 9 тестов (по 1 на сценарий). Итого ~36 тестов. ## Структура теста ```python async def test_create_idea_success(async_client, user_token): response = await async_client.post( "/api/v1/ideas", json={"title": "Test", "content": "Content"}, headers={"Authorization": f"Bearer {user_token}"}, ) assert response.status_code == 201 data = response.json() assert data["title"] == "Test" ```