@@ -0,0 +1,108 @@
|
||||
"""API /api/feed-quality/settings."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import unittest
|
||||
from datetime import datetime
|
||||
|
||||
from app import create_app, db
|
||||
from app.models import LoadingReport, LoadingReportComponent, Recipe
|
||||
from app.models.feed_quality_settings import FeedQualitySettings
|
||||
from app.services.feed_quality.evaluator import evaluate_loading_report
|
||||
from app.services.setup_state import mark_setup_complete
|
||||
from tests.helpers.zootech_test_helpers import ZootechTestConfig
|
||||
|
||||
|
||||
class FeedQualitySettingsApiTests(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_get_settings(self) -> None:
|
||||
resp = self.client.get("/api/feed-quality/settings")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
body = resp.get_json()
|
||||
self.assertIn("settings", body)
|
||||
self.assertIn("defaults", body)
|
||||
self.assertTrue(body["settings"]["loading"]["enabled"])
|
||||
|
||||
def test_put_disables_loading_and_reevaluates(self) -> None:
|
||||
db.session.add(Recipe(id="set-r1", name="Set рейс", heads_per_trip=1, content_hash=""))
|
||||
report = LoadingReport(
|
||||
id="set-lr-1",
|
||||
recipe_id="set-r1",
|
||||
recipe_name="Set рейс",
|
||||
start_time=datetime.now(),
|
||||
target_mixing_time=60,
|
||||
actual_mixing_time=60,
|
||||
total_weight=50.0,
|
||||
created_by="system",
|
||||
updated_by="system",
|
||||
)
|
||||
db.session.add(report)
|
||||
db.session.flush()
|
||||
db.session.add(
|
||||
LoadingReportComponent(
|
||||
report_id=report.id,
|
||||
component_name="C1",
|
||||
target_weight=50.0,
|
||||
actual_weight=60.0,
|
||||
overload=10.0,
|
||||
loading_order=1,
|
||||
created_by="system",
|
||||
updated_by="system",
|
||||
)
|
||||
)
|
||||
db.session.commit()
|
||||
evaluate_loading_report(report.id, send_notifications=False)
|
||||
|
||||
resp = self.client.put(
|
||||
"/api/feed-quality/settings",
|
||||
json={"settings": {"loading": {"enabled": False}}},
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
body = resp.get_json()
|
||||
self.assertTrue(body.get("saved"))
|
||||
self.assertFalse(body["settings"]["loading"]["enabled"])
|
||||
self.assertIn("reevaluatedReports", body)
|
||||
|
||||
row = db.session.get(FeedQualitySettings, 1)
|
||||
self.assertIsNotNone(row)
|
||||
|
||||
alerts = self.client.get("/api/feed-quality/alerts")
|
||||
self.assertEqual(alerts.status_code, 200)
|
||||
items = alerts.get_json().get("items") or []
|
||||
self.assertEqual(len(items), 0)
|
||||
|
||||
def test_put_persists_to_db(self) -> None:
|
||||
resp = self.client.put(
|
||||
"/api/feed-quality/settings",
|
||||
json={"settings": {"loading": {"warning_pct": 13}}},
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
row = db.session.get(FeedQualitySettings, 1)
|
||||
self.assertIsNotNone(row)
|
||||
get_resp = self.client.get("/api/feed-quality/settings")
|
||||
self.assertEqual(get_resp.get_json()["settings"]["loading"]["warning_pct"], 13.0)
|
||||
|
||||
def test_requires_auth(self) -> None:
|
||||
self.client.post("/api/auth/logout")
|
||||
resp = self.client.get("/api/feed-quality/settings")
|
||||
self.assertEqual(resp.status_code, 401)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
Reference in New Issue
Block a user