Some checks failed
CI/CD Pipeline / Code Quality Checks (push) Failing after 3m50s
CI/CD Pipeline / Run Tests (push) Successful in 3m57s
CI/CD Pipeline / Build Docker Images (push) Has been skipped
CI/CD Pipeline / Push to Gitea Registry (push) Has been skipped
CI/CD Pipeline / Deploy to Server (push) Has been skipped
183 lines
7.0 KiB
Python
183 lines
7.0 KiB
Python
"""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))
|