# План тестирования 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_requests - `staff_user` - Django staff - `superuser` - 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%** **Команда запуска:** ```bash 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+ тестовых сценариев для полного покрытия функционала! 🎯