"""Tests for organization API.""" from __future__ import annotations from datetime import date from django.test import override_settings from rest_framework import status from rest_framework.test import APITestCase from apps.registers.models import Register, RegisterUpload, RegistryMembershipPeriod 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]["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["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))