- Заменено 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
311 lines
12 KiB
Python
311 lines
12 KiB
Python
#!/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)
|