# План тестирования: Документы и уведомления **Дата создания**: 4 марта 2026 **Статус**: В процессе реализации **Приоритет**: CRITICAL ## Обзор Комплексный план тестирования для проверки полного жизненного цикла документов, включая FSM workflow, систему уведомлений и интеграцию между модулями. ### Текущее покрытие - ✅ **34 теста** - базовый CRUD API документов (PASSING) - ❌ **0 тестов** - FSM workflow (7 переходов состояний) - ❌ **0 тестов** - система уведомлений (7 signal receivers) - ❌ **0 тестов** - интеграция Documents ↔ Notifications ### Цель плана Создать **~80 дополнительных тестов** для покрытия критической функциональности: - FSM переходы документов (draft → in_review → approved → published → archived) - Автоматические уведомления при создании документов - Уведомления об ознакомлении - Уведомления о комментариях и связанных документах - Проверка прав доступа для FSM действий - Производительность при массовых операциях --- ## Реализация ### ✅ ФАЗА 1: CRITICAL - Базовая функциональность (COMPLETED) #### 1.1 ✅ FSM Workflow Tests **Файл**: `tests/api/v1/documents/test_fsm_workflow.py` **Статус**: Создан (17 тестов) **Реализованные тесты**: **Валидные переходы (7 тестов)**: - ✅ `test_submit_for_review_draft_to_in_review` - draft → in_review - ✅ `test_approve_in_review_to_approved` - in_review → approved - ✅ `test_reject_in_review_to_draft` - in_review → draft (отклонение) - ✅ `test_publish_approved_to_published` - approved → published - ✅ `test_archive_published_to_archived` - published → archived - ✅ `test_unarchive_archived_to_published` - archived → published - ✅ `test_return_to_draft_approved_to_draft` - approved → draft (возврат) **Невалидные переходы (3 теста)**: - ✅ `test_cannot_approve_draft` - нельзя approve документ в draft - ✅ `test_cannot_publish_draft` - нельзя publish документ в draft - ✅ `test_cannot_archive_draft` - нельзя archive документ в draft **FSM Permissions (6 тестов)**: - ✅ `test_submit_requires_change_permission` - ✅ `test_approve_requires_change_permission` - ✅ `test_publish_requires_change_permission` - ✅ `test_archive_requires_change_permission` - ✅ `test_unauthenticated_cannot_change_status` **Полный цикл (1 тест)**: - ✅ `test_complete_document_lifecycle` - draft → in_review → approved → published → archived → published --- #### 1.2 ✅ Базовые уведомления при создании **Файл**: `tests/integration/test_document_notifications.py` **Статус**: Создан (10 тестов) **Реализованные тесты**: **sent_to_all режим (3 теста)**: - ✅ `test_sent_to_all_creates_notifications` - уведомления всем активным пользователям - ✅ `test_sent_to_all_excludes_uploader` - автор не получает уведомление о своем документе - ✅ `test_sent_to_all_needs_all_active_users` - только активные пользователи **Получатели (recipients) (2 теста)**: - ✅ `test_recipients_create_notifications` - уведомления явным получателям - ✅ `test_inactive_users_not_notified` - неактивные не уведомляются **Отделы (departments) (2 теста)**: - ✅ `test_departments_create_notifications` - уведомления сотрудникам отделов - ✅ `test_combined_recipients_and_departments` - комбинация без дубликатов **Содержимое уведомлений (2 теста)**: - ✅ `test_notification_has_correct_data` - корректные метаданные - ✅ `test_notification_type_is_document_ready` - тип document_ready **Граничные случаи (1 тест)**: - ✅ `test_document_without_uploader` - документ без автора --- #### 1.3 ✅ Уведомления об ознакомлении **Файл**: `tests/integration/test_acknowledgement_notifications.py` **Статус**: Создан (8 тестов) **Реализованные тесты**: **Завершение ознакомления (3 теста)**: - ✅ `test_all_acknowledged_notifies_uploader` - автор получает уведомление - ✅ `test_partial_acknowledged_no_notification` - частичное не уведомляет - ✅ `test_notification_only_sent_once` - уведомление только раз **Особые случаи (3 теста)**: - ✅ `test_no_recipients_no_notification` - нет получателей = нет уведомления - ✅ `test_sent_to_all_needs_all_active_users` - sent_to_all учитывает только активных - ✅ `test_document_without_uploader_no_crash` - документ без автора не падает **Прогресс (1 тест)**: - ✅ `test_acknowledgement_progress_tracking` - отслеживание прогресса 0/5 → 5/5 --- ### ✅ ФАЗА 2: HIGH PRIORITY - Расширенная функциональность (COMPLETED) #### 2.1 ✅ Уведомления о комментариях **Файл**: `tests/integration/test_comment_notifications.py` **Статус**: Создан (8 тестов) **Реализованные тесты**: **Базовые комментарии (3 теста)**: - ✅ `test_comment_notifies_uploader` - автор документа получает уведомление - ✅ `test_comment_does_not_notify_self` - не уведомляет себя - ✅ `test_multiple_comments_create_multiple_notifications` - множественные комментарии **Ответы на комментарии (3 теста)**: - ✅ `test_reply_notifies_parent_comment_author` - уведомление автору комментария - ✅ `test_reply_does_not_notify_self` - не уведомляет себя - ✅ `test_reply_notifies_both_uploader_and_parent_author` - оба получают уведомления **Граничные случаи (2 теста)**: - ✅ `test_comment_without_document_uploader` - комментарий без автора документа - ✅ `test_multiple_comments_create_multiple_notifications` - множественные комментарии --- #### 2.2 ✅ Связанные документы **Файл**: `tests/integration/test_related_documents_notifications.py` **Статус**: Создан (6 тестов) **Реализованные тесты**: **Добавление связей (3 теста)**: - ✅ `test_adding_related_document_notifies_uploader` - уведомление автору - ✅ `test_adding_multiple_related_documents` - множественные связи - ✅ `test_related_document_does_not_notify_self` - не уведомляет себя **Удаление и особые случаи (3 теста)**: - ✅ `test_removing_related_document_no_notification` - удаление не уведомляет - ✅ `test_bidirectional_relation_notifications` - двусторонние связи - ✅ `test_related_document_without_uploader` - связь с документом без автора --- ### ✅ ФАЗА 3: MEDIUM PRIORITY - Граничные случаи (COMPLETED) #### 3.1 ✅ Edge Cases **Файл**: `tests/integration/test_edge_cases.py` **Статус**: Создан (15 тестов) **Реализованные тесты**: **Массовые операции (2 теста)**: - ✅ `test_sent_to_all_with_many_users` - 50 пользователей - ✅ `test_many_recipients_explicitly` - 30 явных получателей **Предотвращение дубликатов (2 теста)**: - ✅ `test_no_duplicate_notifications_on_update` - обновление не создает дубликаты - ✅ `test_adding_same_recipient_twice` - один получатель дважды **Неактивные пользователи (2 теста)**: - ✅ `test_only_active_users_notified_sent_to_all` - только активные - ✅ `test_inactive_explicit_recipient_not_notified` - явный неактивный не уведомляется **Пустые состояния (2 теста)**: - ✅ `test_document_with_no_recipients_no_notifications` - нет получателей - ✅ `test_system_with_no_users_except_uploader` - единственный пользователь **Безопасность транзакций (1 тест)**: - ✅ `test_notification_created_after_commit` - уведомления после commit **Документы без автора (2 теста)**: - ✅ `test_document_without_uploader_sent_to_all` - ✅ `test_document_without_uploader_recipients` **Параллельность (1 тест)**: - ✅ `test_simultaneous_acknowledgements` - одновременное ознакомление --- ### ✅ ФАЗА 4: MEDIUM PRIORITY - Производительность (COMPLETED) #### 4.1 ✅ Performance Tests **Файл**: `tests/integration/test_performance.py` **Статус**: Создан (7 тестов) **Реализованные тесты** (помечены `@pytest.mark.performance`): **Производительность уведомлений (4 теста)**: - ✅ `test_100_users_notification_time` - 100 пользователей < 5 сек - ✅ `test_bulk_acknowledgement_performance` - 50 ознакомлений < 3 сек - ✅ `test_query_count_for_notification_creation` - N+1 запросы - ✅ `test_notification_retrieval_performance` - получение 50 уведомлений < 1 сек **Масштабируемость (3 теста)**: - ✅ `test_multiple_departments_performance` - 5 отделов по 10 человек < 5 сек - ✅ `test_large_recipient_list_memory` - 200 получателей < 50 МБ памяти --- ## Статистика ### Реализовано | Фаза | Приоритет | Файл | Тестов | Статус | |------|-----------|------|--------|--------| | 1.1 | CRITICAL | `test_fsm_workflow.py` | 17 | ✅ Создан | | 1.2 | CRITICAL | `test_document_notifications.py` | 10 | ✅ Создан | | 1.3 | CRITICAL | `test_acknowledgement_notifications.py` | 8 | ✅ Создан | | 2.1 | HIGH | `test_comment_notifications.py` | 8 | ✅ Создан | | 2.2 | HIGH | `test_related_documents_notifications.py` | 6 | ✅ Создан | | 3.1 | MEDIUM | `test_edge_cases.py` | 15 | ✅ Создан | | 4.1 | MEDIUM | `test_performance.py` | 7 | ✅ Создан | | **ИТОГО** | | **7 файлов** | **71 тест** | ✅ **100%** | ### Ожидаемое покрытие После запуска всех тестов ожидается: - ✅ **71 новый тест** для FSM и уведомлений - ✅ **34 существующих теста** для CRUD API - **ИТОГО: 105 тестов** для модуля documents #### Покрытие функциональности: - ✅ FSM workflow: 7/7 переходов (100%) - ✅ Signal receivers: 7/7 обработчиков (100%) - ✅ Notification types: 5/5 типов (100%) - ✅ Edge cases: критические сценарии покрыты - ✅ Performance: базовые метрики установлены --- ## Запуск тестов ### Все новые тесты ```bash # FSM workflow .venv/Scripts/python -m pytest tests/api/v1/documents/test_fsm_workflow.py -v # Интеграционные тесты уведомлений .venv/Scripts/python -m pytest tests/integration/ -v # Производительность (отдельно) .venv/Scripts/python -m pytest tests/integration/test_performance.py -v -m performance ``` ### Все тесты документов ```bash # Полный набор (CRUD + FSM + Notifications) .venv/Scripts/python -m pytest tests/api/v1/documents/ tests/integration/ -v # С покрытием кода .venv/Scripts/python -m pytest tests/api/v1/documents/ tests/integration/ --cov=documents --cov=notifications --cov-report=html ``` ### Быстрая проверка критических путей ```bash # Только CRITICAL тесты .venv/Scripts/python -m pytest \ tests/api/v1/documents/test_fsm_workflow.py::TestFullWorkflowCycle::test_complete_document_lifecycle \ tests/integration/test_document_notifications.py::TestDocumentCreationNotifications \ tests/integration/test_acknowledgement_notifications.py::TestAcknowledgementNotifications \ -v ``` --- ## Следующие шаги ### 1. ⏳ Запуск и отладка - Запустить все созданные тесты - Исправить ошибки в сигналах и моделях - Проверить корректность ожиданий ### 2. ⏳ Измерение покрытия ```bash .venv/Scripts/python -m pytest tests/ --cov=documents --cov=notifications --cov-report=html --cov-report=term ``` ### 3. ⏳ Документация результатов - Создать отчет о покрытии - Задокументировать найденные баги - Обновить CI/CD pipeline ### 4. ⏳ Расширенные тесты (опционально) **API тесты для Notifications** (`tests/api/v1/notifications/`): - GET `/api/v1/notifications/` - список уведомлений - GET `/api/v1/notifications/{id}/` - детали - POST `/api/v1/notifications/{id}/mark_read/` - пометить прочитанным - POST `/api/v1/notifications/mark_all_read/` - все прочитать - DELETE `/api/v1/notifications/{id}/` - удалить - GET `/api/v1/notifications/unread_count/` - счетчик непрочитанных - WebSocket реального времени **E2E тесты** (если нужны): - Полный сценарий: создание → согласование → публикация → ознакомление - Проверка WebSocket уведомлений в реальном времени - Email и Telegram интеграция --- ## Зависимости ### Фикстуры используемые - `make_user` - создание тестового пользователя - `make_document` - создание тестового документа - `grant_permissions` - выдача прав - `notification_types` - создание типов уведомлений - `api_client` - DRF test client ### Внешние зависимости - `pytest-django` - Django integration - `pytest-cov` - покрытие кода - `django-fsm` - FSM transitions - `django-rules` - permissions - `celery` - async tasks (мокировать в тестах) --- ## Риски и ограничения ### Известные ограничения 1. **Celery tasks мокированы** - async уведомления работают синхронно в тестах 2. **WebSocket не тестируется** - требуется отдельная инфраструктура 3. **Email/Telegram не проверяются** - только модели уведомлений 4. **Race conditions** - некоторые параллельные сценарии могут флейкать ### Потенциальные проблемы 1. **Signal receivers** могут не срабатывать в транзакциях 2. **on_commit() hooks** требуют реальных транзакций, не всегда работают в тестах 3. **FSM protected fields** - refresh_from_db() конфликтует с FSMField 4. **N+1 queries** - порог 50 может быть слишком высоким для продакшена --- ## Контрольный список ### Создание тестов - ✅ FSM workflow tests (17 тестов) - ✅ Document creation notifications (10 тестов) - ✅ Acknowledgement notifications (8 тестов) - ✅ Comment notifications (8 тестов) - ✅ Related documents notifications (6 тестов) - ✅ Edge cases (15 тестов) - ✅ Performance tests (7 тестов) ### Запуск и проверка - ⏳ Запустить все тесты - ⏳ Проверить покрытие кода (цель: >80%) - ⏳ Исправить failing тесты - ⏳ Оптимизировать медленные тесты ### Интеграция - ⏳ Добавить в CI/CD pipeline - ⏳ Настроить автоматический запуск - ⏳ Создать отчеты о покрытии - ⏳ Документировать багы --- ## Примечания **Автор**: GitHub Copilot (Claude Sonnet 4.5) **Дата последнего обновления**: 4 марта 2026 **Версия**: 1.0 **Связанные документы**: - Исходный plan: conversation summary - Tests location: `backend/tests/` - Signal receivers: `backend/documents/notification_signals.py` - FSM model: `backend/documents/models.py`