@@ -0,0 +1,85 @@
|
||||
"""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)
|
||||
Reference in New Issue
Block a user