import sys from contextlib import asynccontextmanager from pathlib import Path from fastapi import FastAPI from fastapi.testclient import TestClient BACKEND_ROOT = Path(__file__).resolve().parents[1] if str(BACKEND_ROOT) not in sys.path: sys.path.insert(0, str(BACKEND_ROOT)) from app import create_app from app.services.hot_videos import HotVideoItem, PlatformHotVideoResult @asynccontextmanager async def noop_lifespan(app: FastAPI): yield def test_hot_videos_route_returns_normalized_payload(monkeypatch): from app.routers import hot_videos as route def fake_payload(platform="all", limit=12, force=False): return { "platform": platform, "limit": limit, "generated_at": "2026-06-08T09:30:00+08:00", "platforms": [ PlatformHotVideoResult( platform="bilibili", status="ok", message="", items=[ HotVideoItem( id="BV1route", platform="bilibili", title="路由测试", url="https://www.bilibili.com/video/BV1route", rank=1, source="bilibili_popular", ) ], ).to_dict() ], } monkeypatch.setattr(route, "fetch_hot_video_payload", fake_payload) app = create_app(lifespan=noop_lifespan) client = TestClient(app) response = client.get("/api/hot_videos?platform=bilibili&limit=3") assert response.status_code == 200 body = response.json() assert body["code"] == 0 assert body["data"]["platform"] == "bilibili" assert body["data"]["limit"] == 3 assert ( body["data"]["platforms"][0]["items"][0]["url"] == "https://www.bilibili.com/video/BV1route" ) def test_hot_videos_route_returns_business_error_for_invalid_platform(monkeypatch): from app.routers import hot_videos as route def fake_payload(platform="all", limit=12, force=False): raise ValueError("不支持的热点平台: instagram") monkeypatch.setattr(route, "fetch_hot_video_payload", fake_payload) app = create_app(lifespan=noop_lifespan) client = TestClient(app) response = client.get("/api/hot_videos?platform=instagram") assert response.status_code == 200 body = response.json() assert body["code"] == 400 assert "不支持的热点平台" in body["msg"]