feat: 修复代码审核报告问题

This commit is contained in:
congsh
2026-06-12 16:04:03 +08:00
commit bae47a2411
46 changed files with 6231 additions and 0 deletions
View File
+21
View File
@@ -0,0 +1,21 @@
"""测试配置"""
import pytest
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from database import Base
from models import EnrichedArticle, Taxonomy, DuplicateGroup, DailyBrief
TEST_DATABASE_URL = "sqlite:///:memory:"
@pytest.fixture(scope="function")
def db():
engine = create_engine(TEST_DATABASE_URL, connect_args={"check_same_thread": False})
Base.metadata.create_all(bind=engine)
Session = sessionmaker(bind=engine)
session = Session()
yield session
session.close()
Base.metadata.drop_all(bind=engine)
+78
View File
@@ -0,0 +1,78 @@
"""去重模块测试"""
from datetime import datetime, timedelta, timezone
from app.deduplicator import _title_similarity, _find_duplicate_clusters, deduplicate_articles
from models import EnrichedArticle
def test_title_similarity_identical():
assert _title_similarity("OpenAI 发布 GPT-5", "OpenAI 发布 GPT-5") > 0.95
def test_title_similarity_different():
assert _title_similarity("OpenAI 发布 GPT-5", "苹果发布新款 iPhone") < 0.5
def test_find_duplicate_clusters(db):
articles = [
EnrichedArticle(
rk_article_id=1,
title="OpenAI 发布 GPT-5,性能大幅提升",
content="OpenAI 今天发布了 GPT-5,性能大幅提升。",
),
EnrichedArticle(
rk_article_id=2,
title="OpenAI 发布 GPT-5 性能大幅提升",
content="OpenAI 发布了 GPT-5,性能提升明显。",
),
EnrichedArticle(
rk_article_id=3,
title="苹果发布新款 iPhone",
content="苹果公司发布了新款 iPhone。",
),
]
clusters = _find_duplicate_clusters(articles, title_threshold=0.85, content_threshold=0.80)
assert len(clusters) == 1
assert {0, 1} in clusters
def test_deduplicate_articles(db):
today = datetime.now(timezone.utc).strftime("%Y-%m-%d")
day_start = datetime.strptime(today, "%Y-%m-%d")
a1 = EnrichedArticle(
rk_article_id=1,
title="OpenAI 发布 GPT-5",
content="OpenAI 今天发布了 GPT-5。",
fetched_at=day_start,
)
a2 = EnrichedArticle(
rk_article_id=2,
title="OpenAI 发布 GPT-5 性能提升",
content="OpenAI 发布了 GPT-5,性能提升。",
fetched_at=day_start + timedelta(minutes=10),
)
a3 = EnrichedArticle(
rk_article_id=3,
title="苹果发布新款 iPhone",
content="苹果发布了 iPhone。",
fetched_at=day_start + timedelta(minutes=20),
)
db.add_all([a1, a2, a3])
db.commit()
stats = deduplicate_articles(db, date_str=today, title_threshold=0.85, content_threshold=0.80)
assert stats["total"] == 3
assert stats["duplicate_groups"] == 1
assert stats["representatives"] == 1
# 刷新对象
db.refresh(a1)
db.refresh(a2)
db.refresh(a3)
representatives = [a for a in [a1, a2, a3] if a.is_representative]
assert len(representatives) == 1
assert representatives[0].duplicate_group_id is not None
+46
View File
@@ -0,0 +1,46 @@
"""打分模块测试"""
from datetime import datetime
from app.scorer import compute_heat_score, compute_importance_score, compute_duplication_score, compute_composite_score, score_articles
from models import EnrichedArticle, Taxonomy, DuplicateGroup
def test_compute_heat_score():
rules = [Taxonomy(name="AI", kind="heat_rule", keywords=["AI", "大模型"], weight=1.5)]
article = EnrichedArticle(title="OpenAI 发布 GPT-5 大模型")
score = compute_heat_score(article, rules)
assert score > 0
def test_compute_importance_score():
rules = [Taxonomy(name="政策", kind="importance_rule", keywords=["政策", "监管"], weight=2.0)]
article = EnrichedArticle(title="新政策发布,加强 AI 监管")
score = compute_importance_score(article, rules)
assert score > 0
def test_compute_duplication_score():
assert compute_duplication_score(1) == 0.0
assert compute_duplication_score(5) == 100.0
def test_compute_composite_score():
score = compute_composite_score(50, 80, 30)
expected = 50 * 0.3 + 80 * 0.5 + 30 * 0.2
assert score == round(expected, 2)
def test_score_articles_integration(db):
db.add_all([
Taxonomy(name="AI", kind="heat_rule", keywords=["AI"], weight=1.5),
Taxonomy(name="政策", kind="importance_rule", keywords=["政策"], weight=2.0),
])
article = EnrichedArticle(rk_article_id=1, title="AI 新政策发布")
db.add(article)
db.commit()
score_articles(db, article_ids=[article.id])
assert article.heat_score > 0
assert article.importance_score > 0
assert article.composite_score > 0
+43
View File
@@ -0,0 +1,43 @@
"""分类/标签模块测试"""
from app.tagger import classify_article, tag_article, tag_articles
from models import EnrichedArticle, Taxonomy
def test_classify_article(db):
categories = [
Taxonomy(name="科技", kind="category", keywords=["AI", "大模型", "芯片"]),
Taxonomy(name="财经", kind="category", keywords=["股市", "基金", "财报"]),
]
article = EnrichedArticle(
rk_article_id=1,
title="OpenAI 发布新一代大模型",
)
assert classify_article(article, categories) == "科技"
def test_tag_article(db):
tags = [
Taxonomy(name="人工智能", kind="tag", keywords=["AI", "人工智能", "大模型"]),
Taxonomy(name="半导体", kind="tag", keywords=["芯片", "半导体"]),
]
article = EnrichedArticle(
rk_article_id=1,
title="OpenAI 发布新一代大模型",
)
result = tag_article(article, tags)
assert "人工智能" in result
def test_tag_articles_integration(db):
db.add_all([
Taxonomy(name="科技", kind="category", keywords=["AI", "大模型"]),
Taxonomy(name="人工智能", kind="tag", keywords=["AI", "大模型"]),
])
article = EnrichedArticle(rk_article_id=1, title="OpenAI 发布 GPT-5 大模型")
db.add(article)
db.commit()
count = tag_articles(db)
assert count == 1
assert article.category == "科技"
assert "人工智能" in article.tags