feat: improve async feedback and export workflow

This commit is contained in:
2026-08-11 18:45:39 +08:00
parent ff4ba1148b
commit 83b259af2d
11 changed files with 248 additions and 28 deletions

View File

@@ -12,6 +12,7 @@ from app.services.admin_permission_service import ALL_PERMISSION_CODES, permissi
def test_super_admin_has_all_permissions() -> None:
admin = Admin(id=1, username="root", password="unused", name="root", status=1, is_super_admin=1)
assert permissions_for(admin) == ALL_PERMISSION_CODES
assert {"feedback.view", "feedback.detail", "feedback.export", "feedback.delete"} <= ALL_PERMISSION_CODES
def test_role_permissions_are_restricted_to_catalog() -> None:

View File

@@ -1,10 +1,13 @@
from __future__ import annotations
from datetime import datetime
from types import SimpleNamespace
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from sqlalchemy.pool import StaticPool
from app.api.feedback import FeedbackCreate, create_feedback, delete_feedback, feedback_detail, feedback_list
from app.api.feedback import FeedbackCreate, _feedback_workbook, create_feedback, delete_feedback, feedback_detail, feedback_list
from app.models import Base
from app.models.admin import Admin
from app.models.chat import ChatMessage, ChatSession
@@ -33,3 +36,20 @@ def test_feedback_binds_target_answer_and_exposes_context() -> None:
assert detail["messages"][-1]["isTarget"] is True
delete_feedback(created["id"], db=db, admin=admin)
assert feedback_list(readStatus="all", page=1, pageSize=20, db=db, _admin=admin)["data"]["total"] == 0
def test_feedback_export_workbook_is_formatted_and_formula_safe() -> None:
created_at = datetime(2026, 8, 11, 12, 30)
row = (
SimpleNamespace(is_read=0, content="=HYPERLINK(\"bad\")", created_at=created_at, read_at=None),
SimpleNamespace(name="测试用户", phone="13800000000"),
SimpleNamespace(id=9, content="AI 回答"),
SimpleNamespace(title="测试会话"),
)
workbook = _feedback_workbook([row])
sheet = workbook["反馈记录"]
assert sheet.freeze_panes == "A2"
assert sheet["E2"].data_type == "s"
assert sheet["E2"].value.startswith("'=")
assert sheet["I2"].value == created_at
assert sheet.tables["FeedbackRecords"].ref == "A1:J2"