Files
2026-07-17 12:57:18 +03:00

86 lines
3.3 KiB
Python

"""API /api/lab/"""
from __future__ import annotations
import unittest
from app import create_app, db
from app.models import Recipe
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 LabApiTests(unittest.TestCase):
def setUp(self) -> None:
self.app = create_app(ZootechTestConfig)
self.client = self.app.test_client()
self.ctx = self.app.app_context()
self.ctx.push()
db.create_all()
mark_setup_complete(self.app)
recipe = Recipe(id=default_uuid(), name="Lab test", heads_per_trip=10, mixing_time=5)
db.session.add(recipe)
db.session.commit()
self.recipe_id = recipe.id
self.client.post(
"/api/auth/login",
json={"login": "zootech-test-admin", "password": "zootech-test-secret"},
)
def tearDown(self) -> None:
db.session.remove()
db.drop_all()
self.ctx.pop()
def test_health(self) -> None:
r = self.client.get("/api/lab/health")
self.assertEqual(r.status_code, 200)
self.assertTrue(r.get_json()["ok"])
def test_lab_recipes_list_with_session(self) -> None:
"""Селект партий в lab — /api/lab/recipes, контур зоотехника (не paired terminal)."""
r = self.client.get("/api/lab/recipes")
self.assertEqual(r.status_code, 200, r.get_data(as_text=True))
recipes = r.get_json()["recipes"]
ids = {row["id"] for row in recipes}
self.assertIn(self.recipe_id, ids)
def test_seed_and_get_ration(self) -> None:
r = self.client.post(f"/api/lab/rations/{self.recipe_id}/seed-from-execution")
self.assertEqual(r.status_code, 200, r.get_data(as_text=True))
self.assertTrue(r.get_json()["seeded"])
r2 = self.client.get(f"/api/lab/rations/{self.recipe_id}")
self.assertEqual(r2.status_code, 200)
body = r2.get_json()
self.assertEqual(body["recipeId"], self.recipe_id)
self.assertTrue(body["exists"])
def test_ensure_empty_and_sync_from_execution(self) -> None:
r = self.client.post(f"/api/lab/rations/{self.recipe_id}/ensure-empty")
self.assertEqual(r.status_code, 200)
self.assertTrue(r.get_json()["created"])
r2 = self.client.post(f"/api/lab/rations/{self.recipe_id}/sync-from-execution")
self.assertEqual(r2.status_code, 200)
self.assertGreaterEqual(r2.get_json()["lines"], 0)
def test_animal_profile_crud(self) -> None:
r = self.client.post(
"/api/lab/animal-profiles",
json={
"profileKey": "test_beef",
"label": "Тест",
"rationType": "BEEF",
"normsData": {"dry_matter": {"min": 1, "max": 2}},
},
)
self.assertEqual(r.status_code, 201, r.get_data(as_text=True))
pid = r.get_json()["id"]
r2 = self.client.get(f"/api/lab/animal-profiles/{pid}")
self.assertEqual(r2.status_code, 200)
self.assertEqual(r2.get_json()["profileKey"], "test_beef")
def test_print_requires_master(self) -> None:
r = self.client.get(f"/api/lab/rations/{self.recipe_id}/print?mode=ration")
self.assertEqual(r.status_code, 404)