from pathlib import Path PAGE = Path("frontend/src/app/(app)/page.tsx") STARTER_HOME = Path("frontend/src/components/starter-home.tsx") HOME_CLOUD = Path("frontend/src/lib/home-cloud-sync.ts") RECTIFICATION_HOOK = Path("frontend/src/hooks/use-rectification-surface.ts") DAILY_ROUTE = Path("frontend/src/app/api/daily-starlanguage/route.ts") RECTIFICATION_ROUTE = Path("frontend/src/app/api/birth-rectification/route.ts") def _home_entrypoint_surface() -> str: parts = [PAGE, STARTER_HOME, HOME_CLOUD] if RECTIFICATION_HOOK.exists(): parts.append(RECTIFICATION_HOOK) return "".join(path.read_text(encoding="utf-8") for path in parts) def test_daily_starlanguage_entrypoint_is_productized() -> None: # 原值:断言 daily-starlanguage-card(空状态大卡) # 新值:StarterEntries 的 starter-entry pill + startDailyStarlanguageConsultation # 原因:62903b7a 已把卡片改成问候 + 输入框 + 两枚 pill,全仓已无该类名 source = _home_entrypoint_surface() assert "今日星语" in source assert "fetchDailyStarlanguage" in source assert "starter-entry" in source assert "startDailyStarlanguageConsultation" in source assert "从今日问起" in source assert "今天的星语还没写出来。" in source assert "daily-starlanguage-card" not in source assert "buildDailyStarlanguageCard" not in source assert "点这里" not in source assert "不会用通用文案顶替" not in source def test_daily_starlanguage_api_declares_honest_source_boundary() -> None: source = DAILY_ROUTE.read_text(encoding="utf-8") assert "status: \"ok\"" in source assert "/api/daily_guidance" in source assert "/api/chart" not in source assert "/api/transit" not in source assert "exploratory_unvalidated" in source assert "not_deterministic_prediction" in source def test_birth_time_rectification_entrypoint_is_productized() -> None: # 原值:断言 birth-rectification-card # 新值:同一套 starter-entry pill + openRectificationFromHomepage # 原因:同上,卡片入口已删除 source = _home_entrypoint_surface() assert "生时校正" in source assert "starter-entry" in source assert "openRectificationFromHomepage" in source assert "birth-rectification-card" not in source def test_birth_rectification_api_proxies_active_questionnaire_with_boundary() -> None: source = RECTIFICATION_ROUTE.read_text(encoding="utf-8") assert "/api/active_rectification_questions" in source assert "candidate_scan" in source assert "question_count" in source assert "not_auto_rectified" in source