"""save_component_nutrients — единая точка записи.""" from __future__ import annotations import unittest from app import create_app, db from app.lab.models import LabComponentNutrientValue from app.lab.services.component_nutrients import nutrients_api_dict, save_component_nutrients 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 ComponentNutrientsSaveTests(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.comp = Component( id=default_uuid(), name="Save test", dry_matter=88.0, created_by="test", updated_by="test", ) db.session.add(self.comp) db.session.commit() def tearDown(self) -> None: db.session.remove() db.drop_all() self.ctx.pop() def test_save_returns_affected_recipes(self) -> None: result = save_component_nutrients( self.comp.id, {"Сыр. Протеин": 110, "Сырая клетч": 300, "Сырой жир": 20}, ) self.assertIn("stored", result) self.assertIn("affectedRecipeIds", result) self.assertEqual(nutrients_api_dict(self.comp.id).get("Сыр. Протеин"), 110) def test_save_preserves_extra_lab_keys_after_derive(self) -> None: result = save_component_nutrients( self.comp.id, { "Сыр. Протеин": 107.5, "Сырая клетч": 645.5, "Сырой жир": 44.5, "Лизин": 4.4, "Ca": 7.3, "ВРХ Орг Вещ": 53.0, }, ) stored = nutrients_api_dict(self.comp.id) self.assertEqual(stored.get("Лизин"), 4.4) self.assertEqual(stored.get("Ca"), 7.3) self.assertIn("stored", result) def test_sv_not_stored_in_eav(self) -> None: save_component_nutrients( self.comp.id, {"Сыр. Протеин": 100, "Сырая клетч": 280, "Сырой жир": 18, "СВ": 999}, ) keys = {r.nutrient_key for r in LabComponentNutrientValue.query.filter_by(component_id=self.comp.id)} self.assertNotIn("СВ", keys)