Интегрирован wesp в сайт
CI / quality (push) Canceled after 0s

This commit is contained in:
влад
2026-07-17 12:57:18 +03:00
parent 5dfa06ddbe
commit 355c0ef9f1
883 changed files with 194576 additions and 177 deletions
+130
View File
@@ -0,0 +1,130 @@
"""Served HTML /recipes: auth, структура, скрипты, preload."""
from __future__ import annotations
import os
import re
import tempfile
import unittest
from app import create_app, db
from app.models import Component, FeedDispenser, Recipe
from app.services.setup_state import mark_setup_complete
from config import TestingConfig
from tests.helpers.recipes_ui_inventory import DOM_IDS, RECIPES_PAGE_SCRIPTS
class RecipesPageServedConfig(TestingConfig):
_TMP_DIR = tempfile.mkdtemp(prefix="wesp-recipes-served-")
SQLALCHEMY_DATABASE_URI = f"sqlite:///{os.path.join(_TMP_DIR, 'recipes_test.db')}"
SQLALCHEMY_BINDS = {"reports": f"sqlite:///{os.path.join(_TMP_DIR, 'reports_test.db')}"}
AUTH_LOGIN = "recipes-served-admin"
AUTH_PASSWORD = "recipes-served-secret"
def _drain(resp) -> None:
try:
resp.get_data()
finally:
close = getattr(resp, "close", None)
if callable(close):
close()
class RecipesPageServedTests(unittest.TestCase):
def setUp(self) -> None:
self.app = create_app(RecipesPageServedConfig)
self.client = self.app.test_client()
self.ctx = self.app.app_context()
self.ctx.push()
db.create_all()
mark_setup_complete(self.app)
def tearDown(self) -> None:
db.session.remove()
db.drop_all()
self.ctx.pop()
def _login(self) -> None:
resp = self.client.post(
"/api/auth/login",
json={"login": "recipes-served-admin", "password": "recipes-served-secret"},
)
self.assertEqual(resp.status_code, 200)
_drain(resp)
def test_recipes_redirects_without_session(self) -> None:
resp = self.client.get("/recipes", follow_redirects=False)
self.assertEqual(resp.status_code, 302)
self.assertIn("/login", resp.headers.get("Location", ""))
_drain(resp)
def test_recipes_served_with_key_dom_after_login(self) -> None:
self._login()
resp = self.client.get("/recipes")
self.assertEqual(resp.status_code, 200)
body = resp.get_data(as_text=True)
for dom_id in DOM_IDS[:12]:
with self.subTest(dom_id=dom_id):
self.assertIn(f'id="{dom_id}"', body)
_drain(resp)
def test_recipes_page_includes_module_scripts(self) -> None:
self._login()
body = self.client.get("/recipes").get_data(as_text=True)
for script in RECIPES_PAGE_SCRIPTS:
with self.subTest(script=script):
self.assertRegex(body, re.escape(script))
def test_recipes_page_preload_module_chain(self) -> None:
self._login()
body = self.client.get("/recipes").get_data(as_text=True)
self.assertIn("recipes-boot.js", body)
self.assertIn("recipes-data-controller.js", body)
def test_api_feed_dispensers_returns_seeded_mill_for_page(self) -> None:
self._login()
mill = FeedDispenser(
id="mill-served-1",
name="Цех served",
farm="F",
operator="O",
type="mill",
content_hash="",
)
comp = Component(
id="comp-served-1",
name="Зерно",
type="grain",
dry_matter=50.0,
protein=0.0,
energy=0.0,
price=0.0,
)
recipe = Recipe(
id="recipe-served-1",
name="Рецепт served",
heads_per_trip=5,
mixing_time=3,
trip_percent=100.0,
target_component_id=comp.id,
content_hash="",
)
db.session.add_all([mill, comp, recipe])
db.session.commit()
dispensers = self.client.get("/api/feed_dispensers")
self.assertEqual(dispensers.status_code, 200)
rows = dispensers.get_json()
mill_rows = [r for r in rows if r.get("id") == mill.id]
self.assertEqual(len(mill_rows), 1)
self.assertEqual(mill_rows[0]["type"], "mill")
recipes = self.client.get(f"/api/feed_dispensers/{mill.id}/recipes")
self.assertEqual(recipes.status_code, 200)
recipe_ids = [r["id"] for r in recipes.get_json()]
self.assertIn(recipe.id, recipe_ids)
if __name__ == "__main__":
unittest.main()