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