83 lines
3.3 KiB
Python
83 lines
3.3 KiB
Python
"""Tests for backups export API."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from datetime import date
|
|
from types import SimpleNamespace
|
|
from unittest.mock import patch
|
|
|
|
from apps.exchange.state_corp_services import StateCorpExchangeError
|
|
from django.urls import reverse
|
|
from rest_framework import status
|
|
from rest_framework.test import APITestCase
|
|
|
|
from tests.apps.user.factories import UserFactory
|
|
|
|
|
|
class BackupExportViewTest(APITestCase):
|
|
"""Tests for synchronous ZIP export endpoint."""
|
|
|
|
def setUp(self):
|
|
self.user = UserFactory.create_user()
|
|
self.admin = UserFactory.create_superuser()
|
|
self.url = reverse("api_v1:backups:export")
|
|
|
|
def test_export_admin_only(self):
|
|
response = self.client.post(self.url, {}, format="json")
|
|
self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED)
|
|
|
|
self.client.force_authenticate(self.user)
|
|
response = self.client.post(self.url, {}, format="json")
|
|
self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)
|
|
|
|
@patch("apps.backups.views.StateCorpExchangeService.build_package")
|
|
def test_export_returns_state_corp_zip_synchronously(self, build_package_mock):
|
|
build_package_mock.return_value = SimpleNamespace(
|
|
package_id="package-1",
|
|
archive_name="state_corp_exchange.zip",
|
|
bin_name="state_corp_exchange.bin",
|
|
archive_bytes=b"zip-bytes",
|
|
payload_counts={
|
|
"organizations": 2,
|
|
"industrial_products": 1,
|
|
"prosecutor_checks": 0,
|
|
"public_procurements": 0,
|
|
"arbitration_cases": 0,
|
|
},
|
|
produced_at="2026-05-12T10:00:00+00:00",
|
|
)
|
|
|
|
self.client.force_authenticate(self.admin)
|
|
response = self.client.post(
|
|
self.url,
|
|
{"actual_date": "2026-05-12", "registry": "ignored-legacy-field"},
|
|
format="json",
|
|
)
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assertEqual(response.content, b"zip-bytes")
|
|
self.assertEqual(response["Content-Type"], "application/zip")
|
|
self.assertIn(
|
|
'attachment; filename="state_corp_exchange.zip"',
|
|
response["Content-Disposition"],
|
|
)
|
|
self.assertEqual(response["Content-Length"], "9")
|
|
self.assertEqual(response["X-State-Corp-Package-Id"], "package-1")
|
|
self.assertEqual(response["X-State-Corp-Bin-File"], "state_corp_exchange.bin")
|
|
self.assertEqual(response["X-State-Corp-Organizations"], "2")
|
|
self.assertEqual(response["X-Backup-Organizations"], "2")
|
|
self.assertEqual(response["X-Backup-Actual-Date"], "2026-05-12")
|
|
build_package_mock.assert_called_once_with(actual_date=date(2026, 5, 12))
|
|
|
|
@patch("apps.backups.views.StateCorpExchangeService.build_package")
|
|
def test_export_returns_400_when_package_build_fails(self, build_package_mock):
|
|
self.client.force_authenticate(self.admin)
|
|
build_package_mock.side_effect = StateCorpExchangeError("broken")
|
|
|
|
response = self.client.post(self.url, {}, format="json")
|
|
|
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
|
self.assertEqual(
|
|
response.data["errors"][0]["details"]["fields"]["backup"], ["broken"]
|
|
)
|