"""Классификация кормов по группам для авторациона.""" from __future__ import annotations import unittest from app import create_app, db from app.lab.calc.feed_groups import classify_feed_group, validate_group_selections from app.models import Component from app.models.base import default_uuid from app.services.setup_state import mark_setup_complete from tests.helpers.zootech_test_helpers import ZootechTestConfig class LabFeedGroupsTests(unittest.TestCase): @classmethod def setUpClass(cls) -> None: cls.app = create_app(ZootechTestConfig) cls.ctx = cls.app.app_context() cls.ctx.push() db.create_all() mark_setup_complete(cls.app) @classmethod def tearDownClass(cls) -> None: db.session.remove() db.drop_all() cls.ctx.pop() def _comp(self, name: str, ctype: str) -> Component: c = Component(id=default_uuid(), name=name, type=ctype, dry_matter=80.0, price=10.0) db.session.add(c) db.session.commit() return c def test_classify_by_canonical_type(self) -> None: self.assertEqual(classify_feed_group(self._comp("Сено", "Грубые корма")), "rough") self.assertEqual(classify_feed_group(self._comp("Силос", "Сочные корма")), "succulent") self.assertEqual(classify_feed_group(self._comp("Комбикорм", "Концентрированные")), "concentrate") self.assertEqual(classify_feed_group(self._comp("Премикс", "Добавки")), "other") def test_classify_legacy_type_fallback(self) -> None: self.assertEqual(classify_feed_group(self._comp("Комбикорм", "зерновые")), "concentrate") self.assertEqual(classify_feed_group(self._comp("Сено", "объемные корма")), "rough") def test_validate_requires_rough_and_three_total(self) -> None: errs = validate_group_selections({"rough": ["a"], "succulent": [], "concentrate": [], "other": []}) self.assertIn("pool:need_3", errs) errs2 = validate_group_selections( {"rough": ["a"], "succulent": ["b"], "concentrate": ["c"], "other": []} ) self.assertEqual(errs2, [])