Files
leaudit-platform-backend/tests/test_home_dashboard_statistics.py

145 lines
5.2 KiB
Python

"""首页统计接口测试。"""
import pytest
from fastapi_modules.fastapi_leaudit.services.impl.homeServiceImpl import HomeServiceImpl
class _FakeDocument:
def __init__(
self,
*,
audit_status: int,
failed_count: int = 0,
passed_count: int | None = None,
updated_at: str = "2026-05-23T10:00:00",
processing_status: str | None = None,
run_status: str | None = None,
result_status: str | None = None,
) -> None:
self.auditStatus = audit_status
self.failedCount = failed_count
self.passedCount = passed_count
self.updatedAt = updated_at
self.processingStatus = processing_status or ("running" if audit_status == 2 else "waiting" if audit_status == 0 else "completed")
self.runStatus = run_status or ("running" if audit_status == 2 else "pending" if audit_status == 0 else "completed")
self.resultStatus = result_status
class _FakePage:
def __init__(self, *, documents, total_pages: int) -> None:
self.documents = documents
self.totalPages = total_pages
class _FakeDocumentService:
def __init__(self) -> None:
self.calls = []
async def ListDocuments(self, **kwargs):
self.calls.append(kwargs)
page = kwargs["Page"]
if page == 1:
return _FakePage(
documents=[
_FakeDocument(audit_status=0, updated_at="2026-05-23T09:00:00"),
_FakeDocument(audit_status=2, updated_at="2026-05-23T09:30:00"),
_FakeDocument(audit_status=1, failed_count=0, updated_at="2026-05-03T10:00:00"),
_FakeDocument(audit_status=1, failed_count=2, updated_at="2026-05-20T10:00:00"),
],
total_pages=2,
)
if page == 2:
return _FakePage(
documents=[
_FakeDocument(audit_status=1, failed_count=1, updated_at="2026-05-22T10:00:00"),
_FakeDocument(audit_status=1, failed_count=0, updated_at="2026-04-18T10:00:00"),
_FakeDocument(audit_status=0, updated_at="2026-05-10T10:00:00"),
],
total_pages=2,
)
return _FakePage(documents=[], total_pages=2)
class _FakeFailedReviewDocumentService:
def __init__(self) -> None:
self.calls = []
async def ListDocuments(self, **kwargs):
self.calls.append(kwargs)
return _FakePage(
documents=[
_FakeDocument(
audit_status=0,
passed_count=5,
failed_count=0,
updated_at="2026-05-21T09:00:00",
run_status="completed",
result_status="pass",
),
_FakeDocument(
audit_status=0,
failed_count=3,
updated_at="2026-05-21T10:00:00",
run_status="completed",
result_status="fail",
),
_FakeDocument(
audit_status=0,
failed_count=0,
updated_at="2026-05-21T11:00:00",
processing_status="waiting",
run_status="pending",
result_status=None,
),
_FakeDocument(
audit_status=0,
failed_count=1,
updated_at="2026-04-18T10:00:00",
run_status="completed",
result_status="fail",
),
],
total_pages=1,
)
@pytest.mark.asyncio
async def test_home_dashboard_statistics_uses_entry_scope_and_all_pages():
"""首页统计按入口模块与文档类型过滤,并拉取全量分页后计算。"""
document_service = _FakeDocumentService()
service = HomeServiceImpl(DocumentService=document_service)
result = await service.GetDashboardStatistics(
UserId=7,
Today="2026-05-23",
TypeIds=[10, 11],
EntryModuleId=3,
)
assert result.todayPendingFiles == 2
assert result.monthlyReviewedFiles == 3
assert result.monthlyPassRate == 33
assert result.issuesDetected == 3
assert result.monthlyReviewGrowth.value == 200
assert result.monthlyReviewGrowth.isUp is True
assert {call["EntryModuleId"] for call in document_service.calls} == {3}
assert {tuple(call["TypeIds"]) for call in document_service.calls} == {(10, 11)}
assert [call["Page"] for call in document_service.calls] == [1, 2]
assert all("DateFrom" not in call for call in document_service.calls)
assert all("DateTo" not in call for call in document_service.calls)
@pytest.mark.asyncio
async def test_home_dashboard_statistics_counts_failed_reviews_as_reviewed():
"""首页已审核统计应包含不通过但已评查完成的文件。"""
document_service = _FakeFailedReviewDocumentService()
service = HomeServiceImpl(DocumentService=document_service)
result = await service.GetDashboardStatistics(UserId=7, Today="2026-05-21")
assert result.todayPendingFiles == 1
assert result.monthlyReviewedFiles == 2
assert result.monthlyPassRate == 50
assert result.issuesDetected == 3