108 lines
4.1 KiB
Python
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()
|