18 KiB
18 KiB
План тестирования API заявлений (Requests)
🎯 Цель
Полное покрытие тестами логики доступа к заявлениям с учетом:
- Модельных прав (permissions)
- Департаментных прав (scoped permissions)
- Получателей (recipients/cc_users)
- Отделов (departments)
- Флага sent_to_all_department
📋 Матрица тестовых сценариев
1. Тесты доступа на чтение (GET /api/v1/requests/)
1.1 Обычные пользователи (без прав)
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 1.1.1 | Получить список всех заявок | Видит только: свои + адресованные ему |
| 1.1.2 | Получить свою заявку (retrieve) | ✅ Доступ разрешен |
| 1.1.3 | Получить чужую заявку (не адресованную) | ❌ 403/404 Forbidden |
| 1.1.4 | Получить заявку, где он в recipients | ✅ Доступ разрешен |
| 1.1.5 | Получить заявку, где он в cc_users | ✅ Доступ разрешен |
| 1.1.6 | Получить заявку с sent_to_all_department для его отдела | ✅ Доступ разрешен |
| 1.1.7 | Получить заявку с sent_to_all_department для чужого отдела | ❌ Не видит |
| 1.1.8 | Фильтр ?mine=true | Видит только свои заявки |
| 1.1.9 | Фильтр ?addressed_to_me=true | Видит только адресованные ему |
1.2 Руководители отделов (department.head)
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 1.2.1 | Получить список заявок | Видит: свои + своего отдела + адресованные |
| 1.2.2 | Получить заявку сотрудника своего отдела | ✅ Доступ разрешен |
| 1.2.3 | Получить заявку сотрудника чужого отдела | ❌ Не видит (если не адресована) |
| 1.2.4 | Получить заявку, адресованную его отделу | ✅ Доступ разрешен |
| 1.2.5 | Получить заявку с sent_to_all_department для его отдела | ✅ Доступ разрешен |
1.3 Пользователи с департаментным правом view_request
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 1.3.1 | Получить список заявок | Видит: свои + отделов с правом + адресованные |
| 1.3.2 | Получить заявку сотрудника отдела (где есть право) | ✅ Доступ разрешен |
| 1.3.3 | Получить заявку сотрудника другого отдела | ❌ Не видит |
| 1.3.4 | Получить заявку, адресованную отделу (где есть право) | ✅ Доступ разрешен |
1.4 Пользователи с департаментным правом can_process_requests
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 1.4.1 | Получить список заявок | Видит: свои + отделов с правом + адресованные |
| 1.4.2 | Получить заявку для согласования | ✅ Доступ разрешен |
| 1.4.3 | Получить заявку чужого отдела | ❌ Не видит |
1.5 Пользователи с глобальным правом can_view_all_requests
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 1.5.1 | Получить список всех заявок | ✅ Видит ВСЕ заявки |
| 1.5.2 | Получить любую заявку (retrieve) | ✅ Доступ разрешен |
| 1.5.3 | Фильтр ?mine=true | Видит только свои |
| 1.5.4 | Фильтр ?addressed_to_me=true | Видит только адресованные |
1.6 Django staff пользователи
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 1.6.1 | Получить список всех заявок | ✅ Видит ВСЕ заявки |
| 1.6.2 | Получить любую заявку | ✅ Доступ разрешен |
2. Тесты создания (POST /api/v1/requests/)
2.1 Обычные пользователи
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 2.1.1 | Создать заявку без получателей | ✅ Успешно (backward compatibility) |
| 2.1.2 | Создать заявку с recipients | ✅ Успешно |
| 2.1.3 | Создать заявку с cc_users | ✅ Успешно |
| 2.1.4 | Создать заявку с departments | ✅ Успешно |
| 2.1.5 | Создать заявку с sent_to_all_department | ✅ Успешно |
| 2.1.6 | Создать заявку: recipients + cc + departments | ✅ Успешно (комбинация) |
| 2.1.7 | Создать заявку с несуществующим recipient_id | ❌ 400 Validation error |
| 2.1.8 | Создать заявку с несуществующим department_id | ❌ 400 Validation error |
| 2.1.9 | Создать заявку: себя в recipients | ✅ Успешно (валидация не запрещает) |
| 2.1.10 | Создать заявку: дубли в recipients | ✅ ManyToMany устранит дубли |
| 2.1.11 | Создать заявку: recipient_ids как JSON array | ✅ Успешно |
| 2.1.12 | Создать заявку: recipient_ids как CSV | ✅ Успешно |
| 2.1.13 | Создать заявку: recipient_ids как repeat params | ✅ Успешно |
2.2 Уведомления при создании
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 2.2.1 | Создать заявку с recipients | Уведомления отправлены recipients |
| 2.2.2 | Создать заявку с cc_users | Уведомления отправлены cc_users |
| 2.2.3 | Создать заявку с departments | Уведомления руководителям отделов |
| 2.2.4 | Создать с sent_to_all_department | Уведомления ВСЕМ в отделах |
| 2.2.5 | Проверить metadata уведомлений | is_primary_recipient, is_cc корректны |
3. Тесты обновления (PUT/PATCH /api/v1/requests/{id}/)
3.1 Автор заявки
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 3.1.1 | Обновить свою заявку (не финальный статус) | ✅ Успешно |
| 3.1.2 | Обновить recipients своей заявки | ✅ Успешно |
| 3.1.3 | Обновить cc_users своей заявки | ✅ Успешно |
| 3.1.4 | Обновить departments своей заявки | ✅ Успешно |
| 3.1.5 | Обновить свою заявку (финальный статус) | ❌ 403 Forbidden |
| 3.1.6 | Обновить чужую заявку | ❌ 403 Forbidden |
3.2 Staff / с правами
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 3.2.1 | Staff обновляет любую заявку | ✅ Успешно |
| 3.2.2 | С change_request обновляет заявку | ✅ Успешно |
4. Тесты согласования (approve/reject)
4.1 Пользователи с can_process_requests (департаментное)
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 4.1.1 | Approve заявку своего отдела | ✅ Успешно |
| 4.1.2 | Approve заявку чужого отдела | ❌ 403 Forbidden |
| 4.1.3 | Reject заявку своего отдела | ✅ Успешно |
| 4.1.4 | Approve уже approved заявку | ❌ 400 Bad request |
4.2 Пользователи с can_process_requests (глобальное)
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 4.2.1 | Approve любую заявку | ✅ Успешно |
| 4.2.2 | Reject любую заявку | ✅ Успешно |
4.3 Уведомления при согласовании
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 4.3.1 | Approve заявку | Уведомление автору + recipients + cc |
| 4.3.2 | Reject заявку | Уведомление автору + recipients + cc |
| 4.3.3 | Проверить metadata | is_approver=True для согласующего |
5. Тесты отмены (cancel)
5.1 Автор заявки
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 5.1.1 | Cancel свою заявку (не финальный статус) | ✅ Успешно |
| 5.1.2 | Cancel свою заявку (уже approved) | ❌ 403/400 Forbidden |
| 5.1.3 | Cancel чужую заявку | ❌ 403 Forbidden |
5.2 Staff
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 5.2.1 | Cancel любую заявку | ✅ Успешно |
6. Тесты удаления (DELETE)
6.1 Автор заявки
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 6.1.1 | Delete свою заявку (не финальный статус) | ✅ Успешно |
| 6.1.2 | Delete свою заявку (финальный статус) | ❌ 403 Forbidden |
| 6.1.3 | Delete чужую заявку | ❌ 403 Forbidden |
6.2 Staff / с правами
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 6.2.1 | Staff удаляет любую заявку | ✅ Успешно |
| 6.2.2 | С delete_request удаляет заявку | ✅ Успешно |
7. Тесты комментариев (GET/POST /api/v1/requests/{id}/comments/)
7.1 Чтение комментариев
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 7.1.1 | Автор читает комментарии к своей заявке | ✅ Успешно |
| 7.1.2 | Получатель читает комментарии | ✅ Успешно |
| 7.1.3 | CC читает комментарии | ✅ Успешно |
| 7.1.4 | Посторонний читает комментарии | ❌ 403 Forbidden |
| 7.1.5 | Staff читает любые комментарии | ✅ Успешно |
7.2 Создание комментариев
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 7.2.1 | Автор комментирует свою заявку | ✅ Успешно |
| 7.2.2 | Получатель комментирует заявку | ✅ Успешно |
| 7.2.3 | CC комментирует заявку | ✅ Успешно |
| 7.2.4 | Посторонний комментирует заявку | ❌ 403 Forbidden |
| 7.2.5 | Staff комментирует любую заявку | ✅ Успешно |
7.3 Уведомления при комментариях
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 7.3.1 | Добавить комментарий | Уведомления: автор + recipients + cc + approver |
| 7.3.2 | Автор комментирует | Уведомления только recipients/cc (не себе) |
| 7.3.3 | Проверить metadata | Корректные данные о комментарии |
8. Тесты фильтрации
8.1 Фильтры queryset
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 8.1.1 | ?type=vacation | Только заявки типа vacation |
| 8.1.2 | ?status=pending | Только pending заявки |
| 8.1.3 | ?mine=true | Только мои заявки |
| 8.1.4 | ?addressed_to_me=true | Только адресованные мне |
| 8.1.5 | ?view=mine | Только мои заявки (альтернатива) |
| 8.1.6 | Комбинация фильтров | Работает корректно |
9. Тесты валидации
9.1 Валидация полей
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 9.1.1 | recipient_ids: невалидный формат | ❌ 400 Validation error |
| 9.1.2 | recipient_ids: несуществующий ID | ❌ 400 User not found |
| 9.1.3 | department_ids: несуществующий ID | ❌ 400 Department not found |
| 9.1.4 | Vacation без date_from/date_to | ❌ 400 Validation error |
| 9.1.5 | date_from > date_to | ❌ 400 Validation error |
10. Тесты обратной совместимости
10.1 Старое поле department
| # | Сценарий | Ожидаемый результат |
|---|---|---|
| 10.1.1 | Создать заявку со старым полем department | ✅ Успешно (backward compatibility) |
| 10.1.2 | Читать заявку со старым полем | ✅ department возвращается |
| 10.1.3 | Заявка с department (старым) видна уполномоченным | ✅ Доступ работает |
🏗️ Структура тестов
tests/
├── conftest.py # Fixtures
├── requests_app/
│ ├── __init__.py
│ ├── test_list_requests.py # GET /api/v1/requests/
│ ├── test_retrieve_request.py # GET /api/v1/requests/{id}/
│ ├── test_create_request.py # POST /api/v1/requests/
│ ├── test_update_request.py # PUT/PATCH
│ ├── test_approve_reject.py # approve/reject actions
│ ├── test_cancel_request.py # cancel action
│ ├── test_delete_request.py # DELETE
│ ├── test_comments.py # comments endpoint
│ ├── test_notifications.py # уведомления
│ ├── test_filters.py # фильтрация
│ ├── test_validation.py # валидация
│ └── test_permissions.py # комплексные тесты прав
🎭 Fixtures (conftest.py)
Пользователи:
regular_user- обычный сотрудник без правdept_head- руководитель отделаdept_viewer- с правом view_request в отделеdept_processor- с правом can_process_requests в отделеglobal_viewer- с can_view_all_requestsstaff_user- Django staffsuperuser- superuser
Данные:
department- тестовый отделanother_department- второй отделrequest_data- базовые данные для создания заявкиapi_client- APIClient с аутентификацией
Утилиты:
create_request_with_recipients- хелпер для создания заявкиassert_notification_sent- проверка уведомлений
📊 Метрики покрытия
Целевые показатели:
- Coverage: >90% для requests_app/
- Coverage API views: 100%
- Coverage serializers: 100%
- Coverage permissions: 100%
Команда запуска:
pytest tests/requests_app/ -v --cov=requests_app --cov-report=html
🚀 Приоритеты реализации
Этап 1 (высокий приоритет):
- ✅ Тесты доступа на чтение (сценарии 1.1-1.6)
- ✅ Тесты создания заявок (сценарии 2.1)
- ✅ Тесты согласования (сценарии 4.1-4.2)
Этап 2 (средний приоритет):
- ✅ Тесты обновления (сценарии 3.1-3.2)
- ✅ Тесты комментариев (сценарии 7.1-7.2)
- ✅ Тесты уведомлений (сценарии 2.2, 4.3, 7.3)
Этап 3 (низкий приоритет):
- ✅ Тесты фильтрации (сценарии 8.1)
- ✅ Тесты валидации (сценарии 9.1)
- ✅ Тесты обратной совместимости (сценарии 10.1)
✅ Чеклист готовности
- Созданы все fixtures в conftest.py
- Реализованы тесты доступа (1.1-1.6)
- Реализованы тесты создания (2.1-2.2)
- Реализованы тесты обновления (3.1-3.2)
- Реализованы тесты согласования (4.1-4.3)
- Реализованы тесты отмены (5.1-5.2)
- Реализованы тесты удаления (6.1-6.2)
- Реализованы тесты комментариев (7.1-7.3)
- Реализованы тесты фильтрации (8.1)
- Реализованы тесты валидации (9.1)
- Реализованы тесты обратной совместимости (10.1)
- Coverage >90%
- Все тесты проходят в CI/CD
Итого: ~150+ тестовых сценариев для полного покрытия функционала! 🎯