Files
state-corp-backend/tests/apps/organization/test_api.py
Aleksandr Meshchriakov bd8e1a8400
All checks were successful
CI/CD Pipeline / Code Quality Checks (push) Successful in 2m41s
CI/CD Pipeline / Run Tests (push) Successful in 2m47s
CI/CD Pipeline / Build Docker Images (push) Successful in 2m24s
CI/CD Pipeline / Push to Gitea Registry (push) Successful in 0s
CI/CD Pipeline / Deploy to Server (push) Successful in 0s
feat: import additional exchange sections
2026-05-12 15:19:26 +02:00

271 lines
11 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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)