111 lines
4.4 KiB
Python
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()
|