# phase-5 §7.2 — 대시보드 집계 정확성 def test_dashboard_shape(client): d = client.get("/api/dashboard").json() for k in ( "user", "briefing", "saved_today", "today_routed", "schedule", "task_summary", "goals", "approvals_summary", "inbox_recent", "badges", ): assert k in d def test_user_top_level(client): d = client.get("/api/dashboard").json() assert d["user"]["name"] == "지우" assert d["user"]["initial"] == "지" def test_briefing_seed_values(client): d = client.get("/api/dashboard").json() b = d["briefing"] assert b["today"] == "6월 7일 일요일" assert b["weather"]["cond"] == "맑음 · 한낮 28°" assert b["weather"]["icon"] == "sun" # cloudSun → sun assert d["saved_today"] == "47분" assert d["today_routed"] == 7 assert "분기 리포트" in b["note"] def test_schedule_four_items_and_soon(client): d = client.get("/api/dashboard").json() sch = d["schedule"] assert len(sch) == 4 assert sch[0]["time"] == "09:30" soon = [e for e in sch if e["soon"]] assert len(soon) == 1 and soon[0]["title"] == "분기 전략 미팅" def test_approvals_summary_only_high_risk_max3(client): d = client.get("/api/dashboard").json() ap = d["approvals_summary"] assert len(ap) == 3 titles = [a["title"] for a in ap] assert "현우님께 회신 초안이 준비됐어요" in titles assert "Netflix 일시정지를 추천해요" in titles assert all("치과 예약" not in t for t in titles) def test_inbox_recent_three_with_type_and_proj(client): d = client.get("/api/dashboard").json() inb = d["inbox_recent"] assert len(inb) == 3 assert inb[0]["type"] in ("task", "event", "idea", "") assert all("proj_label" in x for x in inb) assert all("tone" in x for x in inb) def test_goals_three_with_tone_key(client): d = client.get("/api/dashboard").json() goals = d["goals"] assert len(goals) == 3 assert goals[0]["pct"] == 68 assert goals[0]["tone"] == "blue" # var(--blue) 아님 def test_badges_match_counts(client): d = client.get("/api/dashboard").json() b = d["badges"] assert b["appr"] == 3 # high 3건 assert b["task"] == d["task_summary"]["open_count"] assert b["noti"] == 6