"""Tests for organization API.""" from __future__ import annotations from datetime import date from apps.registers.models import Register, RegisterUpload, RegistryMembershipPeriod from django.test import override_settings from rest_framework import status from rest_framework.test import APITestCase from tests.apps.organization.factories import OrganizationFactory from tests.apps.user.factories import UserFactory @override_settings(ROOT_URLCONF="core.urls") class OrganizationApiTest(APITestCase): """Tests for organization endpoints.""" def setUp(self): self.user = UserFactory.create_user() self.client.force_authenticate(self.user) def test_list_includes_only_active_registry_names(self): organization = OrganizationFactory.create( name="АО Альфа", short_name="АО «Альфа»", organization_type="ao", ) active_register = Register.objects.create(name="Реестр ОПК") closed_register = Register.objects.create(name="Архивный реестр") active_upload = RegisterUpload.objects.create( registry=active_register, actual_date=date(2026, 3, 1), file_name="active.xlsx", file_hash="active-api-hash", rows_count=1, ) closed_upload = RegisterUpload.objects.create( registry=closed_register, actual_date=date(2026, 2, 1), file_name="closed.xlsx", file_hash="closed-api-hash", rows_count=1, ) RegistryMembershipPeriod.objects.create( registry=active_register, organization=organization, started_at=date(2026, 3, 1), started_by_upload=active_upload, ) RegistryMembershipPeriod.objects.create( registry=closed_register, organization=organization, started_at=date(2026, 2, 1), ended_at=date(2026, 3, 1), started_by_upload=closed_upload, ended_by_upload=closed_upload, ) response = self.client.get("/api/v1/organizations/") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( response.data["results"][0]["active_registry_names"], ["Реестр ОПК"] ) self.assertEqual(response.data["results"][0]["corporation_scope"], "opk") self.assertEqual( response.data["results"][0]["corporation_scope_label"], "Организации ОПК", ) self.assertEqual(response.data["results"][0]["registry_category"], "opk") self.assertEqual(response.data["results"][0]["registry_category_label"], "ОПК") self.assertEqual(response.data["results"][0]["short_name"], "АО «Альфа»") def test_detail_includes_active_registries(self): organization = OrganizationFactory.create( short_name="АО «Бета»", general_director_name="Иванов Иван Иванович", general_director_inn="123456789012", financial_reports_available=True, tax_reports_available=True, ) register = Register.objects.create(name="Реестр Роскосмос") upload = RegisterUpload.objects.create( registry=register, actual_date=date(2026, 3, 1), file_name="detail.xlsx", file_hash="detail-api-hash", rows_count=1, ) RegistryMembershipPeriod.objects.create( registry=register, organization=organization, started_at=date(2026, 3, 1), started_by_upload=upload, ) response = self.client.get(f"/api/v1/organizations/{organization.id}/") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( response.data["summary"]["active_registry_names"], ["Реестр Роскосмос"], ) self.assertEqual( response.data["active_registries"], [{"id": str(register.id), "name": "Реестр Роскосмос"}], ) self.assertEqual(response.data["corporation_scope"], "roscosmos") self.assertEqual( response.data["corporation_scope_label"], "Госкорпорация «Роскосмос»", ) self.assertEqual(response.data["registry_category"], "other") self.assertEqual(response.data["registry_category_label"], "Прочие") self.assertEqual( response.data["general_director"]["full_name"], "Иванов Иван Иванович", ) def test_registry_filter_uses_only_active_memberships(self): active_organization = OrganizationFactory.create(name="АО Актив") closed_organization = OrganizationFactory.create(name="АО Закрыт") register = Register.objects.create(name="Реестр Росатом") upload = RegisterUpload.objects.create( registry=register, actual_date=date(2026, 3, 1), file_name="filter.xlsx", file_hash="filter-api-hash", rows_count=2, ) RegistryMembershipPeriod.objects.create( registry=register, organization=active_organization, started_at=date(2026, 3, 1), started_by_upload=upload, ) RegistryMembershipPeriod.objects.create( registry=register, organization=closed_organization, started_at=date(2026, 2, 1), ended_at=date(2026, 3, 1), started_by_upload=upload, ended_by_upload=upload, ) response = self.client.get(f"/api/v1/organizations/?registry={register.id}") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(len(response.data["results"]), 1) self.assertEqual(response.data["results"][0]["id"], str(active_organization.id)) def test_corporation_scope_filter_uses_active_registers(self): rosatom_org = OrganizationFactory.create(name="АО Росатом") roscosmos_org = OrganizationFactory.create(name="АО Роскосмос") rosatom_register = Register.objects.create(name="Реестр госкорпорации Росатом") roscosmos_register = Register.objects.create( name="Реестр госкорпорации Роскосмос" ) rosatom_upload = RegisterUpload.objects.create( registry=rosatom_register, actual_date=date(2026, 4, 1), file_name="rosatom.xlsx", file_hash="rosatom-hash", rows_count=1, ) roscosmos_upload = RegisterUpload.objects.create( registry=roscosmos_register, actual_date=date(2026, 4, 1), file_name="roscosmos.xlsx", file_hash="roscosmos-hash", rows_count=1, ) RegistryMembershipPeriod.objects.create( registry=rosatom_register, organization=rosatom_org, started_at=date(2026, 4, 1), started_by_upload=rosatom_upload, ) RegistryMembershipPeriod.objects.create( registry=roscosmos_register, organization=roscosmos_org, started_at=date(2026, 4, 1), started_by_upload=roscosmos_upload, ) response = self.client.get("/api/v1/organizations/?corporation_scope=rosatom") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual(len(response.data["results"]), 1) self.assertEqual(response.data["results"][0]["id"], str(rosatom_org.id)) def test_registry_category_filters_support_snake_and_camel_case(self): opk_org = OrganizationFactory.create(name="АО ОПК") goz_org = OrganizationFactory.create(name="АО ГОЗ", in_275_fz_registry=True) other_org = OrganizationFactory.create(name="АО Прочие") opk_register = Register.objects.create(name="Реестр предприятий ОПК") goz_register = Register.objects.create(name="Реестр госкорпорации Росатом ГОЗ") upload = RegisterUpload.objects.create( registry=opk_register, actual_date=date(2026, 4, 1), file_name="registry-category.xlsx", file_hash="registry-category-hash", rows_count=2, ) goz_upload = RegisterUpload.objects.create( registry=goz_register, actual_date=date(2026, 4, 1), file_name="registry-category-goz.xlsx", file_hash="registry-category-goz-hash", rows_count=1, ) RegistryMembershipPeriod.objects.create( registry=opk_register, organization=opk_org, started_at=date(2026, 4, 1), started_by_upload=upload, ) RegistryMembershipPeriod.objects.create( registry=goz_register, organization=goz_org, started_at=date(2026, 4, 1), started_by_upload=goz_upload, ) response = self.client.get("/api/v1/organizations/?registry_category=goz") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( [item["id"] for item in response.data["results"]], [str(goz_org.id)] ) response = self.client.get("/api/v1/organizations/?registryCategory=opk") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertEqual( [item["id"] for item in response.data["results"]], [str(opk_org.id)] ) response = self.client.get("/api/v1/organizations/?registry_category=other") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertIn( str(other_org.id), [item["id"] for item in response.data["results"]] ) class OrganizationDictionaryApiTest(APITestCase): """Tests for organization dictionaries endpoints.""" def setUp(self): self.user = UserFactory.create_user() self.client.force_authenticate(self.user) def test_corporation_scopes_dictionary_returns_sorted_results(self): response = self.client.get("/api/v1/dictionaries/corporation-scopes/") self.assertEqual(response.status_code, status.HTTP_200_OK) self.assertIn("results", response.data) self.assertGreaterEqual(len(response.data["results"]), 3) sort_orders = [item["sort_order"] for item in response.data["results"]] self.assertEqual(sort_orders, sorted(sort_orders)) first_item = response.data["results"][0] self.assertEqual(first_item["code"], "rosatom") self.assertIn("short_name", first_item) self.assertIn("name", first_item) self.assertIn("sort_order", first_item)