Corp/backend/REQUESTS_API_TESTING_PLAN.md

18 KiB
Raw Blame History

План тестирования 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%

Команда запуска:

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+ тестовых сценариев для полного покрытия функционала! 🎯