- Replaced models.py with filer version (FilerFileField) - Replaced admin.py with full filer admin (thumbnails, previews, file info) - Replaced rules.py with updated django-rules predicates - Replaced tests.py with comprehensive test suite (298 lines, 16 tests) - Deleted duplicate V2 files: models_v2.py, admin_v2.py, rules_v2.py, tests_v2.py - Deleted management/commands/migrate_to_filer.py (no longer needed) - Created migration 0005_migrate_to_filer.py with data migration: * Migrated 23 existing documents from FileField to FilerFileField * Dropped DocumentV2 and DocumentAcknowledgementV2 models Breaking changes: None (V2 models removed, primary models enhanced) Migration applied: All 23 documents successfully migrated to django-filer
299 lines
10 KiB
Python
299 lines
10 KiB
Python
# documents/tests.py
|
||
"""
|
||
Тесты для моделей Document и DocumentAcknowledgement с django-filer
|
||
"""
|
||
|
||
from django.test import TestCase
|
||
from django.contrib.auth import get_user_model
|
||
from django.core.files.uploadedfile import SimpleUploadedFile
|
||
from filer.models import File as FilerFile
|
||
from documents.models import Document, DocumentAcknowledgement
|
||
from employees.models import Department
|
||
import rules
|
||
|
||
User = get_user_model()
|
||
|
||
|
||
class DocumentModelTest(TestCase):
|
||
"""Тесты для модели Document"""
|
||
|
||
def setUp(self):
|
||
"""Создание тестовых данных"""
|
||
self.user = User.objects.create_user(
|
||
phone_number='+79999999999',
|
||
email='test1@example.com',
|
||
first_name='Тест',
|
||
last_name='Тестов',
|
||
is_active=True
|
||
)
|
||
|
||
# Создаем тестовый файл через filer
|
||
test_file = SimpleUploadedFile(
|
||
"test_document.txt",
|
||
b"Test content",
|
||
content_type="text/plain"
|
||
)
|
||
|
||
self.filer_file = FilerFile.objects.create(
|
||
file=test_file,
|
||
original_filename="test_document.txt",
|
||
name="Test Document",
|
||
owner=self.user
|
||
)
|
||
|
||
def test_create_document(self):
|
||
"""Создание документа с filer файлом"""
|
||
document = Document.objects.create(
|
||
title="Тестовый документ",
|
||
file=self.filer_file,
|
||
description="Описание тестового документа",
|
||
uploaded_by=self.user,
|
||
sent_to_all=True
|
||
)
|
||
|
||
self.assertEqual(document.title, "Тестовый документ")
|
||
self.assertEqual(document.file, self.filer_file)
|
||
self.assertEqual(document.uploaded_by, self.user)
|
||
self.assertTrue(document.sent_to_all)
|
||
self.assertIsNotNone(document.uploaded_at)
|
||
|
||
def test_file_properties(self):
|
||
"""Проверка свойств файла (размер, расширение)"""
|
||
document = Document.objects.create(
|
||
title="Тестовый документ",
|
||
file=self.filer_file,
|
||
uploaded_by=self.user
|
||
)
|
||
|
||
self.assertGreater(document.file_size, 0)
|
||
self.assertEqual(document.file_extension, 'txt')
|
||
|
||
def test_sent_to_all(self):
|
||
"""Документ с sent_to_all=True"""
|
||
document = Document.objects.create(
|
||
title="Документ для всех",
|
||
file=self.filer_file,
|
||
uploaded_by=self.user,
|
||
sent_to_all=True
|
||
)
|
||
|
||
self.assertTrue(document.sent_to_all)
|
||
self.assertEqual(document.departments.count(), 0)
|
||
self.assertEqual(document.recipients.count(), 0)
|
||
|
||
def test_department_recipients(self):
|
||
"""Документ для конкретных отделов"""
|
||
department = Department.objects.create(
|
||
name="Тестовый отдел"
|
||
)
|
||
|
||
document = Document.objects.create(
|
||
title="Документ для отдела",
|
||
file=self.filer_file,
|
||
uploaded_by=self.user,
|
||
sent_to_all=False
|
||
)
|
||
document.departments.add(department)
|
||
|
||
self.assertFalse(document.sent_to_all)
|
||
self.assertEqual(document.departments.count(), 1)
|
||
self.assertIn(department, document.departments.all())
|
||
|
||
def test_individual_recipients(self):
|
||
"""Документ для конкретных получателей"""
|
||
recipient = User.objects.create_user(
|
||
phone_number='+79999999998',
|
||
email='recipient@example.com',
|
||
first_name='Получатель',
|
||
last_name='Тестовый',
|
||
is_active=True
|
||
)
|
||
|
||
document = Document.objects.create(
|
||
title="Документ для получателя",
|
||
file=self.filer_file,
|
||
uploaded_by=self.user,
|
||
sent_to_all=False
|
||
)
|
||
document.recipients.add(recipient)
|
||
|
||
self.assertFalse(document.sent_to_all)
|
||
self.assertEqual(document.recipients.count(), 1)
|
||
self.assertIn(recipient, document.recipients.all())
|
||
|
||
|
||
class DocumentAcknowledgementModelTest(TestCase):
|
||
"""Тесты для модели DocumentAcknowledgement"""
|
||
|
||
def setUp(self):
|
||
"""Создание тестовых данных"""
|
||
self.user = User.objects.create_user(
|
||
phone_number='+79999999999',
|
||
email='test@example.com',
|
||
first_name='Тест',
|
||
last_name='Тестов',
|
||
is_active=True
|
||
)
|
||
|
||
test_file = SimpleUploadedFile(
|
||
"test_document.txt",
|
||
b"Test content",
|
||
content_type="text/plain"
|
||
)
|
||
|
||
filer_file = FilerFile.objects.create(
|
||
file=test_file,
|
||
original_filename="test_document.txt",
|
||
name="Test Document",
|
||
owner=self.user
|
||
)
|
||
|
||
self.document = Document.objects.create(
|
||
title="Тестовый документ",
|
||
file=filer_file,
|
||
uploaded_by=self.user,
|
||
sent_to_all=True
|
||
)
|
||
|
||
def test_create_acknowledgement(self):
|
||
"""Создание ознакомления с документом"""
|
||
ack = DocumentAcknowledgement.objects.create(
|
||
document=self.document,
|
||
user=self.user
|
||
)
|
||
|
||
self.assertEqual(ack.document, self.document)
|
||
self.assertEqual(ack.user, self.user)
|
||
self.assertIsNotNone(ack.acknowledged_at)
|
||
|
||
def test_unique_acknowledgement(self):
|
||
"""Один пользователь может ознакомиться только один раз"""
|
||
DocumentAcknowledgement.objects.create(
|
||
document=self.document,
|
||
user=self.user
|
||
)
|
||
|
||
# Попытка создать второе ознакомление должна вызвать ошибку
|
||
with self.assertRaises(Exception):
|
||
DocumentAcknowledgement.objects.create(
|
||
document=self.document,
|
||
user=self.user
|
||
)
|
||
|
||
def test_acknowledgement_count(self):
|
||
"""Подсчет ознакомлений"""
|
||
user2 = User.objects.create_user(
|
||
phone_number='+79999999998',
|
||
email='test2@example.com',
|
||
first_name='Тест2',
|
||
last_name='Тестов2',
|
||
is_active=True
|
||
)
|
||
|
||
DocumentAcknowledgement.objects.create(
|
||
document=self.document,
|
||
user=self.user
|
||
)
|
||
DocumentAcknowledgement.objects.create(
|
||
document=self.document,
|
||
user=user2
|
||
)
|
||
|
||
self.assertEqual(self.document.acknowledgements.count(), 2)
|
||
|
||
|
||
class DocumentRulesTest(TestCase):
|
||
"""Тесты для правил доступа django-rules"""
|
||
|
||
def setUp(self):
|
||
"""Создание тестовых данных"""
|
||
self.owner = User.objects.create_user(
|
||
phone_number='+79999999999',
|
||
email='owner@example.com',
|
||
first_name='Владелец',
|
||
last_name='Документа',
|
||
is_active=True
|
||
)
|
||
|
||
self.other_user = User.objects.create_user(
|
||
phone_number='+79999999998',
|
||
email='other@example.com',
|
||
first_name='Другой',
|
||
last_name='Пользователь',
|
||
is_active=True
|
||
)
|
||
|
||
test_file = SimpleUploadedFile(
|
||
"test_document.txt",
|
||
b"Test content",
|
||
content_type="text/plain"
|
||
)
|
||
|
||
filer_file = FilerFile.objects.create(
|
||
file=test_file,
|
||
original_filename="test_document.txt",
|
||
name="Test Document",
|
||
owner=self.owner
|
||
)
|
||
|
||
self.document = Document.objects.create(
|
||
title="Тестовый документ",
|
||
file=filer_file,
|
||
uploaded_by=self.owner,
|
||
sent_to_all=False # Не для всех
|
||
)
|
||
|
||
def test_owner_can_view(self):
|
||
"""Владелец может просматривать свой документ"""
|
||
self.assertTrue(
|
||
rules.test_rule('documents.view_document', self.owner, self.document)
|
||
)
|
||
|
||
def test_other_user_cannot_view(self):
|
||
"""Другой пользователь не может просматривать чужой документ (если не в списке)"""
|
||
self.assertFalse(
|
||
rules.test_rule('documents.view_document', self.other_user, self.document)
|
||
)
|
||
|
||
def test_sent_to_all_allows_view(self):
|
||
"""Документ с sent_to_all=True доступен всем активным пользователям"""
|
||
self.document.sent_to_all = True
|
||
self.document.save()
|
||
|
||
self.assertTrue(
|
||
rules.test_rule('documents.view_document', self.other_user, self.document)
|
||
)
|
||
|
||
def test_recipient_can_view(self):
|
||
"""Получатель из списка может просматривать документ"""
|
||
self.document.recipients.add(self.other_user)
|
||
|
||
self.assertTrue(
|
||
rules.test_rule('documents.view_document', self.other_user, self.document)
|
||
)
|
||
|
||
def test_owner_can_edit(self):
|
||
"""Владелец может редактировать свой документ"""
|
||
self.assertTrue(
|
||
rules.test_rule('documents.change_document', self.owner, self.document)
|
||
)
|
||
|
||
def test_other_user_cannot_edit(self):
|
||
"""Другой пользователь не может редактировать чужой документ"""
|
||
self.assertFalse(
|
||
rules.test_rule('documents.change_document', self.other_user, self.document)
|
||
)
|
||
|
||
def test_owner_can_delete(self):
|
||
"""Владелец может удалять свой документ"""
|
||
self.assertTrue(
|
||
rules.test_rule('documents.delete_document', self.owner, self.document)
|
||
)
|
||
|
||
def test_other_user_cannot_delete(self):
|
||
"""Другой пользователь не может удалять чужой документ"""
|
||
self.assertFalse(
|
||
rules.test_rule('documents.delete_document', self.other_user, self.document)
|
||
)
|
||
|