feat: 提交热榜评论分析工具 MVP 基线
This commit is contained in:
@@ -0,0 +1,146 @@
|
||||
from app.models import Comment, ContentItem, Hotspot, Report, Task
|
||||
from tests.helpers import make_test_client
|
||||
|
||||
|
||||
def test_index_page_renders_task_form_empty_state_and_default_scale():
|
||||
with make_test_client() as (client, _engine):
|
||||
response = client.get("/")
|
||||
|
||||
assert response.status_code == 200
|
||||
assert "热榜评论分析工具" in response.text
|
||||
assert 'name="platform"' in response.text
|
||||
assert 'name="hotspot_limit"' in response.text
|
||||
assert 'name="item_limit_per_hotspot"' in response.text
|
||||
assert 'name="comment_limit_per_item"' in response.text
|
||||
assert "1250" in response.text
|
||||
assert 'onclick="window.location.href=\'/\'"' in response.text
|
||||
assert "还没有任何任务" in response.text
|
||||
|
||||
|
||||
def test_index_page_lists_existing_tasks():
|
||||
with make_test_client() as (client, engine):
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
with Session(engine) as session:
|
||||
session.add(
|
||||
Task(
|
||||
id="task-visible",
|
||||
platform="douyin",
|
||||
status="running",
|
||||
hotspot_limit=3,
|
||||
item_limit_per_hotspot=4,
|
||||
comment_limit_per_item=50,
|
||||
)
|
||||
)
|
||||
session.commit()
|
||||
|
||||
response = client.get("/")
|
||||
|
||||
assert response.status_code == 200
|
||||
assert "task-visible" in response.text
|
||||
assert "抖音" in response.text
|
||||
assert "运行中" in response.text
|
||||
|
||||
|
||||
def seed_result_data(engine):
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
with Session(engine) as session:
|
||||
task = Task(id="task-result", platform="douyin", status="success", total_items_count=1, successful_items_count=1)
|
||||
session.add(task)
|
||||
hotspot = Hotspot(id="hot-result", task_id=task.id, platform="douyin", title="热点标题", rank=1, raw_data="{}")
|
||||
session.add(hotspot)
|
||||
item = ContentItem(
|
||||
id="item-result",
|
||||
task_id=task.id,
|
||||
hotspot_id=hotspot.id,
|
||||
platform="douyin",
|
||||
source_item_id="v1",
|
||||
item_type="video",
|
||||
title="视频标题",
|
||||
status="success",
|
||||
raw_data="{}",
|
||||
)
|
||||
session.add(item)
|
||||
session.add(
|
||||
Comment(
|
||||
id="comment-result",
|
||||
task_id=task.id,
|
||||
hotspot_id=hotspot.id,
|
||||
content_item_id=item.id,
|
||||
platform="douyin",
|
||||
source_comment_id="c1",
|
||||
content="评论内容",
|
||||
sentiment="positive",
|
||||
labels='["认可"]',
|
||||
like_count=3,
|
||||
raw_data="{}",
|
||||
)
|
||||
)
|
||||
session.add(
|
||||
Report(
|
||||
task_id=task.id,
|
||||
hotspot_id=hotspot.id,
|
||||
report_type="hotspot",
|
||||
title="热点标题",
|
||||
metrics_json='{"sample_count":1,"sentiment":{"positive":{"count":1,"pct":100}},"top_labels":[{"name":"认可","count":1}]}',
|
||||
typical_comments_json='{"positive":[{"content":"评论内容","like_count":3}]}',
|
||||
summary="热点总结",
|
||||
markdown_content="# 热点标题\n\n热点总结",
|
||||
data="{}",
|
||||
markdown="# 热点标题\n\n热点总结",
|
||||
)
|
||||
)
|
||||
session.add(
|
||||
Report(
|
||||
task_id=task.id,
|
||||
hotspot_id=hotspot.id,
|
||||
content_item_id=item.id,
|
||||
report_type="item",
|
||||
title="视频标题",
|
||||
metrics_json='{"sample_count":1,"sentiment":{"positive":{"count":1,"pct":100}},"top_labels":[{"name":"认可","count":1}]}',
|
||||
typical_comments_json='{"positive":[{"content":"评论内容","like_count":3}]}',
|
||||
summary="内容总结",
|
||||
markdown_content="# 视频标题\n\n内容总结",
|
||||
data="{}",
|
||||
markdown="# 视频标题\n\n内容总结",
|
||||
)
|
||||
)
|
||||
session.commit()
|
||||
|
||||
|
||||
def test_result_pages_render_seeded_data():
|
||||
with make_test_client() as (client, engine):
|
||||
seed_result_data(engine)
|
||||
|
||||
task_response = client.get("/tasks/task-result")
|
||||
hotspot_response = client.get("/hotspots/hot-result/report")
|
||||
item_response = client.get("/items/item-result")
|
||||
|
||||
assert task_response.status_code == 200
|
||||
assert "热点标题" in task_response.text
|
||||
assert 'onclick="window.location.href=\'/\'"' in task_response.text
|
||||
assert hotspot_response.status_code == 200
|
||||
assert "热点总结" in hotspot_response.text
|
||||
assert item_response.status_code == 200
|
||||
assert "评论内容" in item_response.text
|
||||
|
||||
|
||||
def test_export_routes_return_csv_and_markdown():
|
||||
with make_test_client() as (client, engine):
|
||||
seed_result_data(engine)
|
||||
|
||||
csv_response = client.get("/api/export/items/item-result/comments.csv")
|
||||
hotspot_csv_response = client.get("/api/export/hotspots/hot-result/comments.csv")
|
||||
hotspot_md = client.get("/api/export/hotspots/hot-result.md")
|
||||
item_md = client.get("/api/export/items/item-result.md")
|
||||
|
||||
assert csv_response.status_code == 200
|
||||
assert csv_response.content.startswith(b"\xef\xbb\xbf")
|
||||
assert "评论内容".encode("utf-8") in csv_response.content
|
||||
assert hotspot_csv_response.status_code == 200
|
||||
assert "评论内容".encode("utf-8") in hotspot_csv_response.content
|
||||
assert hotspot_md.status_code == 200
|
||||
assert "热点总结" in hotspot_md.text
|
||||
assert item_md.status_code == 200
|
||||
assert "内容总结" in item_md.text
|
||||
Reference in New Issue
Block a user