"""API /api/components — CRUD.""" from __future__ import annotations import unittest import uuid from app import create_app, db from app.models import Component from app.services.setup_state import mark_setup_complete from tests.helpers.zootech_test_helpers import ZootechTestConfig, drain_response class ComponentsApiTests(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) 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_feed_types_endpoint(self) -> None: r = self.client.get("/api/components/feed-types") self.assertEqual(r.status_code, 200) types = r.get_json()["types"] values = {t["value"] for t in types} self.assertIn("Грубые корма", values) self.assertIn("Сочные корма", values) def test_reject_invalid_feed_type(self) -> None: r = self.client.post( "/api/components", json={"name": "Тест", "type": "Зерновые", "dryMatter": 88.0}, ) self.assertEqual(r.status_code, 400) def test_components_crud(self) -> None: create = self.client.post( "/api/components", json={ "name": "Соя", "type": "Концентрированные", "dryMatter": 88.0, "price": 0, }, ) self.assertEqual(create.status_code, 201, create.get_data(as_text=True)) cid = create.get_json()["id"] one = self.client.get(f"/api/components/{cid}") self.assertEqual(one.get_json()["externalNo"], 1) second = self.client.post( "/api/components", json={ "name": "Сено", "type": "Грубые корма", "dryMatter": 88.0, "price": 0, }, ) self.assertEqual(second.status_code, 201) self.assertEqual(self.client.get(f"/api/components/{second.get_json()['id']}").get_json()["externalNo"], 2) dup = self.client.post( "/api/components", json={ "name": "Дубль", "type": "Добавки", "dryMatter": 88.0, "price": 0, "externalNo": 1, }, ) self.assertEqual(dup.status_code, 400) self.assertIn("уже используется", dup.get_json()["message"]) manual = self.client.post( "/api/components", json={ "name": "Премикс", "type": "Добавки", "dryMatter": 95.0, "price": 0, "externalNo": 100, }, ) self.assertEqual(manual.status_code, 201) manual_id = manual.get_json()["id"] self.assertEqual(self.client.get(f"/api/components/{manual_id}").get_json()["externalNo"], 100) invalid = self.client.post( "/api/components", json={ "name": "Неверный номер", "type": "Добавки", "dryMatter": 95.0, "price": 0, "externalNo": 0, }, ) self.assertEqual(invalid.status_code, 400) self.assertIn("больше нуля", invalid.get_json()["message"]) listed = self.client.get("/api/components") self.assertEqual(listed.status_code, 200) self.assertTrue(any(x["id"] == cid for x in listed.get_json())) one = self.client.get(f"/api/components/{cid}") self.assertEqual(one.status_code, 200) self.assertEqual(one.get_json()["name"], "Соя") updated = self.client.put( f"/api/components/{cid}", json={ "name": "Соя обновл.", "type": "Концентрированные", "dryMatter": 90.0, "price": 0, "externalNo": 50, }, ) self.assertEqual(updated.status_code, 200) self.assertEqual(self.client.get(f"/api/components/{cid}").get_json()["externalNo"], 50) bad = self.client.put( f"/api/components/{cid}", json={"externalNo": 100}, ) self.assertEqual(bad.status_code, 400) deleted = self.client.delete(f"/api/components/{cid}") self.assertEqual(deleted.status_code, 200) gone = self.client.get(f"/api/components/{cid}") self.assertEqual(gone.status_code, 404) if __name__ == "__main__": unittest.main()