From f2820e3553acdb3bafd1ad89e17e3499699bcf2e Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sat, 5 Sep 2026 17:04:26 +0800 Subject: [PATCH] fix(search): preserve cached resource contexts --- app/schemas/search.py | 4 +-- tests/test_search_response_models.py | 48 ++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 tests/test_search_response_models.py diff --git a/app/schemas/search.py b/app/schemas/search.py index fe03639ed..712ec69a5 100644 --- a/app/schemas/search.py +++ b/app/schemas/search.py @@ -5,14 +5,14 @@ from typing import Literal, Union from pydantic import BaseModel, Field from app.schemas.common import JsonData -from app.schemas.context import SubtitleInfo, TorrentInfo +from app.schemas.context import Context, SubtitleInfo class SearchLastContextData(BaseModel): """上一次搜索的请求参数与结果。""" params: dict[str, JsonData] = Field(default_factory=dict) - results: list[Union[TorrentInfo, SubtitleInfo]] = Field(default_factory=list) + results: list[Union[Context, SubtitleInfo]] = Field(default_factory=list) class SearchRecommendStatusData(BaseModel): diff --git a/tests/test_search_response_models.py b/tests/test_search_response_models.py new file mode 100644 index 000000000..2243c0535 --- /dev/null +++ b/tests/test_search_response_models.py @@ -0,0 +1,48 @@ +"""搜索接口响应模型测试。""" + +from app.schemas.context import Context, MetaInfo, SubtitleInfo, TorrentInfo +from app.schemas.response import Response +from app.schemas.search import SearchLastContextData + + +def test_last_search_context_preserves_nested_torrent_context() -> None: + """最近搜索响应必须保留资源上下文的嵌套元数据和种子信息。""" + context = Context( + meta_info=MetaInfo(title="Example", name="Example"), + torrent_info=TorrentInfo(title="Example torrent", site_name="Site A"), + ) + + response = Response[SearchLastContextData]( + success=True, + data={ + "params": {"keyword": "Example", "result_type": "torrent"}, + "results": [context.model_dump(mode="json")], + }, + ).model_dump(mode="json") + + result = response["data"]["results"][0] + assert result["meta_info"]["name"] == "Example" + assert result["torrent_info"]["title"] == "Example torrent" + assert result["torrent_info"]["site_name"] == "Site A" + + +def test_last_search_context_keeps_subtitle_result_shape() -> None: + """修正资源上下文类型后仍必须完整保留字幕搜索结果。""" + subtitle = SubtitleInfo( + title="Example subtitle", + site_name="Subtitle Site", + enclosure="https://example.test/subtitle.srt", + ) + + response = Response[SearchLastContextData]( + success=True, + data={ + "params": {"keyword": "Example", "result_type": "subtitle"}, + "results": [subtitle.model_dump(mode="json")], + }, + ).model_dump(mode="json") + + result = response["data"]["results"][0] + assert result["title"] == "Example subtitle" + assert result["site_name"] == "Subtitle Site" + assert result["enclosure"] == "https://example.test/subtitle.srt"