Add initial implementations for forms and organization apps with serializers, factories, and admin configurations
Some checks failed
CI/CD Pipeline / Run Tests (push) Failing after 45s
CI/CD Pipeline / Code Quality Checks (push) Failing after 48s
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
Some checks failed
CI/CD Pipeline / Run Tests (push) Failing after 45s
CI/CD Pipeline / Code Quality Checks (push) Failing after 48s
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
This commit is contained in:
123
tests/apps/organization/test_api.py
Normal file
123
tests/apps/organization/test_api.py
Normal file
@@ -0,0 +1,123 @@
|
||||
"""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="АО Альфа")
|
||||
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["data"][0]["active_registry_names"], ["Реестр ОПК"])
|
||||
|
||||
def test_detail_includes_active_registries(self):
|
||||
organization = OrganizationFactory.create()
|
||||
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["data"]["active_registry_names"],
|
||||
["Реестр Роскосмос"],
|
||||
)
|
||||
self.assertEqual(
|
||||
response.data["data"]["active_registries"],
|
||||
[{"id": str(register.id), "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["data"]), 1)
|
||||
self.assertEqual(response.data["data"][0]["id"], str(active_organization.id))
|
||||
@@ -1,5 +1,8 @@
|
||||
"""Tests for Organization model."""
|
||||
|
||||
from datetime import date
|
||||
|
||||
from apps.registers.models import Register, RegisterUpload, RegistryMembershipPeriod
|
||||
from django.test import TestCase
|
||||
|
||||
from .factories import OrganizationFactory
|
||||
@@ -50,3 +53,40 @@ class OrganizationModelTest(TestCase):
|
||||
def test_ogrn_index_exists(self):
|
||||
"""Test OGRN has db_index."""
|
||||
self.assertTrue(self.org._meta.get_field("ogrn").db_index)
|
||||
|
||||
def test_active_registry_names_include_only_current_memberships(self):
|
||||
"""Test only active registry memberships are shown on organization."""
|
||||
active_register = Register.objects.create(name="Активный реестр")
|
||||
inactive_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-hash",
|
||||
rows_count=1,
|
||||
)
|
||||
inactive_upload = RegisterUpload.objects.create(
|
||||
registry=inactive_register,
|
||||
actual_date=date(2026, 2, 1),
|
||||
file_name="inactive.xlsx",
|
||||
file_hash="inactive-hash",
|
||||
rows_count=1,
|
||||
)
|
||||
|
||||
RegistryMembershipPeriod.objects.create(
|
||||
registry=active_register,
|
||||
organization=self.org,
|
||||
started_at=date(2026, 3, 1),
|
||||
started_by_upload=active_upload,
|
||||
)
|
||||
RegistryMembershipPeriod.objects.create(
|
||||
registry=inactive_register,
|
||||
organization=self.org,
|
||||
started_at=date(2026, 2, 1),
|
||||
ended_at=date(2026, 3, 1),
|
||||
started_by_upload=inactive_upload,
|
||||
ended_by_upload=inactive_upload,
|
||||
)
|
||||
|
||||
self.assertEqual(self.org.get_active_registry_names(), ["Активный реестр"])
|
||||
self.assertEqual(self.org.active_registry_names_display(), "Активный реестр")
|
||||
|
||||
Reference in New Issue
Block a user