2009 lines
90 KiB
Markdown
2009 lines
90 KiB
Markdown
|
# Тестовая спецификация 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": "<script>alert('xss')</script>" }
|
|||
|
- Ожидаемый результат: 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": "<script>alert('xss')</script>" }
|
|||
|
- Ожидаемый результат: 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": "<script>alert('xss')</script>" }
|
|||
|
- Ожидаемый результат: 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": "<script>alert('xss')</script>" }
|
|||
|
- Ожидаемый результат: 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": "<script>alert('xss')</script>" }
|
|||
|
- Ожидаемый результат: 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/<script>alert('xss')</script>
|
|||
|
- Ожидаемый результат: 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/<script>alert('xss')</script>
|
|||
|
- Ожидаемый результат: 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
|