feat: overhaul UI styling, improve templates, enhance services and tests
This commit is contained in:
+32
-5
@@ -18,46 +18,54 @@ class TestSearchService:
|
||||
|
||||
def test_search_by_title(self, db_session, sample_paper):
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
result = search_papers(db_session, query="Test Paper")
|
||||
assert result["total"] == 1
|
||||
assert result["results"][0].arxiv_id == "2401.12345"
|
||||
|
||||
def test_search_by_abstract(self, db_session, sample_paper):
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
result = search_papers(db_session, query="test abstract")
|
||||
assert result["total"] == 1
|
||||
|
||||
def test_search_by_author(self, db_session, sample_paper):
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
result = search_papers(db_session, query="Alice")
|
||||
assert result["total"] == 1
|
||||
|
||||
def test_search_by_tag_in_fts(self, db_session, sample_paper):
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
# FTS5 索引中包含 tags 列,可以搜到
|
||||
result = search_papers(db_session, query="NLP")
|
||||
assert result["total"] == 1
|
||||
|
||||
def test_search_no_results(self, db_session, sample_paper):
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
result = search_papers(db_session, query="quantum entanglement")
|
||||
assert result["total"] == 0
|
||||
assert result["results"] == []
|
||||
|
||||
def test_search_empty_query_returns_empty(self, db_session):
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
result = search_papers(db_session, query="")
|
||||
assert result["total"] == 0
|
||||
assert result["results"] == []
|
||||
|
||||
def test_search_special_characters_sanitized(self, db_session, sample_paper):
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
# 特殊字符被清除后,剩下 "Test" 仍然能搜到
|
||||
result = search_papers(db_session, query='Test "Paper" {test}')
|
||||
assert result["total"] >= 1
|
||||
|
||||
def test_search_with_tag_filter(self, db_session, sample_paper):
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
# 关键词 + 标签筛选
|
||||
result = search_papers(db_session, query="Paper", tag="NLP")
|
||||
assert result["total"] == 1
|
||||
@@ -67,6 +75,7 @@ class TestSearchService:
|
||||
|
||||
def test_search_tag_only_no_query(self, db_session, sample_paper):
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
# 只有标签,无关键词
|
||||
result = search_papers(db_session, tag="NLP")
|
||||
assert result["total"] == 1
|
||||
@@ -74,12 +83,14 @@ class TestSearchService:
|
||||
|
||||
def test_search_pagination(self, db_session, sample_paper):
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
result = search_papers(db_session, query="Test", page=2, page_size=10)
|
||||
assert result["page"] == 2
|
||||
assert result["total_pages"] == 1 # 只有 1 条结果,1 页
|
||||
|
||||
def test_search_returns_snippets(self, db_session, sample_paper):
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
result = search_papers(db_session, query="test abstract")
|
||||
assert result["total"] == 1
|
||||
paper_id = result["results"][0].id
|
||||
@@ -89,6 +100,7 @@ class TestSearchService:
|
||||
|
||||
def test_get_all_tags(self, db_session, sample_paper):
|
||||
from app.services.searcher import get_all_tags
|
||||
|
||||
tags = get_all_tags(db_session)
|
||||
assert "NLP" in tags
|
||||
assert "LLM" in tags
|
||||
@@ -105,20 +117,27 @@ class TestSearchSemanticMode:
|
||||
def test_keyword_mode_default(self, db_session, sample_papers_with_summary):
|
||||
"""默认 keyword 模式走 FTS5。"""
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
result = search_papers(db_session, query="Test Paper", mode="keyword")
|
||||
assert result["total"] >= 1
|
||||
assert result["distances"] == {}
|
||||
|
||||
def test_semantic_mode_disabled_fallback(self, db_session, monkeypatch, sample_papers_with_summary):
|
||||
def test_semantic_mode_disabled_fallback(
|
||||
self, db_session, monkeypatch, sample_papers_with_summary
|
||||
):
|
||||
"""CHROMA_ENABLED=false + semantic 模式走 FTS5。"""
|
||||
monkeypatch.setattr(settings, "CHROMA_ENABLED", False)
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
result = search_papers(db_session, query="Test", mode="semantic")
|
||||
assert result["total"] >= 1
|
||||
|
||||
def test_search_returns_distances_dict(self, db_session, sample_papers_with_summary):
|
||||
def test_search_returns_distances_dict(
|
||||
self, db_session, sample_papers_with_summary
|
||||
):
|
||||
"""搜索结果应包含 distances 字段。"""
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
result = search_papers(db_session, query="Test Paper")
|
||||
assert "distances" in result
|
||||
assert isinstance(result["distances"], dict)
|
||||
@@ -126,6 +145,7 @@ class TestSearchSemanticMode:
|
||||
def test_empty_query_returns_empty_no_tags(self, db_session):
|
||||
"""空查询无标签时返回空。"""
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
result = search_papers(db_session)
|
||||
assert result["total"] == 0
|
||||
assert result["results"] == []
|
||||
@@ -133,6 +153,7 @@ class TestSearchSemanticMode:
|
||||
def test_tag_only_search(self, db_session, sample_papers_with_summary):
|
||||
"""仅标签搜索。"""
|
||||
from app.services.searcher import search_papers
|
||||
|
||||
result = search_papers(db_session, tag="NLP")
|
||||
assert result["total"] >= 1
|
||||
|
||||
@@ -169,7 +190,9 @@ class TestSearchRoutes:
|
||||
assert resp.status_code == 200
|
||||
assert "Test" in resp.text or "测试" in resp.text
|
||||
|
||||
def test_search_page_semantic_disabled(self, client, monkeypatch, sample_papers_with_summary):
|
||||
def test_search_page_semantic_disabled(
|
||||
self, client, monkeypatch, sample_papers_with_summary
|
||||
):
|
||||
"""语义模式 CHROMA_ENABLED=false 时仍能工作。"""
|
||||
monkeypatch.setattr(settings, "CHROMA_ENABLED", False)
|
||||
resp = client.get("/search?q=Test&mode=semantic")
|
||||
@@ -221,7 +244,9 @@ class TestSearchRoutes:
|
||||
class TestSimilarAPI:
|
||||
"""相似论文 API 测试。"""
|
||||
|
||||
def test_similar_api_disabled(self, client, monkeypatch, sample_papers_with_summary):
|
||||
def test_similar_api_disabled(
|
||||
self, client, monkeypatch, sample_papers_with_summary
|
||||
):
|
||||
"""CHROMA_ENABLED=false 时返回空列表。"""
|
||||
monkeypatch.setattr(settings, "CHROMA_ENABLED", False)
|
||||
resp = client.get("/api/similar/2401.20001")
|
||||
@@ -236,7 +261,9 @@ class TestSimilarAPI:
|
||||
assert resp.status_code == 200
|
||||
assert resp.json()["results"] == []
|
||||
|
||||
def test_similar_api_with_top_k(self, client, monkeypatch, sample_papers_with_summary):
|
||||
def test_similar_api_with_top_k(
|
||||
self, client, monkeypatch, sample_papers_with_summary
|
||||
):
|
||||
"""top_k 参数控制返回数量。"""
|
||||
monkeypatch.setattr(settings, "CHROMA_ENABLED", False)
|
||||
resp = client.get("/api/similar/2401.20001?top_k=3")
|
||||
|
||||
Reference in New Issue
Block a user