feat: overhaul UI styling, improve templates, enhance services and tests

This commit is contained in:
2026-06-06 00:38:56 +08:00
parent f7f1a4c0cb
commit 904eec392e
38 changed files with 1471 additions and 795 deletions
+49 -22
View File
@@ -29,13 +29,17 @@ def sample_paper_with_user_data(db_session, sample_papers_range):
paper = sample_papers_range[0]
now = datetime.now(timezone.utc)
db_session.add(UserBookmark(paper_id=paper.id, created_at=now))
db_session.add(UserReadingStatus(paper_id=paper.id, status="read_summary", updated_at=now))
db_session.add(UserNote(
paper_id=paper.id,
content="My notes on this paper",
created_at=now,
updated_at=now,
))
db_session.add(
UserReadingStatus(paper_id=paper.id, status="read_summary", updated_at=now)
)
db_session.add(
UserNote(
paper_id=paper.id,
content="My notes on this paper",
created_at=now,
updated_at=now,
)
)
db_session.commit()
return paper
@@ -64,6 +68,7 @@ class TestCleanupTmp:
monkeypatch.setattr("app.services.cleaner.TMP_DIR", tmp_dir)
from app.services.cleaner import cleanup_tmp
result = cleanup_tmp()
assert result["scanned"] == 1
@@ -81,6 +86,7 @@ class TestCleanupTmp:
monkeypatch.setattr("app.services.cleaner.TMP_DIR", tmp_dir)
from app.services.cleaner import cleanup_tmp
result = cleanup_tmp()
assert result["scanned"] == 1
@@ -91,6 +97,7 @@ class TestCleanupTmp:
"""data/tmp/ 不存在时安全返回。"""
monkeypatch.setattr("app.services.cleaner.TMP_DIR", tmp_path / "nonexistent")
from app.services.cleaner import cleanup_tmp
result = cleanup_tmp()
assert result["scanned"] == 0
assert result["removed"] == 0
@@ -110,6 +117,7 @@ class TestCleanupTmp:
monkeypatch.setattr("app.services.cleaner.TMP_DIR", tmp_dir)
from app.services.cleaner import cleanup_tmp
result = cleanup_tmp()
assert result["scanned"] == 2
@@ -178,14 +186,18 @@ class TestDeletePapersByDateRange:
date(2024, 1, 14),
)
logs = db_session.execute(
select(CrawlLog).where(CrawlLog.task == "delete")
).scalars().all()
logs = (
db_session.execute(select(CrawlLog).where(CrawlLog.task == "delete"))
.scalars()
.all()
)
assert len(logs) == 1
assert logs[0].status == "success"
@pytest.mark.asyncio
async def test_delete_cascade_user_data(self, db_session, sample_paper_with_user_data):
async def test_delete_cascade_user_data(
self, db_session, sample_paper_with_user_data
):
"""删除论文时应 cascade 删除关联的用户数据。"""
from app.services.cleaner import delete_papers_by_date_range
@@ -200,15 +212,24 @@ class TestDeletePapersByDateRange:
assert result["deleted"] == 1
# 确认用户数据被 cascade 删除
assert db_session.execute(
select(UserBookmark).where(UserBookmark.paper_id == paper.id)
).scalar_one_or_none() is None
assert db_session.execute(
select(UserReadingStatus).where(UserReadingStatus.paper_id == paper.id)
).scalar_one_or_none() is None
assert db_session.execute(
select(UserNote).where(UserNote.paper_id == paper.id)
).scalar_one_or_none() is None
assert (
db_session.execute(
select(UserBookmark).where(UserBookmark.paper_id == paper.id)
).scalar_one_or_none()
is None
)
assert (
db_session.execute(
select(UserReadingStatus).where(UserReadingStatus.paper_id == paper.id)
).scalar_one_or_none()
is None
)
assert (
db_session.execute(
select(UserNote).where(UserNote.paper_id == paper.id)
).scalar_one_or_none()
is None
)
@pytest.mark.asyncio
async def test_delete_removes_fts(self, db_session, sample_papers_range):
@@ -229,7 +250,9 @@ class TestDeletePapersByDateRange:
assert rows == 0
@pytest.mark.asyncio
async def test_delete_removes_local_files(self, db_session, sample_papers_range, tmp_path, monkeypatch):
async def test_delete_removes_local_files(
self, db_session, sample_papers_range, tmp_path, monkeypatch
):
"""删除论文时应删除本地文件目录。"""
from app.services.cleaner import delete_papers_by_date_range
@@ -263,13 +286,17 @@ class TestDeletePapersByDateRange:
assert result["status"] == "success"
@pytest.mark.asyncio
async def test_cleaner_works_without_chroma(self, db_session, sample_papers_with_summary, monkeypatch):
async def test_cleaner_works_without_chroma(
self, db_session, sample_papers_with_summary, monkeypatch
):
"""CHROMA 关闭时删除论文正常工作。"""
monkeypatch.setattr(settings, "CHROMA_ENABLED", False)
import app.services.embedder as emb
emb._chroma.reset()
from app.services.cleaner import delete_papers_by_date_range
result = await delete_papers_by_date_range(
db_session,
date(2024, 1, 10),