61 lines
2.1 KiB
Python
61 lines
2.1 KiB
Python
"""Доп. тесты calc engine (пустой рацион, compound)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import unittest
|
|
|
|
from app.lab.calc.engine import calculate_ration
|
|
|
|
|
|
class LabCalcEngineTests(unittest.TestCase):
|
|
def test_empty_lines_returns_errors_or_totals(self) -> None:
|
|
result = calculate_ration("BEEF", [], {})
|
|
self.assertIn("totals", result)
|
|
self.assertIn("indicators", result)
|
|
|
|
def test_dairy_ration_type(self) -> None:
|
|
result = calculate_ration(
|
|
"DAIRY",
|
|
[
|
|
{
|
|
"daily_kg": 50,
|
|
"in_ration": True,
|
|
"in_compound": True,
|
|
"dry_matter": 850,
|
|
"nutrients": {"Сыр. Протеин": 100},
|
|
}
|
|
],
|
|
{},
|
|
)
|
|
total = next(t["value"] for t in result["totals"] if t["key"] == "total_kg")
|
|
self.assertEqual(total, 50)
|
|
|
|
def test_bra_derived_from_protein_and_usp(self) -> None:
|
|
result = calculate_ration(
|
|
"DAIRY",
|
|
[
|
|
{
|
|
"daily_kg": 10,
|
|
"in_ration": True,
|
|
"in_compound": False,
|
|
"dry_matter": 850,
|
|
"nutrients": {"Сыр. Протеин": 100, "уСП": 80},
|
|
},
|
|
{
|
|
"daily_kg": 5,
|
|
"in_ration": True,
|
|
"in_compound": False,
|
|
"dry_matter": 880,
|
|
"nutrients": {"Сыр. Протеин": 200, "уСП": 160},
|
|
},
|
|
],
|
|
{},
|
|
heads_per_trip=1,
|
|
)
|
|
cp = next(i["content"] for i in result["indicators"] if i["key"] == "crude_protein")
|
|
usp = next(i["content"] for i in result["indicators"] if i["key"] == "usp")
|
|
rnb = next(i["content"] for i in result["indicators"] if i["key"] == "rnb")
|
|
self.assertAlmostEqual(cp, 10 * 100 + 5 * 200)
|
|
self.assertAlmostEqual(usp, 10 * 80 + 5 * 160)
|
|
self.assertAlmostEqual(rnb, (cp - usp) / 6.25)
|