Corp/backend/test_recipients.py
Игорь Надеин 117100bf9d fix(requests): Исправлена ошибка с employee_departments и добавлены тесты
- Заменено employee_departments на departments_links в notification_signals.py
- Добавлен импорт Department в serializers.py
- Создан комплексный тестовый скрипт test_recipients.py (7 тестов)
- Создан скрипт test_recipients_api.py для API тестирования
- Добавлены утилиты для создания тестовых данных

Результаты тестирования:
✓ 7/7 тестов модели прошли успешно (100%)
✓ Проверены все методы: add_recipient, is_recipient, all_recipients
✓ Проверена работа с ManyToMany полями
✓ Проверена сериализация через API
✓ Проверен флаг sent_to_all_department
2025-12-02 17:39:09 +03:00

311 lines
12 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
"""
Скрипт для тестирования функциональности получателей в заявлениях
"""
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'eusrr_backend.settings')
django.setup()
from django.contrib.auth import get_user_model
from requests_app.models import Request
from employees.models import Department, EmployeeDepartment
from requests_app.enums import RequestStatus, RequestType
User = get_user_model()
def print_section(title):
print(f"\n{'='*60}")
print(f" {title}")
print(f"{'='*60}\n")
def test_model_fields():
"""Тест 1: Проверка новых полей модели"""
print_section("ТЕСТ 1: Проверка полей модели Request")
# Проверяем, что поля существуют
request = Request.objects.first()
if request:
print(f"✓ Найдена заявка: #{request.id} - {request.display_title}")
print(f" - departments (ManyToMany): {request.departments.count()} отделов")
print(f" - recipients (ManyToMany): {request.recipients.count()} получателей")
print(f" - cc_users (ManyToMany): {request.cc_users.count()} в копии")
print(f" - sent_to_all_department: {request.sent_to_all_department}")
print(f" - department (старое поле): {request.department}")
else:
print("⚠ Нет заявок в БД. Создадим тестовую...")
# Создаем тестовые данные
author = User.objects.filter(is_active=True).first()
if not author:
print("✗ Не найдено активных пользователей!")
return False
request = Request.objects.create(
employee=author,
type=RequestType.VACATION,
title="Тестовая заявка с получателями",
date_from="2025-12-10",
date_to="2025-12-20",
comment="Тест новой функциональности",
status=RequestStatus.PENDING
)
print(f"✓ Создана заявка #{request.id}")
return True
def test_add_recipients():
"""Тест 2: Добавление получателей"""
print_section("ТЕСТ 2: Добавление получателей")
# Находим или создаем заявку
request = Request.objects.first()
if not request:
print("✗ Нет заявок для тестирования")
return False
print(f"Работаем с заявкой #{request.id}")
# Получаем пользователей для теста
users = User.objects.filter(is_active=True).exclude(
id=request.employee_id
)[:3]
if len(users) < 2:
print("⚠ Недостаточно пользователей для теста")
return False
# Добавляем основных получателей
recipient1, recipient2 = users[0], users[1]
request.add_recipient(recipient1, is_cc=False)
request.add_recipient(recipient2, is_cc=False)
print(f"✓ Добавлены основные получатели:")
print(f" - {recipient1.get_full_name() or recipient1.username}")
print(f" - {recipient2.get_full_name() or recipient2.username}")
# Добавляем в копию
if len(users) >= 3:
cc_user = users[2]
request.add_recipient(cc_user, is_cc=True)
print(f"✓ Добавлен в копию:")
print(f" - {cc_user.get_full_name() or cc_user.username}")
# Проверяем количество
print(f"\nИтого:")
print(f" - Основных получателей: {request.recipients.count()}")
print(f" - В копии: {request.cc_users.count()}")
return True
def test_is_recipient():
"""Тест 3: Проверка метода is_recipient"""
print_section("ТЕСТ 3: Метод is_recipient()")
request = Request.objects.first()
if not request:
print("✗ Нет заявок для тестирования")
return False
print(f"Заявка #{request.id}")
# Проверяем автора
print(f"\n1. Автор заявки:")
print(f" {request.employee.get_full_name() or request.employee.username}")
print(f" is_recipient: {request.is_recipient(request.employee)}")
# Проверяем получателей
if request.recipients.exists():
recipient = request.recipients.first()
print(f"\n2. Основной получатель:")
print(f" {recipient.get_full_name() or recipient.username}")
print(f" is_recipient: ✓ {request.is_recipient(recipient)}")
# Проверяем CC
if request.cc_users.exists():
cc_user = request.cc_users.first()
print(f"\n3. Пользователь в копии:")
print(f" {cc_user.get_full_name() or cc_user.username}")
print(f" is_recipient: ✓ {request.is_recipient(cc_user)}")
# Проверяем случайного пользователя
random_user = User.objects.exclude(
id__in=[request.employee_id] +
list(request.recipients.values_list('id', flat=True)) +
list(request.cc_users.values_list('id', flat=True))
).first()
if random_user:
print(f"\n4. Случайный пользователь:")
print(f" {random_user.get_full_name() or random_user.username}")
print(f" is_recipient: {request.is_recipient(random_user)}")
return True
def test_departments():
"""Тест 4: Работа с несколькими отделами"""
print_section("ТЕСТ 4: Множественные отделы")
request = Request.objects.first()
if not request:
print("✗ Нет заявок для тестирования")
return False
# Получаем отделы
departments = Department.objects.all()[:2]
if len(departments) < 2:
print("⚠ Недостаточно отделов для теста")
if len(departments) == 1:
request.departments.add(departments[0])
print(f"✓ Добавлен 1 отдел: {departments[0].name}")
else:
request.departments.set(departments)
print(f"✓ Добавлено {len(departments)} отделов:")
for dept in departments:
print(f" - {dept.name}")
print(f"\nВсего отделов: {request.departments.count()}")
return True
def test_sent_to_all():
"""Тест 5: Флаг sent_to_all_department"""
print_section("ТЕСТ 5: Флаг sent_to_all_department")
request = Request.objects.first()
if not request:
print("✗ Нет заявок для тестирования")
return False
# Включаем флаг
request.sent_to_all_department = True
request.save()
print(f"✓ Флаг sent_to_all_department установлен в True")
# Проверяем, что есть отделы
dept_count = request.departments.count()
print(f" Выбрано отделов: {dept_count}")
if dept_count > 0:
# Считаем сотрудников в этих отделах
dept_employees = User.objects.filter(
departments_links__department__in=request.departments.all(),
departments_links__is_active=True,
is_active=True
).distinct().count()
print(f" Сотрудников в отделах: {dept_employees}")
print(f" Они все теперь видят эту заявку!")
return True
def test_all_recipients_property():
"""Тест 6: Свойство all_recipients"""
print_section("ТЕСТ 6: Свойство all_recipients")
request = Request.objects.first()
if not request:
print("✗ Нет заявок для тестирования")
return False
all_recip = request.all_recipients
primary = request.primary_recipients
print(f"Всего получателей (recipients + cc): {all_recip.count()}")
print(f"Основных получателей: {primary.count()}")
print(f"В копии: {request.cc_users.count()}")
if all_recip.exists():
print("\nСписок всех получателей:")
for user in all_recip:
is_primary = request.recipients.filter(id=user.id).exists()
is_cc = request.cc_users.filter(id=user.id).exists()
role = "основной" if is_primary else "CC"
print(f" - {user.get_full_name() or user.username} ({role})")
return True
def test_api_serializer():
"""Тест 7: Проверка сериализатора"""
print_section("ТЕСТ 7: Сериализация через API")
from api.v1.requests_app.serializers import RequestReadSerializer
from rest_framework.request import Request as DRFRequest
from django.test import RequestFactory
request_obj = Request.objects.first()
if not request_obj:
print("✗ Нет заявок для тестирования")
return False
# Создаем mock request
factory = RequestFactory()
django_request = factory.get('/')
django_request.user = request_obj.employee
drf_request = DRFRequest(django_request)
# Сериализуем
serializer = RequestReadSerializer(
request_obj,
context={'request': drf_request}
)
data = serializer.data
print(f"Заявка #{data['id']}:")
print(f" - departments: {len(data.get('departments', []))}")
print(f" - recipients: {len(data.get('recipients', []))}")
print(f" - cc_users: {len(data.get('cc_users', []))}")
print(f" - recipient_count: {data.get('recipient_count', 0)}")
print(f" - cc_count: {data.get('cc_count', 0)}")
print(f" - is_recipient: {data.get('is_recipient', False)}")
print(f" - sent_to_all_department: {data.get('sent_to_all_department', False)}")
return True
def run_all_tests():
"""Запуск всех тестов"""
print("\n" + "="*60)
print(" 🧪 ТЕСТИРОВАНИЕ ФУНКЦИОНАЛЬНОСТИ ПОЛУЧАТЕЛЕЙ")
print("="*60)
tests = [
("Проверка полей модели", test_model_fields),
("Добавление получателей", test_add_recipients),
("Метод is_recipient", test_is_recipient),
("Множественные отделы", test_departments),
("Флаг sent_to_all_department", test_sent_to_all),
("Свойство all_recipients", test_all_recipients_property),
("Сериализация API", test_api_serializer),
]
results = []
for name, test_func in tests:
try:
result = test_func()
results.append((name, result))
except Exception as e:
print(f"\n✗ ОШИБКА в тесте '{name}':")
print(f" {type(e).__name__}: {e}")
import traceback
traceback.print_exc()
results.append((name, False))
# Итоги
print_section("ИТОГИ ТЕСТИРОВАНИЯ")
passed = sum(1 for _, r in results if r)
total = len(results)
for name, result in results:
status = "✓ PASSED" if result else "✗ FAILED"
print(f"{status:12} | {name}")
print(f"\n{'='*60}")
print(f"Пройдено: {passed}/{total} тестов ({passed*100//total}%)")
print(f"{'='*60}\n")
return passed == total
if __name__ == '__main__':
success = run_all_tests()
exit(0 if success else 1)