187 lines
8.1 KiB
Python
187 lines
8.1 KiB
Python
"""Tests for organization API."""
|
||
|
||
from __future__ import annotations
|
||
|
||
from django.test import override_settings
|
||
from rest_framework import status
|
||
from rest_framework.test import APITestCase
|
||
|
||
from tests.apps.external_data.factories import FinancialReportFactory
|
||
from tests.apps.form_2.factories import FormF2RecordFactory
|
||
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):
|
||
OrganizationFactory.create(
|
||
name="АО Альфа",
|
||
short_name="АО «Альфа»",
|
||
organization_type="ao",
|
||
opk_registry_membership=True,
|
||
)
|
||
|
||
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_catalog_hides_form_only_organization_until_mostovik_confirms_it(self):
|
||
organization = OrganizationFactory.create(mostovik_uid=None)
|
||
|
||
list_response = self.client.get("/api/v1/organizations/")
|
||
detail_response = self.client.get(f"/api/v1/organizations/{organization.id}/")
|
||
|
||
self.assertEqual(list_response.status_code, status.HTTP_200_OK)
|
||
self.assertEqual(list_response.data["count"], 0)
|
||
self.assertEqual(detail_response.status_code, status.HTTP_404_NOT_FOUND)
|
||
|
||
organization.mostovik_uid = "11111111-1111-4111-8111-111111111111"
|
||
organization.save(update_fields=["mostovik_uid", "updated_at"])
|
||
|
||
list_response = self.client.get("/api/v1/organizations/")
|
||
detail_response = self.client.get(f"/api/v1/organizations/{organization.id}/")
|
||
|
||
self.assertEqual(list_response.data["count"], 1)
|
||
self.assertEqual(detail_response.status_code, status.HTTP_200_OK)
|
||
|
||
def test_detail_includes_active_registries(self):
|
||
organization = OrganizationFactory.create(
|
||
short_name="АО «Бета»",
|
||
general_director="Иванов Иван Иванович",
|
||
general_director_tax_id="123456789012",
|
||
financial_reports_available=True,
|
||
tax_reports_available=True,
|
||
gk_code="2",
|
||
gk_name="Роскосмос",
|
||
in_korp_name="Организация внутри ГК",
|
||
)
|
||
|
||
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": "2", "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"], "Иванов Иван Иванович")
|
||
self.assertEqual(response.data["general_director_tax_id"], "123456789012")
|
||
self.assertEqual(response.data["gk_name"], "Роскосмос")
|
||
self.assertEqual(response.data["in_korp_name"], "Организация внутри ГК")
|
||
|
||
def test_detail_summary_uses_available_related_report_data(self):
|
||
organization = OrganizationFactory.create(
|
||
financial_reports_available=False,
|
||
tax_reports_available=False,
|
||
)
|
||
FinancialReportFactory.create(organization=organization, status="success")
|
||
FormF2RecordFactory.create(organization=organization, income_tax="1200.00")
|
||
|
||
response = self.client.get(f"/api/v1/organizations/{organization.id}/")
|
||
|
||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||
self.assertTrue(response.data["summary"]["financial_reports_available"])
|
||
self.assertTrue(response.data["summary"]["tax_reports_available"])
|
||
|
||
def test_corporation_scope_filter_uses_organization_fields(self):
|
||
rosatom_org = OrganizationFactory.create(name="АО Росатом", gk_name="Росатом")
|
||
roscosmos_org = OrganizationFactory.create(
|
||
name="АО Роскосмос", gk_name="Роскосмос"
|
||
)
|
||
|
||
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))
|
||
|
||
for scope_code in ("roscosmos", "roskosmos"):
|
||
response = self.client.get(
|
||
f"/api/v1/organizations/?corporation_scope={scope_code}"
|
||
)
|
||
|
||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||
self.assertEqual(len(response.data["results"]), 1)
|
||
self.assertEqual(response.data["results"][0]["id"], str(roscosmos_org.id))
|
||
self.assertEqual(
|
||
response.data["results"][0]["corporation_scope"], "roscosmos"
|
||
)
|
||
|
||
def test_registry_category_filters_support_snake_and_camel_case(self):
|
||
opk_org = OrganizationFactory.create(
|
||
name="АО ОПК",
|
||
opk_registry_membership=True,
|
||
ropk_razdel_name="Раздел ОПК",
|
||
)
|
||
goz_org = OrganizationFactory.create(name="АО ГОЗ", goz_participation=True)
|
||
other_org = OrganizationFactory.create(name="АО Прочие")
|
||
|
||
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)
|