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