feat: use authoritative organization directory
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import hashlib
|
||||
from pathlib import Path
|
||||
from tempfile import TemporaryDirectory
|
||||
|
||||
@@ -9,17 +10,16 @@ from apps.core.models import BackgroundJob, JobStatus
|
||||
from apps.parsers.models import ParserLoadLog
|
||||
from apps.parsers.source_cards import SourceCardService
|
||||
from django.test import override_settings
|
||||
from django.urls import reverse
|
||||
from django.urls import NoReverseMatch, reverse
|
||||
from organizations.models import Organization
|
||||
from organizations.source_ingestion import (
|
||||
OrganizationSourceIngestionService,
|
||||
SourceRecordInput,
|
||||
)
|
||||
from registers.models import Register
|
||||
from rest_framework import status
|
||||
from rest_framework.test import APITestCase
|
||||
|
||||
from tests.apps.parsers.factories import ParserLoadLogFactory
|
||||
from tests.apps.registers.factories import RegistryMembershipPeriodFactory
|
||||
from tests.apps.user.factories import UserFactory
|
||||
from tests.utils.fixtures import fake
|
||||
|
||||
@@ -37,6 +37,27 @@ def _save_source_record(
|
||||
organization_name: str = "",
|
||||
title: str = "",
|
||||
) -> None:
|
||||
payload: dict = {}
|
||||
if inn or ogrn:
|
||||
query = {}
|
||||
if inn:
|
||||
query["inn"] = inn
|
||||
if ogrn:
|
||||
query["ogrn"] = ogrn
|
||||
if not Organization.objects.filter(**query).exists():
|
||||
Organization.objects.create(
|
||||
name=organization_name or title or external_id,
|
||||
inn=inn,
|
||||
ogrn=ogrn,
|
||||
)
|
||||
else:
|
||||
rn_key = organization_name or title or external_id
|
||||
rn = str(int(hashlib.sha256(rn_key.encode()).hexdigest()[:12], 16) % 10**12)
|
||||
payload["rn"] = rn
|
||||
Organization.objects.get_or_create(
|
||||
rn=rn,
|
||||
defaults={"name": organization_name or title or external_id},
|
||||
)
|
||||
OrganizationSourceIngestionService.save_records(
|
||||
source=source,
|
||||
load_batch=1,
|
||||
@@ -47,6 +68,7 @@ def _save_source_record(
|
||||
organization_name=organization_name or title or external_id,
|
||||
inn=inn,
|
||||
ogrn=ogrn,
|
||||
payload=payload,
|
||||
)
|
||||
],
|
||||
)
|
||||
@@ -109,38 +131,11 @@ class SourceCardsApiTestCase(APITestCase):
|
||||
self.assertEqual(inspections_card["status"], "in_progress")
|
||||
self.assertEqual(inspections_card["progress"], 63)
|
||||
|
||||
def test_main_dashboard_returns_cached_source_cards_and_registry_stats(self):
|
||||
registry, _created = Register.objects.get_or_create(
|
||||
name="Реестр предприятий ОПК",
|
||||
)
|
||||
RegistryMembershipPeriodFactory(
|
||||
registry=registry,
|
||||
)
|
||||
ParserLoadLogFactory(
|
||||
source=ParserLoadLog.Source.FNS_REPORTS,
|
||||
status="success",
|
||||
records_count=1,
|
||||
)
|
||||
SourceCardService.clear_cache()
|
||||
def test_main_dashboard_route_is_removed_with_registers_api(self):
|
||||
with self.assertRaises(NoReverseMatch):
|
||||
reverse("api_v1:stat:main-dashboard")
|
||||
|
||||
response = self.client.get(reverse("api_v1:stat:main-dashboard"))
|
||||
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
self.assertTrue(response.data["success"])
|
||||
self.assertEqual(response["X-Cache"], "MISS")
|
||||
|
||||
data = response.data["data"]
|
||||
self.assertIn("source_cards", data)
|
||||
self.assertIn("organization_stats", data)
|
||||
self.assertGreaterEqual(len(data["source_cards"]), 1)
|
||||
self.assertEqual(data["organization_stats"]["counts"]["opk"], 1)
|
||||
self.assertEqual(data["cache_ttl_seconds"], 604800)
|
||||
|
||||
cached_response = self.client.get(reverse("api_v1:stat:main-dashboard"))
|
||||
self.assertEqual(cached_response.status_code, status.HTTP_200_OK)
|
||||
self.assertEqual(cached_response["X-Cache"], "HIT")
|
||||
|
||||
def test_main_dashboard_cache_is_warmed_after_successful_parser_load(self):
|
||||
def test_successful_parser_load_does_not_restore_removed_stat_route(self):
|
||||
with self.captureOnCommitCallbacks(execute=True):
|
||||
ParserLoadLogFactory(
|
||||
source=ParserLoadLog.Source.FNS_REPORTS,
|
||||
@@ -148,10 +143,8 @@ class SourceCardsApiTestCase(APITestCase):
|
||||
records_count=1,
|
||||
)
|
||||
|
||||
response = self.client.get(reverse("api_v1:stat:main-dashboard"))
|
||||
|
||||
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
||||
self.assertEqual(response["X-Cache"], "HIT")
|
||||
with self.assertRaises(NoReverseMatch):
|
||||
reverse("api_v1:stat:main-dashboard")
|
||||
|
||||
def test_source_card_detail_returns_combined_minprom_stats(self):
|
||||
shared_inn = _digits(10)
|
||||
|
||||
Reference in New Issue
Block a user