"""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)