"""API /api/daily-plan — JSON и PDF.""" from __future__ import annotations import unittest from app import create_app, db from app.services.setup_state import mark_setup_complete from app.services.daily_plan.builder import ALL_DISPENSERS_ID from tests.helpers.dispenser_recipe_fixtures import E2E_DISP_ID, seed_dispenser_period_recipes from tests.helpers.zootech_test_helpers import ZootechTestConfig class DailyPlanApiTests(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) seed_dispenser_period_recipes() 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_daily_plan_json(self) -> None: resp = self.client.get( f"/api/daily-plan?dispenser_id={E2E_DISP_ID}&date=2026-06-07" ) self.assertEqual(resp.status_code, 200, resp.get_data(as_text=True)) body = resp.get_json() self.assertEqual(body["date"], "2026-06-07") self.assertEqual(body["dispenserId"], E2E_DISP_ID) self.assertTrue(body["periods"]) self.assertTrue(body["ingredientTotals"]) def test_get_daily_plan_all_dispensers(self) -> None: resp = self.client.get( f"/api/daily-plan?dispenser_id={ALL_DISPENSERS_ID}&date=2026-06-07" ) self.assertEqual(resp.status_code, 200, resp.get_data(as_text=True)) self.assertEqual(resp.get_json()["dispenserName"], "Все кормораздатчики") def test_get_daily_plan_requires_dispenser_id(self) -> None: resp = self.client.get("/api/daily-plan") self.assertEqual(resp.status_code, 400) self.assertIn("dispenser_id", resp.get_json()["message"]) def test_get_daily_plan_404_unknown_dispenser(self) -> None: resp = self.client.get("/api/daily-plan?dispenser_id=unknown") self.assertEqual(resp.status_code, 404) def test_get_daily_plan_pdf(self) -> None: resp = self.client.get( f"/api/daily-plan/pdf?dispenser_id={E2E_DISP_ID}&date=2026-06-07" ) self.assertEqual(resp.status_code, 200) self.assertEqual(resp.content_type, "application/pdf") self.assertTrue(resp.data.startswith(b"%PDF")) def test_daily_plan_requires_auth(self) -> None: anon = self.app.test_client() resp = anon.get(f"/api/daily-plan?dispenser_id={E2E_DISP_ID}") self.assertIn(resp.status_code, (401, 403))