Files
DEMO-AGENT/tests/test_file_summary_frontend.py

150 lines
5.2 KiB
Python

import pytest
from django.urls import reverse
from review_agent.models import Conversation, FileSummaryBatch, Message, WorkflowNodeRun
pytestmark = pytest.mark.django_db
def test_workspace_renders_summary_panel(client, django_user_model):
user = django_user_model.objects.create_user(username="owner", password="pass")
conversation = Conversation.objects.create(user=user, title="会话")
Message.objects.create(
conversation=conversation,
role=Message.Role.ASSISTANT,
content="| 序号 | 文件名 |\n| --- | --- |\n| 1 | a.pdf |\n\n[下载](/api/review-agent/file-summary/exports/1/download/)",
)
client.force_login(user)
response = client.get(f"{reverse('home')}?conversation={conversation.pk}")
assert response.status_code == 200
content = response.content.decode("utf-8")
assert 'id="summaryPanel"' in content
assert 'id="uploadDropzone"' in content
assert 'id="workflowCardList"' in content
assert 'data-conversation-id="' in content
assert 'data-message-id="' in content
assert 'data-message-url-template="' in content
assert 'class="message-content markdown-content"' in content
assert 'class="message-raw"' in content
assert "自动汇总文件目录与页数" in content
def test_workspace_renders_workflow_history_as_batch_carousel(client, django_user_model):
user = django_user_model.objects.create_user(username="owner", password="pass")
conversation = Conversation.objects.create(user=user, title="会话")
older = FileSummaryBatch.objects.create(
conversation=conversation,
user=user,
batch_no="FS-OLDER",
status=FileSummaryBatch.Status.SUCCESS,
)
latest = FileSummaryBatch.objects.create(
conversation=conversation,
user=user,
batch_no="FS-LATEST",
status=FileSummaryBatch.Status.FAILED,
error_message="解压失败",
)
WorkflowNodeRun.objects.create(
batch=older,
node_code="upload",
node_name="附件固化",
status=WorkflowNodeRun.Status.SUCCESS,
progress=100,
message="附件固化完成",
)
WorkflowNodeRun.objects.create(
batch=latest,
node_code="extract",
node_name="压缩包解压",
status=WorkflowNodeRun.Status.FAILED,
progress=10,
message="压缩包损坏",
)
client.force_login(user)
response = client.get(f"{reverse('home')}?conversation={conversation.pk}")
assert response.status_code == 200
content = response.content.decode("utf-8")
assert "workflow-batch-carousel" in content
assert 'class="workflow-card active"' in content
assert 'data-workflow-index="0"' in content
assert 'data-workflow-action="prev"' in content
assert 'data-workflow-action="next"' in content
assert content.index("FS-LATEST") < content.index("FS-OLDER")
assert "压缩包损坏" in content
def test_frontend_prevents_long_message_overflow():
css = open("static/css/login.css", encoding="utf-8").read()
assert ".message-bubble" in css
assert "overflow-wrap: anywhere" in css
assert "word-break: break-word" in css
def test_frontend_polls_running_workflow_cards():
script = open("static/js/app.js", encoding="utf-8").read()
assert "startWorkflowPolling" in script
assert "setInterval" in script
assert "refreshRunningWorkflowCards" in script
def test_frontend_updates_sidebar_conversation_by_stable_id():
script = open("static/js/app.js", encoding="utf-8").read()
assert "data-conversation-id" in script
assert "setAttribute(\"data-conversation-id\"" in script
assert ".history-item[data-conversation-id=" in script
def test_frontend_refreshes_generated_workflow_messages():
script = open("static/js/app.js", encoding="utf-8").read()
assert "refreshConversationMessages" in script
assert "latestMessageId" in script
assert "data-message-url-template" in script
def test_frontend_can_replace_partial_stream_content():
script = open("static/js/app.js", encoding="utf-8").read()
assert 'eventName === "replace"' in script
assert "assistantText = payload.content" in script
def test_frontend_enter_sends_and_ctrl_enter_inserts_newline():
script = open("static/js/app.js", encoding="utf-8").read()
assert "bindPromptKeyboardShortcuts" in script
assert "event.key === \"Enter\"" in script
assert "event.ctrlKey" in script
assert "composer.requestSubmit()" in script
def test_frontend_renders_workflow_error_messages():
script = open("static/js/app.js", encoding="utf-8").read()
css = open("static/css/login.css", encoding="utf-8").read()
assert "payload.batch.error_message" in script
assert "workflow-error" in script
assert "node.message" in script
assert ".workflow-error" in css
def test_frontend_renders_workflow_batches_as_carousel():
script = open("static/js/app.js", encoding="utf-8").read()
css = open("static/css/login.css", encoding="utf-8").read()
assert "selectWorkflowBatchIndex" in script
assert "refreshWorkflowBatchCarousel" in script
assert "data-workflow-action" in script
assert "workflow-batch-carousel" in script
assert ".workflow-batch-controls" in css
assert ".workflow-card.active" in css