Files
site/WESP_REL/tests/test_reference_profiles.py
T
2026-07-17 12:57:18 +03:00

81 lines
3.2 KiB
Python

"""Reference norm_* profiles: catalog API и CRUD."""
from __future__ import annotations
import unittest
from app import create_app, db
from app.lab.commands.delete_profile import delete_animal_profile
from app.lab.commands.import_seed import import_norm_profiles
from app.lab.commands.upsert_profile import upsert_animal_profile
from app.lab.loaders.profile_loader import list_animal_profiles, load_animal_profile
from app.lab.models import LabAnimalProfile
from app.lab.seed_paths import norms_dir
from app.services.setup_state import mark_setup_complete
from tests.helpers.zootech_test_helpers import ZootechTestConfig
class ReferenceProfilesTests(unittest.TestCase):
def setUp(self) -> None:
self.app = create_app(ZootechTestConfig)
self.ctx = self.app.app_context()
self.ctx.push()
db.create_all()
mark_setup_complete(self.app)
self.client = self.app.test_client()
self.client.post(
"/api/auth/login",
json={"login": "zootech-test-admin", "password": "zootech-test-secret"},
)
if not (norms_dir() / "Нормы Дойн.csv").is_file():
self.skipTest("seed CSV missing")
import_norm_profiles(replace_reference=True)
def tearDown(self) -> None:
db.session.remove()
db.drop_all()
self.ctx.pop()
def test_list_includes_reference_profiles(self) -> None:
profiles = list_animal_profiles("DAIRY")
keys = {p["profileKey"] for p in profiles}
self.assertIn("norm_dairy_0001", keys)
def test_get_reference_profile_by_id(self) -> None:
ref = LabAnimalProfile.query.filter_by(profile_key="norm_dairy_0001", is_deleted=False).first()
self.assertIsNotNone(ref)
loaded = load_animal_profile(ref.id)
self.assertEqual(loaded["profileKey"], "norm_dairy_0001")
self.assertTrue(loaded["norms"])
def test_can_delete_reference(self) -> None:
ref = LabAnimalProfile.query.filter_by(profile_key="norm_dairy_0001", is_deleted=False).first()
assert ref is not None
delete_animal_profile(ref.id, "tester")
gone = LabAnimalProfile.query.filter_by(id=ref.id, is_deleted=False).first()
self.assertIsNone(gone)
def test_can_update_existing_reference(self) -> None:
ref = LabAnimalProfile.query.filter_by(profile_key="norm_dairy_0001", is_deleted=False).first()
assert ref is not None
upsert_animal_profile(
ref.id,
{
"profileKey": "norm_dairy_0001",
"label": "Изменённый справочник",
"rationType": "DAIRY",
"indicators": {"dry_matter": {"min": 100, "max": 200}},
},
"tester",
)
loaded = load_animal_profile(ref.id)
self.assertEqual(loaded["norms"]["dry_matter"]["min"], 100)
def test_api_animal_profiles_includes_reference(self) -> None:
resp = self.client.get("/api/lab/animal-profiles?ration_type=DAIRY")
self.assertEqual(resp.status_code, 200)
data = resp.get_json()
assert data is not None
keys = {p["profileKey"] for p in data["profiles"]}
self.assertIn("norm_dairy_0001", keys)