diff --git a/api/openapi2.yaml b/api/openapi2.yaml index e2f371d..cadefcc 100644 --- a/api/openapi2.yaml +++ b/api/openapi2.yaml @@ -499,7 +499,7 @@ paths: $ref: '#/components/responses/InternalServerError' /question/delete: - post: + delete: tags: [Question] summary: Delete a question security: @@ -512,7 +512,7 @@ paths: $ref: '#/components/schemas/DeactivateQuestionRequest' responses: '200': - description: Question deleted successfully + description: Question deleted successfully content: application/json: schema: diff --git a/api_test_specification.md b/api_test_specification.md new file mode 100644 index 0000000..3f791c5 --- /dev/null +++ b/api_test_specification.md @@ -0,0 +1,2009 @@ +# Тестовая спецификация API + +## Содержание +1. [GET /account/get](#1-get-accountget) +2. [POST /account/create](#2-post-accountcreate) +3. [DELETE /account/delete](#3-delete-accountdelete) +4. [GET /accounts](#4-get-accounts) +5. [GET /privilege/{userId}](#5-get-privilegeuserid) +6. [DELETE /account/{userId}](#6-delete-accountuserid) +7. [POST /account/manualdone](#7-post-accountmanualdone) +8. [POST /account/leadtarget](#8-post-accountleadtarget) +9. [PUT /account/leadtarget](#9-put-accountleadtarget) +10. [DELETE /account/leadtarget/{id}](#10-delete-accountleadtargetid) +11. [GET /account/leadtarget/{quizID}](#11-get-accountleadtargetquizid) +13. [POST /question/create](#13-post-questioncreate) + +## 1. GET /account/get + +### 1.1 Описание +Получение информации о текущем аккаунте пользователя. + +### 1.2 Базовые требования +- Требуется JWT токен авторизации (bearerAuth) +- Возвращает детальную информацию об аккаунте в формате JSON +- Поддерживает стандартные HTTP коды ответа: 200, 401, 404, 500 + +### 1.3 Тестовые сценарии + +#### 1.3.1 Успешное получение информации об аккаунте +**Предусловия:** +- Пользователь авторизован +- Аккаунт существует и активен +- JWT токен валиден + +**Входные данные:** +- Метод: GET +- URL: /account/get +- Headers: + - Authorization: Bearer {valid_jwt_token} + +**Ожидаемый результат:** +- HTTP Status: 200 OK +- Content-Type: application/json +- Тело ответа содержит объект Account со следующими полями: + - id (string) + - user_id (string) + - created_at (date-time) + - privileges (object) + +**Проверки:** +1. Все обязательные поля присутствуют в ответе +2. Формат даты created_at соответствует ISO 8601 +3. Структура privileges соответствует схеме ShortPrivilege +4. Значения полей соответствуют данным в базе + +#### 1.3.2 Проверка авторизации +**Сценарий 2.1: Отсутствие токена** +- Headers: без Authorization +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.2: Невалидный токен** +- Headers: Authorization: Bearer invalid_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.3: Истекший токен** +- Headers: Authorization: Bearer expired_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +#### 1.3.3 Проверка существования аккаунта +**Сценарий 3.1: Аккаунт не найден** +- Предусловие: Аккаунт удален или не существует +- Ожидаемый результат: 404 Not Found +- Проверка сообщения об ошибке + +**Сценарий 3.2: Аккаунт деактивирован** +- Предусловие: Аккаунт помечен как deleted=true +- Ожидаемый результат: 404 Not Found +- Проверка сообщения об ошибке + +#### 1.3.4 Проверка привилегий +**Сценарий 4.1: Аккаунт без привилегий** +- Предусловие: Аккаунт существует, но не имеет привилегий +- Ожидаемый результат: 200 OK +- Проверка: privileges = {} + +**Сценарий 4.2: Аккаунт с множеством привилегий** +- Предусловие: Аккаунт имеет несколько активных привилегий +- Ожидаемый результат: 200 OK +- Проверка структуры и содержимого privileges + +#### 1.3.5 Проверка производительности +**Сценарий 5.1: Время ответа** +- Проверка: время ответа < 500ms +- Проверка: стабильность времени ответа при повторных запросах + +**Сценарий 5.2: Нагрузочное тестирование** +- Проверка: система выдерживает 100 последовательных запросов +- Проверка: отсутствие утечек памяти + +#### 1.3.6 Проверка безопасности +**Сценарий 6.1: XSS уязвимости** +- Проверка: экранирование специальных символов в ответе +- Проверка: корректные заголовки безопасности + +**Сценарий 6.2: CSRF защита** +- Проверка: наличие и валидность CSRF токена +- Проверка: корректная обработка невалидного CSRF токена + +#### 1.3.7 Граничные случаи +**Сценарий 7.1: Очень длинные значения полей** +- Проверка: обработка полей с максимально допустимой длиной +- Проверка: корректное обрезание/валидация длинных значений + +**Сценарий 7.2: Специальные символы в данных** +- Проверка: корректная обработка Unicode символов +- Проверка: обработка специальных символов в именах полей + +#### 1.3.8 Обработка ошибок +**Сценарий 8.1: Внутренняя ошибка сервера** +- Предусловие: Имитация сбоя базы данных +- Ожидаемый результат: 500 Internal Server Error +- Проверка: информативное сообщение об ошибке + +**Сценарий 8.2: Таймаут соединения** +- Предусловие: Имитация таймаута +- Ожидаемый результат: 500 Internal Server Error +- Проверка: корректная обработка таймаута + +### 1.4 Особые моменты для тестирования + +1. **Валидация JWT токена:** + - Проверка подписи токена + - Проверка срока действия + - Проверка структуры claims + +2. **Кэширование:** + - Проверка правильности кэширования ответов + - Проверка инвалидации кэша при изменении данных + +3. **Логирование:** + - Проверка записи всех важных событий + - Проверка корректности логов + +4. **Мониторинг:** + - Проверка метрик производительности + - Проверка алертов при ошибках + +### 1.5 Критерии приемки + +1. Все тестовые сценарии пройдены успешно +2. Время ответа соответствует требованиям +3. Обработка ошибок соответствует спецификации +4. Безопасность соответствует стандартам +5. Логирование и мониторинг работают корректно + +## 2. POST /account/create + +### 2.1 Описание +Создание нового аккаунта пользователя. + +### 2.2 Базовые требования +- Требуется JWT токен авторизации (bearerAuth) +- Создает новый аккаунт в системе +- Поддерживает HTTP коды ответа: 200, 401, 409, 500 + +### 2.3 Тестовые сценарии + +#### 2.3.1 Успешное создание аккаунта +**Предусловия:** +- Пользователь авторизован +- JWT токен валиден +- Аккаунт с таким user_id еще не существует + +**Входные данные:** +- Метод: POST +- URL: /account/create +- Headers: + - Authorization: Bearer {valid_jwt_token} + - Content-Type: application/json + +**Ожидаемый результат:** +- HTTP Status: 200 OK +- Content-Type: application/json +- Тело ответа содержит объект Account со следующими полями: + - id (string) + - user_id (string) + - created_at (date-time) + - privileges (object) + +**Проверки:** +1. Аккаунт успешно создан в базе данных +2. Все обязательные поля присутствуют в ответе +3. Формат даты created_at соответствует ISO 8601 +4. Значения полей соответствуют переданным данным + +#### 2.3.2 Проверка авторизации +**Сценарий 2.1: Отсутствие токена** +- Headers: без Authorization +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.2: Невалидный токен** +- Headers: Authorization: Bearer invalid_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.3: Истекший токен** +- Headers: Authorization: Bearer expired_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +#### 2.3.3 Проверка конфликтов +**Сценарий 3.1: Создание дублирующегося аккаунта** +- Предусловие: Аккаунт с таким user_id уже существует +- Ожидаемый результат: 409 Conflict +- Проверка сообщения об ошибке + +**Сценарий 3.2: Попытка создания аккаунта с существующим ID** +- Предусловие: Передан ID существующего аккаунта +- Ожидаемый результат: 409 Conflict +- Проверка сообщения об ошибке + +#### 2.3.4 Проверка валидации данных +**Сценарий 4.1: Отсутствие обязательных полей** +- Входные данные: пустой JSON объект +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 4.2: Некорректный формат данных** +- Входные данные: неверный формат полей +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +#### 2.3.5 Проверка безопасности +**Сценарий 5.1: SQL-инъекции** +- Входные данные: SQL-инъекция в полях +- Ожидаемый результат: 400 Bad Request +- Проверка: инъекция не выполнена + +**Сценарий 5.2: XSS-атаки** +- Входные данные: XSS-код в полях +- Ожидаемый результат: 400 Bad Request +- Проверка: XSS-код не выполнен + +#### 2.3.6 Проверка производительности +**Сценарий 6.1: Время создания** +- Проверка: время создания аккаунта < 1s +- Проверка: стабильность времени при повторных запросах + +**Сценарий 6.2: Нагрузочное тестирование** +- Проверка: система выдерживает создание 100 аккаунтов подряд +- Проверка: отсутствие утечек памяти + +#### 2.3.7 Граничные случаи +**Сценарий 7.1: Очень длинные значения полей** +- Входные данные: поля с максимально допустимой длиной +- Ожидаемый результат: 200 OK +- Проверка: данные сохранены корректно + +**Сценарий 7.2: Специальные символы** +- Входные данные: Unicode символы в полях +- Ожидаемый результат: 200 OK +- Проверка: данные сохранены корректно + +#### 2.3.8 Обработка ошибок +**Сценарий 8.1: Внутренняя ошибка сервера** +- Предусловие: Имитация сбоя базы данных +- Ожидаемый результат: 500 Internal Server Error +- Проверка: информативное сообщение об ошибке + +**Сценарий 8.2: Таймаут соединения** +- Предусловие: Имитация таймаута +- Ожидаемый результат: 500 Internal Server Error +- Проверка: корректная обработка таймаута + +### 2.4 Особые моменты для тестирования + +1. **Валидация данных:** + - Проверка всех обязательных полей + - Проверка форматов данных + - Проверка уникальности user_id + +2. **Транзакционность:** + - Проверка атомарности операции создания + - Проверка отката при ошибках + +3. **Логирование:** + - Проверка записи создания аккаунта + - Проверка аудит-логов + +4. **Мониторинг:** + - Проверка метрик создания аккаунтов + - Проверка алертов при ошибках + +### 2.5 Критерии приемки + +1. Все тестовые сценарии пройдены успешно +2. Время создания аккаунта соответствует требованиям +3. Обработка ошибок соответствует спецификации +4. Безопасность соответствует стандартам +5. Логирование и мониторинг работают корректно + +## 3. DELETE /account/delete + +### 3.1 Описание +Удаление текущего аккаунта пользователя. + +### 3.2 Базовые требования +- Требуется JWT токен авторизации (bearerAuth) +- Удаляет текущий аккаунт пользователя +- Поддерживает HTTP коды ответа: 200, 401, 500 + +### 3.3 Тестовые сценарии + +#### 3.3.1 Успешное удаление аккаунта +**Предусловия:** +- Пользователь авторизован +- JWT токен валиден +- Аккаунт существует и активен + +**Входные данные:** +- Метод: DELETE +- URL: /account/delete +- Headers: + - Authorization: Bearer {valid_jwt_token} + +**Ожидаемый результат:** +- HTTP Status: 200 OK +- Content-Type: application/json +- Тело ответа содержит объект с полем accountId (string) + +**Проверки:** +1. Аккаунт успешно удален из базы данных +2. Все связанные данные аккаунта удалены или помечены как удаленные +3. Поле accountId в ответе соответствует ID удаленного аккаунта +4. Последующие запросы к аккаунту возвращают 404 + +#### 3.3.2 Проверка авторизации +**Сценарий 2.1: Отсутствие токена** +- Headers: без Authorization +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.2: Невалидный токен** +- Headers: Authorization: Bearer invalid_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.3: Истекший токен** +- Headers: Authorization: Bearer expired_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +#### 3.3.3 Проверка состояния аккаунта +**Сценарий 3.1: Удаление уже удаленного аккаунта** +- Предусловие: Аккаунт уже помечен как удаленный +- Ожидаемый результат: 200 OK +- Проверка: повторное удаление не вызывает ошибок + +**Сценарий 3.2: Удаление несуществующего аккаунта** +- Предусловие: Аккаунт не существует +- Ожидаемый результат: 200 OK +- Проверка: операция завершается успешно + +#### 3.3.4 Проверка каскадного удаления +**Сценарий 4.1: Удаление связанных данных** +- Проверка: все связанные квизы удалены или помечены как удаленные +- Проверка: все связанные вопросы удалены или помечены как удаленные +- Проверка: все связанные результаты удалены или помечены как удаленные + +**Сценарий 4.2: Сохранение статистики** +- Проверка: статистические данные сохранены для аналитики +- Проверка: исторические данные доступны для отчетов + +#### 3.3.5 Проверка безопасности +**Сценарий 5.1: Попытка удаления чужого аккаунта** +- Предусловие: Попытка удаления аккаунта другого пользователя +- Ожидаемый результат: 401 Unauthorized +- Проверка: операция отклонена + +**Сценарий 5.2: Проверка CSRF защиты** +- Проверка: наличие и валидность CSRF токена +- Проверка: отклонение запросов без валидного CSRF токена + +#### 3.3.6 Проверка производительности +**Сценарий 6.1: Время удаления** +- Проверка: время удаления аккаунта < 2s +- Проверка: стабильность времени при повторных запросах + +**Сценарий 6.2: Нагрузочное тестирование** +- Проверка: система корректно обрабатывает множественные запросы на удаление +- Проверка: отсутствие утечек памяти при массовом удалении + +#### 3.3.7 Граничные случаи +**Сценарий 7.1: Удаление аккаунта с большим количеством данных** +- Предусловие: Аккаунт имеет множество связанных данных +- Ожидаемый результат: 200 OK +- Проверка: все данные успешно удалены + +**Сценарий 7.2: Удаление во время активных операций** +- Предусловие: Активные операции с аккаунтом +- Ожидаемый результат: 200 OK +- Проверка: корректная обработка конкурентных запросов + +#### 3.3.8 Обработка ошибок +**Сценарий 8.1: Внутренняя ошибка сервера** +- Предусловие: Имитация сбоя базы данных +- Ожидаемый результат: 500 Internal Server Error +- Проверка: информативное сообщение об ошибке + +**Сценарий 8.2: Таймаут соединения** +- Предусловие: Имитация таймаута +- Ожидаемый результат: 500 Internal Server Error +- Проверка: корректная обработка таймаута + +### 3.4 Особые моменты для тестирования + +1. **Транзакционность:** + - Проверка атомарности операции удаления + - Проверка отката при частичном удалении + - Проверка целостности данных после удаления + +2. **Логирование:** + - Проверка записи операции удаления + - Проверка аудит-логов + - Проверка логов связанных операций + +3. **Мониторинг:** + - Проверка метрик удаления аккаунтов + - Проверка алертов при ошибках + - Проверка мониторинга связанных операций + +4. **Восстановление:** + - Проверка возможности восстановления данных + - Проверка периода хранения удаленных данных + +### 3.5 Критерии приемки + +1. Все тестовые сценарии пройдены успешно +2. Время удаления аккаунта соответствует требованиям +3. Обработка ошибок соответствует спецификации +4. Безопасность соответствует стандартам +5. Логирование и мониторинг работают корректно +6. Каскадное удаление работает корректно +7. Данные успешно удаляются или помечаются как удаленные + +## 4. GET /accounts + +### 4.1 Описание +Получение списка аккаунтов с поддержкой пагинации. + +### 4.2 Базовые требования +- Требуется JWT токен авторизации (bearerAuth) +- Поддерживает пагинацию через параметры limit и page +- Поддерживает HTTP коды ответа: 200, 400, 401, 500 + +### 4.3 Тестовые сценарии + +#### 4.3.1 Успешное получение списка аккаунтов +**Предусловия:** +- Пользователь авторизован +- JWT токен валиден +- В системе есть несколько аккаунтов + +**Входные данные:** +- Метод: GET +- URL: /accounts +- Headers: + - Authorization: Bearer {valid_jwt_token} + - Content-Type: application/json +- Body: + ```json + { + "limit": 10, + "page": 1 + } + ``` + +**Ожидаемый результат:** +- HTTP Status: 200 OK +- Content-Type: application/json +- Тело ответа содержит объект со следующими полями: + - count (integer) - общее количество аккаунтов + - items (array) - массив объектов Account + +**Проверки:** +1. Количество возвращаемых элементов не превышает limit +2. Все обязательные поля присутствуют в каждом объекте Account +3. Значение count соответствует общему количеству аккаунтов +4. Элементы отсортированы по дате создания (новые первые) + +#### 4.3.2 Проверка авторизации +**Сценарий 2.1: Отсутствие токена** +- Headers: без Authorization +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.2: Невалидный токен** +- Headers: Authorization: Bearer invalid_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.3: Истекший токен** +- Headers: Authorization: Bearer expired_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +#### 4.3.3 Проверка пагинации +**Сценарий 3.1: Корректные параметры пагинации** +- Входные данные: limit=10, page=1 +- Ожидаемый результат: 200 OK +- Проверка: возвращается корректное количество элементов + +**Сценарий 3.2: Некорректные параметры пагинации** +- Входные данные: limit=0, page=0 +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.3: Превышение максимального лимита** +- Входные данные: limit=1000 +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +#### 4.3.4 Проверка фильтрации +**Сценарий 4.1: Пустой результат** +- Предусловие: Нет аккаунтов в системе +- Ожидаемый результат: 200 OK +- Проверка: count=0, items=[] + +**Сценарий 4.2: Последняя страница** +- Входные данные: page с большим номером +- Ожидаемый результат: 200 OK +- Проверка: items=[] + +#### 4.3.5 Проверка безопасности +**Сценарий 5.1: Проверка прав доступа** +- Проверка: пользователь видит только разрешенные аккаунты +- Проверка: конфиденциальные данные скрыты + +**Сценарий 5.2: CSRF защита** +- Проверка: наличие и валидность CSRF токена +- Проверка: отклонение запросов без валидного CSRF токена + +#### 4.3.6 Проверка производительности +**Сценарий 6.1: Время ответа** +- Проверка: время ответа < 500ms +- Проверка: стабильность времени при повторных запросах + +**Сценарий 6.2: Нагрузочное тестирование** +- Проверка: система выдерживает 100 последовательных запросов +- Проверка: отсутствие утечек памяти + +#### 4.3.7 Граничные случаи +**Сценарий 7.1: Большое количество аккаунтов** +- Предусловие: В системе 1000+ аккаунтов +- Ожидаемый результат: 200 OK +- Проверка: корректная работа пагинации + +**Сценарий 7.2: Специальные символы в данных** +- Проверка: корректная обработка Unicode символов +- Проверка: корректное отображение специальных символов + +#### 4.3.8 Обработка ошибок +**Сценарий 8.1: Внутренняя ошибка сервера** +- Предусловие: Имитация сбоя базы данных +- Ожидаемый результат: 500 Internal Server Error +- Проверка: информативное сообщение об ошибке + +**Сценарий 8.2: Таймаут соединения** +- Предусловие: Имитация таймаута +- Ожидаемый результат: 500 Internal Server Error +- Проверка: корректная обработка таймаута + +### 4.4 Особые моменты для тестирования + +1. **Кэширование:** + - Проверка правильности кэширования результатов + - Проверка инвалидации кэша при изменении данных + +2. **Логирование:** + - Проверка записи запросов к списку аккаунтов + - Проверка аудит-логов + +3. **Мониторинг:** + - Проверка метрик производительности + - Проверка алертов при ошибках + +4. **Оптимизация:** + - Проверка эффективности запросов к БД + - Проверка использования индексов + +### 4.5 Критерии приемки + +1. Все тестовые сценарии пройдены успешно +2. Время ответа соответствует требованиям +3. Пагинация работает корректно +4. Обработка ошибок соответствует спецификации +5. Безопасность соответствует стандартам +6. Логирование и мониторинг работают корректно +7. Кэширование работает эффективно + +## 5. GET /privilege/{userId} + +### 5.1 Описание +Получение списка привилегий для указанного пользователя по его ID. + +### 5.2 Базовые требования +- Требуется JWT токен авторизации (bearerAuth) +- Требуется передача userId в теле запроса +- Поддерживает HTTP коды ответа: 200, 400, 401, 500 + +### 5.3 Тестовые сценарии + +#### 5.3.1 Успешное получение привилегий +**Предусловия:** +- Пользователь авторизован +- JWT токен валиден +- Указанный пользователь существует +- У пользователя есть привилегии + +**Входные данные:** +- Метод: GET +- URL: /privilege/{userId} +- Headers: + - Authorization: Bearer {valid_jwt_token} + - Content-Type: application/json +- Body: + ```json + { + "userId": "valid_user_id" + } + ``` + +**Ожидаемый результат:** +- HTTP Status: 200 OK +- Content-Type: application/json +- Тело ответа содержит массив объектов ShortPrivilege со следующими полями: + - id (string) + - privilege_id (string) + - privilege_name (string) + - amount (integer) + - created_at (date-time) + +**Проверки:** +1. Все привилегии пользователя возвращены +2. Все обязательные поля присутствуют в каждом объекте +3. Формат даты created_at соответствует ISO 8601 +4. Значения полей соответствуют данным в базе + +#### 5.3.2 Проверка авторизации +**Сценарий 2.1: Отсутствие токена** +- Headers: без Authorization +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.2: Невалидный токен** +- Headers: Authorization: Bearer invalid_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.3: Истекший токен** +- Headers: Authorization: Bearer expired_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +#### 5.3.3 Проверка входных данных +**Сценарий 3.1: Отсутствие userId** +- Body: пустой JSON объект +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.2: Невалидный userId** +- Body: { "userId": "invalid_id" } +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.3: Несуществующий userId** +- Body: { "userId": "non_existent_id" } +- Ожидаемый результат: 200 OK +- Проверка: возвращается пустой массив + +#### 5.3.4 Проверка прав доступа +**Сценарий 4.1: Запрос привилегий другого пользователя** +- Предусловие: Запрос привилегий пользователя с другим ID +- Ожидаемый результат: 401 Unauthorized +- Проверка: доступ запрещен + +**Сценарий 4.2: Запрос привилегий с недостаточными правами** +- Предусловие: У запрашивающего пользователя нет прав на просмотр привилегий +- Ожидаемый результат: 401 Unauthorized +- Проверка: доступ запрещен + +#### 5.3.5 Проверка безопасности +**Сценарий 5.1: SQL-инъекции** +- Body: { "userId": "1' OR '1'='1" } +- Ожидаемый результат: 400 Bad Request +- Проверка: инъекция не выполнена + +**Сценарий 5.2: XSS-атаки** +- Body: { "userId": "" } +- Ожидаемый результат: 400 Bad Request +- Проверка: XSS-код не выполнен + +#### 5.3.6 Проверка производительности +**Сценарий 6.1: Время ответа** +- Проверка: время ответа < 300ms +- Проверка: стабильность времени при повторных запросах + +**Сценарий 6.2: Нагрузочное тестирование** +- Проверка: система выдерживает 100 последовательных запросов +- Проверка: отсутствие утечек памяти + +#### 5.3.7 Граничные случаи +**Сценарий 7.1: Пользователь с большим количеством привилегий** +- Предусловие: У пользователя 100+ привилегий +- Ожидаемый результат: 200 OK +- Проверка: все привилегии возвращены корректно + +**Сценарий 7.2: Пользователь без привилегий** +- Предусловие: У пользователя нет привилегий +- Ожидаемый результат: 200 OK +- Проверка: возвращается пустой массив + +#### 5.3.8 Обработка ошибок +**Сценарий 8.1: Внутренняя ошибка сервера** +- Предусловие: Имитация сбоя базы данных +- Ожидаемый результат: 500 Internal Server Error +- Проверка: информативное сообщение об ошибке + +**Сценарий 8.2: Таймаут соединения** +- Предусловие: Имитация таймаута +- Ожидаемый результат: 500 Internal Server Error +- Проверка: корректная обработка таймаута + +### 5.4 Особые моменты для тестирования + +1. **Кэширование:** + - Проверка кэширования результатов запроса + - Проверка инвалидации кэша при изменении привилегий + +2. **Логирование:** + - Проверка записи запросов к привилегиям + - Проверка аудит-логов доступа + +3. **Мониторинг:** + - Проверка метрик производительности + - Проверка алертов при ошибках + +4. **Безопасность:** + - Проверка контроля доступа + - Проверка валидации входных данных + +### 5.5 Критерии приемки + +1. Все тестовые сценарии пройдены успешно +2. Время ответа соответствует требованиям +3. Обработка ошибок соответствует спецификации +4. Безопасность соответствует стандартам +5. Логирование и мониторинг работают корректно +6. Кэширование работает эффективно +7. Контроль доступа работает корректно + +## 6. DELETE /account/{userId} + +### 6.1 Описание +Удаление аккаунта пользователя по его ID. + +### 6.2 Базовые требования +- Требуется JWT токен авторизации (bearerAuth) +- Требуется передача userId в теле запроса +- Поддерживает HTTP коды ответа: 200, 400, 401, 500 + +### 6.3 Тестовые сценарии + +#### 6.3.1 Успешное удаление аккаунта +**Предусловия:** +- Пользователь авторизован +- JWT токен валиден +- У запрашивающего пользователя есть права на удаление аккаунтов +- Удаляемый аккаунт существует и активен + +**Входные данные:** +- Метод: DELETE +- URL: /account/{userId} +- Headers: + - Authorization: Bearer {valid_jwt_token} + - Content-Type: application/json +- Body: + ```json + { + "userId": "valid_user_id" + } + ``` + +**Ожидаемый результат:** +- HTTP Status: 200 OK +- Content-Type: application/json +- Тело ответа содержит объект с полем userId (string) + +**Проверки:** +1. Аккаунт успешно удален из базы данных +2. Все связанные данные аккаунта удалены или помечены как удаленные +3. Поле userId в ответе соответствует ID удаленного аккаунта +4. Последующие запросы к аккаунту возвращают 404 + +#### 6.3.2 Проверка авторизации +**Сценарий 2.1: Отсутствие токена** +- Headers: без Authorization +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.2: Невалидный токен** +- Headers: Authorization: Bearer invalid_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.3: Истекший токен** +- Headers: Authorization: Bearer expired_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +#### 6.3.3 Проверка входных данных +**Сценарий 3.1: Отсутствие userId** +- Body: пустой JSON объект +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.2: Невалидный userId** +- Body: { "userId": "invalid_id" } +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.3: Несуществующий userId** +- Body: { "userId": "non_existent_id" } +- Ожидаемый результат: 200 OK +- Проверка: операция завершается успешно + +#### 6.3.4 Проверка прав доступа +**Сценарий 4.1: Удаление без необходимых прав** +- Предусловие: У пользователя нет прав на удаление аккаунтов +- Ожидаемый результат: 401 Unauthorized +- Проверка: доступ запрещен + +**Сценарий 4.2: Попытка удаления системного аккаунта** +- Предусловие: Попытка удаления системного аккаунта +- Ожидаемый результат: 401 Unauthorized +- Проверка: доступ запрещен + +#### 6.3.5 Проверка каскадного удаления +**Сценарий 5.1: Удаление связанных данных** +- Проверка: все связанные квизы удалены или помечены как удаленные +- Проверка: все связанные вопросы удалены или помечены как удаленные +- Проверка: все связанные результаты удалены или помечены как удаленные + +**Сценарий 5.2: Сохранение статистики** +- Проверка: статистические данные сохранены для аналитики +- Проверка: исторические данные доступны для отчетов + +#### 6.3.6 Проверка безопасности +**Сценарий 6.1: SQL-инъекции** +- Body: { "userId": "1' OR '1'='1" } +- Ожидаемый результат: 400 Bad Request +- Проверка: инъекция не выполнена + +**Сценарий 6.2: XSS-атаки** +- Body: { "userId": "" } +- Ожидаемый результат: 400 Bad Request +- Проверка: XSS-код не выполнен + +#### 6.3.7 Проверка производительности +**Сценарий 7.1: Время удаления** +- Проверка: время удаления аккаунта < 2s +- Проверка: стабильность времени при повторных запросах + +**Сценарий 7.2: Нагрузочное тестирование** +- Проверка: система корректно обрабатывает множественные запросы на удаление +- Проверка: отсутствие утечек памяти при массовом удалении + +#### 6.3.8 Граничные случаи +**Сценарий 8.1: Удаление аккаунта с большим количеством данных** +- Предусловие: Аккаунт имеет множество связанных данных +- Ожидаемый результат: 200 OK +- Проверка: все данные успешно удалены + +**Сценарий 8.2: Удаление во время активных операций** +- Предусловие: Активные операции с аккаунтом +- Ожидаемый результат: 200 OK +- Проверка: корректная обработка конкурентных запросов + +#### 6.3.9 Обработка ошибок +**Сценарий 9.1: Внутренняя ошибка сервера** +- Предусловие: Имитация сбоя базы данных +- Ожидаемый результат: 500 Internal Server Error +- Проверка: информативное сообщение об ошибке + +**Сценарий 9.2: Таймаут соединения** +- Предусловие: Имитация таймаута +- Ожидаемый результат: 500 Internal Server Error +- Проверка: корректная обработка таймаута + +### 6.4 Особые моменты для тестирования + +1. **Транзакционность:** + - Проверка атомарности операции удаления + - Проверка отката при частичном удалении + - Проверка целостности данных после удаления + +2. **Логирование:** + - Проверка записи операции удаления + - Проверка аудит-логов + - Проверка логов связанных операций + +3. **Мониторинг:** + - Проверка метрик удаления аккаунтов + - Проверка алертов при ошибках + - Проверка мониторинга связанных операций + +4. **Восстановление:** + - Проверка возможности восстановления данных + - Проверка периода хранения удаленных данных + +### 6.5 Критерии приемки + +1. Все тестовые сценарии пройдены успешно +2. Время удаления аккаунта соответствует требованиям +3. Обработка ошибок соответствует спецификации +4. Безопасность соответствует стандартам +5. Логирование и мониторинг работают корректно +6. Каскадное удаление работает корректно +7. Данные успешно удаляются или помечаются как удаленные +8. Контроль доступа работает корректно + +## 7. POST /account/manualdone + +### 7.1 Описание +Ручная пометка аккаунта как завершенного. + +### 7.2 Базовые требования +- Требуется JWT токен авторизации (bearerAuth) +- Требуется передача id пользователя в теле запроса +- Поддерживает HTTP коды ответа: 200, 400, 401, 404, 500 + +### 7.3 Тестовые сценарии + +#### 7.3.1 Успешная пометка аккаунта как завершенного +**Предусловия:** +- Пользователь авторизован +- JWT токен валиден +- У запрашивающего пользователя есть права на пометку аккаунтов +- Аккаунт существует и активен + +**Входные данные:** +- Метод: POST +- URL: /account/manualdone +- Headers: + - Authorization: Bearer {valid_jwt_token} + - Content-Type: application/json +- Body: + ```json + { + "id": "valid_user_id" + } + ``` + +**Ожидаемый результат:** +- HTTP Status: 200 OK +- Content-Type: application/json + +**Проверки:** +1. Аккаунт успешно помечен как завершенный +2. Статус аккаунта обновлен в базе данных +3. Все связанные операции завершены +4. Последующие запросы к аккаунту показывают обновленный статус + +#### 7.3.2 Проверка авторизации +**Сценарий 2.1: Отсутствие токена** +- Headers: без Authorization +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.2: Невалидный токен** +- Headers: Authorization: Bearer invalid_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.3: Истекший токен** +- Headers: Authorization: Bearer expired_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +#### 7.3.3 Проверка входных данных +**Сценарий 3.1: Отсутствие id** +- Body: пустой JSON объект +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.2: Невалидный id** +- Body: { "id": "invalid_id" } +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.3: Несуществующий id** +- Body: { "id": "non_existent_id" } +- Ожидаемый результат: 404 Not Found +- Проверка сообщения об ошибке + +#### 7.3.4 Проверка прав доступа +**Сценарий 4.1: Отметка без необходимых прав** +- Предусловие: У пользователя нет прав на пометку аккаунтов +- Ожидаемый результат: 401 Unauthorized +- Проверка: доступ запрещен + +**Сценарий 4.2: Попытка пометки системного аккаунта** +- Предусловие: Попытка пометки системного аккаунта +- Ожидаемый результат: 401 Unauthorized +- Проверка: доступ запрещен + +#### 7.3.5 Проверка состояния аккаунта +**Сценарий 5.1: Пометка уже завершенного аккаунта** +- Предусловие: Аккаунт уже помечен как завершенный +- Ожидаемый результат: 200 OK +- Проверка: повторная пометка не вызывает ошибок + +**Сценарий 5.2: Пометка удаленного аккаунта** +- Предусловие: Аккаунт помечен как удаленный +- Ожидаемый результат: 404 Not Found +- Проверка: операция отклонена + +#### 7.3.6 Проверка безопасности +**Сценарий 6.1: SQL-инъекции** +- Body: { "id": "1' OR '1'='1" } +- Ожидаемый результат: 400 Bad Request +- Проверка: инъекция не выполнена + +**Сценарий 6.2: XSS-атаки** +- Body: { "id": "" } +- Ожидаемый результат: 400 Bad Request +- Проверка: XSS-код не выполнен + +#### 7.3.7 Проверка производительности +**Сценарий 7.1: Время выполнения** +- Проверка: время выполнения операции < 1s +- Проверка: стабильность времени при повторных запросах + +**Сценарий 7.2: Нагрузочное тестирование** +- Проверка: система корректно обрабатывает множественные запросы +- Проверка: отсутствие утечек памяти + +#### 7.3.8 Граничные случаи +**Сценарий 8.1: Пометка аккаунта с большим количеством данных** +- Предусловие: Аккаунт имеет множество связанных данных +- Ожидаемый результат: 200 OK +- Проверка: все данные успешно обработаны + +**Сценарий 8.2: Пометка во время активных операций** +- Предусловие: Активные операции с аккаунтом +- Ожидаемый результат: 200 OK +- Проверка: корректная обработка конкурентных запросов + +#### 7.3.9 Обработка ошибок +**Сценарий 9.1: Внутренняя ошибка сервера** +- Предусловие: Имитация сбоя базы данных +- Ожидаемый результат: 500 Internal Server Error +- Проверка: информативное сообщение об ошибке + +**Сценарий 9.2: Таймаут соединения** +- Предусловие: Имитация таймаута +- Ожидаемый результат: 500 Internal Server Error +- Проверка: корректная обработка таймаута + +### 7.4 Особые моменты для тестирования + +1. **Транзакционность:** + - Проверка атомарности операции пометки + - Проверка отката при частичном выполнении + - Проверка целостности данных после пометки + +2. **Логирование:** + - Проверка записи операции пометки + - Проверка аудит-логов + - Проверка логов связанных операций + +3. **Мониторинг:** + - Проверка метрик выполнения операций + - Проверка алертов при ошибках + - Проверка мониторинга связанных операций + +4. **Восстановление:** + - Проверка возможности отмены пометки + - Проверка истории изменений статуса + +### 7.5 Критерии приемки + +1. Все тестовые сценарии пройдены успешно +2. Время выполнения операции соответствует требованиям +3. Обработка ошибок соответствует спецификации +4. Безопасность соответствует стандартам +5. Логирование и мониторинг работают корректно +6. Транзакционность работает корректно +7. Статус аккаунта успешно обновляется +8. Контроль доступа работает корректно + +## 8. POST /account/leadtarget + +### 8.1 Описание +Добавление целевого адреса для отправки клиентских запросов. + +### 8.2 Базовые требования +- Требуется JWT токен авторизации (bearerAuth) +- Обязательные поля в теле запроса: type, quizID, target +- Поддерживает HTTP коды ответа: 200, 208, 400, 401, 404, 500 + +### 8.3 Тестовые сценарии + +#### 8.3.1 Успешное добавление целевого адреса +**Предусловия:** +- Пользователь авторизован +- JWT токен валиден +- У пользователя есть права на добавление целевых адресов + +**Входные данные:** +- Метод: POST +- URL: /account/leadtarget +- Headers: + - Authorization: Bearer {valid_jwt_token} + - Content-Type: application/json +- Body: + ```json + { + "type": "mail", + "quizID": 123, + "target": "example@mail.com", + "name": "Example Channel" + } + ``` + +**Ожидаемый результат:** +- HTTP Status: 200 OK +- Content-Type: application/json + +**Проверки:** +1. Целевой адрес успешно добавлен +2. Данные корректно сохранены в базе +3. Все обязательные поля присутствуют +4. Значения полей соответствуют переданным данным + +#### 8.3.2 Проверка авторизации +**Сценарий 2.1: Отсутствие токена** +- Headers: без Authorization +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.2: Невалидный токен** +- Headers: Authorization: Bearer invalid_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.3: Истекший токен** +- Headers: Authorization: Bearer expired_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +#### 8.3.3 Проверка входных данных +**Сценарий 3.1: Отсутствие обязательных полей** +- Body: { "type": "mail" } +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.2: Невалидный тип** +- Body: { "type": "invalid", "quizID": 123, "target": "example@mail.com" } +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.3: Невалидный формат target** +- Body: { "type": "mail", "quizID": 123, "target": "invalid_email" } +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +#### 8.3.4 Проверка дублирования +**Сценарий 4.1: Добавление существующего target** +- Предусловие: Target уже существует +- Ожидаемый результат: 208 Already Reported +- Проверка сообщения об ошибке + +**Сценарий 4.2: Добавление с разным регистром** +- Предусловие: Target существует с другим регистром +- Ожидаемый результат: 208 Already Reported +- Проверка сообщения об ошибке + +#### 8.3.5 Проверка безопасности +**Сценарий 5.1: SQL-инъекции** +- Body: { "type": "mail", "quizID": "1' OR '1'='1", "target": "example@mail.com" } +- Ожидаемый результат: 400 Bad Request +- Проверка: инъекция не выполнена + +**Сценарий 5.2: XSS-атаки** +- Body: { "type": "mail", "quizID": 123, "target": "" } +- Ожидаемый результат: 400 Bad Request +- Проверка: XSS-код не выполнен + +#### 8.3.6 Проверка производительности +**Сценарий 6.1: Время выполнения** +- Проверка: время выполнения операции < 1s +- Проверка: стабильность времени при повторных запросах + +**Сценарий 6.2: Нагрузочное тестирование** +- Проверка: система корректно обрабатывает множественные запросы +- Проверка: отсутствие утечек памяти + +#### 8.3.7 Граничные случаи +**Сценарий 7.1: Максимальная длина полей** +- Body: { "type": "mail", "quizID": 123, "target": "very_long_email@domain.com", "name": "very_long_name" } +- Ожидаемый результат: 200 OK +- Проверка: данные сохранены корректно + +**Сценарий 7.2: Специальные символы** +- Body: { "type": "mail", "quizID": 123, "target": "special!@#$%^&*()@domain.com", "name": "Special Name!" } +- Ожидаемый результат: 200 OK +- Проверка: данные сохранены корректно + +#### 8.3.8 Обработка ошибок +**Сценарий 8.1: Внутренняя ошибка сервера** +- Предусловие: Имитация сбоя базы данных +- Ожидаемый результат: 500 Internal Server Error +- Проверка: информативное сообщение об ошибке + +**Сценарий 8.2: Таймаут соединения** +- Предусловие: Имитация таймаута +- Ожидаемый результат: 500 Internal Server Error +- Проверка: корректная обработка таймаута + +### 8.4 Особые моменты для тестирования + +1. **Валидация данных:** + - Проверка форматов email, телефона, ID канала + - Проверка уникальности target + - Проверка допустимых значений type + +2. **Транзакционность:** + - Проверка атомарности операции добавления + - Проверка отката при ошибках + +3. **Логирование:** + - Проверка записи операции добавления + - Проверка аудит-логов + +4. **Мониторинг:** + - Проверка метрик добавления target + - Проверка алертов при ошибках + +### 8.5 Критерии приемки + +1. Все тестовые сценарии пройдены успешно +2. Время выполнения операции соответствует требованиям +3. Обработка ошибок соответствует спецификации +4. Безопасность соответствует стандартам +5. Логирование и мониторинг работают корректно +6. Валидация данных работает корректно +7. Дублирование target обрабатывается корректно + +## 9. PUT /account/leadtarget + +### 9.1 Описание +Обновление существующего целевого адреса. + +### 9.2 Базовые требования +- Требуется JWT токен авторизации (bearerAuth) +- Обязательные поля в теле запроса: id, target +- Поддерживает HTTP коды ответа: 200, 400, 401, 404, 500 + +### 9.3 Тестовые сценарии + +#### 9.3.1 Успешное обновление целевого адреса +**Предусловия:** +- Пользователь авторизован +- JWT токен валиден +- У пользователя есть права на обновление целевых адресов +- Целевой адрес существует + +**Входные данные:** +- Метод: PUT +- URL: /account/leadtarget +- Headers: + - Authorization: Bearer {valid_jwt_token} + - Content-Type: application/json +- Body: + ```json + { + "id": 123, + "target": "new_target@mail.com" + } + ``` + +**Ожидаемый результат:** +- HTTP Status: 200 OK +- Content-Type: application/json + +**Проверки:** +1. Целевой адрес успешно обновлен +2. Данные корректно сохранены в базе +3. Старое значение target заменено на новое +4. Остальные поля остались без изменений + +#### 9.3.2 Проверка авторизации +**Сценарий 2.1: Отсутствие токена** +- Headers: без Authorization +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.2: Невалидный токен** +- Headers: Authorization: Bearer invalid_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.3: Истекший токен** +- Headers: Authorization: Bearer expired_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +#### 9.3.3 Проверка входных данных +**Сценарий 3.1: Отсутствие обязательных полей** +- Body: { "id": 123 } +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.2: Невалидный id** +- Body: { "id": "invalid", "target": "example@mail.com" } +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.3: Невалидный формат target** +- Body: { "id": 123, "target": "invalid_email" } +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +#### 9.3.4 Проверка существования +**Сценарий 4.1: Обновление несуществующего target** +- Body: { "id": 999999, "target": "example@mail.com" } +- Ожидаемый результат: 404 Not Found +- Проверка сообщения об ошибке + +**Сценарий 4.2: Обновление удаленного target** +- Предусловие: Target помечен как удаленный +- Ожидаемый результат: 404 Not Found +- Проверка сообщения об ошибке + +#### 9.3.5 Проверка безопасности +**Сценарий 5.1: SQL-инъекции** +- Body: { "id": "1' OR '1'='1", "target": "example@mail.com" } +- Ожидаемый результат: 400 Bad Request +- Проверка: инъекция не выполнена + +**Сценарий 5.2: XSS-атаки** +- Body: { "id": 123, "target": "" } +- Ожидаемый результат: 400 Bad Request +- Проверка: XSS-код не выполнен + +#### 9.3.6 Проверка производительности +**Сценарий 6.1: Время выполнения** +- Проверка: время выполнения операции < 1s +- Проверка: стабильность времени при повторных запросах + +**Сценарий 6.2: Нагрузочное тестирование** +- Проверка: система корректно обрабатывает множественные запросы +- Проверка: отсутствие утечек памяти + +#### 9.3.7 Граничные случаи +**Сценарий 7.1: Максимальная длина target** +- Body: { "id": 123, "target": "very_long_email@very_long_domain.com" } +- Ожидаемый результат: 200 OK +- Проверка: данные сохранены корректно + +**Сценарий 7.2: Специальные символы** +- Body: { "id": 123, "target": "special!@#$%^&*()@domain.com" } +- Ожидаемый результат: 200 OK +- Проверка: данные сохранены корректно + +#### 9.3.8 Обработка ошибок +**Сценарий 8.1: Внутренняя ошибка сервера** +- Предусловие: Имитация сбоя базы данных +- Ожидаемый результат: 500 Internal Server Error +- Проверка: информативное сообщение об ошибке + +**Сценарий 8.2: Таймаут соединения** +- Предусловие: Имитация таймаута +- Ожидаемый результат: 500 Internal Server Error +- Проверка: корректная обработка таймаута + +### 9.4 Особые моменты для тестирования + +1. **Валидация данных:** + - Проверка форматов email, телефона, ID канала + - Проверка уникальности нового target + - Проверка существования id + +2. **Транзакционность:** + - Проверка атомарности операции обновления + - Проверка отката при ошибках + +3. **Логирование:** + - Проверка записи операции обновления + - Проверка аудит-логов + - Проверка истории изменений + +4. **Мониторинг:** + - Проверка метрик обновления target + - Проверка алертов при ошибках + +### 9.5 Критерии приемки + +1. Все тестовые сценарии пройдены успешно +2. Время выполнения операции соответствует требованиям +3. Обработка ошибок соответствует спецификации +4. Безопасность соответствует стандартам +5. Логирование и мониторинг работают корректно +6. Валидация данных работает корректно +7. Обновление target выполняется корректно +8. История изменений сохраняется + +## 10. DELETE /account/leadtarget/{id} + +### 10.1 Описание +Удаление целевого адреса по его ID. + +### 10.2 Базовые требования +- Требуется JWT токен авторизации (bearerAuth) +- ID целевого адреса передается в пути URL +- Поддерживает HTTP коды ответа: 200, 400, 401, 500 + +### 10.3 Тестовые сценарии + +#### 10.3.1 Успешное удаление целевого адреса +**Предусловия:** +- Пользователь авторизован +- JWT токен валиден +- У пользователя есть права на удаление целевых адресов +- Целевой адрес существует и активен + +**Входные данные:** +- Метод: DELETE +- URL: /account/leadtarget/{valid_id} +- Headers: + - Authorization: Bearer {valid_jwt_token} + +**Ожидаемый результат:** +- HTTP Status: 200 OK +- Content-Type: application/json + +**Проверки:** +1. Целевой адрес успешно удален +2. Данные корректно удалены из базы +3. Последующие запросы к этому ID возвращают 404 +4. Все связанные данные обработаны корректно + +#### 10.3.2 Проверка авторизации +**Сценарий 2.1: Отсутствие токена** +- Headers: без Authorization +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.2: Невалидный токен** +- Headers: Authorization: Bearer invalid_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.3: Истекший токен** +- Headers: Authorization: Bearer expired_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +#### 10.3.3 Проверка входных данных +**Сценарий 3.1: Невалидный ID** +- URL: /account/leadtarget/invalid_id +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.2: Отсутствующий ID** +- URL: /account/leadtarget/ +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.3: Несуществующий ID** +- URL: /account/leadtarget/999999 +- Ожидаемый результат: 200 OK +- Проверка: операция завершается успешно + +#### 10.3.4 Проверка прав доступа +**Сценарий 4.1: Удаление без необходимых прав** +- Предусловие: У пользователя нет прав на удаление целевых адресов +- Ожидаемый результат: 401 Unauthorized +- Проверка: доступ запрещен + +**Сценарий 4.2: Попытка удаления чужого целевого адреса** +- Предусловие: Целевой адрес принадлежит другому пользователю +- Ожидаемый результат: 401 Unauthorized +- Проверка: доступ запрещен + +#### 10.3.5 Проверка состояния целевого адреса +**Сценарий 5.1: Удаление уже удаленного целевого адреса** +- Предусловие: Целевой адрес уже помечен как удаленный +- Ожидаемый результат: 200 OK +- Проверка: повторное удаление не вызывает ошибок + +**Сценарий 5.2: Удаление активного целевого адреса** +- Предусловие: Целевой адрес активен и используется +- Ожидаемый результат: 200 OK +- Проверка: все связанные операции обработаны корректно + +#### 10.3.6 Проверка безопасности +**Сценарий 6.1: SQL-инъекции** +- URL: /account/leadtarget/1' OR '1'='1 +- Ожидаемый результат: 400 Bad Request +- Проверка: инъекция не выполнена + +**Сценарий 6.2: XSS-атаки** +- URL: /account/leadtarget/ +- Ожидаемый результат: 400 Bad Request +- Проверка: XSS-код не выполнен + +#### 10.3.7 Проверка производительности +**Сценарий 7.1: Время выполнения** +- Проверка: время выполнения операции < 1s +- Проверка: стабильность времени при повторных запросах + +**Сценарий 7.2: Нагрузочное тестирование** +- Проверка: система корректно обрабатывает множественные запросы на удаление +- Проверка: отсутствие утечек памяти + +#### 10.3.8 Граничные случаи +**Сценарий 8.1: Удаление целевого адреса с большим количеством связанных данных** +- Предусловие: Целевой адрес имеет множество связанных данных +- Ожидаемый результат: 200 OK +- Проверка: все данные успешно удалены + +**Сценарий 8.2: Удаление во время активных операций** +- Предусловие: Активные операции с целевым адресом +- Ожидаемый результат: 200 OK +- Проверка: корректная обработка конкурентных запросов + +#### 10.3.9 Обработка ошибок +**Сценарий 9.1: Внутренняя ошибка сервера** +- Предусловие: Имитация сбоя базы данных +- Ожидаемый результат: 500 Internal Server Error +- Проверка: информативное сообщение об ошибке + +**Сценарий 9.2: Таймаут соединения** +- Предусловие: Имитация таймаута +- Ожидаемый результат: 500 Internal Server Error +- Проверка: корректная обработка таймаута + +### 10.4 Особые моменты для тестирования + +1. **Транзакционность:** + - Проверка атомарности операции удаления + - Проверка отката при частичном удалении + - Проверка целостности данных после удаления + +2. **Логирование:** + - Проверка записи операции удаления + - Проверка аудит-логов + - Проверка логов связанных операций + +3. **Мониторинг:** + - Проверка метрик удаления целевых адресов + - Проверка алертов при ошибках + - Проверка мониторинга связанных операций + +4. **Восстановление:** + - Проверка возможности восстановления данных + - Проверка периода хранения удаленных данных + +### 10.5 Критерии приемки + +1. Все тестовые сценарии пройдены успешно +2. Время выполнения операции соответствует требованиям +3. Обработка ошибок соответствует спецификации +4. Безопасность соответствует стандартам +5. Логирование и мониторинг работают корректно +6. Транзакционность работает корректно +7. Целевой адрес успешно удаляется +8. Контроль доступа работает корректно + +## 11. GET /account/leadtarget/{quizID} + +### 11.1 Описание +Получение целевого адреса по ID квиза. + +### 11.2 Базовые требования +- Требуется JWT токен авторизации (bearerAuth) +- ID квиза передается в пути URL +- Поддерживает HTTP коды ответа: 200, 400, 401, 404, 500 + +### 11.3 Тестовые сценарии + +#### 11.3.1 Успешное получение целевого адреса +**Предусловия:** +- Пользователь авторизован +- JWT токен валиден +- У пользователя есть права на просмотр целевых адресов +- Квиз существует и имеет связанный целевой адрес + +**Входные данные:** +- Метод: GET +- URL: /account/leadtarget/{valid_quiz_id} +- Headers: + - Authorization: Bearer {valid_jwt_token} + +**Ожидаемый результат:** +- HTTP Status: 200 OK +- Content-Type: application/json +- Тело ответа содержит объект LeadTarget со следующими полями: + - id (integer) + - accountID (string) + - type (string) + - target (string) + - quizID (integer) + - inviteLink (string, опционально) + - deleted (boolean) + - createdAt (date-time) + +**Проверки:** +1. Все обязательные поля присутствуют в ответе +2. Формат даты createdAt соответствует ISO 8601 +3. Значения полей соответствуют данным в базе +4. Тип целевого адреса соответствует ожидаемому + +#### 11.3.2 Проверка авторизации +**Сценарий 2.1: Отсутствие токена** +- Headers: без Authorization +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.2: Невалидный токен** +- Headers: Authorization: Bearer invalid_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +**Сценарий 2.3: Истекший токен** +- Headers: Authorization: Bearer expired_token +- Ожидаемый результат: 401 Unauthorized +- Проверка сообщения об ошибке + +#### 11.3.3 Проверка входных данных +**Сценарий 3.1: Невалидный quizID** +- URL: /account/leadtarget/invalid_id +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.2: Отсутствующий quizID** +- URL: /account/leadtarget/ +- Ожидаемый результат: 400 Bad Request +- Проверка сообщения об ошибке + +**Сценарий 3.3: Несуществующий quizID** +- URL: /account/leadtarget/999999 +- Ожидаемый результат: 404 Not Found +- Проверка сообщения об ошибке + +#### 11.3.4 Проверка прав доступа +**Сценарий 4.1: Просмотр без необходимых прав** +- Предусловие: У пользователя нет прав на просмотр целевых адресов +- Ожидаемый результат: 401 Unauthorized +- Проверка: доступ запрещен + +**Сценарий 4.2: Попытка просмотра чужого целевого адреса** +- Предусловие: Целевой адрес принадлежит другому пользователю +- Ожидаемый результат: 401 Unauthorized +- Проверка: доступ запрещен + +#### 11.3.5 Проверка состояния целевого адреса +**Сценарий 5.1: Получение удаленного целевого адреса** +- Предусловие: Целевой адрес помечен как удаленный +- Ожидаемый результат: 404 Not Found +- Проверка сообщения об ошибке + +**Сценарий 5.2: Получение активного целевого адреса** +- Предусловие: Целевой адрес активен +- Ожидаемый результат: 200 OK +- Проверка: все данные возвращены корректно + +#### 11.3.6 Проверка безопасности +**Сценарий 6.1: SQL-инъекции** +- URL: /account/leadtarget/1' OR '1'='1 +- Ожидаемый результат: 400 Bad Request +- Проверка: инъекция не выполнена + +**Сценарий 6.2: XSS-атаки** +- URL: /account/leadtarget/ +- Ожидаемый результат: 400 Bad Request +- Проверка: XSS-код не выполнен + +#### 11.3.7 Проверка производительности +**Сценарий 7.1: Время выполнения** +- Проверка: время выполнения операции < 300ms +- Проверка: стабильность времени при повторных запросах + +**Сценарий 7.2: Нагрузочное тестирование** +- Проверка: система выдерживает 100 последовательных запросов +- Проверка: отсутствие утечек памяти + +#### 11.3.8 Граничные случаи +**Сценарий 8.1: Получение целевого адреса с большим количеством данных** +- Предусловие: Целевой адрес имеет множество связанных данных +- Ожидаемый результат: 200 OK +- Проверка: все данные возвращены корректно + +**Сценарий 8.2: Получение во время активных операций** +- Предусловие: Активные операции с целевым адресом +- Ожидаемый результат: 200 OK +- Проверка: корректная обработка конкурентных запросов + +#### 11.3.9 Обработка ошибок +**Сценарий 9.1: Внутренняя ошибка сервера** +- Предусловие: Имитация сбоя базы данных +- Ожидаемый результат: 500 Internal Server Error +- Проверка: информативное сообщение об ошибке + +**Сценарий 9.2: Таймаут соединения** +- Предусловие: Имитация таймаута +- Ожидаемый результат: 500 Internal Server Error +- Проверка: корректная обработка таймаута + +### 11.4 Особые моменты для тестирования + +1. **Кэширование:** + - Проверка правильности кэширования результатов + - Проверка инвалидации кэша при изменении данных + - Проверка TTL кэша + +2. **Логирование:** + - Проверка записи запросов к целевым адресам + - Проверка аудит-логов + - Проверка логов доступа + +3. **Мониторинг:** + - Проверка метрик производительности + - Проверка алертов при ошибках + - Проверка мониторинга доступа + +4. **Безопасность:** + - Проверка контроля доступа + - Проверка валидации входных данных + - Проверка защиты от атак + +### 11.5 Критерии приемки + +1. Все тестовые сценарии пройдены успешно +2. Время ответа соответствует требованиям +3. Обработка ошибок соответствует спецификации +4. Безопасность соответствует стандартам +5. Логирование и мониторинг работают корректно +6. Кэширование работает эффективно +7. Контроль доступа работает корректно +8. Данные возвращаются в корректном формате + +## 13. POST /question/create + +### Description +Creates a new question in the system. The endpoint requires authentication and accepts a JSON payload with question details. + +### Request +- Method: POST +- Path: /question/create +- Authentication: Required (Bearer Token) +- Content-Type: application/json + +#### Request Body Schema +```json +{ + "quiz_id": "integer (required)", + "title": "string (required, max 512 chars)", + "description": "string (optional)", + "type": "string (required, enum)", + "required": "boolean (optional)", + "page": "integer (optional)", + "content": "string (optional, JSON)" +} +``` + +### Response +- Content-Type: application/json + +#### Success Response (200) +```json +{ + "id": "integer", + "quiz_id": "integer", + "title": "string", + "description": "string", + "type": "string", + "required": "boolean", + "deleted": "boolean", + "page": "integer", + "content": "string", + "version": "integer", + "parent_ids": ["integer"], + "created_at": "string (date-time)", + "updated_at": "string (date-time)" +} +``` + +#### Error Responses +- 400 Bad Request +- 401 Unauthorized +- 406 Not Acceptable +- 422 Validation Error +- 424 Failed Dependency +- 500 Internal Server Error + +### Test Cases + +#### TC1: Create Basic Question +**Objective**: Verify that a question can be created with minimal required fields +**Preconditions**: +- Valid authentication token +- Quiz exists in the system +**Test Steps**: +1. Send POST request with minimal required fields: +```json +{ + "quiz_id": 1, + "title": "Test Question", + "type": "text" +} +``` +**Expected Results**: +- Status Code: 200 +- Response contains created question with all fields +- Question ID is generated +- Created_at and updated_at timestamps are set + +#### TC2: Create Question with All Fields +**Objective**: Verify that a question can be created with all possible fields +**Preconditions**: +- Valid authentication token +- Quiz exists in the system +**Test Steps**: +1. Send POST request with all fields: +```json +{ + "quiz_id": 1, + "title": "Comprehensive Test Question", + "description": "This is a detailed question description", + "type": "variant", + "required": true, + "page": 1, + "content": "{\"options\": [\"Option 1\", \"Option 2\"]}" +} +``` +**Expected Results**: +- Status Code: 200 +- Response contains all provided fields +- Question is properly created with all attributes + +#### TC3: Create Question with Different Types +**Objective**: Verify that questions can be created with all supported types +**Preconditions**: +- Valid authentication token +- Quiz exists in the system +**Test Steps**: +1. Create questions with each type: + - text + - variant + - images + - select + - varimg + - emoji + - date + - number + - page + - rating + - result + - file +**Expected Results**: +- Status Code: 200 for each type +- Questions are created successfully +- Type-specific content is properly stored + +#### TC4: Invalid Quiz ID +**Objective**: Verify error handling for non-existent quiz ID +**Preconditions**: +- Valid authentication token +**Test Steps**: +1. Send POST request with invalid quiz_id: +```json +{ + "quiz_id": 999999, + "title": "Test Question", + "type": "text" +} +``` +**Expected Results**: +- Status Code: 400 or 424 +- Error message indicates invalid quiz ID + +#### TC5: Missing Required Fields +**Objective**: Verify validation of required fields +**Preconditions**: +- Valid authentication token +**Test Steps**: +1. Send POST request without quiz_id +2. Send POST request without title +3. Send POST request without type +**Expected Results**: +- Status Code: 400 +- Error message indicates missing required fields + +#### TC6: Invalid Question Type +**Objective**: Verify validation of question type +**Preconditions**: +- Valid authentication token +- Quiz exists in the system +**Test Steps**: +1. Send POST request with invalid type: +```json +{ + "quiz_id": 1, + "title": "Test Question", + "type": "invalid_type" +} +``` +**Expected Results**: +- Status Code: 400 or 422 +- Error message indicates invalid question type + +#### TC7: Title Length Validation +**Objective**: Verify title length constraints +**Preconditions**: +- Valid authentication token +- Quiz exists in the system +**Test Steps**: +1. Send POST request with title exceeding 512 characters +2. Send POST request with empty title +**Expected Results**: +- Status Code: 400 or 422 +- Error message indicates title length violation + +#### TC8: Invalid Content Format +**Objective**: Verify content JSON format validation +**Preconditions**: +- Valid authentication token +- Quiz exists in the system +**Test Steps**: +1. Send POST request with invalid JSON in content field +2. Send POST request with content not matching type requirements +**Expected Results**: +- Status Code: 400 or 422 +- Error message indicates invalid content format + +#### TC9: Unauthorized Access +**Objective**: Verify authentication requirement +**Preconditions**: None +**Test Steps**: +1. Send POST request without authentication token +**Expected Results**: +- Status Code: 401 +- Error message indicates authentication required + +#### TC10: Rate Limiting +**Objective**: Verify rate limiting behavior +**Preconditions**: +- Valid authentication token +- Quiz exists in the system +**Test Steps**: +1. Send multiple POST requests in quick succession +**Expected Results**: +- Status Code: 429 (if rate limited) +- Error message indicates rate limit exceeded + +### Special Testing Considerations + +#### Content Validation +- Verify that content JSON matches the expected format for each question type +- Test with various content structures for each type +- Validate that content is properly stored and can be retrieved + +#### Type-Specific Requirements +- Each question type may have specific content requirements +- Test creation with valid and invalid content for each type +- Verify that type-specific validation rules are enforced + +#### Quiz Relationship +- Verify that questions are properly associated with the quiz +- Test creation of questions for different quizzes +- Verify that quiz_id references are properly validated + +#### Version Control +- Check if version tracking is implemented +- Verify that new questions start with appropriate version numbers +- Test version incrementing if applicable + +#### Performance +- Test creation of multiple questions in sequence +- Monitor response times for different question types +- Verify system behavior under load + +#### Security +- Verify that questions can only be created by authorized users +- Test access control for different user roles +- Verify that sensitive data is properly handled + +#### Data Integrity +- Verify that all fields are properly stored +- Test creation with special characters in text fields +- Verify that timestamps are properly set +- Check that required fields are properly enforced \ No newline at end of file