# -*- 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 = """ """ if include_menu else "" html_text = f""" {menu} """ 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"), [ ("
  • 分享率 (24.12)
  • ", 24.12), ("
  • 分享率24.12
  • ", 24.12), ("
  • \n分享率:24.12
  • ", 24.12), ("
  • 分享率(1,234.56)
  • ", 1234.56), ("
  • 分享率 : 0.00
  • ", 0), ("
  • 分享率 (24.12)
  • 分享率 (31.91)
  • ", 24.12), ("
  • 保种率 31.91
  • ", 0), ("
  • 分享率 -- 保种率 (31.91)
  • ", 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"") assert parser.ratio == expected assert parser.bonus == 123