mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-08-13 09:44:43 +08:00
129 lines
3.5 KiB
Python
129 lines
3.5 KiB
Python
"""影视自动识别主数据源路由回归测试。"""
|
||
|
||
import asyncio
|
||
from typing import Optional
|
||
|
||
from app.chain import ChainBase
|
||
from app.chain.media import MediaChain
|
||
from app.core.context import MediaInfo
|
||
from app.core.meta import MetaBase
|
||
from app.schemas.types import MediaType
|
||
|
||
|
||
def _video_meta() -> MetaBase:
|
||
"""构造未指定数据源的电影元数据。"""
|
||
meta = MetaBase("流浪地球 2019")
|
||
meta.name = "流浪地球"
|
||
meta.year = "2019"
|
||
meta.type = MediaType.MOVIE
|
||
return meta
|
||
|
||
|
||
def _module_kwargs(meta: MetaBase, source: Optional[str] = None) -> dict:
|
||
"""构造原生识别路由使用的模块参数。"""
|
||
return {
|
||
"meta": meta,
|
||
"mtype": MediaType.MOVIE,
|
||
"source": source,
|
||
"mediaid": None,
|
||
"tmdbid": None,
|
||
"doubanid": None,
|
||
"bangumiid": None,
|
||
"anilistid": None,
|
||
"episode_group": None,
|
||
"cache": True,
|
||
}
|
||
|
||
|
||
def test_video_auto_recognize_only_uses_tmdb(monkeypatch) -> None:
|
||
"""未指定影视来源时必须固定委托 TMDB,失败后也不切换其它来源。"""
|
||
chain = object.__new__(MediaChain)
|
||
calls = []
|
||
|
||
def generic_recognize(_self, module_kwargs, cache):
|
||
"""记录父类模块分发参数并模拟 TMDB 未命中。"""
|
||
calls.append((module_kwargs, cache))
|
||
return None
|
||
|
||
monkeypatch.setattr(
|
||
ChainBase,
|
||
"_run_native_media_recognize",
|
||
generic_recognize,
|
||
)
|
||
|
||
result = chain._run_native_media_recognize(
|
||
_module_kwargs(_video_meta()),
|
||
cache=True,
|
||
)
|
||
|
||
assert result is None
|
||
assert len(calls) == 1
|
||
assert calls[0][0]["source"] == "themoviedb"
|
||
|
||
|
||
def test_async_video_auto_recognize_only_uses_tmdb(monkeypatch) -> None:
|
||
"""异步未指定影视来源时也只委托 TMDB 原生识别入口。"""
|
||
chain = object.__new__(MediaChain)
|
||
expected = MediaInfo(
|
||
source="themoviedb",
|
||
media_id="550",
|
||
tmdb_id=550,
|
||
title="流浪地球",
|
||
year="2019",
|
||
type=MediaType.MOVIE,
|
||
)
|
||
calls = []
|
||
|
||
async def generic_recognize(_self, module_kwargs, cache):
|
||
"""记录异步父类模块分发参数并返回 TMDB 结果。"""
|
||
calls.append((module_kwargs, cache))
|
||
return expected
|
||
|
||
monkeypatch.setattr(
|
||
ChainBase,
|
||
"_async_run_native_media_recognize",
|
||
generic_recognize,
|
||
)
|
||
|
||
result = asyncio.run(chain._async_run_native_media_recognize(
|
||
_module_kwargs(_video_meta()),
|
||
cache=True,
|
||
))
|
||
|
||
assert result is expected
|
||
assert len(calls) == 1
|
||
assert calls[0][0]["source"] == "themoviedb"
|
||
|
||
|
||
def test_video_explicit_source_is_preserved(monkeypatch) -> None:
|
||
"""手工指定影视来源时必须保持严格单源分发。"""
|
||
chain = object.__new__(MediaChain)
|
||
expected = MediaInfo(
|
||
source="douban",
|
||
media_id="26266893",
|
||
douban_id="26266893",
|
||
title="流浪地球",
|
||
year="2019",
|
||
type=MediaType.MOVIE,
|
||
)
|
||
calls = []
|
||
|
||
def generic_recognize(_self, module_kwargs, cache):
|
||
"""记录显式来源并返回预设结果。"""
|
||
calls.append((module_kwargs, cache))
|
||
return expected
|
||
|
||
monkeypatch.setattr(
|
||
ChainBase,
|
||
"_run_native_media_recognize",
|
||
generic_recognize,
|
||
)
|
||
|
||
result = chain._run_native_media_recognize(
|
||
_module_kwargs(_video_meta(), source="douban"),
|
||
cache=True,
|
||
)
|
||
|
||
assert result is expected
|
||
assert calls[0][0]["source"] == "douban"
|