from pathlib import Path def test_shared_page_skeleton_components_are_available(): source = Path("web/src/components/shared/PageSkeletons.tsx").read_text() for name in ( "PageSkeleton", "CardSkeleton", "MetricGridSkeleton", "TableSkeleton", "MobileListSkeleton", "DetailSkeleton", "TokenStatusSkeleton", ): assert f"function {name}" in source assert name in source.rsplit("export {", 1)[-1] def test_data_pages_use_shared_desktop_and_mobile_loading_skeletons(): keys_source = Path("web/src/pages/KeysPage.tsx").read_text() logs_source = Path("web/src/pages/LogsPage.tsx").read_text() for source in (keys_source, logs_source): assert "@/components/shared/PageSkeletons" in source assert "TableSkeleton" in source assert "MobileListSkeleton" in source assert "hidden md:block" in source assert "md:hidden" in source def test_token_and_log_detail_use_structured_skeletons(): token_source = Path("web/src/pages/TokenPage.tsx").read_text() detail_source = Path("web/src/pages/LogDetailPage.tsx").read_text() assert "TokenStatusSkeleton" in token_source assert "" in token_source assert "加载中..." not in token_source assert "DetailSkeleton" in detail_source assert 'from "@/components/ui/skeleton"' not in detail_source