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

103 lines
3.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""
验证 Discuz 用户信息解析的默认值、流量和页面字段。
"""
from collections.abc import Iterator
import pytest
from app.modules.indexer.parser.discuz import DiscuzUserInfo
@pytest.fixture
def parser() -> Iterator[DiscuzUserInfo]:
"""
创建不访问外部服务的 Discuz 解析器,并在用例结束后关闭。
:yields: 使用空凭据和示例地址的解析器
"""
instance = DiscuzUserInfo(
site_name="Discuz",
url="https://example.com/",
site_cookie="",
apikey=None,
token=None,
)
yield instance
instance.close()
def test_discuz_traffic_defaults_use_integer_bytes(parser: DiscuzUserInfo) -> None:
"""
上传/下载量使用整数字节,分享率保持浮点数。
"""
for value in (parser.upload, parser.download):
assert value == 0
assert type(value) is int
assert parser.ratio == 0.0
assert isinstance(parser.ratio, float)
@pytest.mark.parametrize("include_menu", [True, False])
def test_discuz_skyeysnow_ratio(parser: DiscuzUserInfo, include_menu: bool) -> None:
"""
天雪菜单和资料页的无括号分享率均应解析,且不影响积分和流量。
"""
menu = """
<ul id="ratio_menu">
<li><a>上传量 : 845.25 GB</a></li>
<li><a>分享率 : 24.12</a></li>
<li><a>保种率 : 31.91</a></li>
</ul>
""" if include_menu else ""
html_text = f"""
<html><body>
{menu}
<ul class="cl bbda pbm mbm">
<li>
<em class="xg2">统计信息</em>
<a>好友数 0</a><span class="pipe">|</span><a>回帖数 1033</a>
<br /><em class="xg2">PT信息</em>
保种率 32.09 <span class="pipe">|</span> 分享率 24.12
<span class="pipe">|</span> 预期保种率 31.91
</li>
</ul>
<ul class="pf_l">
<li><em>积分</em>58065</li>
<li><em>上传积分/上传量</em>343.62 G / 845.25 GB</li>
<li><em>下载积分/下载量</em>35.04 G / 35.04 GB</li>
</ul>
</body></html>
"""
parser._parse_user_detail_info(html_text)
assert parser.ratio == 24.12
assert parser.to_dict()["ratio"] == 24.12
assert parser.bonus == 58065
assert parser.upload == round(845.25 * 1024 ** 3)
assert parser.download == round(35.04 * 1024 ** 3)
@pytest.mark.parametrize(("ratio_html", "expected"), [
("<li>分享率 (24.12)</li>", 24.12),
("<li><em>分享率</em>24.12</li>", 24.12),
("<li>\n<em>分享率</em>:<span>24.12</span></li>", 24.12),
("<li><em>分享率</em>(1,234.56)</li>", 1234.56),
("<li><a>分享率 : 0.00</a></li>", 0),
("<li>分享率 (24.12)</li><li>分享率 (31.91)</li>", 24.12),
("<li>保种率 31.91</li>", 0),
("<li>分享率 -- <span>保种率 (31.91)</span></li>", 0),
])
def test_discuz_ratio_formats_keep_bonus(parser: DiscuzUserInfo, ratio_html: str, expected: float) -> None:
"""
分享率应读取标签后的数值,不误取其他指标或覆盖已有积分。
"""
parser.bonus = 123
parser._parse_user_detail_info(f"<html><body><ul>{ratio_html}</ul></body></html>")
assert parser.ratio == expected
assert parser.bonus == 123