Files
mostovik-backend/tests/apps/backups/test_views.py
Aleksandr Meshchriakov 75c1d4cf1a
Some checks failed
CI/CD Pipeline / Quality Gate (push) Successful in 33s
CI/CD Pipeline / Build and Push Images (push) Successful in 10s
CI/CD Pipeline / Internal Notify (push) Successful in 0s
CI/CD Pipeline / Deploy Dev in Dokploy (push) Failing after 9s
feat: export state corp package from backup endpoint
2026-05-12 15:12:56 +02:00

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"]
)