"""Chat-Komfort: Ergebnistabellen mit CSV und Diagramm, Antwort neu erzeugen, Export, Suche.""" import pytest from sqlalchemy import func, select from app.chat.models import Message from app.core import charts from app.identity import Principal from app.tasks.models import TaskRun from app.tasks.worker import Worker from app.tools import service as tools from helpers import create_workspace CSV = b"region,umsatz,monat\nNord,100,2025-01\nSued,250,2025-01\nNord,50,2025-02\n" QUERY = "SELECT region, sum(umsatz) AS summe FROM umsatz GROUP BY 1 ORDER BY 1" @pytest.fixture def ws(browser, people, db): anna = browser("anna") workspace_id = create_workspace(anna, people["team_demo"], "Analyse") anna.post(f"/workspaces/{workspace_id}/members", {"username": "ben", "role": "member"}) anna.post(f"/workspaces/{workspace_id}/uploads", files={"file": ("umsatz.csv", CSV)}) admin = Principal(user_id=people["anna"], username="anna", display_name="Anna", is_admin=True, team_ids=frozenset({people["team_demo"]})) with db.session() as session: tools.classify_suggested(session, admin) chat_id = int(anna.post(f"/workspaces/{workspace_id}/chats").headers["location"].rsplit("/", 1)[1]) return {"anna": anna, "ben": browser("ben"), "dora": browser("dora"), "id": workspace_id, "chat_id": chat_id} def ask(ws, text: str = "Umsatz je Region?"): ws["anna"].post(f"/chats/{ws['chat_id']}/messages", {"content": text}, headers={"HX-Request": "true"}) def test_ergebnis_mit_tabelle_csv_und_diagramm(ws, db, settings, fake_provider): fake_provider.script = [[("data_query", {"sql": QUERY}), ("data_query", {"sql": "DELETE FROM umsatz"})], "Nord 150, Sued 250."] ask(ws) Worker(db, settings).run_once() page = ws["ben"].get(f"/chats/{ws['chat_id']}").text # Nur die erfolgreiche Abfrage hat ein Ergebnis assert page.count("Abfrageergebnis:") == 1 assert "Abfrageergebnis: 2 Zeilen, 2 Spalten · mit Diagramm" in page assert 'alert(1)", 5], ["b", -3]]) assert "