feat: 修复代码审核报告问题
This commit is contained in:
@@ -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)
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user