kaikai_test/tests/test_report_service.py
2026-05-07 16:31:56 +08:00

111 lines
4.4 KiB
Python

from __future__ import annotations
import json
import tempfile
import unittest
from datetime import datetime, timezone
from pathlib import Path
from daily_report.db import Database
from daily_report.report_service import ReportService
def make_database(employees: list[dict]) -> Database:
temp_dir = Path(tempfile.mkdtemp(prefix="daily-report-"))
seed_path = temp_dir / "employees.json"
seed_path.write_text(json.dumps(employees), encoding="utf-8")
return Database(temp_dir / "test.sqlite", seed_path)
class ReportServiceTest(unittest.TestCase):
def test_creates_schema_and_loads_active_employees(self) -> None:
db = make_database(
[
{"feishu_user_id": "u_1", "name": "Lin", "department": "Design", "manager": "Mo", "active": True},
{"feishu_user_id": "u_2", "name": "Chen", "department": "Sales", "manager": "Mo", "active": False},
]
)
try:
employees = db.list_active_employees()
self.assertEqual(len(employees), 1)
self.assertEqual(employees[0]["name"], "Lin")
finally:
db.close()
def test_validates_required_report_fields(self) -> None:
db = make_database([{"feishu_user_id": "u_1", "name": "Lin", "active": True}])
service = ReportService(db)
try:
with self.assertRaisesRegex(ValueError, "today_done is required"):
service.upsert_report(
{
"feishu_user_id": "u_1",
"report_date": "2026-05-07",
"today_done": "",
"tomorrow_plan": "完成管理页",
}
)
finally:
db.close()
def test_upserts_one_report_per_employee_and_date(self) -> None:
db = make_database([{"feishu_user_id": "u_1", "name": "Lin", "department": "Design", "active": True}])
service = ReportService(db, clock=lambda: datetime(2026, 5, 7, 10, tzinfo=timezone.utc))
try:
service.upsert_report(
{
"feishu_user_id": "u_1",
"report_date": "2026-05-07",
"today_done": "完成原型初稿",
"tomorrow_plan": "和主管评审",
}
)
service.upsert_report(
{
"feishu_user_id": "u_1",
"report_date": "2026-05-07",
"today_done": "完成原型初稿并调整文案",
"tomorrow_plan": "和主管评审",
"blockers": "需要确认 logo",
"help_needed": "确认视觉方向",
}
)
result = service.list_reports_for_date("2026-05-07")
self.assertEqual(len(result["reports"]), 1)
self.assertEqual(result["reports"][0]["today_done"], "完成原型初稿并调整文案")
self.assertEqual(result["reports"][0]["blockers"], "需要确认 logo")
self.assertEqual(len(result["missing"]), 0)
finally:
db.close()
def test_returns_missing_active_employees_and_csv_export(self) -> None:
db = make_database(
[
{"feishu_user_id": "u_1", "name": "Lin", "department": "Design", "active": True},
{"feishu_user_id": "u_2", "name": "Chen", "department": "Sales", "active": True},
]
)
service = ReportService(db, clock=lambda: datetime(2026, 5, 7, 10, tzinfo=timezone.utc))
try:
service.upsert_report(
{
"feishu_user_id": "u_1",
"report_date": "2026-05-07",
"today_done": "完成上线检查清单",
"tomorrow_plan": "准备发布",
}
)
result = service.list_reports_for_date("2026-05-07")
self.assertEqual(result["submittedCount"], 1)
self.assertEqual(result["missing"][0]["name"], "Chen")
csv_text = service.export_reports_csv("2026-05-07")
self.assertIn("employee_name,report_date,today_done,tomorrow_plan,blockers,help_needed,submitted_at", csv_text)
self.assertIn("Lin,2026-05-07,完成上线检查清单,准备发布", csv_text)
finally:
db.close()
if __name__ == "__main__":
unittest.main()