bifroest/tests/test_admin_delete.py
2026-10-27 08:34:17 +01:00

63 lines
3.1 KiB
Python

"""Fehlende Lösch-Funktionen: Teams, Modelle und Endpunkte."""
import pytest
from sqlalchemy import select
from app.ai.models import Model, Provider, ProviderKey
from app.identity.models import Team, User
from app.workspaces.models import Workspace
from helpers import create_workspace
@pytest.fixture
def admin(browser, people, db):
with db.session() as session:
session.get(User, people["anna"]).is_admin = True
return browser("anna")
def ids(db, model, **where):
with db.session() as session:
return list(session.scalars(select(model.id).filter_by(**where)))
def test_team_loeschen_nur_ohne_workspaces(admin, browser, db, people):
admin.post("/admin/teams", {"name": "Kurzlebig", "slug": "kurz"})
team = ids(db, Team, slug="kurz")[0]
admin.post(f"/admin/teams/{team}/members", {"username": "anna"})
assert "Team löschen</button>" in admin.get(f"/admin/teams/{team}").text
assert browser("ben").post(f"/admin/teams/{team}/delete").status_code == 403
# Mit Workspace (auch im Papierkorb) nicht möglich
anna = browser("anna") # neue Sitzung, damit die neue Teamzugehörigkeit gilt
workspace_id = create_workspace(anna, team, "Weg")
anna.post(f"/workspaces/{workspace_id}/delete", {"confirmation": "Weg"})
response = admin.post(f"/admin/teams/{team}/delete")
assert response.status_code == 400 and "noch Workspaces" in response.text
anna.post(f"/workspaces/{workspace_id}/purge")
response = admin.post(f"/admin/teams/{team}/delete")
assert response.status_code == 303 and response.headers["location"] == "/admin/teams"
assert ids(db, Team, slug="kurz") == []
def test_modell_und_endpunkt_loeschen(admin, db, people, browser):
admin.post("/admin/providers", {"name": "Test-Gateway", "base_url": "https://gateway.example/v1", "active": "1"})
provider = ids(db, Provider, name="Test-Gateway")[0]
admin.post("/admin/keys", {"provider_id": provider, "value": "sk-test-1234567890", "team_id": ""})
admin.post("/admin/models", {"provider_id": provider, "name": "test-mini", "label": "Mini", "active": "1"})
model = ids(db, Model, name="test-mini")[0]
workspace_id = create_workspace(admin, people["team_demo"])
admin.post(f"/workspaces/{workspace_id}/model", {"model_id": model})
# Endpunkt mit Modell: nicht löschbar
response = admin.post(f"/admin/providers/{provider}/delete")
assert response.status_code == 400 and "noch Modelle" in response.text
# Standardmodell: nicht löschbar
admin.post(f"/admin/models/{model}/default")
assert admin.post(f"/admin/models/{model}/delete").status_code == 400
with db.session() as session:
session.get(Model, model).is_default = False
assert browser("ben").post(f"/admin/models/{model}/delete").status_code == 403
assert "Modell gelöscht." in admin.post(f"/admin/models/{model}/delete").text
with db.session() as session:
assert session.get(Workspace, workspace_id).model_id is None
assert "Endpunkt mit seinen API-Keys gelöscht." in admin.post(f"/admin/providers/{provider}/delete").text
assert ids(db, Provider, name="Test-Gateway") == [] and ids(db, ProviderKey, provider_id=provider) == []