feat(admin): improve uploads and dashboard UX
This commit is contained in:
@@ -4,6 +4,7 @@ import io
|
||||
import os
|
||||
import tempfile
|
||||
import zipfile
|
||||
from unittest.mock import patch
|
||||
|
||||
from apps.parsers.admin import (
|
||||
FinancialReportAdmin,
|
||||
@@ -84,14 +85,24 @@ def _build_fns_zip_upload() -> SimpleUploadedFile:
|
||||
)
|
||||
|
||||
|
||||
def _build_fns_excel_upload() -> SimpleUploadedFile:
|
||||
return SimpleUploadedFile(
|
||||
f"fin_{_digits(5)}_{_digits(13)}.xlsx",
|
||||
_build_fns_excel_bytes(),
|
||||
content_type=(
|
||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
class ParsersAdminTest(TestCase):
|
||||
def setUp(self):
|
||||
self.site = AdminSite()
|
||||
self.factory = RequestFactory()
|
||||
self.user = UserFactory.create_superuser()
|
||||
|
||||
def _request(self):
|
||||
request = self.factory.get("/")
|
||||
def _request(self, path="/"):
|
||||
request = self.factory.get(path)
|
||||
request.user = self.user
|
||||
request.session = {}
|
||||
request._messages = FallbackStorage(request)
|
||||
@@ -122,6 +133,42 @@ class ParsersAdminTest(TestCase):
|
||||
proxy.refresh_from_db()
|
||||
self.assertEqual(proxy.fail_count, 0)
|
||||
|
||||
def test_proxy_admin_has_sync_route(self):
|
||||
admin = ProxyAdmin(Proxy, self.site)
|
||||
route_names = [route.name for route in admin.get_urls()]
|
||||
|
||||
self.assertIn("parsers_proxy_sync_proxy_tools", route_names)
|
||||
|
||||
def test_proxy_admin_changelist_renders_sync_button(self):
|
||||
admin = ProxyAdmin(Proxy, self.site)
|
||||
response = admin.changelist_view(self._request("/admin/parsers/proxy/"))
|
||||
response.render()
|
||||
content = response.content.decode("utf-8")
|
||||
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertIn("Обновить список прокси", content)
|
||||
self.assertIn("mx-object-tool-form", content)
|
||||
|
||||
@patch("apps.parsers.admin.ProxyToolsSyncService.sync_ru_proxies")
|
||||
def test_proxy_admin_sync_view_calls_service(self, sync_mock):
|
||||
sync_mock.return_value = {
|
||||
"status": "success",
|
||||
"fetched": 3,
|
||||
"created": 2,
|
||||
"updated": 1,
|
||||
"deactivated": 0,
|
||||
}
|
||||
admin = ProxyAdmin(Proxy, self.site)
|
||||
request = self._post_request(
|
||||
"/admin/parsers/proxy/sync-proxy-tools/",
|
||||
{},
|
||||
)
|
||||
|
||||
response = admin.sync_proxy_tools_view(request)
|
||||
|
||||
self.assertEqual(response.status_code, 302)
|
||||
sync_mock.assert_called_once_with()
|
||||
|
||||
def test_proxy_active_badge(self):
|
||||
admin = ProxyAdmin(Proxy, self.site)
|
||||
active = ProxyFactory(is_active=True)
|
||||
@@ -299,6 +346,17 @@ class ParsersAdminTest(TestCase):
|
||||
self.assertIn("parsers_financialreport_upload_excel", route_names)
|
||||
self.assertIn("parsers_financialreport_upload_zip", route_names)
|
||||
|
||||
def test_financial_report_admin_upload_excel_get_renders_custom_file_picker(self):
|
||||
admin = FinancialReportAdmin(FinancialReport, 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)
|
||||
self.assertIn("multiple", content)
|
||||
|
||||
def test_financial_report_admin_upload_zip_view(self):
|
||||
admin = FinancialReportAdmin(FinancialReport, self.site)
|
||||
archive_upload = _build_fns_zip_upload()
|
||||
@@ -311,9 +369,57 @@ class ParsersAdminTest(TestCase):
|
||||
FNS_WATCH_DIRECTORY=os.path.join(tmpdir, "watch"),
|
||||
FNS_PROCESSED_DIRECTORY=os.path.join(tmpdir, "processed"),
|
||||
FNS_FAILED_DIRECTORY=os.path.join(tmpdir, "failed"),
|
||||
):
|
||||
), patch("apps.parsers.fns_upload.process_fns_file") as task_mock:
|
||||
task_mock.apply_async.side_effect = AssertionError(
|
||||
"admin upload should not enqueue celery task"
|
||||
)
|
||||
response = admin.upload_zip_view(request)
|
||||
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertEqual(FinancialReport.objects.count(), 1)
|
||||
self.assertEqual(FinancialReportLine.objects.count(), 1)
|
||||
|
||||
def test_financial_report_admin_upload_excel_view_processes_multiple_files(self):
|
||||
admin = FinancialReportAdmin(FinancialReport, self.site)
|
||||
first_upload = _build_fns_excel_upload()
|
||||
second_upload = _build_fns_excel_upload()
|
||||
request = self._post_request(
|
||||
"/admin/parsers/financialreport/upload-excel/",
|
||||
{"files": [first_upload, second_upload]},
|
||||
)
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmpdir, override_settings(
|
||||
FNS_WATCH_DIRECTORY=os.path.join(tmpdir, "watch"),
|
||||
FNS_PROCESSED_DIRECTORY=os.path.join(tmpdir, "processed"),
|
||||
FNS_FAILED_DIRECTORY=os.path.join(tmpdir, "failed"),
|
||||
), patch("apps.parsers.fns_upload.process_fns_file") as task_mock:
|
||||
task_mock.apply_async.side_effect = AssertionError(
|
||||
"admin upload should not enqueue celery task"
|
||||
)
|
||||
response = admin.upload_excel_view(request)
|
||||
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertEqual(FinancialReport.objects.count(), 2)
|
||||
self.assertEqual(FinancialReportLine.objects.count(), 2)
|
||||
|
||||
def test_financial_report_admin_upload_excel_view_processes_sync(self):
|
||||
admin = FinancialReportAdmin(FinancialReport, self.site)
|
||||
excel_upload = _build_fns_excel_upload()
|
||||
request = self._post_request(
|
||||
"/admin/parsers/financialreport/upload-excel/",
|
||||
{"files": [excel_upload]},
|
||||
)
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmpdir, override_settings(
|
||||
FNS_WATCH_DIRECTORY=os.path.join(tmpdir, "watch"),
|
||||
FNS_PROCESSED_DIRECTORY=os.path.join(tmpdir, "processed"),
|
||||
FNS_FAILED_DIRECTORY=os.path.join(tmpdir, "failed"),
|
||||
), patch("apps.parsers.fns_upload.process_fns_file") as task_mock:
|
||||
task_mock.apply_async.side_effect = AssertionError(
|
||||
"admin upload should not enqueue celery task"
|
||||
)
|
||||
response = admin.upload_excel_view(request)
|
||||
|
||||
self.assertEqual(response.status_code, 302)
|
||||
self.assertEqual(FinancialReport.objects.count(), 1)
|
||||
self.assertEqual(FinancialReportLine.objects.count(), 1)
|
||||
|
||||
Reference in New Issue
Block a user