feat: improve chat feedback navigation

This commit is contained in:
2026-08-31 11:41:56 +08:00
parent 5740bd26e7
commit f4b2836c8a
11 changed files with 422 additions and 41 deletions

View File

@@ -99,6 +99,7 @@ def test_chat_detail_messages_are_paginated():
ChatMessage(id=index + 1, session_id=1, user_id=1, role="user", content=f"消息{index + 1}")
for index in range(25)
])
db.add(AiRequestLog(session_id=1, status="success", prompt="p" * 100_000, retrieved_chunks='[{"content":"large"}]'))
db.commit()
response = chat_detail(
@@ -116,6 +117,7 @@ def test_chat_detail_messages_are_paginated():
assert data["messagesPage"]["page"] == 2
assert len(data["messages"]) == 10
assert data["messages"][0]["content"] == "消息11"
assert data["aiLogs"] == []
def test_chat_detail_focus_message_opens_its_page_in_chronological_order():
@@ -164,7 +166,7 @@ def test_chat_messages_endpoint_returns_only_message_page():
db.add(AiRequestLog(session_id=1, status="success", prompt="p" * 5000, retrieved_chunks='[{"content":"large"}]'))
db.commit()
response = chat_messages(1, page=2, pageSize=10, db=db, current_admin=object())
response = chat_messages(1, keyword="", page=2, pageSize=10, db=db, current_admin=object())
data = response["data"]
assert data["total"] == 12
@@ -173,6 +175,32 @@ def test_chat_messages_endpoint_returns_only_message_page():
assert "aiLogs" not in data
def test_chat_messages_keyword_search_is_scoped_and_paginated():
with _database() as db:
user = User(id=1, phone="13800000000", name="学员", daily_chat_limit=10)
session = ChatSession(id=1, user_id=1, title="搜索会话", message_count=24)
other_session = ChatSession(id=2, user_id=1, title="其他会话", message_count=1)
db.add_all([user, session, other_session])
db.add_all([
ChatMessage(
id=index,
session_id=1,
user_id=1,
role="user",
content=f"{index}条 关键字" if index % 2 == 0 else f"{index}条普通内容",
)
for index in range(1, 25)
])
db.add(ChatMessage(id=100, session_id=2, user_id=1, role="user", content="其他会话关键字"))
db.commit()
response = chat_messages(1, keyword="关键字", page=2, pageSize=10, db=db, current_admin=object())
data = response["data"]
assert data["total"] == 12
assert [item["id"] for item in data["items"]] == [22, 24]
def test_retrieval_and_attention_lists_are_paginated():
with _database() as db:
for index in range(21):

View File

@@ -55,3 +55,47 @@ def test_feedback_export_workbook_is_formatted_and_formula_safe() -> None:
assert "AI生成内容请结合实际情况核对后使用。" in sheet["H2"].value
assert sheet["I2"].value == created_at + timedelta(hours=8)
assert sheet.tables["FeedbackRecords"].ref == "A1:J2"
def test_feedback_detail_locates_target_beyond_first_two_hundred_messages() -> None:
engine = create_engine("sqlite:///:memory:", connect_args={"check_same_thread": False}, poolclass=StaticPool)
Base.metadata.create_all(engine)
with Session(engine) as db:
user = User(id=1, phone="13800000000", name="测试用户")
admin = Admin(id=1, username="admin", password="hash", name="管理员", is_super_admin=1, must_change_password=0)
session = ChatSession(id=1, user_id=1, title="超长会话", message_count=250)
created_at = datetime(2026, 8, 29, 9, 0)
db.add_all([user, admin, session])
db.add_all([
ChatMessage(
id=index,
session_id=1,
user_id=1,
role="assistant" if index % 2 == 0 else "user",
content=f"消息{index}",
message_status="FINISHED",
created_at=created_at,
)
for index in range(1, 251)
])
db.commit()
feedback_id = create_feedback(
FeedbackCreate(messageId=230, content="这条回答有问题"),
db=db,
user=user,
)["data"]["id"]
detail = feedback_detail(
feedback_id,
messagePage=None,
messagePageSize=20,
db=db,
admin=admin,
)["data"]
assert detail["messagesPage"]["page"] == 12
assert detail["messagesPage"]["total"] == 250
assert [item["id"] for item in detail["messages"]] == list(range(221, 241))
target = next(item for item in detail["messages"] if item["isTarget"])
assert target["id"] == 230
assert target["createdAt"] == "2026-08-29T09:00:00.000Z"