"""Prueft die organisationsweite KI-Vorgabe ohne Datenbank und ohne Netz. Der Monitor loest den KI-Weg als Lage vor Organisation vor Servervorgabe auf. Diese Datei deckt das mittlere Glied ab, also das Org-Setting 'ai_backend'. Geprueft werden die Modelle (welche Werte kommen durch), der Router (wird das Setting geschrieben und gelesen) und die Oberflaeche (Spaltenzahl der Tabelle, Behandlung des Leerstrings als gueltiger Wert). """ import os import re import pytest from pydantic import ValidationError from models import OrgCreate, OrgResponse, OrgUpdate STAMM = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) def lies(*teile): with open(os.path.join(STAMM, *teile), encoding="utf-8") as f: return f.read() @pytest.fixture(scope="module") def router(): return lies("src", "routers", "organizations.py") @pytest.fixture(scope="module") def html(): return lies("src", "static", "dashboard.html") @pytest.fixture(scope="module") def js(): return lies("src", "static", "js", "app.js") # --- Modelle --------------------------------------------------------------- @pytest.mark.parametrize("wert", ["", "cli", "bedrock"]) def test_orgcreate_nimmt_gueltige_werte(wert): assert OrgCreate(name="Test", slug="test", ai_backend=wert).ai_backend == wert @pytest.mark.parametrize("wert", ["gpt", "CLI", "bedrock ", "openai", "anthropic"]) def test_orgcreate_lehnt_ungueltige_werte_ab(wert): with pytest.raises(ValidationError): OrgCreate(name="Test", slug="test", ai_backend=wert) def test_orgcreate_ohne_angabe_ist_leer(): assert OrgCreate(name="T", slug="t").ai_backend == "" @pytest.mark.parametrize("wert", ["", "cli", "bedrock"]) def test_orgupdate_nimmt_gueltige_werte(wert): assert OrgUpdate(ai_backend=wert).ai_backend == wert def test_orgupdate_unterscheidet_leerstring_von_fehlender_angabe(): """Der Leerstring bedeutet ausdruecklich "Servervorgabe" und muss den Router erreichen. Eine fehlende Angabe darf dagegen nichts aendern.""" assert OrgUpdate(ai_backend="").ai_backend == "" assert OrgUpdate(name="x").ai_backend is None def test_orgresponse_liefert_das_feld(): felder = OrgResponse.model_fields assert "ai_backend" in felder assert felder["ai_backend"].default == "" # --- Router ---------------------------------------------------------------- def test_router_setzt_beim_anlegen(router): assert 'set_org_setting(db, org_id, "ai_backend", data.ai_backend or "")' in router def test_router_setzt_beim_aendern(router): assert 'set_org_setting(db, org_id, "ai_backend", data.ai_backend)' in router def test_router_prueft_auf_none_statt_auf_wahrheit(router): """Eine Pruefung auf Wahrheit wuerde das Zuruecksetzen auf die Servervorgabe verschlucken, denn der Leerstring ist falsy.""" assert "if data.ai_backend is not None:" in router def test_router_liefert_das_setting_mit(router): assert "key = 'ai_backend'" in router assert 'org["ai_backend"] = (ai_row["value"] if ai_row else "") or ""' in router # --- Oberflaeche ----------------------------------------------------------- def test_lizenztabelle_hat_acht_spalten(html): bis = html.index('
') kopf = html[html.rindex("", 0, bis):bis] assert len(re.findall(r"