86 lines
3.3 KiB
Python
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)
|