Files
mostovik-backend/tests/apps/registers/test_admin.py

147 lines
5.0 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.
"""Tests for registers admin configuration."""
import io
from unittest.mock import patch
from apps.registers.admin import RegisterUploadAdmin
from apps.registers.models import Organization, RegisterUpload, RegistryMembershipPeriod
from django.contrib.admin.sites import AdminSite
from django.contrib.messages.storage.fallback import FallbackStorage
from django.core.files.uploadedfile import SimpleUploadedFile
from django.test import RequestFactory, TestCase
from openpyxl import Workbook
from tests.apps.registers.factories import RegisterFactory
from tests.apps.user.factories import UserFactory
def _build_register_excel_upload(filename: str = "registry.xlsx") -> SimpleUploadedFile:
workbook = Workbook()
worksheet = workbook.active
worksheet.append(["pn_name", "mn_ogrn", "mn_inn", "in_kpp", "mn_okpo"])
worksheet.append(
[
'АО "Тестовая организация"',
1027600980990,
7601000086,
760401001,
"07506197",
]
)
buffer = io.BytesIO()
workbook.save(buffer)
workbook.close()
return SimpleUploadedFile(
filename,
buffer.getvalue(),
content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
)
class RegistersAdminTest(TestCase):
def setUp(self):
self.site = AdminSite()
self.factory = RequestFactory()
self.user = UserFactory.create_superuser()
def _request(self):
request = self.factory.get("/admin/registers/registerupload/upload-excel/")
request.user = self.user
request.session = {}
request._messages = FallbackStorage(request)
return request
def _post_request(self, data):
request = self.factory.post(
"/admin/registers/registerupload/upload-excel/",
data=data,
)
request.user = self.user
request.session = {}
request._messages = FallbackStorage(request)
return request
def test_register_upload_admin_has_custom_upload_route(self):
admin = RegisterUploadAdmin(RegisterUpload, self.site)
route_names = [route.name for route in admin.get_urls()]
self.assertIn("registers_registerupload_upload_excel", route_names)
def test_register_upload_admin_get_renders_custom_file_picker(self):
admin = RegisterUploadAdmin(RegisterUpload, self.site)
response = admin.upload_excel_view(self._request())
response.render()
content = response.content.decode("utf-8")
self.assertEqual(response.status_code, 200)
self.assertIn('type="file"', content)
self.assertIn("mx-upload-file", content)
def test_register_upload_admin_upload_excel_success(self):
admin = RegisterUploadAdmin(RegisterUpload, self.site)
registry = RegisterFactory()
uploaded_file = _build_register_excel_upload()
request = self._post_request(
{
"registry": str(registry.id),
"actual_date": "2026-03-20",
"file": uploaded_file,
}
)
response = admin.upload_excel_view(request)
self.assertEqual(response.status_code, 302)
self.assertEqual(RegisterUpload.objects.count(), 1)
self.assertEqual(Organization.objects.count(), 1)
self.assertEqual(RegistryMembershipPeriod.objects.count(), 1)
upload = RegisterUpload.objects.first()
self.assertEqual(upload.registry, registry)
self.assertEqual(upload.actual_date.isoformat(), "2026-03-20")
def test_register_upload_admin_upload_excel_invalid_extension(self):
admin = RegisterUploadAdmin(RegisterUpload, self.site)
registry = RegisterFactory()
invalid_file = SimpleUploadedFile("registry.txt", b"text/plain")
request = self._post_request(
{
"registry": str(registry.id),
"actual_date": "2026-03-20",
"file": invalid_file,
}
)
response = admin.upload_excel_view(request)
self.assertEqual(response.status_code, 302)
self.assertEqual(RegisterUpload.objects.count(), 0)
def test_register_upload_admin_uses_sync_import_service(self):
admin = RegisterUploadAdmin(RegisterUpload, self.site)
registry = RegisterFactory()
uploaded_file = _build_register_excel_upload()
request = self._post_request(
{
"registry": str(registry.id),
"actual_date": "2026-03-20",
"file": uploaded_file,
}
)
with patch(
"apps.registers.admin.RegisterImportService.sync_registry_memberships",
return_value={
"registry_name": registry.name,
"rows_in_file": 1,
"organizations_created": 1,
"organizations_updated": 0,
},
) as sync_mock:
response = admin.upload_excel_view(request)
self.assertEqual(response.status_code, 302)
sync_mock.assert_called_once()