Files
site/WESP_REL/tests/test_feed_quality_settings_store.py
T
2026-07-17 12:57:18 +03:00

108 lines
4.1 KiB
Python

"""Тесты feed_quality.settings_store (recipes.db)."""
from __future__ import annotations
import json
import os
import tempfile
import unittest
from sqlalchemy import create_engine, text
from app import create_app, db
from app.models.feed_quality_settings import FeedQualitySettings
from app.services.feed_quality.settings_store import (
create_feed_quality_settings_table,
default_settings,
get_feed_quality_settings,
get_legacy_json_path,
import_feed_quality_settings_json,
import_legacy_json_to_db,
normalize_settings,
save_feed_quality_settings,
)
from tests.helpers.zootech_test_helpers import ZootechTestConfig
class FeedQualitySettingsStoreTests(unittest.TestCase):
def setUp(self) -> None:
self.app = create_app(ZootechTestConfig)
self.ctx = self.app.app_context()
self.ctx.push()
db.create_all()
def tearDown(self) -> None:
db.session.remove()
db.drop_all()
self.ctx.pop()
os.environ.pop("WESP_FEED_QUALITY_SETTINGS_PATH", None)
def test_defaults(self) -> None:
d = default_settings()
self.assertTrue(d["loading"]["enabled"])
self.assertEqual(d["loading"]["warning_pct"], 10.0)
def test_normalize_critical_not_below_warning(self) -> None:
out = normalize_settings({"loading": {"warning_pct": 12, "critical_pct": 8}})
self.assertEqual(out["loading"]["critical_pct"], 12.0)
def test_save_and_load_from_db(self) -> None:
save_feed_quality_settings({"loading": {"enabled": False, "warning_pct": 11}})
loaded = get_feed_quality_settings()
self.assertFalse(loaded["loading"]["enabled"])
self.assertEqual(loaded["loading"]["warning_pct"], 11.0)
row = db.session.get(FeedQualitySettings, 1)
self.assertIsNotNone(row)
payload = json.loads(row.payload)
self.assertFalse(payload["loading"]["enabled"])
def test_partial_save_preserves_other_loading_fields(self) -> None:
save_feed_quality_settings({"loading": {"warning_pct": 12.5}})
save_feed_quality_settings({"loading": {"enabled": False}})
loaded = get_feed_quality_settings()
self.assertFalse(loaded["loading"]["enabled"])
self.assertEqual(loaded["loading"]["warning_pct"], 12.5)
def test_import_legacy_json_to_db(self) -> None:
tmp = tempfile.mkdtemp()
path = os.path.join(tmp, "legacy.json")
os.environ["WESP_FEED_QUALITY_SETTINGS_PATH"] = path
with open(path, "w", encoding="utf-8") as fh:
json.dump({"loading": {"enabled": False, "warning_pct": 9}}, fh)
self.assertTrue(import_legacy_json_to_db())
loaded = get_feed_quality_settings()
self.assertFalse(loaded["loading"]["enabled"])
self.assertEqual(loaded["loading"]["warning_pct"], 9.0)
def test_import_json_via_bind(self) -> None:
tmp = tempfile.mkdtemp()
path = os.path.join(tmp, "legacy_bind.json")
os.environ["WESP_FEED_QUALITY_SETTINGS_PATH"] = path
with open(path, "w", encoding="utf-8") as fh:
json.dump({"unloading": {"warning_pct": 7}}, fh)
db.session.remove()
db.drop_all()
engine = create_engine(self.app.config["SQLALCHEMY_DATABASE_URI"])
create_feed_quality_settings_table(engine)
self.assertTrue(import_feed_quality_settings_json(engine))
with engine.connect() as conn:
row = conn.execute(
text("SELECT payload FROM feed_quality_settings WHERE id = 1")
).fetchone()
payload = json.loads(row[0])
self.assertEqual(payload["unloading"]["warning_pct"], 7.0)
def test_get_creates_defaults_when_empty(self) -> None:
loaded = get_feed_quality_settings()
self.assertTrue(loaded["loading"]["enabled"])
row = db.session.get(FeedQualitySettings, 1)
self.assertIsNotNone(row)
def test_legacy_path_env(self) -> None:
os.environ["WESP_FEED_QUALITY_SETTINGS_PATH"] = "/tmp/custom_fq.json"
self.assertTrue(str(get_legacy_json_path()).endswith("custom_fq.json"))
if __name__ == "__main__":
unittest.main()