Files
MoviePilot/tests/test_rss_helper.py
T

63 lines
2.1 KiB
Python

from types import SimpleNamespace
from app.application import rss as rss_module
from app.application.rss import RssHelper
from app.adapters.network.http import RequestUtils
def test_rss_site_domain_prefers_configured_multilevel_domain():
"""RSS 站点域名匹配应保留配置中的多级域名,并为普通域名回退。"""
assert RssHelper._get_site_domain("https://u2.dmhy.org/getrss.php") == "u2.dmhy.org"
assert RssHelper._get_site_domain("https://tracker.example.com/rss") == "example.com"
def test_rss_helper_decodes_utf8_xml_before_python_parser(monkeypatch):
"""
RSS 解码应先修正 XML 文本,再交给 Python 解析兜底路径处理。
"""
xml = """
<?xml version="1.0" encoding="UTF-8"?>
<rss>
<channel>
<item>
<title><![CDATA[警察故事4:简单任务 2160p]]></title>
<description><![CDATA[中文简介]]></description>
<link>https://example.com/details/4</link>
<pubDate>2026-06-25T10:30:00Z</pubDate>
</item>
</channel>
</rss>
""".strip()
class FakeRequestUtils:
"""
测试用 RequestUtils,避免真实网络请求。
"""
get_decoded_xml_content = staticmethod(RequestUtils.get_decoded_xml_content)
def __init__(self, **_kwargs):
"""
保存构造参数占位,兼容 RssHelper 的调用方式。
"""
def get_res(self, _url):
"""
返回带错误 HTTP 默认编码的 RSS 响应对象。
"""
return SimpleNamespace(
status_code=200,
content=xml.encode("utf-8"),
text=xml.encode("utf-8").decode("ISO-8859-1"),
apparent_encoding="utf-8",
encoding="ISO-8859-1",
)
monkeypatch.setattr(rss_module, "RequestUtils", FakeRequestUtils)
monkeypatch.setattr(rss_module.rust_accel, "parse_rss_items", lambda *_args, **_kwargs: None)
result = RssHelper().parse("https://example.com/rss")
assert result[0]["title"] == "警察故事4:简单任务 2160p"
assert result[0]["description"] == "中文简介"