Files
MoviePilot/tests/test_bangumi_recognize_scrape.py
DDSRem 2de976f6b3 Merge pull request #7050 from DDSRem-Dev/codex-comment-migration
docs: 统一全项目中文注释和结构化契约说明
2026-10-17 19:26:29 +08:00

92 lines
3.0 KiB
Python

"""
验证 Bangumi 标题识别、人物加载和来源元数据刮削。
"""
from unittest.mock import Mock
from xml.dom import minidom
from app.domain.meta.metabase import MetaBase
from app.domain.scraper import MediaScraperHelper
from app.modules.bangumi import BangumiModule
from app.schemas.types import MediaSource, MediaType
def _bangumi_info() -> dict:
"""
构造Bangumi识别与刮削测试详情。
"""
return {
"id": 400602,
"name": "Sousou no Frieren",
"name_cn": "葬送的芙莉莲",
"platform": "TV",
"date": "2023-09-29",
"eps": 28,
"summary": "勇者一行击败魔王后的故事。",
"images": {"large": "https://lain.example/poster.jpg"},
"rating": {"score": 8.9},
"tags": [{"name": "奇幻"}, {"name": "冒险"}],
"infobox": [
{"key": "动画制作", "value": "MADHOUSE"},
{"key": "导演", "value": [{"v": "斋藤圭一郎"}]},
],
}
def test_bangumi_title_recognition_loads_detail_and_people() -> None:
"""
Bangumi标题识别应搜索候选、读取详情并补齐演职员。
"""
module = BangumiModule()
module.bangumiapi = Mock()
module.bangumiapi.search.return_value = [
{"id": 400602, "name": "Sousou no Frieren", "name_cn": "葬送的芙莉莲"}
]
module.bangumiapi.detail.return_value = _bangumi_info()
module.bangumiapi.credits.return_value = [
{"name": "种崎敦美", "career": ["芙莉莲"]}
]
meta = MetaBase("葬送的芙莉莲")
meta.cn_name = "葬送的芙莉莲"
meta.type = MediaType.TV
meta.year = "2023"
media = module.recognize_media(meta=meta, media_source=MediaSource.Bangumi)
assert media is not None
assert media.media_source == MediaSource.Bangumi
assert media.media_id == "400602"
assert media.bangumi_id == 400602
assert media.number_of_episodes == 28
assert media.genres == [
{"id": "奇幻", "name": "奇幻"},
{"id": "冒险", "name": "冒险"},
]
assert media.production_companies == [{"name": "MADHOUSE"}]
assert media.directors == [{"name": "斋藤圭一郎"}]
assert media.actors[0]["name"] == "种崎敦美"
def test_bangumi_scraper_generates_source_nfo() -> None:
"""
Bangumi来源应可生成带Bangumi唯一ID的NFO与图片清单。
"""
module = BangumiModule()
module.bangumiapi = Mock()
module.scraper = MediaScraperHelper()
module.bangumiapi.detail.return_value = _bangumi_info()
module.bangumiapi.credits.return_value = []
media = module.recognize_media(
media_source=MediaSource.Bangumi, media_id="400602"
)
media.scrape_source = "bangumi"
nfo = module.metadata_nfo(media)
images = module.metadata_img(media)
document = minidom.parseString(nfo)
unique_id = document.getElementsByTagName("uniqueid")[0]
assert unique_id.firstChild.data == "400602"
assert unique_id.getAttribute("type") == "bangumi"
assert images == {"poster.jpg": "https://lain.example/poster.jpg"}